Skip to content

Commit

Permalink
fix(canvas) Increment/Decrement Fractional Grid Tracks (#6588)
Browse files Browse the repository at this point in the history
- Added `isFR` utility function.
- Modified `GridExpressionInput.onKeyDown` to handle arrow up and down
but only for fractional values.
  • Loading branch information
seanparsons authored Oct 25, 2024
1 parent 7f377c9 commit 45649c6
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 22 deletions.
4 changes: 4 additions & 0 deletions editor/src/components/inspector/common/css-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,10 @@ const CSSNumberUnits: Array<CSSNumberUnit> = [
'%',
]

export function isFR(unit: CSSNumberUnit): unit is 'fr' {
return unit === 'fr'
}

export interface CSSNumber {
value: number
unit: CSSNumberUnit | null
Expand Down
75 changes: 53 additions & 22 deletions editor/src/uuiui/inputs/grid-expression-input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import { jsx } from '@emotion/react'
import type { CSSProperties } from 'react'
import React from 'react'
import type { CSSNumberUnit } from '../../components/inspector/common/css-utils'
import {
cssKeyword,
gridDimensionsAreEqual,
isFR,
isGridCSSNumber,
isValidGridDimensionKeyword,
parseCSSNumber,
Expand All @@ -28,6 +30,9 @@ import { Icons, SmallerIcons } from '../icons'
import { NO_OP } from '../../core/shared/utils'
import { unless } from '../../utils/react-conditionals'
import { useColorTheme, UtopiaTheme } from '../styles/theme'
import type { Optic } from '../../core/shared/optics/optics'
import { fromField, fromTypeGuard, notNull } from '../../core/shared/optics/optic-creators'
import { exists, modify } from '../../core/shared/optics/optic-utilities'

interface GridExpressionInputProps {
testId: string
Expand All @@ -43,6 +48,8 @@ interface GridExpressionInputProps {

const DropdownWidth = 25

const ArrowKeyFractionalIncrement = 0.1

export const GridExpressionInput = React.memo(
({
testId,
Expand All @@ -66,32 +73,56 @@ export const GridExpressionInput = React.memo(

const onKeyDown = React.useCallback(
(e: React.KeyboardEvent) => {
if (e.key !== 'Enter') {
return
}
if (isValidGridDimensionKeyword(printValue)) {
return onUpdateNumberOrKeyword(cssKeyword(printValue))
}
switch (e.key) {
case 'Enter':
if (isValidGridDimensionKeyword(printValue)) {
return onUpdateNumberOrKeyword(cssKeyword(printValue))
}

const defaultUnit = isGridCSSNumber(value) ? value.value.unit : 'px'
const maybeNumber = parseCSSNumber(printValue, 'AnyValid', defaultUnit)
if (isRight(maybeNumber)) {
return onUpdateNumberOrKeyword(maybeNumber.value)
}
const defaultUnit = isGridCSSNumber(value) ? value.value.unit : 'px'
const maybeNumber = parseCSSNumber(printValue, 'AnyValid', defaultUnit)
if (isRight(maybeNumber)) {
return onUpdateNumberOrKeyword(maybeNumber.value)
}

const maybeMinmax = parseGridCSSMinmaxOrRepeat(printValue)
if (maybeMinmax != null) {
return onUpdateDimension({
...maybeMinmax,
lineName: value.lineName,
} as GridDimension)
}
const maybeMinmax = parseGridCSSMinmaxOrRepeat(printValue)
if (maybeMinmax != null) {
return onUpdateDimension({
...maybeMinmax,
lineName: value.lineName,
} as GridDimension)
}

if (printValue === '') {
return onUpdateNumberOrKeyword(cssKeyword('auto'))
}
if (printValue === '') {
return onUpdateNumberOrKeyword(cssKeyword('auto'))
}

setPrintValue(stringifyGridDimension(value))
setPrintValue(stringifyGridDimension(value))
break
case 'ArrowUp':
case 'ArrowDown':
e.preventDefault()
const gridNumberValueOptic: Optic<GridDimension, CSSNumber> = fromTypeGuard(
isGridCSSNumber,
).compose(fromField('value'))
const valueUnitOptic: Optic<GridDimension, 'fr'> = gridNumberValueOptic
.compose(fromField('unit'))
.compose(notNull())
.compose(fromTypeGuard(isFR))
const gridNumberNumberOptic: Optic<GridDimension, number> =
gridNumberValueOptic.compose(fromField('value'))
if (exists(valueUnitOptic, value)) {
function updateFractional(fractionalValue: number): number {
return (
fractionalValue +
(e.key === 'ArrowUp' ? ArrowKeyFractionalIncrement : -ArrowKeyFractionalIncrement)
)
}
const updatedDimension = modify(gridNumberNumberOptic, updateFractional, value)
onUpdateDimension(updatedDimension)
}
break
}
},
[printValue, onUpdateNumberOrKeyword, onUpdateDimension, value],
)
Expand Down

0 comments on commit 45649c6

Please sign in to comment.