diff --git a/packages/core/basic/Field/index.tsx b/packages/core/basic/Field/index.tsx index d6c843449..d1b4dd543 100755 --- a/packages/core/basic/Field/index.tsx +++ b/packages/core/basic/Field/index.tsx @@ -20,6 +20,7 @@ function Field(props: Types.PrivateProps, ref: React.ForwardedRef +
{label !== undefined && labelType === 'outside' && labelJSX}
diff --git a/packages/core/control/Select/index.tsx b/packages/core/control/Select/index.tsx index 20e44ceb0..853bd58f2 100755 --- a/packages/core/control/Select/index.tsx +++ b/packages/core/control/Select/index.tsx @@ -7,12 +7,14 @@ import React, { useState, } from 'react' -import { Drop, ScrollView } from '@stage-ui/core' +import { Button, Drop, ScrollView } from '@stage-ui/core' import Field from '@stage-ui/core/basic/Field' import DropTypes from '@stage-ui/core/layout/Drop/types' import { ChevronDown, Close } from '@stage-ui/icons' import { useSystem, createID } from '@stage-ui/system' +import { FocusTrap } from 'focus-trap-react' + import SharedZIndex from '../../utils/SharedZIndex' import styles from './styles' @@ -114,6 +116,17 @@ const Select: ForwardRefRenderFunction = (props, ref) => } }, [isOpen, searchValue, options?.map((value) => value.value).join()]) + /** + * Open and close select drop + */ + function toggleOpen(e?: React.MouseEvent) { + e?.stopPropagation() + if (!isOpen && disabled) { + return + } + setOpen(!isOpen) + } + /* * Keyboard control * TODO: handle keyboard control @@ -121,26 +134,16 @@ const Select: ForwardRefRenderFunction = (props, ref) => function handleKeyDown(event: React.KeyboardEvent) { switch (event.key) { case 'Enter': + case ' ': + toggleOpen() break case 'ArrowUp': - break case 'ArrowDown': - break case 'Backspace': break + default: + onKeyDown?.(event) } - onKeyDown?.(event) - } - - /** - * Open and close select drop - */ - function toggleOpen(e?: React.MouseEvent) { - e?.stopPropagation() - if (!isOpen && disabled) { - return - } - setOpen(!isOpen) } /** @@ -196,7 +199,7 @@ const Select: ForwardRefRenderFunction = (props, ref) => const renderOption = (option: Types.Option) => { const isThisOptionSelected = values.map((item) => item.value).includes(option.value) return ( -
= (props, ref) => e.stopPropagation() setOption(option) }} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + setOption(option) + } + }} > {customRenderOption ? customRenderOption(option, isThisOptionSelected) : option.text} -
+ ) } @@ -231,6 +239,7 @@ const Select: ForwardRefRenderFunction = (props, ref) => return ( = (props, ref) => target={fieldRef} >
+ {/* @ts-expect-error - containerElements works using querySelector reference, but throws type error */} + {!!dropHeader &&
{dropHeader}
} = (props, ref) => overrides={{ content: classes.scrollContent, }} + className="select__scroll-view" > {options.map(renderOption)} {options.length === 0 && ( diff --git a/packages/core/control/Select/styles.ts b/packages/core/control/Select/styles.ts index 96bafd86c..00bfc2bdb 100755 --- a/packages/core/control/Select/styles.ts +++ b/packages/core/control/Select/styles.ts @@ -15,7 +15,11 @@ const createClasses: Stage.CreateClasses = ( return { container: {}, label: {}, - field: {}, + field: { + '&:focus, &#focused:focus': { + boxShadow: `0px 0px 2px 2px ${theme.color.blue[500].string()} !important`, + }, + }, rightChild: {}, leftChild: {}, selectedArea: { @@ -42,6 +46,7 @@ const createClasses: Stage.CreateClasses = ( '&::placeholder': { color: theme.color.light.rgb().string(), }, + userSelect: 'none', }, state.searchMode && { color: theme.color.hard.rgb().string(), @@ -161,6 +166,9 @@ const createClasses: Stage.CreateClasses = ( scrollContent: { maxHeight: maxScrollHeight, padding: `calc(${theme.assets.field[size].indent} / 2)`, + display: 'flex', + flexDirection: 'column', + gap: '0.25rem', }, option: (state) => [ @@ -170,11 +178,16 @@ const createClasses: Stage.CreateClasses = ( cursor: 'pointer', userSelect: 'none', borderRadius: theme.radius.s, + backgroundColor: 'transparent', + width: '100%', + justifyContent: 'flex-start', + color: theme.color.primary.rgb().string(), + + padding: `calc(${theme.assets.field[size].indent} / 2)`, ':hover': { color: theme.color.primary.rgb().string(), - backgroundColor: theme.color.primary.alpha(0.1).rgb().string(), + backgroundColor: `${theme.color.primary.alpha(0.1).rgb().string()}`, }, - padding: `calc(${theme.assets.field[size].indent} / 2)`, }, theme.assets.typography.text[size], state.selected && { diff --git a/packages/testbed/src/index.tsx b/packages/testbed/src/index.tsx index 14503769c..4964cd892 100755 --- a/packages/testbed/src/index.tsx +++ b/packages/testbed/src/index.tsx @@ -1,7 +1,8 @@ -import { light } from './theme' -import { DatePicker, Modal, modal, Viewport } from '@stage-ui/core' +import { modal, Viewport } from '@stage-ui/core' + import ReactDOM from 'react-dom' -import { useState } from 'react' + +import { light } from './theme' const App: React.FC = () => { const handleOpen = () => {