| <template> | 
 |   <div class="input-password-toggle-container"> | 
 |     <slot></slot> | 
 |     <b-button | 
 |       :aria-label="$t('global.ariaLabel.showPassword')" | 
 |       variant="link" | 
 |       class="input-action-btn" | 
 |       :class="{ isVisible: isVisible }" | 
 |       @click="toggleVisibility" | 
 |     > | 
 |       <icon-view-off | 
 |         v-if="isVisible" | 
 |         aria-hidden="true" | 
 |         :title="$t('global.ariaLabel.hidePassword')" | 
 |       /> | 
 |       <icon-view | 
 |         v-else | 
 |         aria-hidden="true" | 
 |         :title="$t('global.ariaLabel.showPassword')" | 
 |       /> | 
 |     </b-button> | 
 |   </div> | 
 | </template> | 
 |  | 
 | <script> | 
 | import IconView from '@carbon/icons-vue/es/view/20'; | 
 | import IconViewOff from '@carbon/icons-vue/es/view--off/20'; | 
 |  | 
 | export default { | 
 |   name: 'InputPasswordToggle', | 
 |   components: { IconView, IconViewOff }, | 
 |   data() { | 
 |     return { | 
 |       isVisible: false | 
 |     }; | 
 |   }, | 
 |   methods: { | 
 |     toggleVisibility() { | 
 |       const firstChild = this.$children[0]; | 
 |       const inputEl = firstChild ? firstChild.$el : null; | 
 |  | 
 |       this.isVisible = !this.isVisible; | 
 |  | 
 |       if (inputEl.nodeName === 'INPUT') { | 
 |         inputEl.type = this.isVisible ? 'text' : 'password'; | 
 |       } | 
 |     } | 
 |   } | 
 | }; | 
 | </script> | 
 |  | 
 | <style lang="scss" scoped> | 
 | .input-password-toggle-container { | 
 |   position: relative; | 
 | } | 
 | </style> |