tldraw 4.1.0-next.b9999db71010 → 4.1.0-next.c6278e85ba60

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.
Files changed (33) hide show
  1. package/dist-cjs/index.d.ts +11 -2
  2. package/dist-cjs/index.js +4 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +63 -55
  5. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  6. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js +54 -47
  7. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +3 -3
  8. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js +62 -55
  9. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +2 -2
  10. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js +12 -5
  11. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +2 -2
  12. package/dist-cjs/lib/ui/version.js +3 -3
  13. package/dist-cjs/lib/ui/version.js.map +1 -1
  14. package/dist-esm/index.d.mts +11 -2
  15. package/dist-esm/index.mjs +10 -4
  16. package/dist-esm/index.mjs.map +2 -2
  17. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +68 -57
  18. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  19. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +54 -47
  20. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +3 -3
  21. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs +63 -56
  22. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +2 -2
  23. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs +12 -5
  24. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +2 -2
  25. package/dist-esm/lib/ui/version.mjs +3 -3
  26. package/dist-esm/lib/ui/version.mjs.map +1 -1
  27. package/package.json +3 -3
  28. package/src/index.ts +3 -0
  29. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +60 -49
  30. package/src/lib/ui/components/StylePanel/StylePanelButtonPicker.tsx +70 -53
  31. package/src/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.tsx +105 -90
  32. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +72 -51
  33. package/src/lib/ui/version.ts +3 -3
@@ -6,7 +6,7 @@ import {
6
6
  TLDefaultColorStyle,
7
7
  useEditor,
8
8
  } from '@tldraw/editor'
9
- import { memo, ReactElement, useMemo, useRef } from 'react'
9
+ import { memo, useMemo, useRef } from 'react'
10
10
  import { useDefaultColorTheme } from '../../../shapes/shared/useDefaultColorTheme'
11
11
  import { StyleValuesForUi } from '../../../styles'
12
12
  import { PORTRAIT_BREAKPOINT } from '../../constants'
@@ -34,8 +34,19 @@ export interface StylePanelButtonPickerProps<T extends string> {
34
34
  onHistoryMark?(id: string): void
35
35
  }
36
36
 
37
- /** @public */
38
- export const StylePanelButtonPicker = memo(function StylePanelButtonPicker<T extends string>(
37
+ function StylePanelButtonPickerInner<T extends string>(props: StylePanelButtonPickerProps<T>) {
38
+ const { enhancedA11yMode } = useStylePanelContext()
39
+ return (
40
+ <>
41
+ {enhancedA11yMode && <StylePanelSubheading>{props.title}</StylePanelSubheading>}
42
+ <TldrawUiToolbar label={props.title}>
43
+ <StylePanelButtonPickerInline {...props} />
44
+ </TldrawUiToolbar>
45
+ </>
46
+ )
47
+ }
48
+
49
+ function StylePanelButtonPickerInlineInner<T extends string>(
39
50
  props: StylePanelButtonPickerProps<T>
40
51
  ) {
41
52
  const ctx = useStylePanelContext()
@@ -126,54 +137,60 @@ export const StylePanelButtonPicker = memo(function StylePanelButtonPicker<T ext
126
137
  const Layout = items.length > 4 ? TldrawUiGrid : TldrawUiRow
127
138
 
128
139
  return (
129
- <>
130
- {ctx.enhancedA11yMode && <StylePanelSubheading>{title}</StylePanelSubheading>}
131
- <TldrawUiToolbar label={title}>
132
- <TldrawUiToolbarToggleGroup
133
- data-testid={`style.${uiType}`}
134
- type="single"
135
- value={value.type === 'shared' ? value.value : undefined}
136
- asChild
137
- >
138
- <Layout>
139
- {items.map((item) => {
140
- const isActive = value.type === 'shared' && value.value === item.value
141
- const label =
142
- title + ' — ' + msg(`${uiType}-style.${item.value}` as TLUiTranslationKey)
143
- return (
144
- <TldrawUiToolbarToggleItem
145
- type="icon"
146
- key={item.value}
147
- data-id={item.value}
148
- data-testid={`style.${uiType}.${item.value}`}
149
- aria-label={label + (isActive ? ` (${msg('style-panel.selected')})` : '')}
150
- tooltip={
151
- <>
152
- <div>{label}</div>
153
- {isActive ? <div>({msg('style-panel.selected')})</div> : null}
154
- </>
155
- }
156
- value={item.value}
157
- data-state={value.type === 'shared' && value.value === item.value ? 'on' : 'off'}
158
- data-isactive={isActive}
159
- title={label}
160
- style={
161
- style === (DefaultColorStyle as StyleProp<unknown>)
162
- ? { color: getColorValue(theme, item.value as TLDefaultColorStyle, 'solid') }
163
- : undefined
164
- }
165
- onPointerEnter={handleButtonPointerEnter}
166
- onPointerDown={handleButtonPointerDown}
167
- onPointerUp={handleButtonPointerUp}
168
- onClick={handleButtonClick}
169
- >
170
- <TldrawUiButtonIcon icon={item.icon} />
171
- </TldrawUiToolbarToggleItem>
172
- )
173
- })}
174
- </Layout>
175
- </TldrawUiToolbarToggleGroup>
176
- </TldrawUiToolbar>
177
- </>
140
+ <TldrawUiToolbarToggleGroup
141
+ data-testid={`style.${uiType}`}
142
+ type="single"
143
+ value={value.type === 'shared' ? value.value : null}
144
+ asChild
145
+ >
146
+ <Layout>
147
+ {items.map((item) => {
148
+ const isActive = value.type === 'shared' && value.value === item.value
149
+ const label = title + ' — ' + msg(`${uiType}-style.${item.value}` as TLUiTranslationKey)
150
+ return (
151
+ <TldrawUiToolbarToggleItem
152
+ type="icon"
153
+ key={item.value}
154
+ data-id={item.value}
155
+ data-testid={`style.${uiType}.${item.value}`}
156
+ aria-label={label + (isActive ? ` (${msg('style-panel.selected')})` : '')}
157
+ tooltip={
158
+ <>
159
+ <div>{label}</div>
160
+ {isActive ? <div>({msg('style-panel.selected')})</div> : null}
161
+ </>
162
+ }
163
+ value={item.value}
164
+ data-state={value.type === 'shared' && value.value === item.value ? 'on' : 'off'}
165
+ data-isactive={isActive}
166
+ title={label}
167
+ style={
168
+ style === (DefaultColorStyle as StyleProp<unknown>)
169
+ ? { color: getColorValue(theme, item.value as TLDefaultColorStyle, 'solid') }
170
+ : undefined
171
+ }
172
+ onPointerEnter={handleButtonPointerEnter}
173
+ onPointerDown={handleButtonPointerDown}
174
+ onPointerUp={handleButtonPointerUp}
175
+ onClick={handleButtonClick}
176
+ >
177
+ <TldrawUiButtonIcon icon={item.icon} />
178
+ </TldrawUiToolbarToggleItem>
179
+ )
180
+ })}
181
+ </Layout>
182
+ </TldrawUiToolbarToggleGroup>
178
183
  )
179
- }) as <T extends string>(props: StylePanelButtonPickerProps<T>) => ReactElement
184
+ }
185
+
186
+ /** @public @react */
187
+ export const StylePanelButtonPicker = memo(StylePanelButtonPickerInner) as <T extends string>(
188
+ props: StylePanelButtonPickerProps<T>
189
+ ) => React.JSX.Element
190
+
191
+ /** @public @react*/
192
+ export const StylePanelButtonPickerInline = memo(StylePanelButtonPickerInlineInner) as <
193
+ T extends string,
194
+ >(
195
+ props: StylePanelButtonPickerProps<T>
196
+ ) => React.JSX.Element
@@ -29,12 +29,27 @@ export interface StylePanelDoubleDropdownPickerProps<T extends string> {
29
29
  onValueChange?(style: StyleProp<T>, value: T): void
30
30
  }
31
31
 
32
- function DoubleDropdownPickerInner<T extends string>(
32
+ function StylePanelDoubleDropdownPickerInner<T extends string>(
33
+ props: StylePanelDoubleDropdownPickerProps<T>
34
+ ) {
35
+ const msg = useTranslation()
36
+ return (
37
+ <div className="tlui-style-panel__double-select-picker">
38
+ <div title={msg(props.label)} className="tlui-style-panel__double-select-picker-label">
39
+ {msg(props.label)}
40
+ </div>
41
+ <TldrawUiToolbar orientation="horizontal" label={msg(props.label)}>
42
+ <StylePanelDoubleDropdownPickerInline {...props} />
43
+ </TldrawUiToolbar>
44
+ </div>
45
+ )
46
+ }
47
+
48
+ function StylePanelDoubleDropdownPickerInlineInner<T extends string>(
33
49
  props: StylePanelDoubleDropdownPickerProps<T>
34
50
  ) {
35
51
  const ctx = useStylePanelContext()
36
52
  const {
37
- label,
38
53
  uiTypeA,
39
54
  uiTypeB,
40
55
  labelA,
@@ -70,100 +85,100 @@ function DoubleDropdownPickerInner<T extends string>(
70
85
  const idA = `style panel ${uiTypeA} A`
71
86
  const idB = `style panel ${uiTypeB} B`
72
87
  return (
73
- <div className="tlui-style-panel__double-select-picker">
74
- <div title={msg(label)} className="tlui-style-panel__double-select-picker-label">
75
- {msg(label)}
76
- </div>
77
- <TldrawUiToolbar orientation="horizontal" label={msg(label)}>
78
- <TldrawUiPopover id={idA} open={isOpenA} onOpenChange={setIsOpenA}>
79
- <TldrawUiPopoverTrigger>
80
- <TldrawUiToolbarButton
81
- type="icon"
82
- data-testid={`style.${uiTypeA}`}
83
- title={
84
- msg(labelA) +
85
- ' — ' +
86
- (valueA === null || valueA.type === 'mixed'
87
- ? msg('style-panel.mixed')
88
- : msg(`${uiTypeA}-style.${valueA.value}` as TLUiTranslationKey))
89
- }
90
- >
91
- <TldrawUiButtonIcon icon={iconA} small invertIcon />
92
- </TldrawUiToolbarButton>
93
- </TldrawUiPopoverTrigger>
94
- <TldrawUiPopoverContent side="left" align="center" sideOffset={80} alignOffset={0}>
95
- <TldrawUiToolbar orientation="grid" label={msg(labelA)}>
96
- <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
97
- {itemsA.map((item) => {
98
- return (
99
- <TldrawUiToolbarButton
100
- data-testid={`style.${uiTypeA}.${item.value}`}
101
- type="icon"
102
- key={item.value}
103
- onClick={() => {
104
- onValueChange(styleA, item.value)
105
- tlmenus.deleteOpenMenu(idA, editor.contextId)
106
- setIsOpenA(false)
107
- }}
108
- title={`${msg(labelA)} — ${msg(`${uiTypeA}-style.${item.value}`)}`}
109
- >
110
- <TldrawUiButtonIcon icon={item.icon} invertIcon />
111
- </TldrawUiToolbarButton>
112
- )
113
- })}
114
- </TldrawUiMenuContextProvider>
115
- </TldrawUiToolbar>
116
- </TldrawUiPopoverContent>
117
- </TldrawUiPopover>
118
- <TldrawUiPopover id={idB} open={isOpenB} onOpenChange={setIsOpenB}>
119
- <TldrawUiPopoverTrigger>
120
- <TldrawUiToolbarButton
121
- type="icon"
122
- data-testid={`style.${uiTypeB}`}
123
- title={
124
- msg(labelB) +
125
- ' — ' +
126
- (valueB === null || valueB.type === 'mixed'
127
- ? msg('style-panel.mixed')
128
- : msg(`${uiTypeB}-style.${valueB.value}` as TLUiTranslationKey))
129
- }
130
- >
131
- <TldrawUiButtonIcon icon={iconB} small />
132
- </TldrawUiToolbarButton>
133
- </TldrawUiPopoverTrigger>
134
- <TldrawUiPopoverContent side="left" align="center" sideOffset={116} alignOffset={0}>
135
- <TldrawUiToolbar orientation="grid" label={msg(labelB)}>
136
- <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
137
- {itemsB.map((item) => {
138
- return (
139
- <TldrawUiToolbarButton
140
- key={item.value}
141
- type="icon"
142
- title={`${msg(labelB)} — ${msg(`${uiTypeB}-style.${item.value}` as TLUiTranslationKey)}`}
143
- data-testid={`style.${uiTypeB}.${item.value}`}
144
- onClick={() => {
145
- onValueChange(styleB, item.value)
146
- tlmenus.deleteOpenMenu(idB, editor.contextId)
147
- setIsOpenB(false)
148
- }}
149
- >
150
- <TldrawUiButtonIcon icon={item.icon} />
151
- </TldrawUiToolbarButton>
152
- )
153
- })}
154
- </TldrawUiMenuContextProvider>
155
- </TldrawUiToolbar>
156
- </TldrawUiPopoverContent>
157
- </TldrawUiPopover>
158
- </TldrawUiToolbar>
159
- </div>
88
+ <>
89
+ <TldrawUiPopover id={idA} open={isOpenA} onOpenChange={setIsOpenA}>
90
+ <TldrawUiPopoverTrigger>
91
+ <TldrawUiToolbarButton
92
+ type="icon"
93
+ data-testid={`style.${uiTypeA}`}
94
+ title={
95
+ msg(labelA) +
96
+ ' — ' +
97
+ (valueA === null || valueA.type === 'mixed'
98
+ ? msg('style-panel.mixed')
99
+ : msg(`${uiTypeA}-style.${valueA.value}` as TLUiTranslationKey))
100
+ }
101
+ >
102
+ <TldrawUiButtonIcon icon={iconA} small invertIcon />
103
+ </TldrawUiToolbarButton>
104
+ </TldrawUiPopoverTrigger>
105
+ <TldrawUiPopoverContent side="left" align="center" sideOffset={80} alignOffset={0}>
106
+ <TldrawUiToolbar orientation="grid" label={msg(labelA)}>
107
+ <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
108
+ {itemsA.map((item) => {
109
+ return (
110
+ <TldrawUiToolbarButton
111
+ data-testid={`style.${uiTypeA}.${item.value}`}
112
+ type="icon"
113
+ key={item.value}
114
+ onClick={() => {
115
+ onValueChange(styleA, item.value)
116
+ tlmenus.deleteOpenMenu(idA, editor.contextId)
117
+ setIsOpenA(false)
118
+ }}
119
+ title={`${msg(labelA)} — ${msg(`${uiTypeA}-style.${item.value}`)}`}
120
+ >
121
+ <TldrawUiButtonIcon icon={item.icon} invertIcon />
122
+ </TldrawUiToolbarButton>
123
+ )
124
+ })}
125
+ </TldrawUiMenuContextProvider>
126
+ </TldrawUiToolbar>
127
+ </TldrawUiPopoverContent>
128
+ </TldrawUiPopover>
129
+ <TldrawUiPopover id={idB} open={isOpenB} onOpenChange={setIsOpenB}>
130
+ <TldrawUiPopoverTrigger>
131
+ <TldrawUiToolbarButton
132
+ type="icon"
133
+ data-testid={`style.${uiTypeB}`}
134
+ title={
135
+ msg(labelB) +
136
+ ' — ' +
137
+ (valueB === null || valueB.type === 'mixed'
138
+ ? msg('style-panel.mixed')
139
+ : msg(`${uiTypeB}-style.${valueB.value}` as TLUiTranslationKey))
140
+ }
141
+ >
142
+ <TldrawUiButtonIcon icon={iconB} small />
143
+ </TldrawUiToolbarButton>
144
+ </TldrawUiPopoverTrigger>
145
+ <TldrawUiPopoverContent side="left" align="center" sideOffset={116} alignOffset={0}>
146
+ <TldrawUiToolbar orientation="grid" label={msg(labelB)}>
147
+ <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
148
+ {itemsB.map((item) => {
149
+ return (
150
+ <TldrawUiToolbarButton
151
+ key={item.value}
152
+ type="icon"
153
+ title={`${msg(labelB)} — ${msg(`${uiTypeB}-style.${item.value}` as TLUiTranslationKey)}`}
154
+ data-testid={`style.${uiTypeB}.${item.value}`}
155
+ onClick={() => {
156
+ onValueChange(styleB, item.value)
157
+ tlmenus.deleteOpenMenu(idB, editor.contextId)
158
+ setIsOpenB(false)
159
+ }}
160
+ >
161
+ <TldrawUiButtonIcon icon={item.icon} />
162
+ </TldrawUiToolbarButton>
163
+ )
164
+ })}
165
+ </TldrawUiMenuContextProvider>
166
+ </TldrawUiToolbar>
167
+ </TldrawUiPopoverContent>
168
+ </TldrawUiPopover>
169
+ </>
160
170
  )
161
171
  }
162
172
 
163
173
  // need to memo like this to get generics
164
174
  /** @public @react */
165
- export const StylePanelDoubleDropdownPicker = React.memo(DoubleDropdownPickerInner) as <
175
+ export const StylePanelDoubleDropdownPicker = React.memo(StylePanelDoubleDropdownPickerInner) as <
166
176
  T extends string,
167
177
  >(
168
178
  props: StylePanelDoubleDropdownPickerProps<T>
169
179
  ) => React.JSX.Element
180
+
181
+ /** @public @react */
182
+ export const StylePanelDoubleDropdownPickerInline = React.memo(
183
+ StylePanelDoubleDropdownPickerInlineInner
184
+ ) as <T extends string>(props: StylePanelDoubleDropdownPickerProps<T>) => React.JSX.Element
@@ -28,7 +28,21 @@ export interface StylePanelDropdownPickerProps<T extends string> {
28
28
  onValueChange?(style: StyleProp<T>, value: T): void
29
29
  }
30
30
 
31
- function DropdownPickerInner<T extends string>(props: StylePanelDropdownPickerProps<T>) {
31
+ function StylePanelDropdownPickerInner<T extends string>(props: StylePanelDropdownPickerProps<T>) {
32
+ const msg = useTranslation()
33
+ const toolbarLabel = props.label
34
+ ? msg(props.label)
35
+ : msg(`style-panel.${props.stylePanelType}` as TLUiTranslationKey)
36
+ return (
37
+ <TldrawUiToolbar label={toolbarLabel}>
38
+ <StylePanelDropdownPickerInline {...props} />
39
+ </TldrawUiToolbar>
40
+ )
41
+ }
42
+
43
+ function StylePanelDropdownPickerInlineInner<T extends string>(
44
+ props: StylePanelDropdownPickerProps<T>
45
+ ) {
32
46
  const ctx = useStylePanelContext()
33
47
  const {
34
48
  id,
@@ -60,60 +74,67 @@ function DropdownPickerInner<T extends string>(props: StylePanelDropdownPickerPr
60
74
 
61
75
  const popoverId = `style panel ${id}`
62
76
  return (
63
- <TldrawUiToolbar label={stylePanelName}>
64
- <TldrawUiPopover
65
- id={popoverId}
66
- open={isOpen}
67
- onOpenChange={setIsOpen}
68
- className="tlui-style-panel__dropdown-picker"
69
- >
70
- <TldrawUiPopoverTrigger>
71
- <TldrawUiToolbarButton
72
- type={type}
73
- data-testid={`style.${uiType}`}
74
- data-direction="left"
75
- title={titleStr}
76
- >
77
- {labelStr && <TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>}
78
- <TldrawUiButtonIcon icon={(icon as TLUiIconType) ?? 'mixed'} />
79
- </TldrawUiToolbarButton>
80
- </TldrawUiPopoverTrigger>
81
- <TldrawUiPopoverContent side="left" align="center">
82
- <TldrawUiToolbar orientation={items.length > 4 ? 'grid' : 'horizontal'} label={labelStr}>
83
- <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
84
- {items.map((item) => {
85
- return (
86
- <TldrawUiToolbarButton
87
- key={item.value}
88
- type="icon"
89
- data-testid={`style.${uiType}.${item.value}`}
90
- title={
91
- stylePanelName +
92
- ' ' +
93
- msg(`${uiType}-style.${item.value}` as TLUiTranslationKey)
94
- }
95
- isActive={icon === item.icon}
96
- onClick={() => {
97
- ctx.onHistoryMark('select style dropdown item')
98
- onValueChange(style, item.value)
99
- tlmenus.deleteOpenMenu(popoverId, editor.contextId)
100
- setIsOpen(false)
101
- }}
102
- >
103
- <TldrawUiButtonIcon icon={item.icon} />
104
- </TldrawUiToolbarButton>
105
- )
106
- })}
107
- </TldrawUiMenuContextProvider>
108
- </TldrawUiToolbar>
109
- </TldrawUiPopoverContent>
110
- </TldrawUiPopover>
111
- </TldrawUiToolbar>
77
+ <TldrawUiPopover
78
+ id={popoverId}
79
+ open={isOpen}
80
+ onOpenChange={setIsOpen}
81
+ className="tlui-style-panel__dropdown-picker"
82
+ >
83
+ <TldrawUiPopoverTrigger>
84
+ <TldrawUiToolbarButton
85
+ type={type}
86
+ data-testid={`style.${uiType}`}
87
+ data-direction="left"
88
+ title={titleStr}
89
+ >
90
+ {labelStr && <TldrawUiButtonLabel>{labelStr}</TldrawUiButtonLabel>}
91
+ <TldrawUiButtonIcon icon={(icon as TLUiIconType) ?? 'mixed'} />
92
+ </TldrawUiToolbarButton>
93
+ </TldrawUiPopoverTrigger>
94
+ <TldrawUiPopoverContent side="left" align="center">
95
+ <TldrawUiToolbar orientation={items.length > 4 ? 'grid' : 'horizontal'} label={labelStr}>
96
+ <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
97
+ {items.map((item) => {
98
+ return (
99
+ <TldrawUiToolbarButton
100
+ key={item.value}
101
+ type="icon"
102
+ data-testid={`style.${uiType}.${item.value}`}
103
+ title={
104
+ stylePanelName +
105
+ ' — ' +
106
+ msg(`${uiType}-style.${item.value}` as TLUiTranslationKey)
107
+ }
108
+ isActive={icon === item.icon}
109
+ onClick={() => {
110
+ ctx.onHistoryMark('select style dropdown item')
111
+ onValueChange(style, item.value)
112
+ tlmenus.deleteOpenMenu(popoverId, editor.contextId)
113
+ setIsOpen(false)
114
+ }}
115
+ >
116
+ <TldrawUiButtonIcon icon={item.icon} />
117
+ </TldrawUiToolbarButton>
118
+ )
119
+ })}
120
+ </TldrawUiMenuContextProvider>
121
+ </TldrawUiToolbar>
122
+ </TldrawUiPopoverContent>
123
+ </TldrawUiPopover>
112
124
  )
113
125
  }
114
126
 
115
127
  // need to export like this to get generics
116
128
  /** @public @react */
117
- export const StylePanelDropdownPicker = React.memo(DropdownPickerInner) as <T extends string>(
129
+ export const StylePanelDropdownPicker = React.memo(StylePanelDropdownPickerInner) as <
130
+ T extends string,
131
+ >(
132
+ props: StylePanelDropdownPickerProps<T>
133
+ ) => React.JSX.Element
134
+
135
+ /** @public @react */
136
+ export const StylePanelDropdownPickerInline = React.memo(StylePanelDropdownPickerInlineInner) as <
137
+ T extends string,
138
+ >(
118
139
  props: StylePanelDropdownPickerProps<T>
119
140
  ) => React.JSX.Element
@@ -1,9 +1,9 @@
1
1
  // This file is automatically generated by internal/scripts/refresh-assets.ts.
2
2
  // Do not edit manually. Or do, I'm a comment, not a cop.
3
3
 
4
- export const version = '4.1.0-next.b9999db71010'
4
+ export const version = '4.1.0-next.c6278e85ba60'
5
5
  export const publishDates = {
6
6
  major: '2025-09-18T14:39:22.803Z',
7
- minor: '2025-10-15T09:19:04.044Z',
8
- patch: '2025-10-15T09:19:04.044Z',
7
+ minor: '2025-10-15T11:04:59.149Z',
8
+ patch: '2025-10-15T11:04:59.149Z',
9
9
  }