From 6c8c024030bc1a13e88cb3d6c9a319ddf13b6b9c Mon Sep 17 00:00:00 2001 From: Katie Langerman Date: Fri, 6 May 2022 17:22:27 +0000 Subject: [PATCH 01/19] setup new tokens --- package.json | 2 +- src/core/index.scss | 2 ++ src/form-control/form-control.scss | 30 ++++++++++++++++++++++++++++++ src/primitives/index.scss | 9 +++++++++ yarn.lock | 2 +- 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/form-control/form-control.scss create mode 100644 src/primitives/index.scss diff --git a/package.json b/package.json index 2bf0902e45..9e78574a00 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "storybook": "cd docs && yarn && yarn storybook" }, "dependencies": { - "@primer/primitives": "^7.7.0" + "@primer/primitives": "^7.8.3" }, "devDependencies": { "@changesets/changelog-github": "0.4.4", diff --git a/src/core/index.scss b/src/core/index.scss index 166da98b06..e11fd53b6f 100644 --- a/src/core/index.scss +++ b/src/core/index.scss @@ -24,6 +24,8 @@ @import '../pagination/index.scss'; @import '../tooltips/index.scss'; @import '../truncate/index.scss'; +@import '../form-control/form-control.scss'; // Utilities always go last so that they can override components @import '../utilities/index.scss'; +@import '../primitives/index.scss'; diff --git a/src/form-control/form-control.scss b/src/form-control/form-control.scss new file mode 100644 index 0000000000..e4f80607ea --- /dev/null +++ b/src/form-control/form-control.scss @@ -0,0 +1,30 @@ +// size +// label placement +// hidden label +// placeholder +// leading visual +// clear button +// invisible? +// focus-within +// state + +.FormControl { + border: solid var(--primer-borderWidth-thin) var(--color-border-default); + border-radius: var(--primer-borderRadius-medium); + height: var(--primer-control-medium-size); + padding-inline: var(--primer-control-medium-paddingInline-normal); +} + +// size + +.FormControl--small { + height: var(--primer-control-small-size); +} + +.FormControl--medium { + height: var(--primer-control-medium-size); +} + +.FormControl--large { + height: var(--primer-control-large-size); +} diff --git a/src/primitives/index.scss b/src/primitives/index.scss new file mode 100644 index 0000000000..1a6bf9d92e --- /dev/null +++ b/src/primitives/index.scss @@ -0,0 +1,9 @@ +@import '@primer/primitives/tokens-v2-private/css/tokens/base/size/size.css'; +@import '@primer/primitives/tokens-v2-private/css/tokens/base/typography/typography.css'; +@import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/border.css'; +@import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/breakpoints.css'; +@import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/size-coarse.css'; +@import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/size-fine.css'; +@import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/size.css'; +@import '@primer/primitives/tokens-v2-private/css/tokens/functional/size/viewport.css'; +@import '@primer/primitives/tokens-v2-private/css/tokens/functional/typography/typography.css'; diff --git a/yarn.lock b/yarn.lock index 6d1b2e6ce1..b069cd67ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1162,7 +1162,7 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@primer/primitives@^7.7.0": +"@primer/primitives@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@primer/primitives/-/primitives-7.8.3.tgz#de7e03492cf977e99f2417490d76421db9715e9f" integrity sha512-04ZwfJhpZ0QFwDrJfCuLX6iOh0BflWDTvuoRA80lQH9xk0RtIg16INbruwwtnbSgnKKXXRSykRRJ5BbxnqufRA== From 88b7d108e7fec855d8ecee8fb951dc542f977543 Mon Sep 17 00:00:00 2001 From: Katie Langerman Date: Sat, 7 May 2022 00:30:45 +0000 Subject: [PATCH 02/19] layout --- src/form-control/form-control.scss | 81 +++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/src/form-control/form-control.scss b/src/form-control/form-control.scss index e4f80607ea..3039b79b32 100644 --- a/src/form-control/form-control.scss +++ b/src/form-control/form-control.scss @@ -9,10 +9,13 @@ // state .FormControl { + height: var(--primer-control-medium-size); + font-size: var(--primer-text-body-size-medium); + line-height: var(--primer-text-body-lineHeight-medium); border: solid var(--primer-borderWidth-thin) var(--color-border-default); border-radius: var(--primer-borderRadius-medium); - height: var(--primer-control-medium-size); padding-inline: var(--primer-control-medium-paddingInline-normal); + background-color: var(--color-canvas-default); } // size @@ -28,3 +31,79 @@ .FormControl--large { height: var(--primer-control-large-size); } + +.FormControl-label { + font-size: var(--primer-text-body-size-medium); + font-weight: var(--base-text-weight-semibold); + line-height: var(--primer-text-body-lineHeight-medium); +} + +.FormGroup { + display: grid; + gap: var(--primer-controlStack-medium-gap-condensed); +} + +.FormControl-fieldWrap { + display: inline-grid; + grid-template-areas: 'leadingVisual input trailingAction'; + grid-template-columns: min-content minmax(0, auto) min-content; + grid-template-rows: var(--primer-control-medium-size); + gap: var(--primer-controlStack-medium-gap-condensed); + align-items: center; + height: var(--primer-control-medium-size); + // border: solid var(--primer-borderWidth-thin) var(--color-border-default); + border-radius: var(--primer-borderRadius-medium); + box-shadow: var(--primer-borderInset-thin) var(--color-border-default); + padding-inline: var(--primer-control-medium-paddingInline-normal); + overflow: hidden; + background-color: var(--color-canvas-default); + padding-bottom: 1px; // optical alignment for firefox + + .FormControl-leadingVisual { + grid-area: leadingVisual; + } + + .FormControl { + grid-area: input; + border: 0; + padding: unset; + height: calc(var(--primer-control-medium-size) - 2px); + background-color: transparent; + + &:focus-visible, + &:focus { + box-shadow: none; + outline: none; + } + } + + .FormControl-trailingAction { + grid-area: trailingAction; + display: grid; + width: calc(var(--primer-control-medium-size) - 2px); + height: calc(var(--primer-control-medium-size) - 2px); + color: var(--color-fg-muted); + cursor: pointer; + user-select: none; + background-color: transparent; + border: solid var(--primer-borderWidth-thin) transparent; + border-radius: var(--primer-borderRadius-medium); + // border-top-left-radius: 0; + // border-bottom-left-radius: 0; + transition: 0.2s cubic-bezier(0.3, 0, 0.5, 1); + transition-property: color, background-color, border-color; + place-content: center; + margin-right: calc(var(--primer-control-medium-paddingInline-normal) * -1); + + &:hover { + background-color: var(--color-btn-hover-bg); + border: $border-width $border-style var(--color-btn-hover-bg); + } + } + + &:focus-within { + // box-shadow: var(--primer-borderInset-thin) var(--color-accent-fg); + + @include focusBoxShadowInset(2px, var(--color-accent-fg)); + } +} From d4a3065048bd2d74dc16b8823b6472b9b2b04cf4 Mon Sep 17 00:00:00 2001 From: Katie Langerman Date: Sat, 7 May 2022 01:33:34 +0000 Subject: [PATCH 03/19] label positioning --- src/form-control/form-control.scss | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/form-control/form-control.scss b/src/form-control/form-control.scss index 3039b79b32..f11b02fee9 100644 --- a/src/form-control/form-control.scss +++ b/src/form-control/form-control.scss @@ -39,10 +39,20 @@ } .FormGroup { - display: grid; + display: inline-flex; + flex-direction: column; gap: var(--primer-controlStack-medium-gap-condensed); } +.FormGroup--inline { + flex-direction: row; + align-items: center; +} + +.FormGroup--fullWidth { + display: flex; +} + .FormControl-fieldWrap { display: inline-grid; grid-template-areas: 'leadingVisual input trailingAction'; From 628251a8405aede28e757e7e5f9bc602e449c6aa Mon Sep 17 00:00:00 2001 From: Katie Langerman Date: Sat, 7 May 2022 05:29:38 +0000 Subject: [PATCH 04/19] cleanup --- src/form-control/form-control.scss | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/form-control/form-control.scss b/src/form-control/form-control.scss index f11b02fee9..b0973f0981 100644 --- a/src/form-control/form-control.scss +++ b/src/form-control/form-control.scss @@ -20,14 +20,17 @@ // size +.FormControl-fieldWrap.FormControl--small, .FormControl--small { height: var(--primer-control-small-size); } +.FormControl-fieldWrap.FormControl--medium, .FormControl--medium { height: var(--primer-control-medium-size); } +.FormControl-fieldWrap.FormControl--large, .FormControl--large { height: var(--primer-control-large-size); } @@ -51,13 +54,17 @@ .FormGroup--fullWidth { display: flex; + + .FormControl-fieldWrap { + flex-grow: 1; + } } .FormControl-fieldWrap { display: inline-grid; grid-template-areas: 'leadingVisual input trailingAction'; grid-template-columns: min-content minmax(0, auto) min-content; - grid-template-rows: var(--primer-control-medium-size); + grid-template-rows: auto; gap: var(--primer-controlStack-medium-gap-condensed); align-items: center; height: var(--primer-control-medium-size); @@ -77,7 +84,7 @@ grid-area: input; border: 0; padding: unset; - height: calc(var(--primer-control-medium-size) - 2px); + height: 100%; background-color: transparent; &:focus-visible, @@ -98,8 +105,6 @@ background-color: transparent; border: solid var(--primer-borderWidth-thin) transparent; border-radius: var(--primer-borderRadius-medium); - // border-top-left-radius: 0; - // border-bottom-left-radius: 0; transition: 0.2s cubic-bezier(0.3, 0, 0.5, 1); transition-property: color, background-color, border-color; place-content: center; From 01118969ac9c36996d920b838cf8f7329b0beee0 Mon Sep 17 00:00:00 2001 From: Katie Langerman Date: Sat, 7 May 2022 16:52:33 +0000 Subject: [PATCH 05/19] states --- src/form-control/form-control.scss | 59 ++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/src/form-control/form-control.scss b/src/form-control/form-control.scss index b0973f0981..6275dd9090 100644 --- a/src/form-control/form-control.scss +++ b/src/form-control/form-control.scss @@ -16,6 +16,30 @@ border-radius: var(--primer-borderRadius-medium); padding-inline: var(--primer-control-medium-paddingInline-normal); background-color: var(--color-canvas-default); + transition: 80ms cubic-bezier(0.33, 1, 0.68, 1); + transition-property: color, background-color, box-shadow, border-color; + + &[disabled] { + color: var(--color-primer-fg-disabled); + background-color: var(--color-input-disabled-bg); + border-color: var(--color-border-default); + -webkit-text-fill-color: var(--color-primer-fg-disabled); // Fix for Safari + opacity: 1; // Fix for Safari iOS + + &::placeholder { + color: var(--color-primer-fg-disabled); + } + } + + &[invalid] { + border-color: var(--color-attention-emphasis); + } + + // Custom styling for HTML5 validation bubbles (WebKit only) + ::placeholder { + color: var(--color-fg-subtle); + opacity: 1; // override opacity in normalize.css + } } // size @@ -23,16 +47,31 @@ .FormControl-fieldWrap.FormControl--small, .FormControl--small { height: var(--primer-control-small-size); + font-size: var(--primer-text-body-size-small); + + .FormControl-trailingAction { + width: calc(var(--primer-control-small-size) - 8px); + height: calc(var(--primer-control-small-size) - 8px); + } } .FormControl-fieldWrap.FormControl--medium, .FormControl--medium { height: var(--primer-control-medium-size); + + .FormControl-trailingAction { + width: calc(var(--primer-control-medium-size) - 8px); + height: calc(var(--primer-control-medium-size) - 8px); + } } .FormControl-fieldWrap.FormControl--large, .FormControl--large { height: var(--primer-control-large-size); + .FormControl-trailingAction { + width: calc(var(--primer-control-large-size) - 8px); + height: calc(var(--primer-control-large-size) - 8px); + } } .FormControl-label { @@ -67,14 +106,15 @@ grid-template-rows: auto; gap: var(--primer-controlStack-medium-gap-condensed); align-items: center; + align-content: center; height: var(--primer-control-medium-size); // border: solid var(--primer-borderWidth-thin) var(--color-border-default); border-radius: var(--primer-borderRadius-medium); box-shadow: var(--primer-borderInset-thin) var(--color-border-default); padding-inline: var(--primer-control-medium-paddingInline-normal); - overflow: hidden; + // overflow: hidden; background-color: var(--color-canvas-default); - padding-bottom: 1px; // optical alignment for firefox + // padding-bottom: 1px; // optical alignment for firefox .FormControl-leadingVisual { grid-area: leadingVisual; @@ -97,8 +137,8 @@ .FormControl-trailingAction { grid-area: trailingAction; display: grid; - width: calc(var(--primer-control-medium-size) - 2px); - height: calc(var(--primer-control-medium-size) - 2px); + width: calc(var(--primer-control-medium-size) - 4px); + height: calc(var(--primer-control-medium-size) - 4px); color: var(--color-fg-muted); cursor: pointer; user-select: none; @@ -109,6 +149,8 @@ transition-property: color, background-color, border-color; place-content: center; margin-right: calc(var(--primer-control-medium-paddingInline-normal) * -1); + margin-right: -8px; + padding: 0; &:hover { background-color: var(--color-btn-hover-bg); @@ -121,4 +163,13 @@ @include focusBoxShadowInset(2px, var(--color-accent-fg)); } + + &.FormControl-fieldWrap--disabled { + color: var(--color-primer-fg-disabled); + background-color: var(--color-input-disabled-bg); + } + + &.FormControl-fieldWrap--invalid { + box-shadow: var(--primer-borderInset-thin) var(--color-danger-emphasis); + } } From 75fc5e6d804c5548db3a90feae1285abf1a3e7a5 Mon Sep 17 00:00:00 2001 From: Katie Langerman Date: Mon, 9 May 2022 00:49:11 +0000 Subject: [PATCH 06/19] cleanup --- src/core/index.scss | 1 - src/forms/checkbox-radio.scss | 20 +++ src/forms/form-common.scss | 102 +++++++++++ src/forms/index.scss | 4 + .../select-input.scss} | 158 +++++++----------- 5 files changed, 184 insertions(+), 101 deletions(-) create mode 100644 src/forms/checkbox-radio.scss create mode 100644 src/forms/form-common.scss rename src/{form-control/form-control.scss => forms/select-input.scss} (56%) diff --git a/src/core/index.scss b/src/core/index.scss index e11fd53b6f..7d9352fe3f 100644 --- a/src/core/index.scss +++ b/src/core/index.scss @@ -24,7 +24,6 @@ @import '../pagination/index.scss'; @import '../tooltips/index.scss'; @import '../truncate/index.scss'; -@import '../form-control/form-control.scss'; // Utilities always go last so that they can override components @import '../utilities/index.scss'; diff --git a/src/forms/checkbox-radio.scss b/src/forms/checkbox-radio.scss new file mode 100644 index 0000000000..74dfebf1eb --- /dev/null +++ b/src/forms/checkbox-radio.scss @@ -0,0 +1,20 @@ +// checkbox + radio specific styles +.FormControl--checkbox, +.FormControl--radio { + display: block; + width: var(--base-size-16); + height: var(--base-size-16); + background: var(--color-canvas-default); + border: solid var(--primer-borderWidth-thin) var(--color-border-default); + border-radius: var(--primer-borderRadius-small); + + &:disabled { + & + .FormControl-label { + color: var(--color-primer-fg-disabled); + } + } +} + +.FormControl--radio { + border-radius: var(--primer-borderRadius-full); +} diff --git a/src/forms/form-common.scss b/src/forms/form-common.scss new file mode 100644 index 0000000000..69dca243ea --- /dev/null +++ b/src/forms/form-common.scss @@ -0,0 +1,102 @@ +:root { + accent-color: var(--color-accent-fg); +} + +.FormControl { + background-color: var(--color-canvas-default); + border: solid var(--primer-borderWidth-thin) var(--color-border-default); + + &[disabled] { + color: var(--color-primer-fg-disabled); + background-color: var(--color-input-disabled-bg); + border-color: var(--color-border-default); + -webkit-text-fill-color: var(--color-primer-fg-disabled); // Fix for Safari + opacity: 1; // Fix for Safari iOS + } + + &[invalid] { + border-color: var(--color-attention-emphasis); + } +} + +// size + +.FormControl-fieldWrap.FormControl--small, +.FormControl--small { + height: var(--primer-control-small-size); + font-size: var(--primer-text-body-size-small); + + .FormControl--input-trailingAction { + width: calc(var(--primer-control-small-size) - 8px); + height: calc(var(--primer-control-small-size) - 8px); + } +} + +.FormControl-fieldWrap.FormControl--medium, +.FormControl--medium { + height: var(--primer-control-medium-size); + + .FormControl--input-trailingAction { + width: calc(var(--primer-control-medium-size) - 8px); + height: calc(var(--primer-control-medium-size) - 8px); + } +} + +.FormControl-fieldWrap.FormControl--large, +.FormControl--large { + height: var(--primer-control-large-size); + + .FormControl--input-trailingAction { + width: calc(var(--primer-control-large-size) - 8px); + height: calc(var(--primer-control-large-size) - 8px); + } +} + +//