@sanity/ui 3.0.0-static.10 → 3.0.0-static.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks-cjs/_visual-editing.js +160 -207
- package/dist/_chunks-cjs/_visual-editing.js.map +1 -1
- package/dist/_chunks-es/_visual-editing.mjs +161 -208
- package/dist/_chunks-es/_visual-editing.mjs.map +1 -1
- package/dist/_visual-editing.d.mts +1 -3
- package/dist/_visual-editing.d.ts +1 -3
- package/dist/cli.js +1 -1
- package/dist/css.d.mts +115 -2
- package/dist/css.d.ts +115 -2
- package/dist/css.js +539 -402
- package/dist/css.js.map +1 -1
- package/dist/css.mjs +541 -404
- package/dist/css.mjs.map +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +50 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +45 -12
- package/dist/index.mjs.map +1 -1
- package/dist/sanity-theme.css +1 -1
- package/dist/system.css +418 -182
- package/dist/theme.js +10 -11
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +10 -11
- package/dist/theme.mjs.map +1 -1
- package/package.json +1 -1
- package/src/css/_resp.ts +0 -1
- package/src/css/aspects/font/font.style.ts +7 -66
- package/src/css/aspects/shadow/shadow.style.ts +16 -41
- package/src/css/compile/compilePalette.ts +4 -3
- package/src/css/compile/compileSystem.ts +0 -3
- package/src/css/compile/compileTheme_v3.ts +233 -219
- package/src/css/components/skeleton/skeleton.style.ts +8 -4
- package/src/css/constants.ts +9 -0
- package/src/css/index.ts +1 -0
- package/src/css/primitives/_arrow/_arrow.style.ts +6 -8
- package/src/css/primitives/_arrow/_arrow.ts +4 -0
- package/src/css/primitives/_selectable/_selectable.style.ts +23 -23
- package/src/css/primitives/button/button.style.ts +48 -15
- package/src/css/primitives/card/card.style.ts +1 -1
- package/src/css/primitives/token/token.style.ts +37 -36
- package/src/css/responsiveRules.ts +12 -19
- package/src/css/types.ts +106 -3
- package/src/css/varNames.ts +101 -4
- package/src/css/vars.ts +52 -16
- package/src/theme/v3/buildTheme_v3.ts +1 -1
- package/src/theme/v3/{defaults.ts → defaultTokens.ts} +1 -2
- package/src/theme/v3/index.ts +1 -1
- package/src/theme/v3/resolveTokens.ts +9 -9
- package/src/ui/RootClassNames.tsx +41 -0
- package/src/ui/_compat/helpers.ts +72 -0
- package/src/ui/_compat/index.ts +2 -6
- package/src/ui/_compat/studioTheme.ts +7 -0
- package/src/ui/_compat/types.ts +0 -83
- package/src/ui/index.ts +1 -0
- package/src/ui/primitives/button/button.tsx +5 -6
- package/src/ui/primitives/popover/popover.tsx +25 -7
- package/src/ui/primitives/popover/popoverCard.tsx +46 -45
- package/src/ui/primitives/tooltip/tooltip.tsx +9 -2
- package/src/ui/primitives/tooltip/tooltipCard.tsx +1 -1
- package/src/ui/utils/arrow/arrow.tsx +3 -11
- package/src/ui/utils/elementQuery/elementQuery.tsx +10 -8
- package/src/ui/utils/virtualList/virtualList.tsx +37 -32
- package/src/css/components/breadcrumbs/rules.ts +0 -25
- package/src/css/components/dialog/rules.ts +0 -78
- package/src/css/components/skeleton/rules.ts +0 -113
- package/src/css/components/toast/rules.ts +0 -18
- package/src/css/components/tree/rules.ts +0 -168
- package/src/css/primitives/popover/rules.ts +0 -5
- package/src/css/primitives/spinner/rules.ts +0 -21
- package/src/css/primitives/token/rules.ts +0 -45
|
@@ -31,7 +31,7 @@ import {useArrayProp, usePrefersReducedMotion} from '../../hooks'
|
|
|
31
31
|
import {origin} from '../../middleware/origin'
|
|
32
32
|
import {Placement, PopoverMargins, Props} from '../../types'
|
|
33
33
|
import {LayerProps, LayerProvider, Portal, useBoundaryElement, useLayer} from '../../utils'
|
|
34
|
-
import {CardProps} from '../card'
|
|
34
|
+
import {CardProps, CardProvider, useCard} from '../card'
|
|
35
35
|
import {
|
|
36
36
|
DEFAULT_FALLBACK_PLACEMENTS,
|
|
37
37
|
DEFAULT_POPOVER_DISTANCE,
|
|
@@ -109,7 +109,17 @@ export interface PopoverProps extends CardProps, LayerProps {
|
|
|
109
109
|
const ViewportOverlay = () => {
|
|
110
110
|
const {zIndex} = useLayer()
|
|
111
111
|
|
|
112
|
-
return
|
|
112
|
+
return (
|
|
113
|
+
<div
|
|
114
|
+
style={{
|
|
115
|
+
position: 'fixed',
|
|
116
|
+
inset: 0,
|
|
117
|
+
width: '100vw',
|
|
118
|
+
height: '100vh',
|
|
119
|
+
zIndex,
|
|
120
|
+
}}
|
|
121
|
+
/>
|
|
122
|
+
)
|
|
113
123
|
}
|
|
114
124
|
|
|
115
125
|
/**
|
|
@@ -154,11 +164,13 @@ export const Popover = memo(
|
|
|
154
164
|
shadow = 3,
|
|
155
165
|
tone = 'inherit',
|
|
156
166
|
width: widthProp = 'auto',
|
|
157
|
-
// zOffset: zOffsetProp = layer.popover.zOffset,
|
|
158
167
|
zOffset: zOffsetProp = Z_OFFSETS.popover,
|
|
159
168
|
updateRef,
|
|
160
169
|
...restProps
|
|
161
170
|
} = props
|
|
171
|
+
|
|
172
|
+
const card = useCard()
|
|
173
|
+
|
|
162
174
|
const prefersReducedMotion = usePrefersReducedMotion()
|
|
163
175
|
const animate = prefersReducedMotion ? false : _animate
|
|
164
176
|
const zOffset = useArrayProp(zOffsetProp)
|
|
@@ -338,7 +350,8 @@ export const Popover = memo(
|
|
|
338
350
|
|
|
339
351
|
const popover = (
|
|
340
352
|
<LayerProvider zOffset={zOffset}>
|
|
341
|
-
{/* Optional transparent blocking overlay at the top-most z-index layer. Must be positioned
|
|
353
|
+
{/* Optional transparent blocking overlay at the top-most z-index layer. Must be positioned
|
|
354
|
+
before the below popover card. */}
|
|
342
355
|
{modal && <ViewportOverlay />}
|
|
343
356
|
|
|
344
357
|
<PopoverCard
|
|
@@ -356,13 +369,11 @@ export const Popover = memo(
|
|
|
356
369
|
placement={placement}
|
|
357
370
|
radius={radius}
|
|
358
371
|
ref={setFloating}
|
|
359
|
-
// referenceWidth={matchReferenceWidth ? referenceWidthRef.current : width}
|
|
360
372
|
scheme={scheme}
|
|
361
373
|
shadow={shadow}
|
|
362
374
|
originX={originX}
|
|
363
375
|
originY={originY}
|
|
364
376
|
strategy={strategy}
|
|
365
|
-
tone={tone}
|
|
366
377
|
x={x}
|
|
367
378
|
y={y}
|
|
368
379
|
>
|
|
@@ -374,7 +385,14 @@ export const Popover = memo(
|
|
|
374
385
|
const children =
|
|
375
386
|
open &&
|
|
376
387
|
(portal ? (
|
|
377
|
-
<Portal __unstable_name={typeof portal === 'string' ? portal : undefined}>
|
|
388
|
+
<Portal __unstable_name={typeof portal === 'string' ? portal : undefined}>
|
|
389
|
+
<CardProvider
|
|
390
|
+
tone={tone === 'inherit' ? (card?.tone ?? 'default') : tone}
|
|
391
|
+
scheme={scheme ?? 'light'}
|
|
392
|
+
>
|
|
393
|
+
{popover}
|
|
394
|
+
</CardProvider>
|
|
395
|
+
</Portal>
|
|
378
396
|
) : (
|
|
379
397
|
popover
|
|
380
398
|
))
|
|
@@ -6,7 +6,7 @@ import {CSSProperties, ForwardedRef, forwardRef, memo, useMemo} from 'react'
|
|
|
6
6
|
import {POPOVER_MOTION_PROPS} from '../../constants'
|
|
7
7
|
import {Placement, PopoverMargins, Props} from '../../types'
|
|
8
8
|
import {Arrow, useLayer} from '../../utils'
|
|
9
|
-
import {Card, CardProps
|
|
9
|
+
import {Card, CardProps} from '../card'
|
|
10
10
|
import {Flex} from '../flex'
|
|
11
11
|
import {
|
|
12
12
|
DEFAULT_POPOVER_ARROW_HEIGHT,
|
|
@@ -59,18 +59,21 @@ export const PopoverCard = memo(
|
|
|
59
59
|
overflow,
|
|
60
60
|
radius,
|
|
61
61
|
referenceWidth,
|
|
62
|
-
scheme,
|
|
62
|
+
// scheme: schemeProp,
|
|
63
63
|
shadow,
|
|
64
64
|
strategy,
|
|
65
65
|
style,
|
|
66
|
-
tone,
|
|
66
|
+
tone = 'inherit',
|
|
67
67
|
// width,
|
|
68
68
|
x: xProp,
|
|
69
69
|
y: yProp,
|
|
70
70
|
...restProps
|
|
71
71
|
} = props
|
|
72
72
|
|
|
73
|
-
const card = useCard()
|
|
73
|
+
// const card = useCard()
|
|
74
|
+
|
|
75
|
+
// const tone = toneProp ?? card?.tone ?? 'inherit'
|
|
76
|
+
// const scheme = schemeProp ?? card?.scheme ?? 'light'
|
|
74
77
|
|
|
75
78
|
const layer = useLayer()
|
|
76
79
|
|
|
@@ -110,51 +113,49 @@ export const PopoverCard = memo(
|
|
|
110
113
|
)
|
|
111
114
|
|
|
112
115
|
return (
|
|
113
|
-
<
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
<MotionCard
|
|
117
|
+
className={popoverCard()}
|
|
118
|
+
data-ui="Popover"
|
|
119
|
+
{...(restProps as CardProps & MotionProps)}
|
|
120
|
+
data-context-tone={tone}
|
|
121
|
+
data-placement={placement}
|
|
122
|
+
direction="column"
|
|
123
|
+
display="flex"
|
|
124
|
+
radius={radius}
|
|
125
|
+
ref={ref}
|
|
126
|
+
// scheme={scheme}
|
|
127
|
+
shadow={shadow}
|
|
128
|
+
sizing="border"
|
|
129
|
+
style={rootStyle}
|
|
130
|
+
tone={tone}
|
|
131
|
+
variants={POPOVER_MOTION_PROPS.card}
|
|
132
|
+
transition={POPOVER_MOTION_PROPS.transition}
|
|
133
|
+
initial={animate ? ['hidden', 'initial'] : undefined}
|
|
134
|
+
animate={animate ? ['visible', 'scaleIn'] : undefined}
|
|
135
|
+
exit={animate ? ['hidden', 'scaleOut'] : undefined}
|
|
136
|
+
>
|
|
137
|
+
<Flex
|
|
138
|
+
data-ui="Popover__wrapper"
|
|
120
139
|
direction="column"
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
scheme={scheme}
|
|
125
|
-
shadow={shadow}
|
|
126
|
-
sizing="border"
|
|
127
|
-
style={rootStyle}
|
|
128
|
-
tone={tone}
|
|
129
|
-
variants={POPOVER_MOTION_PROPS.card}
|
|
130
|
-
transition={POPOVER_MOTION_PROPS.transition}
|
|
131
|
-
initial={animate ? ['hidden', 'initial'] : undefined}
|
|
132
|
-
animate={animate ? ['visible', 'scaleIn'] : undefined}
|
|
133
|
-
exit={animate ? ['hidden', 'scaleOut'] : undefined}
|
|
140
|
+
flex={1}
|
|
141
|
+
maxWidth={maxWidth}
|
|
142
|
+
overflow={overflow}
|
|
134
143
|
>
|
|
135
|
-
<Flex
|
|
136
|
-
|
|
137
|
-
direction="column"
|
|
138
|
-
flex={1}
|
|
139
|
-
maxWidth={maxWidth}
|
|
140
|
-
overflow={overflow}
|
|
141
|
-
>
|
|
142
|
-
<Flex direction="column" flex={1} padding={padding}>
|
|
143
|
-
{children}
|
|
144
|
-
</Flex>
|
|
144
|
+
<Flex direction="column" flex={1} padding={padding}>
|
|
145
|
+
{children}
|
|
145
146
|
</Flex>
|
|
147
|
+
</Flex>
|
|
146
148
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
</CardProvider>
|
|
149
|
+
{arrow && (
|
|
150
|
+
<Arrow
|
|
151
|
+
ref={arrowRef}
|
|
152
|
+
style={arrowStyle}
|
|
153
|
+
width={DEFAULT_POPOVER_ARROW_WIDTH}
|
|
154
|
+
height={DEFAULT_POPOVER_ARROW_HEIGHT}
|
|
155
|
+
radius={DEFAULT_POPOVER_ARROW_RADIUS}
|
|
156
|
+
/>
|
|
157
|
+
)}
|
|
158
|
+
</MotionCard>
|
|
158
159
|
)
|
|
159
160
|
}),
|
|
160
161
|
)
|
|
@@ -35,6 +35,7 @@ import {origin} from '../../middleware/origin'
|
|
|
35
35
|
import type {Placement, Props} from '../../types'
|
|
36
36
|
import {Layer, type LayerProps, Portal, useBoundaryElement, usePortal} from '../../utils'
|
|
37
37
|
import {getElementRef} from '../../utils/getElementRef'
|
|
38
|
+
import {CardProvider, useCard} from '../card'
|
|
38
39
|
import type {Delay} from '../types'
|
|
39
40
|
import {
|
|
40
41
|
DEFAULT_FALLBACK_PLACEMENTS,
|
|
@@ -109,9 +110,10 @@ export const Tooltip = forwardRef(function Tooltip(
|
|
|
109
110
|
scheme,
|
|
110
111
|
shadow = 2,
|
|
111
112
|
zOffset = Z_OFFSETS.tooltip,
|
|
112
|
-
tone,
|
|
113
|
+
tone = 'inherit',
|
|
113
114
|
...restProps
|
|
114
115
|
} = props
|
|
116
|
+
const card = useCard()
|
|
115
117
|
const prefersReducedMotion = usePrefersReducedMotion()
|
|
116
118
|
const animate = prefersReducedMotion ? false : _animate
|
|
117
119
|
const fallbackPlacements = useArrayProp(fallbackPlacementsProp)
|
|
@@ -399,7 +401,12 @@ export const Tooltip = forwardRef(function Tooltip(
|
|
|
399
401
|
showTooltip &&
|
|
400
402
|
(portalProp ? (
|
|
401
403
|
<Portal __unstable_name={typeof portalProp === 'string' ? portalProp : undefined}>
|
|
402
|
-
|
|
404
|
+
<CardProvider
|
|
405
|
+
tone={tone === 'inherit' ? (card?.tone ?? 'default') : tone}
|
|
406
|
+
scheme={scheme ?? 'light'}
|
|
407
|
+
>
|
|
408
|
+
{node}
|
|
409
|
+
</CardProvider>
|
|
403
410
|
</Portal>
|
|
404
411
|
) : (
|
|
405
412
|
node
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {_arrow, _arrowShape, _arrowStroke} from '@sanity/ui/css'
|
|
1
|
+
import {_arrow, _arrowShape, _arrowStroke, _arrowStrokeMask} from '@sanity/ui/css'
|
|
2
2
|
import {CSSProperties, ForwardedRef, forwardRef, ReactElement, useMemo} from 'react'
|
|
3
3
|
|
|
4
|
-
import {useTheme_v2} from '../../_compat'
|
|
5
4
|
import {Props} from '../../types'
|
|
6
5
|
import {compileCommands, getRoundedCommands, Point} from './cmds'
|
|
7
6
|
|
|
@@ -11,8 +10,6 @@ export const Arrow = forwardRef(function Arrow(
|
|
|
11
10
|
ref: ForwardedRef<HTMLDivElement>,
|
|
12
11
|
): ReactElement {
|
|
13
12
|
const {width: w, height: h, radius = 0, style, ...restProps} = props
|
|
14
|
-
const {card} = useTheme_v2()
|
|
15
|
-
const strokeWidth = card.shadow.outline
|
|
16
13
|
|
|
17
14
|
const center = w / 2
|
|
18
15
|
|
|
@@ -42,14 +39,9 @@ export const Arrow = forwardRef(function Arrow(
|
|
|
42
39
|
>
|
|
43
40
|
<svg width={w} height={w} viewBox={`0 0 ${w} ${w}`}>
|
|
44
41
|
<mask id="stroke-mask">
|
|
45
|
-
<rect
|
|
42
|
+
<rect className={_arrowStrokeMask()} x={0} width={w} height={w} fill="white" />
|
|
46
43
|
</mask>
|
|
47
|
-
<path
|
|
48
|
-
className={_arrowStroke()}
|
|
49
|
-
d={strokePath}
|
|
50
|
-
mask="url(#stroke-mask)"
|
|
51
|
-
strokeWidth={strokeWidth * 2}
|
|
52
|
-
/>
|
|
44
|
+
<path className={_arrowStroke()} d={strokePath} mask="url(#stroke-mask)" />
|
|
53
45
|
<path className={_arrowShape()} d={fillPath} />
|
|
54
46
|
</svg>
|
|
55
47
|
</div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import {BREAKPOINTS} from '@sanity/ui/css'
|
|
1
2
|
import {ForwardedRef, forwardRef, useImperativeHandle, useMemo, useState} from 'react'
|
|
2
3
|
|
|
3
|
-
import {useTheme_v2} from '../../_compat'
|
|
4
4
|
import {useElementSize} from '../../hooks'
|
|
5
5
|
import {Props} from '../../types'
|
|
6
6
|
import {findMaxBreakpoints, findMinBreakpoints} from './helpers'
|
|
@@ -13,6 +13,8 @@ export interface MediaQueryProps {
|
|
|
13
13
|
media?: number[]
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
const defaultBreakpoints = Object.values(BREAKPOINTS)
|
|
17
|
+
|
|
16
18
|
/**
|
|
17
19
|
* DO NOT USE IN PRODUCTION.
|
|
18
20
|
* @beta
|
|
@@ -21,24 +23,24 @@ export const ElementQuery = forwardRef(function ElementQuery(
|
|
|
21
23
|
props: Props<MediaQueryProps, 'div'>,
|
|
22
24
|
forwardedRef: ForwardedRef<HTMLDivElement>,
|
|
23
25
|
) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const media = _media ?? theme.media
|
|
26
|
+
const {children, media: mediaProp, ...restProps} = props
|
|
27
|
+
const breakpoints = mediaProp ?? defaultBreakpoints
|
|
27
28
|
|
|
28
29
|
const [element, setElement] = useState<HTMLDivElement | null>(null)
|
|
29
30
|
const elementSize = useElementSize(element)
|
|
30
31
|
const width = useMemo(() => elementSize?.border.width ?? window.innerWidth, [elementSize])
|
|
31
32
|
|
|
32
33
|
const max = useMemo(() => {
|
|
33
|
-
const eq = findMaxBreakpoints(
|
|
34
|
+
const eq = findMaxBreakpoints(breakpoints, width)
|
|
34
35
|
|
|
35
36
|
return eq.length ? eq.join(' ') : undefined
|
|
36
|
-
}, [
|
|
37
|
+
}, [breakpoints, width])
|
|
38
|
+
|
|
37
39
|
const min = useMemo(() => {
|
|
38
|
-
const eq = findMinBreakpoints(
|
|
40
|
+
const eq = findMinBreakpoints(breakpoints, width)
|
|
39
41
|
|
|
40
42
|
return eq.length ? eq.join(' ') : undefined
|
|
41
|
-
}, [
|
|
43
|
+
}, [breakpoints, width])
|
|
42
44
|
|
|
43
45
|
useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => element, [
|
|
44
46
|
element,
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import {vars} from '@sanity/ui/css'
|
|
2
|
+
import {Space} from '@sanity/ui/theme'
|
|
1
3
|
import {
|
|
4
|
+
CSSProperties,
|
|
2
5
|
ForwardedRef,
|
|
3
6
|
forwardRef,
|
|
4
7
|
ReactElement,
|
|
@@ -10,7 +13,6 @@ import {
|
|
|
10
13
|
useState,
|
|
11
14
|
} from 'react'
|
|
12
15
|
|
|
13
|
-
import {useTheme_v2} from '../../_compat'
|
|
14
16
|
import {_isScrollable} from '../../helpers'
|
|
15
17
|
import {_ResizeObserver} from '../../observers'
|
|
16
18
|
import {Box, StackProps} from '../../primitives'
|
|
@@ -32,7 +34,7 @@ export interface VirtualListChangeOpts {
|
|
|
32
34
|
* @beta
|
|
33
35
|
*/
|
|
34
36
|
export interface VirtualListProps<Item = any> extends Omit<StackProps, 'gap'> {
|
|
35
|
-
gap?:
|
|
37
|
+
gap?: Space
|
|
36
38
|
getItemKey?: (item: Item, itemIndex: number) => string
|
|
37
39
|
items?: Item[]
|
|
38
40
|
onChange?: (opts: VirtualListChangeOpts) => void
|
|
@@ -46,27 +48,18 @@ export const VirtualList = forwardRef(function VirtualList(
|
|
|
46
48
|
props: Props<VirtualListProps, 'div'>,
|
|
47
49
|
forwardedRef: ForwardedRef<HTMLDivElement>,
|
|
48
50
|
): ReactElement {
|
|
49
|
-
const {
|
|
50
|
-
const {space} = useTheme_v2()
|
|
51
|
+
const {gap = 0, getItemKey, items = [], onChange, renderItem, ...restProps} = props
|
|
51
52
|
const ref = useRef<HTMLDivElement | null>(null)
|
|
52
53
|
const wrapperRef = useRef<HTMLDivElement | null>(null)
|
|
53
54
|
const [scrollTop, setScrollTop] = useState(0)
|
|
54
55
|
const [scrollHeight, setScrollHeight] = useState(0)
|
|
55
56
|
const [itemHeight, setItemHeight] = useState(-1)
|
|
56
57
|
|
|
58
|
+
const [gapValue, setGapValue] = useState(0)
|
|
59
|
+
|
|
57
60
|
// Sync ref to parent
|
|
58
61
|
useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)
|
|
59
62
|
|
|
60
|
-
useEffect(() => {
|
|
61
|
-
if (!wrapperRef.current) return
|
|
62
|
-
|
|
63
|
-
const firstElement = wrapperRef.current.firstChild
|
|
64
|
-
|
|
65
|
-
if (firstElement instanceof HTMLElement) {
|
|
66
|
-
setItemHeight(firstElement.offsetHeight)
|
|
67
|
-
}
|
|
68
|
-
}, [renderItem])
|
|
69
|
-
|
|
70
63
|
useEffect((): (() => void) | undefined => {
|
|
71
64
|
if (!ref.current) return
|
|
72
65
|
|
|
@@ -119,23 +112,42 @@ export const VirtualList = forwardRef(function VirtualList(
|
|
|
119
112
|
}, [])
|
|
120
113
|
|
|
121
114
|
const len = items.length
|
|
122
|
-
const height = itemHeight ? len * (itemHeight +
|
|
115
|
+
const height = itemHeight ? len * (itemHeight + gapValue) - gapValue : 0
|
|
123
116
|
const fromIndex = height ? Math.max(Math.floor((scrollTop / height) * len) - 2, 0) : 0
|
|
124
117
|
const toIndex = height ? Math.ceil(((scrollTop + scrollHeight) / height) * len) + 1 : 0
|
|
125
118
|
|
|
126
119
|
useEffect(() => {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
120
|
+
onChange?.({
|
|
121
|
+
fromIndex,
|
|
122
|
+
gap: gapValue,
|
|
123
|
+
itemHeight,
|
|
124
|
+
scrollHeight,
|
|
125
|
+
scrollTop,
|
|
126
|
+
toIndex,
|
|
127
|
+
})
|
|
128
|
+
}, [fromIndex, gapValue, itemHeight, onChange, scrollHeight, scrollTop, toIndex])
|
|
130
129
|
|
|
131
130
|
const children = useMemo(() => {
|
|
132
131
|
if (!renderItem || items.length === 0) return null
|
|
133
132
|
|
|
134
133
|
if (itemHeight === -1) {
|
|
135
134
|
return [
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
135
|
+
<>
|
|
136
|
+
<Box
|
|
137
|
+
ref={(el) => (el ? setItemHeight(el.offsetHeight) : undefined)}
|
|
138
|
+
insetTop={0}
|
|
139
|
+
insetLeft={0}
|
|
140
|
+
insetRight={0}
|
|
141
|
+
key={0}
|
|
142
|
+
position="absolute"
|
|
143
|
+
>
|
|
144
|
+
{renderItem(items[0])}
|
|
145
|
+
</Box>
|
|
146
|
+
<div
|
|
147
|
+
ref={(el) => (el ? setGapValue(el.offsetHeight) : undefined)}
|
|
148
|
+
style={{height: vars.space[gap]}}
|
|
149
|
+
/>
|
|
150
|
+
</>,
|
|
139
151
|
]
|
|
140
152
|
}
|
|
141
153
|
|
|
@@ -150,25 +162,18 @@ export const VirtualList = forwardRef(function VirtualList(
|
|
|
150
162
|
insetRight={0}
|
|
151
163
|
key={key}
|
|
152
164
|
position="absolute"
|
|
153
|
-
style={{top: itemIndex * (itemHeight +
|
|
165
|
+
style={{top: itemIndex * (itemHeight + gapValue) - gapValue}}
|
|
154
166
|
>
|
|
155
167
|
{node}
|
|
156
168
|
</Box>
|
|
157
169
|
)
|
|
158
170
|
})
|
|
159
|
-
}, [fromIndex, gap, getItemKey, itemHeight, items, renderItem,
|
|
171
|
+
}, [fromIndex, gap, gapValue, getItemKey, itemHeight, items, renderItem, toIndex])
|
|
160
172
|
|
|
161
|
-
const wrapperStyle = useMemo(() => ({height}), [height])
|
|
173
|
+
const wrapperStyle: CSSProperties = useMemo(() => ({height}), [height])
|
|
162
174
|
|
|
163
175
|
return (
|
|
164
|
-
<Box
|
|
165
|
-
// Root
|
|
166
|
-
as={as}
|
|
167
|
-
data-ui="VirtualList"
|
|
168
|
-
{...restProps}
|
|
169
|
-
position="relative"
|
|
170
|
-
ref={ref}
|
|
171
|
-
>
|
|
176
|
+
<Box data-ui="VirtualList" {...restProps} position="relative" ref={ref}>
|
|
172
177
|
<div ref={wrapperRef} style={wrapperStyle}>
|
|
173
178
|
{children}
|
|
174
179
|
</div>
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import {Rules} from '../../types'
|
|
2
|
-
|
|
3
|
-
export const breadcrumbsRules: Rules = {
|
|
4
|
-
breadcrumbs: {
|
|
5
|
-
lineHeight: 0,
|
|
6
|
-
},
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// import {styled} from '../../lib/styled'
|
|
10
|
-
// import {Button} from '../../primitives'
|
|
11
|
-
|
|
12
|
-
// export const Root = styled.ol`
|
|
13
|
-
// margin: 0;
|
|
14
|
-
// padding: 0;
|
|
15
|
-
// display: flex;
|
|
16
|
-
// list-style: none;
|
|
17
|
-
// align-items: center;
|
|
18
|
-
// white-space: nowrap;
|
|
19
|
-
// line-height: 0;
|
|
20
|
-
// `
|
|
21
|
-
|
|
22
|
-
// export const ExpandButton = styled(Button)`
|
|
23
|
-
// appearance: none;
|
|
24
|
-
// margin: -4px;
|
|
25
|
-
// `
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import {Rules} from '../../types'
|
|
2
|
-
import {vars} from '../../vars'
|
|
3
|
-
|
|
4
|
-
export const dialogRules: Rules = {
|
|
5
|
-
'dialog': {
|
|
6
|
-
'top': 0,
|
|
7
|
-
'left': 0,
|
|
8
|
-
'right': 0,
|
|
9
|
-
'bottom': 0,
|
|
10
|
-
'alignItems': 'center',
|
|
11
|
-
'justifyContent': 'center',
|
|
12
|
-
'outline': 'none',
|
|
13
|
-
|
|
14
|
-
'background': vars.color.backdrop,
|
|
15
|
-
|
|
16
|
-
// @ts-expect-error - TODO: fix this
|
|
17
|
-
'@keyframes': {
|
|
18
|
-
'dialog-zoom-in': {
|
|
19
|
-
from: {
|
|
20
|
-
opacity: 0,
|
|
21
|
-
transform: 'scale(0.95)',
|
|
22
|
-
},
|
|
23
|
-
to: {
|
|
24
|
-
opacity: 1,
|
|
25
|
-
transform: 'scale(1)',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
'dialog-fade-in': {
|
|
29
|
-
from: {
|
|
30
|
-
opacity: 0,
|
|
31
|
-
},
|
|
32
|
-
to: {
|
|
33
|
-
opacity: 1,
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
'@nest': {
|
|
39
|
-
'&[data-animate]': {
|
|
40
|
-
animation: 'dialog-fade-in 200ms ease-out',
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
// Animates the dialog card.
|
|
44
|
-
'&[data-animate] > [data-ui="DialogCard"]': {
|
|
45
|
-
animation: 'dialog-zoom-in 200ms ease-out',
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
'dialog-container': {
|
|
51
|
-
width: '100%',
|
|
52
|
-
height: '100%',
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
'dialog-card-root': {
|
|
56
|
-
width: '100%',
|
|
57
|
-
maxHeight: '100%',
|
|
58
|
-
// @ts-expect-error - TODO: fix this
|
|
59
|
-
overflow: ['hidden', 'clip'],
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
'dialog-layout': {
|
|
63
|
-
width: '100%',
|
|
64
|
-
},
|
|
65
|
-
|
|
66
|
-
'dialog-header': {
|
|
67
|
-
zIndex: 2,
|
|
68
|
-
},
|
|
69
|
-
|
|
70
|
-
'dialog-content': {
|
|
71
|
-
zIndex: 1,
|
|
72
|
-
outline: 'none',
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
'dialog-footer': {
|
|
76
|
-
zIndex: 3,
|
|
77
|
-
},
|
|
78
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import {FONT_CODE_SIZE, FONT_HEADING_SIZE, FONT_LABEL_SIZE, FONT_TEXT_SIZE} from '@sanity/ui/theme'
|
|
2
|
-
|
|
3
|
-
import {responsiveRules} from '../../responsiveRules'
|
|
4
|
-
import {Rules} from '../../types'
|
|
5
|
-
import {vars} from '../../vars'
|
|
6
|
-
|
|
7
|
-
export const skeletonRules: Rules = {
|
|
8
|
-
'skeleton': {
|
|
9
|
-
'--color-skeleton-from': `color-mix(in srgb, transparent, ${vars.color.muted.fg} 5%)`,
|
|
10
|
-
'--color-skeleton-to': `color-mix(in srgb, transparent, ${vars.color.muted.fg} 10%)`,
|
|
11
|
-
|
|
12
|
-
'backgroundColor': vars.color.skeleton.from,
|
|
13
|
-
'backgroundPosition': '100%',
|
|
14
|
-
'backgroundSize': '200% 100%',
|
|
15
|
-
'backgroundAttachment': 'fixed',
|
|
16
|
-
'opacity': 0,
|
|
17
|
-
'transition': 'opacity 200ms ease-in',
|
|
18
|
-
|
|
19
|
-
// @ts-expect-error - TODO: fix this
|
|
20
|
-
'@keyframes': {
|
|
21
|
-
'skeleton-pulse': {
|
|
22
|
-
'0%': {
|
|
23
|
-
backgroundPosition: '100%',
|
|
24
|
-
},
|
|
25
|
-
'100%': {
|
|
26
|
-
backgroundPosition: '-100%',
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
'@nest': {
|
|
32
|
-
'&[data-animated]': {
|
|
33
|
-
backgroundImage: [
|
|
34
|
-
`linear-gradient(to right`,
|
|
35
|
-
vars.color.skeleton.from,
|
|
36
|
-
vars.color.skeleton.to,
|
|
37
|
-
vars.color.skeleton.from,
|
|
38
|
-
vars.color.skeleton.from,
|
|
39
|
-
vars.color.skeleton.from,
|
|
40
|
-
`)`,
|
|
41
|
-
].join(', '),
|
|
42
|
-
animationName: 'skeleton-pulse',
|
|
43
|
-
animationTimingFunction: 'ease-in-out',
|
|
44
|
-
animationIterationCount: 'infinite',
|
|
45
|
-
animationDuration: '2000ms',
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
'&[data-visible]': {
|
|
49
|
-
opacity: 1,
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
'@media': {
|
|
54
|
-
'screen and (prefers-reduced-motion: no-preference)': {
|
|
55
|
-
backgroundColor: vars.color.skeleton.from,
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
'font-skeleton': {
|
|
61
|
-
height: `calc(var(--font-skeleton-line-height) - var(--font-skeleton-ascender-height) - var(--font-skeleton-descender-height))`,
|
|
62
|
-
},
|
|
63
|
-
|
|
64
|
-
// ...responsiveRules('text-skeleton-0', {
|
|
65
|
-
// '--font-skeleton-line-height': 'var(--font-text-0-line-height)',
|
|
66
|
-
// '--font-skeleton-ascender-height': 'var(--font-text-0-ascender-height)',
|
|
67
|
-
// '--font-skeleton-descender-height': 'var(--font-text-0-descender-height)',
|
|
68
|
-
// }),
|
|
69
|
-
|
|
70
|
-
...FONT_CODE_SIZE.reduce((acc, size) => {
|
|
71
|
-
return {
|
|
72
|
-
...acc,
|
|
73
|
-
...responsiveRules(`code-skeleton-${size}`, {
|
|
74
|
-
'--font-skeleton-line-height': vars.font.code.sizes[size].lineHeight,
|
|
75
|
-
'--font-skeleton-ascender-height': vars.font.code.sizes[size].ascenderHeight,
|
|
76
|
-
'--font-skeleton-descender-height': vars.font.code.sizes[size].descenderHeight,
|
|
77
|
-
}),
|
|
78
|
-
}
|
|
79
|
-
}, {}),
|
|
80
|
-
|
|
81
|
-
...FONT_HEADING_SIZE.reduce((acc, size) => {
|
|
82
|
-
return {
|
|
83
|
-
...acc,
|
|
84
|
-
...responsiveRules(`heading-skeleton-${size}`, {
|
|
85
|
-
'--font-skeleton-line-height': vars.font.heading.sizes[size].lineHeight,
|
|
86
|
-
'--font-skeleton-ascender-height': vars.font.heading.sizes[size].ascenderHeight,
|
|
87
|
-
'--font-skeleton-descender-height': vars.font.heading.sizes[size].descenderHeight,
|
|
88
|
-
}),
|
|
89
|
-
}
|
|
90
|
-
}, {}),
|
|
91
|
-
|
|
92
|
-
...FONT_LABEL_SIZE.reduce((acc, size) => {
|
|
93
|
-
return {
|
|
94
|
-
...acc,
|
|
95
|
-
...responsiveRules(`label-skeleton-${size}`, {
|
|
96
|
-
'--font-skeleton-line-height': vars.font.label.sizes[size].lineHeight,
|
|
97
|
-
'--font-skeleton-ascender-height': vars.font.label.sizes[size].ascenderHeight,
|
|
98
|
-
'--font-skeleton-descender-height': vars.font.label.sizes[size].descenderHeight,
|
|
99
|
-
}),
|
|
100
|
-
}
|
|
101
|
-
}, {}),
|
|
102
|
-
|
|
103
|
-
...FONT_TEXT_SIZE.reduce((acc, size) => {
|
|
104
|
-
return {
|
|
105
|
-
...acc,
|
|
106
|
-
...responsiveRules(`text-skeleton-${size}`, {
|
|
107
|
-
'--font-skeleton-line-height': vars.font.text.sizes[size].lineHeight,
|
|
108
|
-
'--font-skeleton-ascender-height': vars.font.text.sizes[size].ascenderHeight,
|
|
109
|
-
'--font-skeleton-descender-height': vars.font.text.sizes[size].descenderHeight,
|
|
110
|
-
}),
|
|
111
|
-
}
|
|
112
|
-
}, {}),
|
|
113
|
-
}
|