diff --git a/semcore/base-components/src/components/hint/style/hint.shadow.css b/semcore/base-components/src/components/hint/style/hint.shadow.css index 42e1b824a8..de5ba889d3 100644 --- a/semcore/base-components/src/components/hint/style/hint.shadow.css +++ b/semcore/base-components/src/components/hint/style/hint.shadow.css @@ -9,7 +9,7 @@ SHintPopper { pointer-events: none; background: var(--intergalactic-tooltip-invert, oklch(0.23 0.01 140)); /* TODO: --intergalactic-tooltip-bg-invert or consider adding hint category */ - border: 1px solid var(--intergalactic-border-tooltip-invert, oklch(0.995 0.008 145.9 / 0.369)); /* TODO: --intergalactic-tooltip-border-invert or consider adding hint category */ + border: 1px solid var(--intergalactic-border-tooltip-invert, oklch(0.974 0.047 140 / 0.136)); /* TODO: --intergalactic-tooltip-border-invert or consider adding hint category */ color: var(--intergalactic-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); padding: var(--intergalactic-spacing-1x, 4px) var(--intergalactic-spacing-2x, 8px); border-radius: var(--intergalactic-rounded-small, 4px); diff --git a/semcore/bulk-textarea/src/components/InputField/inputField.shadow.css b/semcore/bulk-textarea/src/components/InputField/inputField.shadow.css index 514a43e360..55f2ac81e7 100644 --- a/semcore/bulk-textarea/src/components/InputField/inputField.shadow.css +++ b/semcore/bulk-textarea/src/components/InputField/inputField.shadow.css @@ -23,13 +23,13 @@ SInputField>ol { color: var(--intergalactic-text-placeholder, oklch(0.098 0.023 157.4 / 0.457)); position: absolute; white-space: pre-wrap; - padding-left: var(--intergalactic-spacing-4x, 16px); - text-indent: calc(-1 * var(--intergalactic-spacing-4x, 16px)); + padding-left: var(--intergalactic-spacing-content-padding-medium, 12px); + text-indent: calc(-1 * var(--intergalactic-spacing-content-padding-medium, 12px)); } >li { counter-increment: list-counter; - margin: 0 0 var(--intergalactic-spacing-1x, 4px) 0; + margin: 0 0 var(--intergalactic-spacing-content-padding-xsmall, 4px) 0; position: relative; word-break: break-all; white-space: pre-wrap; @@ -48,7 +48,7 @@ SInputField>ol { text-align: right; color: var(--intergalactic-text-secondary, oklch(0.088 0.026 147.7 / 0.583)); - margin-right: var(--intergalactic-spacing-1x, 4px); + margin-right: var(--intergalactic-spacing-content-gap-small, 4px); font-variant-numeric: normal; font-weight: 300; } @@ -113,7 +113,7 @@ SInputField[showErrors]>ol[aria-invalid]>li[aria-invalid]:after { } SInputField[size='m']>ol { - padding: var(--intergalactic-spacing-2x, 8px) var(--intergalactic-spacing-4x, 16px); + padding: var(--intergalactic-spacing-content-padding-xsmall, 4px) var(--intergalactic-spacing-content-padding-large, 16px) var(--intergalactic-spacing-content-padding-xsmall, 4px) var(--intergalactic-spacing-content-padding-medium, 12px); font-size: var(--intergalactic-fs-200, 14px); line-height: var(--intergalactic-lh-200, 142%); @@ -122,16 +122,16 @@ SInputField[size='m']>ol { max-height: calc((var(--maxRows) - 1) * (20px + var(--intergalactic-spacing-1x, 4px)) + 18px); &:empty { - padding-left: var(--intergalactic-spacing-8x, 32px); + padding-left: calc(var(--intergalactic-spacing-content-padding-xlarge, 20px) + 6px); &::before { - left: calc(var(--intergalactic-spacing-4x, 16px) + 1px); + left: var(--intergalactic-spacing-content-padding-medium, 12px); } } } SInputField[size='l']>ol { - padding: var(--intergalactic-spacing-3x, 12px) var(--intergalactic-spacing-4x, 16px); + padding: var(--intergalactic-spacing-content-padding-small, 8px) var(--intergalactic-spacing-content-padding-large, 16px) var(--intergalactic-spacing-content-padding-small, 8px) var(--intergalactic-spacing-content-padding-medium, 12px); font-size: var(--intergalactic-fs-300, 16px); line-height: var(--intergalactic-lh-300, 150%); @@ -139,10 +139,10 @@ SInputField[size='l']>ol { max-height: calc((var(--maxRows) - 1) * (24px + var(--intergalactic-spacing-1x, 4px)) + 20px); &:empty { - padding-left: calc(var(--intergalactic-spacing-8x, 32px) + var(--intergalactic-spacing-05x, 2px)); + padding-left: calc(var(--intergalactic-spacing-content-padding-xlarge, 20px) + var(--intergalactic-spacing-content-padding-small, 8px)); &::before { - left: var(--intergalactic-spacing-4x, 16px); + left: var(--intergalactic-spacing-content-padding-medium, 12px); } } } diff --git a/semcore/button/src/component/Button/button.shadow.css b/semcore/button/src/component/Button/button.shadow.css index 0f20452d60..00aaf3558a 100644 --- a/semcore/button/src/component/Button/button.shadow.css +++ b/semcore/button/src/component/Button/button.shadow.css @@ -21,6 +21,7 @@ SButton { -webkit-tap-highlight-color: transparent; font-weight: var(--intergalactic-medium, 500); color: var(--intergalactic-control-text-secondary, oklch(0.088 0.026 147.7 / 0.583)); + min-width: fit-content; &::-moz-focus-inner { padding: 0; @@ -49,7 +50,6 @@ SButton[size='s'] { SButton[size='m'] { height: var(--intergalactic-form-control-m, 32px); - min-width: var(--intergalactic-form-control-m, 32px); border-radius: var(--intergalactic-control-rounded, 6px); font-size: var(--intergalactic-fs-200, 14px); } @@ -61,7 +61,6 @@ SButton[size='m']:has(SAddon:only-child) { SButton[size='l'] { height: var(--intergalactic-form-control-l, 44px); - min-width: var(--intergalactic-form-control-l, 44px); border-radius: var(--intergalactic-control-rounded, 6px); font-size: var(--intergalactic-fs-300, 16px); } @@ -187,18 +186,18 @@ SButton[theme='secondary-muted'] { SButton[theme='secondary-invert'] { color: var(--intergalactic-control-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); - background-color: var(--intergalactic-control-secondary-invert, oklch(0.983 0.03 140 / 0.183)); + background-color: var(--intergalactic-control-secondary-invert, oklch(0.969 0.057 140 / 0.118)); &:hover { color: var(--intergalactic-control-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); - background-color: var(--intergalactic-control-secondary-invert-hover, oklch(0.986 0.025 140 / 0.203)); + background-color: var(--intergalactic-control-secondary-invert-hover, oklch(0.98 0.036 140 / 0.164)); } &:active, &[active] { color: var(--intergalactic-control-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); background-color: var(--intergalactic-control-secondary-invert-active, - oklch(0.988 0.021 140 / 0.222)); + oklch(0.986 0.025 140 / 0.203)); } } @@ -241,13 +240,13 @@ SButton[theme='tertiary-invert'] { &:hover { color: var(--intergalactic-control-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); - background-color: var(--intergalactic-control-tertiary-invert-hover, oklch(0.986 0.025 140 / 0.203)); + background-color: var(--intergalactic-control-tertiary-invert-hover, oklch(0.98 0.036 140 / 0.164)); } &:active, &[active] { color: var(--intergalactic-control-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); - background-color: var(--intergalactic-control-tertiary-invert-active, oklch(0.988 0.021 140 / 0.222)); + background-color: var(--intergalactic-control-tertiary-invert-active, oklch(0.986 0.025 140 / 0.203)); } } diff --git a/semcore/input-tags/src/style/input-tag.shadow.css b/semcore/input-tags/src/style/input-tag.shadow.css index 08af38ed01..728f238588 100644 --- a/semcore/input-tags/src/style/input-tag.shadow.css +++ b/semcore/input-tags/src/style/input-tag.shadow.css @@ -43,13 +43,13 @@ SInputTags>div[data-ui-name='ScrollArea.Bar'][orientation='vertical'] { SInputTags[size='m'] { min-height: var(--intergalactic-form-control-m, 32px); height: auto; - padding: 0 calc(var(--intergalactic-spacing-1x, 4px) + var(--intergalactic-spacing-05x, 2px)) 0 var(--intergalactic-spacing-1x, 4px); + padding: var(--intergalactic-spacing-content-padding-xsmall, 4px) var(--intergalactic-spacing-content-padding-medium, 12px); } SInputTags[size='l'] { min-height: var(--intergalactic-form-control-l, 44px); height: auto; - padding: 0 calc(var(--intergalactic-spacing-2x, 8px) + var(--intergalactic-spacing-05x, 2px)) 0 var(--intergalactic-spacing-2x, 8px); + padding: calc(var(--intergalactic-spacing-content-padding-xsmall, 4px) + 2px) var(--intergalactic-spacing-content-padding-medium, 12px); } SInputTags STag:focus-visible, SInputTags STagContainerClose:focus-visible { @@ -59,8 +59,12 @@ SInputTags STag:focus-visible, SInputTags STagContainerClose:focus-visible { } } -STagContainer { - margin: var(--intergalactic-spacing-05x, 2px); +STagContainer[size='m'] { + margin: 0 var(--intergalactic-spacing-05x, 2px) var(--intergalactic-spacing-1x, 4px) 0; +} + +STagContainer[size='l'] { + margin: 0 var(--intergalactic-spacing-05x, 2px) var(--intergalactic-spacing-1x, 4px) 0; } STagContainer[editable] { diff --git a/semcore/tag/src/Tag.tsx b/semcore/tag/src/Tag.tsx index 6f36e64f70..b9e28fdf50 100644 --- a/semcore/tag/src/Tag.tsx +++ b/semcore/tag/src/Tag.tsx @@ -69,6 +69,16 @@ class RootTag extends Component< } }; + resolvedTheme() { + const { theme, invert } = this.asProps; + + if (invert === true) { + return `${theme}-invert`; + } + + return theme; + } + render() { const STag = Root; const { @@ -82,6 +92,7 @@ class RootTag extends Component< resolveColor, id: outerId, uid, + theme, } = this.asProps; const id = outerId || `igc-${uid}-tag`; const isInteractiveView = !disabled && interactive; @@ -93,7 +104,8 @@ class RootTag extends Component< id={id} use:interactive={isInteractive} use:interactiveView={isInteractiveView} - tag-color={resolveColor(color)} + use:theme={this.resolvedTheme()} + tag-color={theme === 'primary' ? resolveColor(color) : undefined} onKeyDown={this.handleKeyDown} use:tabIndex={isInteractive ? 0 : -1} role={isInteractive ? 'button' : undefined} @@ -153,6 +165,7 @@ class RootTagContainer extends Component< addonLeft, addonRight, active, + invert, } = this.asProps; const id = outerId || `igc-${uid}-tag`; @@ -168,6 +181,7 @@ class RootTagContainer extends Component< addonLeft, addonRight, active, + invert, }; } @@ -198,7 +212,7 @@ class RootTagContainer extends Component< return { disabled, size, - theme, + 'theme': this.resolvedTheme(), color, 'id': `${id}-clear`, 'aria-labelledby': `${id}-clear ${id}-text`, @@ -207,6 +221,16 @@ class RootTagContainer extends Component< }; } + resolvedTheme() { + const { theme, invert } = this.asProps; + + if (invert === true) { + return `${theme}-invert`; + } + + return theme; + } + render() { const STagContainer = Root; const { styles, Children, forcedAdvancedMode } = this.asProps; diff --git a/semcore/tag/src/Tag.type.ts b/semcore/tag/src/Tag.type.ts index d928d2d486..32a2fdbd83 100644 --- a/semcore/tag/src/Tag.type.ts +++ b/semcore/tag/src/Tag.type.ts @@ -27,8 +27,10 @@ declare namespace NSTag { * @default primary */ theme?: NSTag.Theme; - /** Tag color text */ - color?: string; + /** + * Flag for invert the tag to display in a dark theme or on a dark background. + */ + invert?: boolean; /** Tag size * @default m */ @@ -39,7 +41,15 @@ declare namespace NSTag { addonRight?: React.ElementType; /** Specifies the locale for i18n support */ locale?: string; - }; + } & ({ + theme?: 'primary'; + /** Tag color text */ + color?: string; + } | { + theme?: 'secondary' | 'additional'; + /** Tag color text */ + color?: never; + }); type DefaultProps = { theme: 'primary'; color: 'gray-500'; diff --git a/semcore/tag/src/style/tag.shadow.css b/semcore/tag/src/style/tag.shadow.css index e951c4c3cc..8230924a61 100644 --- a/semcore/tag/src/style/tag.shadow.css +++ b/semcore/tag/src/style/tag.shadow.css @@ -45,12 +45,12 @@ STagContainerClose { align-items: center; justify-content: center; vertical-align: middle; - border: 1px solid var(--intergalactic-bg-primary-neutral, oklch(1 0 0)); /* TODO: --intergalactic-tag-primary-border */ + border: 1px solid var(--intergalactic-tag-primary-border, oklch(1 0 0)); box-sizing: border-box; - background-color: var(--intergalactic-bg-primary-neutral, oklch(1 0 0)); /* TODO: --intergalactic-tag-primary-bg-normal */ + background-color: var(--intergalactic-tag-primary-bg-normal, oklch(1 0 0)); border-radius: var(--intergalactic-tag-rounded, 24px); - padding-left: var(--intergalactic-spacing-1x, 4px); - padding-right: var(--intergalactic-spacing-1x, 4px); + padding-left: var(--intergalactic-spacing-content-gap-small, 4px); + padding-right: var(--intergalactic-spacing-content-gap-small, 4px); font-family: inherit; font-weight: var(--intergalactic-medium, 500); color: var(--tag-color); @@ -135,7 +135,7 @@ STag[size="xl"], STagContainerClose[size="xl"] { height: 40px; min-width: 40px; - padding: 0 var(--intergalactic-spacing-2x, 8px); + padding: 0 var(--intergalactic-spacing-content-gap-large, 8px); & SText { font-size: var(--intergalactic-fs-300, 16px); @@ -167,62 +167,96 @@ STagContainer[theme="primary"] SAddon { } STag[theme="secondary"], -STagContainerClose[theme="secondary"], -STag[theme="additional"], -STagContainerClose[theme="additional"] { - /* chenge to ...? secondary: change to --intergalactic-tag-secondary-border; additional: change to --intergalactic-tag-additional-bg-normal */ - &::before { - opacity: 0.01; +STagContainerClose[theme="secondary"] { + color: var(--intergalactic-tag-secondary-text, #6a6c6a); + background-color: var(--intergalactic-tag-secondary-bg-normal, #ffffff); + border-color: var(--intergalactic-tag-secondary-border, oklch(0.95 0.002 180)); + + &::before, + &::after { + display: none; } &[interactiveView]:hover, &[interactiveView]:active, &[active] { - &:before { - opacity: 0.1; - } + background-color: var(--intergalactic-tag-secondary-bg-hover-active, #f4f5f5); } } -STag[theme="secondary"], -STagContainerClose[theme="secondary"], STag[theme="additional"], -STagContainerClose[theme="additional"], -STag[theme="secondary-invert"], -STagContainerClose[theme="secondary-invert"], -STag[theme="additional-invert"], -STagContainerClose[theme="additional-invert"] { +STagContainerClose[theme="additional"] { + color: var(--intergalactic-tag-additional-text, #6a6c6a); + background-color: var(--intergalactic-tag-additional-bg-normal, oklch(1 0 0)); + border-color: var(--intergalactic-tag-additional-border, oklch(0.95 0.002 180)); + border-style: dashed; + + &::before, &::after { - opacity: 0.5; + display: none; + } + + &[interactiveView]:hover, + &[interactiveView]:active, + &[active] { + background-color: var(--intergalactic-tag-additional-bg-hover-active, oklch(0.98 0.001 180)); } } STag[theme="primary-invert"], STagContainerClose[theme="primary-invert"] { - background-color: var( - --intergalactic-tag-primary-white-normal, - oklch(1 0 0) - ); - color: var(--intergalactic-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); + background-color: var(--intergalactic-tag-primary-bg-invert-normal, oklch(0.969 0.057 140 / 0.118)); + color: var(--intergalactic-tag-primary-text-invert, #ffffff); + border-color: transparent; + + &[interactiveView]:hover, + &[interactiveView]:active, + &[active] { + background-color: var(--intergalactic-tag-primary-bg-invert-hover-active, oklch(0.99 0.017 140 / 0.242)); + } } STag[theme="secondary-invert"], -STagContainerClose[theme="secondary-invert"], +STagContainerClose[theme="secondary-invert"] { + background-color: var(--intergalactic-tag-secondary-bg-invert-normal, transparent); + color: var(--intergalactic-tag-secondary-text-invert, oklch(0.997 0.004 165.9 / 0.684)); + border-color: var(--intergalactic-tag-secondary-border-invert, oklch(0.974 0.047 140 / 0.136)); + + &::before, + &::after { + display: none; + } + + &[interactiveView]:hover, + &[interactiveView]:active, + &[active] { + background-color: var(--intergalactic-tag-secondary-bg-invert-hover-active, oklch(0.98 0.036 140 / 0.164)); + } +} + STag[theme="additional-invert"], STagContainerClose[theme="additional-invert"] { - color: var(--intergalactic-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); /* TODO:--intergalactic-tag-secondary-white-text */ -} + background-color: var(--intergalactic-tag-additional-bg-invert-normal, transparent); + color: var(--intergalactic-tag-additional-text-invert, oklch(0.997 0.004 165.9 / 0.684)); + border-color: var(--intergalactic-tag-additional-border-invert, oklch(0.995 0.008 147.4 / 0.391)); + border-style: dashed; -STag[theme="additional"] { + &::before, &::after { - border-style: dashed; + display: none; + } + + &[interactiveView]:hover, + &[interactiveView]:active, + &[active] { + background-color: var(--intergalactic-tag-additional-bg-invert-hover-active, oklch(0.98 0.036 140 / 0.164)); } } SText { display: flex; - padding-left: var(--intergalactic-spacing-1x, 4px); - padding-right: var(--intergalactic-spacing-1x, 4px); + padding-left: var(--intergalactic-spacing-content-gap-small, 4px); + padding-right: var(--intergalactic-spacing-content-gap-small, 4px); position: relative; } @@ -258,6 +292,20 @@ STagContainer { align-items: center; justify-content: center; + STag[theme="secondary"]:not(:last-child), + STag[theme="additional"]:not(:last-child), + STag[theme="secondary-invert"]:not(:last-child), + STag[theme="additional-invert"]:not(:last-child) { + border-right: 0; + } + + STagContainerClose[theme="secondary"], + STagContainerClose[theme="additional"], + STagContainerClose[theme="secondary-invert"], + STagContainerClose[theme="additional-invert"] { + border-left: 0; + } + STag, SAddon { &:not(:last-child) { @@ -319,7 +367,7 @@ STagContainer { svg { padding-left: 0; - padding-right: var(--intergalactic-spacing-1x, 4px); + padding-right: var(--intergalactic-spacing-content-gap-small, 4px); } svg path { @@ -333,8 +381,8 @@ STagContainer { STagContainerClose[size="xl"] { svg { - padding-left: var(--intergalactic-spacing-1x, 4px); - padding-right: var(--intergalactic-spacing-2x, 8px); + padding-left: var(--intergalactic-spacing-content-gap-small, 4px); + padding-right: var(--intergalactic-spacing-content-gap-large, 8px); } } } diff --git a/semcore/textarea/src/style/textarea.shadow.css b/semcore/textarea/src/style/textarea.shadow.css index 309681631a..7d76a8e5ec 100644 --- a/semcore/textarea/src/style/textarea.shadow.css +++ b/semcore/textarea/src/style/textarea.shadow.css @@ -23,13 +23,15 @@ STextarea { } STextarea[size='m'] { - padding: var(--intergalactic-spacing-1x, 4px) var(--intergalactic-spacing-2x, 8px); + min-height: var(--intergalactic-form-control-m, 32px); + padding: var(--intergalactic-spacing-1x, 4px) var(--intergalactic-spacing-content-padding-medium, 12px); font-size: var(--intergalactic-fs-200, 14px); line-height: var(--intergalactic-lh-200, 142%); } STextarea[size='l'] { - padding: var(--intergalactic-spacing-2x, 8px) var(--intergalactic-spacing-2x, 8px) var(--intergalactic-spacing-2x, 8px) var(--intergalactic-spacing-3x, 12px); + min-height: var(--intergalactic-form-control-l, 44px); + padding: var(--intergalactic-spacing-2x, 8px) var(--intergalactic-spacing-content-padding-medium, 12px); font-size: var(--intergalactic-fs-300, 16px); line-height: var(--intergalactic-lh-300, 150%); } diff --git a/semcore/tooltip/src/style/tooltip.shadow.css b/semcore/tooltip/src/style/tooltip.shadow.css index 6a2e50be7c..9eca898ada 100644 --- a/semcore/tooltip/src/style/tooltip.shadow.css +++ b/semcore/tooltip/src/style/tooltip.shadow.css @@ -22,7 +22,7 @@ STooltip { STooltip[theme='invert'] { color: var(--intergalactic-text-primary-invert, oklch(0.999 0.001 180 / 0.949)); /* TODO: --intergalactic-tooltip-text-invert */ background-color: var(--intergalactic-tooltip-invert, oklch(0.23 0.01 140)); /* TODO: --intergalactic-tooltip-bg-invert */ - border: 1px solid var(--intergalactic-border-tooltip-invert, oklch(0.995 0.008 145.9 / 0.369)); /* TODO: --intergalactic-tooltip-border-invert */ + border: 1px solid var(--intergalactic-border-tooltip-invert, oklch(0.974 0.047 140 / 0.136)); /* TODO: --intergalactic-tooltip-border-invert */ } STooltip[theme='warning'] { @@ -52,7 +52,7 @@ SArrow { } SArrow[theme='invert'] { - border-color: var(--intergalactic-border-tooltip-invert, oklch(0.995 0.008 145.9 / 0.369)); /* TODO: --intergalactic-tooltip-border-invert */ + border-color: var(--intergalactic-border-tooltip-invert, oklch(0.974 0.047 140 / 0.136)); /* TODO: --intergalactic-tooltip-border-invert */ &::before { border-color: var(--intergalactic-tooltip-invert, oklch(0.23 0.01 140)); /* TODO: --intergalactic-tooltip-bg-invert */ diff --git a/stories/components/tag/advanced/examples/all-tags.tsx b/stories/components/tag/advanced/examples/all-tags.tsx index a21bceacc2..01cf88e796 100644 --- a/stories/components/tag/advanced/examples/all-tags.tsx +++ b/stories/components/tag/advanced/examples/all-tags.tsx @@ -1,5 +1,5 @@ import MathPlusM from '@semcore/icon/MathPlus/m'; -import { Flex } from '@semcore/ui/base-components'; +import { Box, Flex } from '@semcore/ui/base-components'; import Tag, { TagContainer } from '@semcore/ui/tag'; import React from 'react'; @@ -20,25 +20,80 @@ const SIZES = ['m', 'l', 'xl'] as const; export default function AllTags() { return ( - - - Primary - - - Secondary - - - Additional - - - Disabled - - + {SIZES.map((size) => ( + + Primary + Secondary + Disabled + + ))} + {SIZES.map((size) => ( + + + + Primary interactive + + + + + + Secondary interactive + + + + + + Secondary interactive + + + + ))} + + + {SIZES.map((size) => ( + + + Primary invert + + + Secondary invert + + + ))} + {SIZES.map((size) => ( + + + + Primary invert interactive + + + + + + Secondary invert interactive + + + + + + Additional invert interactive + + + + ))} + + {SIZES.map((size) => ( {COLORS.map((color) => ( - {color} + {color} ))} diff --git a/stories/patterns/ux-patterns/form/tests/Form.stories.tsx b/stories/patterns/ux-patterns/form/tests/Form.stories.tsx new file mode 100644 index 0000000000..ba02060ed7 --- /dev/null +++ b/stories/patterns/ux-patterns/form/tests/Form.stories.tsx @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; + +import HorizontalFormExample from './examples/horizontal-form'; +import VerticalFormExample from './examples/vertical-form'; + +const meta: Meta = { + title: 'Patterns/UX Patterns/Form/Tests', +}; + +export const HorizontalForm: StoryObj = { + render: HorizontalFormExample, +}; + +export const VerticalForm: StoryObj = { + render: VerticalFormExample, +}; + +export default meta; diff --git a/stories/patterns/ux-patterns/form/tests/examples/horizontal-form.tsx b/stories/patterns/ux-patterns/form/tests/examples/horizontal-form.tsx new file mode 100644 index 0000000000..d6668f6e87 --- /dev/null +++ b/stories/patterns/ux-patterns/form/tests/examples/horizontal-form.tsx @@ -0,0 +1,117 @@ +import { Flex } from '@semcore/ui/base-components'; +import BulkTextarea from '@semcore/ui/bulk-textarea'; +import Button from '@semcore/ui/button'; +import Flag, { iso2Name } from '@semcore/ui/flags'; +import Input from '@semcore/ui/input'; +import InputTags from '@semcore/ui/input-tags'; +import Textarea from '@semcore/ui/textarea'; +import React from 'react'; + +type HorizontalFormRowProps = { + size: 'm' | 'l'; +}; + +const HorizontalFormRow = ({ size }: HorizontalFormRowProps) => { + const [country, setCountry] = React.useState(''); + const [tags, setTags] = React.useState(['Tag name', 'Tag name']); + const [valueTag, setValueTag] = React.useState(''); + const [comment, setComment] = React.useState(''); + const [bulkComment, setBulkComment] = React.useState(''); + + const handleSubmit = (event: React.FormEvent) => { + event.preventDefault(); + alert(JSON.stringify({ country, tags, comment, bulkComment })); + }; + + const handleAppendTags = (newTags: string[]) => { + setTags((currentTags) => [...currentTags, ...newTags]); + setValueTag(''); + }; + + const handleRemoveTag = () => { + setTags((currentTags) => { + if (currentTags.length === 0) return currentTags; + setValueTag((currentValueTag) => `${currentTags.slice(-1)[0]} ${currentValueTag}`); + return currentTags.slice(0, -1); + }); + }; + + const handleCloseTag = (event: React.MouseEvent) => { + const index = Number(event.currentTarget.dataset.index); + setTags((currentTags) => currentTags.filter((_, tagIndex) => tagIndex !== index)); + }; + + return ( + + + + + + + + + + {tags.map((tag, idx) => ( + + {tag} + + + ))} + + + +