Problème de mise en forme avec button-card

Salut !!
Je suis en train de me mettre à button-card, je repoussais depuis des mois car je ne comprenais pas la construction des codes que j’ai pu voir ci et là. Puis j’ai lu la doc officielle et… ça va mieux, mais c’est pas encore ça… ^^
Cela dit, je cherche à faire un truc qui je penses, et un peu particulier:
Je souhaite faire un bandeau de 7 icones, sur 3 zones, dont une centrale qui sera plus grosse que les 2 autres. J’ai simplifié le code mais ça donne ça:

code
type: custom:button-card
styles:
  grid:
    - grid-template-areas: '"left center right"'
    - grid-template-columns: 1fr 30% 1fr
    - grid-template-rows: min-content
  card:
    - padding: 0px
    - background: none
custom_fields:
  left:
    card:
      type: horizontal-stack
      cards:
        - entity: sun.sun
          type: custom:button-card
          show_icon: true
          show_name: false
          show_state: false
          show_label: false
          styles:
            img_cell:
              - border-radius: 50%
              - width: 35px
              - height: 35px
              - background-color: gray
            icon:
              - width: 50%
              - color: white
  center:
    card:
      entity: sun.sun
      type: custom:button-card
      show_icon: true
      show_name: false
      show_state: false
      show_label: false
      styles:
        card:
          - padding: 0px
        img_cell:
          - border-radius: 50%
          - width: 56px
          - height: 56px
          - background-color: gray
        icon:
          - width: 50%
          - color: white
  right:
    card:
      type: horizontal-stack
      cards:
        - entity: sun.sun
          type: custom:button-card
          show_icon: true
          show_name: false
          show_state: false
          show_label: false
          styles:
            img_cell:
              - border-radius: 50%
              - width: 35px
              - height: 35px
              - background-color: gray
            icon:
              - width: 50%
              - color: white

Le truc sur lequel je coince c’est le background. J’aimerais que le fond des deux zones latérales soit continu, et passe « en dessous » de la zone centrale. De manière à ce que le bouton du milieu soit en « surimpression », comme ça:

Est-ce que l’un d’entre vous qui manipulerais le bestiau depuis longtemps saurait faire ça??

Oui, il suffit de faire des custom_fields (un par icone avec des border-radius à 50% et un pour ton bouton du milieu, ton background). Tu n’as pas besoin de mettre d’horizontal-stack juste des custom_fields avec des custom:button-card. Tu n’as pas besoin non plus de spécifier de grid. Je peux te faire un exemple demain si ça t’intéresse.

1 « J'aime »

Ah oui, très volontiers.
Là j’ai juste mis le code qui s’approchait visuellement de ce que je cherche mais j’ai essayé mille solutions ^^

image

et le code qui va avec :

type: custom:button-card
aspect_ratio: 9/1.6
custom_fields:
  fond:
    card:
      type: custom:button-card
      aspect_ratio: 7/0.9
      styles:
        card:
          - background-color: rgba(128,128,128,1.0)
          - border: none
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_1:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:step-backward-2
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: none
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_2:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:step-backward
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: none
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_3:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:pause
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: none
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_4:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:play
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: none
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 72px
          - height: 72px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_5:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:record
      show_name: false
      styles:
        icon:
          - color: red
        card:
          - box-shadow: none
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_6:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:step-forward
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: none
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_7:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:step-forward-2
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: none
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
styles:
  custom_fields:
    fond:
      - position: absolute
      - left: 2%
      - top: 10%
      - width: 96%
      - height: 54px
    bouton_1:
      - position: absolute
      - left: 3%
      - top: 18%
    bouton_2:
      - position: absolute
      - left: 16%
      - top: 18%
    bouton_3:
      - position: absolute
      - left: 29%
      - top: 18%
    bouton_4:
      - position: absolute
      - left: 42%
      - top: 3%
    bouton_5:
      - position: absolute
      - left: 60%
      - top: 18%
    bouton_6:
      - position: absolute
      - left: 73%
      - top: 18%
    bouton_7:
      - position: absolute
      - left: 86%
      - top: 18%

et sinon avec un peu de relief pour les boutons :

image

C’est une des meilleure approche pour le faire. :+1:

J’ai le meme style pour mes cartes musique. Codage un peu différent, mais pas tant que ca, tres proche.

Merci beaucoup… J’avais pas du tout pensé à faire un field spécifique pour le fond… J’me suis entêté à essayer de joindre deux background différents sous un bouton.

De rien, ça viendra avec le temps :grin:

J’ai un peu du mal à comprendre pourquoi la valeur top est à 18% et pas 50%? Pour mettre ça au milieu…

Parce que le top part du haut du bouton (custom_fields) tout comme le left part de la gauche (en fait le point d’ancrage est en haut à gauche du carré contenant le bouton)
image
Tu peux aussi mettre la position en pixel si tu veux un affichage ultra précis sur un périphérque donné, mais il faudra faire varier cette position sur un autre périphérique (par exemple écran d’ordinateur et téléphone portable).

1 « J'aime »

Dans ce cas je préconise ce genre de code pour une precision parfaite qui s’adate a tout support :
top: calc((100%) - 23px)

C’est un exemple qui n’a rien a voir avec la carte citée, mais ce code je l’utilise pour placer mon top, left et width des custom_fields afin que l’élement soit toujours bien placé.

Par exemple la jauge cercle ici est au bout de la carte, mais si je fais des rangées horizontales de 2 ou 3 cartes, sans ce code, la jauge se retrouve n’importe ou. Là non, elle est toujours bien placée en bout de carte.

1 rangée
image

2 rangées (la jauge se place bien)
image

2 « J'aime »

Ca c’est valable uniquement tant que tu ne change pas de périphérique : si tu passes de ton écran d’ordinateur à ton écran du téléphone portable, le positionnement ne sera pas le même

1 « J'aime »

Et bien non, depuis que je fais ca, que ce soit sur l’écran de l’iphone, ou l’ipad 11 pouces, ou le mac écran 22 pouces, plus aucun problème de positions.
Tout est pareil.

Etant full custom button card, je fais tout comme ca maintenant !

J’ai un template avec un code unique pour le placement d’une jauge comme celle ci.

Vue PC :

Vu tel :

Tout se place parfaitement, selon l’écran, et les rangées.

Alors je ne touche plus a rien et continue comme ca ! :rofl:

EDIT : peut etre car toutes les colonnes sont imbriquées dans des layout de 290px de large remarque je ne sais pas…

C’est surtout que la résolution (pixels / pouce) est la même sur tes appareils. Ce n’est pas le cas entre mon PC de bureau, mon téléphone portable, celui de mon épouse, ma tablette androïd. Même avec la même taille de police, ce qui apparait sur mon téléphone portable n’apparait pas de la même manière sur celui de mon épouse.

1 « J'aime »

Alors… j’ai fini par arriver au résultat escompté mais c’était long!!!

image

Code
# =============================================================================== base
type: custom:button-card
styles:
  card:
    - height: 56px
    - background: none
  custom_fields:
    background:
      - position: absolute
      - width: 100%
      - left: 0%
      - top: 4px
    center_button:
      - position: absolute
      - top: 0%
      - left: calc((50%) - 28px)
custom_fields:
  # --------------------------------------------------------------- background
  background:
    card:
      type: custom:button-card
      styles:
        card:
          - height: 48px
          - background-color: var(--secondary-background-color)
        custom_fields:
          buttons:
            - position: absolute
            - width: 96%
            - left: 02%
            - top: 50%
      custom_fields:
        # ------------------------------------------------------------ buttons
        buttons:
          card:
            type: horizontal-stack
            cards:
              # _____________________________________________ button 1
              - icon: mdi:numeric-1-box
                <<: &button
                  type: custom:button-card
                  styles:
                    card:
                      # - width: 40px
                      # - height: 40px
                      # - border: 2px solid var(--secondary-background-color)
                      # - border-radius: 50%
                      - top: -20px
                      - padding: 0
                      - background-color: none
                    img_cell:
                      - width: 40px
                      - height: 40px
                      - border-radius: 50px
                    icon:
                      - width: 28px
                      - height: 28px
                      # - opacity: 0.2
                    tap_action:
                      action: none
                    hold_action:
                      action: none
              # _____________________________________________ button 2
              - <<: *button
                icon: mdi:numeric-2-box
              # _____________________________________________ button 3
              - <<: *button
                icon: mdi:numeric-3-box
              # __________________________________________ fake button
              - <<: *button
                icon: mdi:cancel
                tap_action:
                  action: none
                hold_action:
                  action: none
              # _____________________________________________ button 5
              - <<: *button
                icon: mdi:numeric-5-box
              # _____________________________________________ button 6
              - <<: *button
                icon: mdi:numeric-6-box
              # _____________________________________________ button 7
              - <<: *button
                icon: mdi:numeric-7-box
  # ------------------------------------------------------------ middle button
  center_button:
    card:
      type: custom:button-card
      icon: mdi:weather-sunny
      size: 70%
      show_name: false
      styles:
        icon:
          - color: var(--secondary-background-color)
        card:
          - box-shadow: none
          - border: 3px solid var(--secondary-background-color)
          - border-radius: 50%
          - background-color: var(--info-color)
          - width: 56px
          - height: 56px
      tap_action:
        action: none
      hold_action:
        action: none

Merci de votre aide à tous les deux. Je n’y serai jamais arrivé sans ça.
Le positionnement des icones est précis ET identique, sur tous les écrans.

calc((50%) - 28px) = placer le bouton au milieu - la moitié de la largeur du bouton

Grâce à la pile horizontale je n’ai pas besoin de placer les éléments un à un avec left: 10px par ex.

Je ne comptais pas m’en servir mais je n’arrive pas à contrôler les background des boutons numérotés:
Dès que j’insère width & height, ça me pète l’alignement.

styles:
  card:
    # - width: 40px
    # - height: 40px
    # - border: 2px solid red
    # - border-radius: 50%

Une idée pour ma culture perso ?

Problème de désignation :

styles:
  custom_fields:
    fond:
      - position: absolute
      - left: 2%
      - top: 10%
      - width: 96%
      - height: 54px
    bouton_1:
      - position: absolute
      - left: 3%
      - top: 18%

La position se règle sur le style des custom_fields, pour le reste, ça se détermine pour chacun des custom_fields (notamment les modifications de bordure en fonction de l’état, cliqué ou pas) :

type: custom:button-card
aspect_ratio: 1/1
custom_fields:
  clim_1:
    card:
      type: custom:button-card
      name: Clim. 1
      show_state: false
      show_icon: false
      styles:
        card:
          - background-color: dimgrey
          - border: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
                  return '2px inset rgba(255,242,0,1.0)';
                else
                  return '2px outset darkgrey';
              ]]]
          - box-shadow: |
              [[[
                if (states['input_number.climatiseurs_clim_courante'].state == '1.0')
                  return '0px 0px 4px 4px rgba(255,242,0,0.5)';
                else
                  return '0px 0px 0px 0px rgba(0,0,0,0.0)';
              ]]]
          - aspect-ratio: 2/1
          - border-radius: 5%
          - width: 78px
          - padding-left: 5px
        name:
          - font-size: 0.9em
          - font-weight: bold
          - justify-self: start
          - align-self: start
          - color: rgba(0,0,0,0.6)
      tap_action:
        action: call-service
        service: script.climatiseurs_clim_1
      hold_action:
        action: none

Tiens, j’ai déjà vu ce code quelque part… :grin::pray:

Salut,
c’est quoi le code pour le box-shadow des boutons?

type: custom:button-card
aspect_ratio: 9/1.6
custom_fields:
  fond:
    card:
      type: custom:button-card
      aspect_ratio: 7/0.9
      styles:
        card:
          - background-color: rgba(64,64,64,0.8)
          - border: none
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_1:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:step-backward-2
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
          - border: 2px rgba(211,211,211,1.0) outset
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_2:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:step-backward
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
          - border: 2px rgba(211,211,211,1.0) outset
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_3:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:pause
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
          - border: 2px rgba(211,211,211,1.0) outset
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_4:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:play
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
          - border: 2px rgba(211,211,211,1.0) outset
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 72px
          - height: 72px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_5:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:record
      show_name: false
      styles:
        icon:
          - color: red
        card:
          - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
          - border: 2px rgba(211,211,211,1.0) outset
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_6:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:step-forward
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
          - border: 2px rgba(211,211,211,1.0) outset
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
  bouton_7:
    card:
      type: custom:button-card
      size: 85%
      icon: mdi:step-forward-2
      show_name: false
      styles:
        icon:
          - color: black
        card:
          - box-shadow: 2px 2px 4px 0px rgba(32,32,32,0.5)
          - border: 2px rgba(211,211,211,1.0) outset
          - border-radius: 50%
          - background-color: rgba(196,196,196,1.0)
          - width: 48px
          - height: 48px
      tap_action:
        action: none
      hold_action:
        action: none
styles:
  custom_fields:
    fond:
      - position: absolute
      - left: 2%
      - top: 10%
      - width: 96%
      - height: 54px
    bouton_1:
      - position: absolute
      - left: 3%
      - top: 18%
    bouton_2:
      - position: absolute
      - left: 16%
      - top: 18%
    bouton_3:
      - position: absolute
      - left: 29%
      - top: 18%
    bouton_4:
      - position: absolute
      - left: 42%
      - top: 3%
    bouton_5:
      - position: absolute
      - left: 60%
      - top: 18%
    bouton_6:
      - position: absolute
      - left: 73%
      - top: 18%
    bouton_7:
      - position: absolute
      - left: 86%
      - top: 18%

Y’a un mix entre box-shadow et border

2 « J'aime »

Nikel , merci.
image

1 « J'aime »

Je me suis fait mes boutons des input select (ici : RDC / étage) avec ce style aussi

image

1 « J'aime »