| <style> |
| :host { |
| --compose-textarea-input-height: calc( |
| 4lh + (2 * var(--compose-textarea-input-padding))); |
| --compose-textarea-input-padding: 10px; |
| --compose-textarea-readonly-height: 48px; |
| --compose-textarea-readonly-padding: 16px; |
| --compose-textarea-readonly-background: |
| var(--color-compose-dialog-textarea-readonly-background); |
| |
| display: grid; |
| grid-template-areas: "content"; |
| align-items: start; |
| grid-auto-columns: 100%; |
| } |
| |
| #inputContainer, |
| #readonlyContainer { |
| grid-area: content; |
| width: 100%; |
| box-sizing: border-box; |
| } |
| |
| #inputContainer { |
| display: flex; |
| flex-direction: column; |
| height: 100%; |
| } |
| |
| textarea { |
| appearance: none; |
| background: transparent; |
| border: none; |
| outline: solid 1px var(--color-compose-dialog-textarea-outline); |
| outline-offset: -1px; |
| border-radius: 8px; |
| color: var(--color-compose-dialog-textarea); |
| font: inherit; |
| font-size: 12px; |
| line-height: 16px; |
| resize: none; |
| width: 100%; |
| height: var(--compose-textarea-input-height); |
| box-sizing: border-box; |
| padding: 10px; |
| scroll-padding-block: 10px; |
| } |
| |
| :host([readonly]) textarea { |
| overflow: hidden; |
| } |
| |
| textarea::placeholder { |
| color: var(--color-compose-dialog-textarea-placeholder); |
| } |
| |
| #input:focus::placeholder { |
| color: transparent; |
| } |
| |
| :host([invalid-input_]) textarea { |
| outline: solid 2px var(--color-compose-dialog-error); |
| outline-offset: -2px; |
| } |
| |
| .error { |
| margin: 4px 10px 0; |
| color: var(--color-compose-dialog-error); |
| font-size: 11px; |
| line-height: 16px; |
| user-select: text; |
| } |
| |
| textarea:focus { |
| outline: solid 2px var(--cr-focus-outline-color); |
| outline-offset: -2px; |
| } |
| |
| #readonlyContainer { |
| border-radius: 8px; |
| display: flex; |
| padding: 16px; |
| background: var(--color-compose-dialog-textarea-readonly-background); |
| color: var(--color-compose-dialog-textarea-readonly-foreground); |
| } |
| |
| #readonlyText { |
| font-size: 12px; |
| font-weight: 400; |
| line-height: 16px; |
| overflow: hidden; |
| text-overflow: ellipsis; |
| white-space: nowrap; |
| width: 100%; |
| user-select: text; |
| } |
| |
| #editButtonContainer { |
| --cr-icon-button-icon-size: var(--cr-icon-size); |
| width: var(--cr-icon-size); |
| height: 16px; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| margin-inline-start: 16px; |
| } |
| |
| cr-icon-button { |
| --cr-icon-button-fill-color: var(--color-compose-dialog-foreground-subtle); |
| margin: 0; |
| } |
| |
| /** |
| * cr-hidden-style stamps an !important on [hidden] elements, which prevents |
| * any animations/transitions from applying. Instead of using cr-hidden-style, |
| * list all the [hidden] elements below. Not all elements need this, just |
| * the ones that override the default 'display' property. |
| */ |
| #inputContainer[hidden], |
| #readonlyContainer[hidden], |
| #editButtonContainer[hidden] { |
| display: none; |
| } |
| </style> |
| |
| <div id="inputContainer" hidden$="[[readonly]]"> |
| <textarea id="input" |
| placeholder="$i18n{inputPlaceholderTitle} |
| • $i18n{inputPlaceholderLine1} |
| • $i18n{inputPlaceholderLine2} |
| • $i18n{inputPlaceholderLine3}" |
| value="{{value::input}}" |
| required |
| autofocus |
| aria-invalid="[[invalidInput_]]" |
| aria-errormessage="error" |
| on-change="onChangeTextArea_"> |
| </textarea> |
| <div id="error" class="error" role="region" aria-live="assertive" |
| hidden$="[[!invalidInput_]]"> |
| <div id="tooShortError" hidden$="[[!tooShort_]]">$i18n{errorTooShort}</div> |
| <div id="tooLongError" hidden$="[[!tooLong_]]">$i18n{errorTooLong}</div> |
| </div> |
| </div> |
| |
| <div id="readonlyContainer" hidden$="[[!readonly]]"> |
| <div id="readonlyText">[[value]]</div> |
| <div id="editButtonContainer" |
| hidden$="[[!shouldShowEditIcon_(allowExitingReadonlyMode, readonly)]]"> |
| <cr-icon-button id="editButton" iron-icon="compose:edit" |
| title="$i18n{editButton}" on-click="onEditClick_"> |
| </cr-icon-button> |
| </div> |
| </div> |