Skip to content

fix(textarea): drag and grow behaviors #2506

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 14 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 28 additions & 7 deletions components/textfield/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ governing permissions and limitations under the License.

/* Grid layout for child components */
display: inline-grid;
grid-template-columns: auto auto;
grid-template-columns: minmax(0, auto) minmax(0, auto);
grid-template-rows: auto auto auto;
}

Expand Down Expand Up @@ -573,6 +573,7 @@ governing permissions and limitations under the License.
--mod-textfield-icon-spacing-inline-end-invalid,
var(--spectrum-textfield-icon-spacing-inline-end-invalid)
);

color: var(
--highcontrast-textfield-icon-color-invalid,
var(
Expand Down Expand Up @@ -1263,33 +1264,53 @@ governing permissions and limitations under the License.

/*** Text Area ***/
.spectrum-Textfield--multiline {
--spectrum-textfield-input-line-height: normal;
--spectrum-textfield-input-line-height: normal;

&.spectrum-Textfield {
/* Remove fixed inline-size to allow resize behavior. */
inline-size: unset;
min-inline-size: var(
--mod-text-area-min-inline-size,
var(--spectrum-text-area-min-inline-size)
);
}

.spectrum-Textfield-input {
.spectrum-Textfield-input {
resize: var(--mod-text-area-resize, both);
inline-size: max(
var(--mod-textfield-width, var(--spectrum-textfield-width)),
var(--mod-text-area-min-inline-size, var(--spectrum-text-area-min-inline-size))
);
min-inline-size: var(
--mod-text-area-min-inline-size,
--mod-text-area-min-inline-size,
var(--spectrum-text-area-min-inline-size)
);
max-inline-size: var(--mod-text-area-max-inline-size, 100%);
min-block-size: var(
--mod-text-area-min-block-size,
var(--spectrum-text-area-min-block-size)
);
resize: inherit;
}

/* CSS to support text area grow behavior. This requires JavaScript to implement. */
&.spectrum-Textfield--grows {
.spectrum-Textfield-validationIcon {
grid-row: auto;
grid-column: auto;
}

.spectrum-Textfield-input {
grid-row: 2 / auto;
}

&.spectrum-Textfield--sideLabel .spectrum-Textfield-input {
grid-row: 1 / auto
resize: none;
grid-row: 1 / auto;
}
}

&.spectrum-Textfield--quiet {
.spectrum-Textfield-input {

min-block-size: var(
--mod-text-area-min-block-size-quiet,
var(--spectrum-text-area-min-block-size-quiet)
Expand Down
1 change: 1 addition & 0 deletions components/textfield/metadata/mods.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
| `--mod-text-area-min-block-size` |
| `--mod-text-area-min-block-size-quiet` |
| `--mod-text-area-min-inline-size` |
| `--mod-text-area-resize` |
| `--mod-textfield-background-color` |
| `--mod-textfield-background-color-disabled` |
| `--mod-textfield-border-color` |
Expand Down
16 changes: 13 additions & 3 deletions components/textfield/metadata/textarea.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Text area
status: Verified
description: A multi-line text field using the `<textarea>` element.
SpectrumSiteSlug: https://spectrum.adobe.com/page/text-field/
SpectrumSiteSlug: https://spectrum.adobe.com/page/text-area/
sections:
- name: Migration Guide
description: |
Expand Down Expand Up @@ -47,7 +47,7 @@ examples:
</div>

- id: textfield-helptext
name: Textfield with Help Text
name: With Help Text
markup: |
<div class="spectrum-Textfield spectrum-Textfield--multiline">
<label for="textfield-helptext" class="spectrum-FieldLabel spectrum-FieldLabel--sizeM">Tags</label>
Expand All @@ -67,7 +67,7 @@ examples:
</div>

- id: textfield-sidelabel
name: Textfield with Side Label
name: With Side Label
markup: |
<div class="spectrum-Textfield spectrum-Textfield--multiline spectrum-Textfield--sideLabel">
<label for="textfield-m-sidelabel" class="spectrum-FieldLabel spectrum-FieldLabel--sizeM">Comments</label>
Expand Down Expand Up @@ -174,8 +174,18 @@ examples:
<textarea id="textarea-keyboard-focused-invalid" name="field" class="spectrum-Textfield-input" pattern="[\w\s]+" required>Invalid input</textarea>
</div>

- id: textfield-grow
name: TextArea with Grow Behavior
description: Use `spectrum-Textfield--grows` to disable the drag behavior along with appropriate JavaScript to enable the height of the text area to <a href="https://spectrum.adobe.com/page/text-area/#Height">grow with input</a>.
markup: |
<div class="spectrum-Textfield spectrum-Textfield--multiline spectrum-Textfield--grows">
<label for="textfield-helptext" class="spectrum-FieldLabel spectrum-FieldLabel--sizeM">Password</label>
<textarea id="textfield-helptext" name="field" class="spectrum-Textfield-input"></textarea>
</div>

- id: textfield-quiet
name: Quiet
description: Text areas should rarely be presented in the quiet style. When used, quiet text areas should use JavaScript to enable the height of the text area to <a href="https://spectrum.adobe.com/page/text-area/#Quiet">grow with input</a>.
markup: |
<div class="spectrum-Textfield spectrum-Textfield--multiline spectrum-Textfield--quiet">
<label for="textarea-quiet" class="spectrum-FieldLabel spectrum-FieldLabel--sizeM">Comments</label>
Expand Down
76 changes: 46 additions & 30 deletions components/textfield/stories/textfield.stories.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Import the component markup template
import { Template } from "./template";
import { html } from "lit";
import { when } from "lit/directives/when.js";
import { Template } from "./template";

export default {
title: "Components/Text field",
Expand Down Expand Up @@ -201,32 +202,28 @@ const TextFieldGroup = ({
...args
}) => {
return html`
<div style="display: flex; flex-direction: column; gap: 2rem;">
<div style="display: flex; flex-direction: column; align-items: flex-start; gap: 2rem;">
${Template({
...args
})}
${window.isChromatic() ?
Template({
${when(window.isChromatic(), () => html`
${Template({
displayLabel: true,
labelText: "Username",
})
: null }
${window.isChromatic() ?
Template({
})}
${Template({
displayLabel: true,
labelText: "Username that is really long and wraps onto a second line",
isInvalid: true,
})
: null }
${window.isChromatic() ?
Template({
})}
${Template({
displayLabel: true,
labelText: "Username",
labelPosition: 'side',
isValid: true,
value: "username@reallylongemail.com"
})
: null }
})}
`)}
</div>
`;
};
Expand All @@ -235,39 +232,58 @@ const TextAreaGroup = ({
...args
}) => {
return html`
<div style="display: flex; flex-direction: column; gap: 2rem;">
<div style="display: flex; flex-direction: column; align-items: flex-start; gap: 2rem;">
${Template({
...args,
multiline: true,
value: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt."
})}
${window.isChromatic() ?
Template({
${when(window.isChromatic(), () => html`
${Template({
displayLabel: true,
labelText: "Username",
multiline: true,
value: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.",
})
: null }
${window.isChromatic() ?
Template({
})}
${Template({
displayLabel: true,
labelText: "Username that is really long and wraps onto a second line",
labelText: "Username",
multiline: true,
grows: true,
value: "Grows, with no resize. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.",
})}
${Template({
displayLabel: true,
labelText: "Username",
multiline: true,
value: "Example of behavior where Text area gets stretched by default within a flex container with flex-direction: column. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia volupta.",
customStyles: {
'align-self': 'stretch'
}
})}
${Template({
displayLabel: true,
labelText: "Username",
isInvalid: true,
multiline: true,
value: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.",
})}
${Template({
displayLabel: true,
labelText: "Username that has a really long label and wraps onto a second line. Lorem ipsum dolor sit amet.",
isInvalid: true,
multiline: true,
value: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.",
})
: null }
${window.isChromatic() ?
Template({
})}
${Template({
displayLabel: true,
labelText: "Username",
labelPosition: 'side',
isValid: true,
multiline: true,
value: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.",
})
: null }
})}
`)}
</div>
`;
};
Expand All @@ -281,6 +297,6 @@ Default.args = {
export const TextArea = TextAreaGroup.bind({});
TextArea.args = {
multiline: true,
grows: true,
value: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.",
value:
"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.",
};