@tldraw/editor 4.6.0-next.20de11b7e238 → 4.6.0-next.241e87d4700a

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 (156) hide show
  1. package/dist-cjs/index.d.ts +668 -96
  2. package/dist-cjs/index.js +16 -3
  3. package/dist-cjs/index.js.map +3 -3
  4. package/dist-cjs/lib/TldrawEditor.js +55 -12
  5. package/dist-cjs/lib/TldrawEditor.js.map +3 -3
  6. package/dist-cjs/lib/components/MenuClickCapture.js +16 -1
  7. package/dist-cjs/lib/components/MenuClickCapture.js.map +2 -2
  8. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js +3 -3
  9. package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +2 -2
  10. package/dist-cjs/lib/config/createTLStore.js +7 -0
  11. package/dist-cjs/lib/config/createTLStore.js.map +2 -2
  12. package/dist-cjs/lib/config/defaultAssets.js +36 -0
  13. package/dist-cjs/lib/config/defaultAssets.js.map +7 -0
  14. package/dist-cjs/lib/editor/Editor.js +215 -5
  15. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  16. package/dist-cjs/lib/editor/assets/AssetUtil.js +66 -0
  17. package/dist-cjs/lib/editor/assets/AssetUtil.js.map +7 -0
  18. package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js +80 -0
  20. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.js.map +7 -0
  21. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js +466 -0
  22. package/dist-cjs/lib/editor/managers/PerformanceManager/PerformanceManager.js.map +7 -0
  23. package/dist-cjs/lib/editor/managers/PerformanceManager/perf-types.js +17 -0
  24. package/dist-cjs/lib/editor/managers/PerformanceManager/perf-types.js.map +7 -0
  25. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +106 -0
  26. package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +7 -0
  27. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js +586 -0
  28. package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +7 -0
  29. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +6 -4
  30. package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
  31. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +11 -2
  32. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  33. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +1 -1
  34. package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
  35. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js +6 -0
  36. package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
  37. package/dist-cjs/lib/editor/tools/StateNode.js +14 -17
  38. package/dist-cjs/lib/editor/tools/StateNode.js.map +2 -2
  39. package/dist-cjs/lib/editor/types/SvgExportContext.js.map +2 -2
  40. package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
  41. package/dist-cjs/lib/exports/getSvgJsx.js +12 -7
  42. package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
  43. package/dist-cjs/lib/globals/environment.js +18 -1
  44. package/dist-cjs/lib/globals/environment.js.map +2 -2
  45. package/dist-cjs/lib/hooks/{useIsDarkMode.js → useColorMode.js} +14 -10
  46. package/dist-cjs/lib/hooks/useColorMode.js.map +7 -0
  47. package/dist-cjs/lib/hooks/useCursor.js +3 -7
  48. package/dist-cjs/lib/hooks/useCursor.js.map +2 -2
  49. package/dist-cjs/lib/hooks/useDarkMode.js +4 -4
  50. package/dist-cjs/lib/hooks/useDarkMode.js.map +2 -2
  51. package/dist-cjs/lib/utils/reparenting.js +2 -1
  52. package/dist-cjs/lib/utils/reparenting.js.map +2 -2
  53. package/dist-cjs/lib/utils/richText.js.map +2 -2
  54. package/dist-cjs/lib/utils/runtime.js +2 -1
  55. package/dist-cjs/lib/utils/runtime.js.map +2 -2
  56. package/dist-cjs/lib/utils/sync/hardReset.js +0 -8
  57. package/dist-cjs/lib/utils/sync/hardReset.js.map +2 -2
  58. package/dist-cjs/version.js +3 -3
  59. package/dist-cjs/version.js.map +1 -1
  60. package/dist-esm/index.d.mts +668 -96
  61. package/dist-esm/index.mjs +17 -6
  62. package/dist-esm/index.mjs.map +2 -2
  63. package/dist-esm/lib/TldrawEditor.mjs +58 -12
  64. package/dist-esm/lib/TldrawEditor.mjs.map +3 -3
  65. package/dist-esm/lib/components/MenuClickCapture.mjs +16 -1
  66. package/dist-esm/lib/components/MenuClickCapture.mjs.map +2 -2
  67. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +3 -3
  68. package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +2 -2
  69. package/dist-esm/lib/config/createTLStore.mjs +10 -1
  70. package/dist-esm/lib/config/createTLStore.mjs.map +2 -2
  71. package/dist-esm/lib/config/defaultAssets.mjs +16 -0
  72. package/dist-esm/lib/config/defaultAssets.mjs.map +7 -0
  73. package/dist-esm/lib/editor/Editor.mjs +215 -5
  74. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  75. package/dist-esm/lib/editor/assets/AssetUtil.mjs +46 -0
  76. package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +7 -0
  77. package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
  78. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs +60 -0
  79. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.mjs.map +7 -0
  80. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs +438 -0
  81. package/dist-esm/lib/editor/managers/PerformanceManager/PerformanceManager.mjs.map +7 -0
  82. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs +1 -0
  83. package/dist-esm/lib/editor/managers/PerformanceManager/perf-types.mjs.map +7 -0
  84. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +88 -0
  85. package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +7 -0
  86. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +568 -0
  87. package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +7 -0
  88. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +6 -4
  89. package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
  90. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +11 -2
  91. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  92. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +1 -1
  93. package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
  94. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs +6 -0
  95. package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
  96. package/dist-esm/lib/editor/tools/StateNode.mjs +14 -17
  97. package/dist-esm/lib/editor/tools/StateNode.mjs.map +2 -2
  98. package/dist-esm/lib/editor/types/SvgExportContext.mjs.map +2 -2
  99. package/dist-esm/lib/exports/getSvgJsx.mjs +12 -10
  100. package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
  101. package/dist-esm/lib/globals/environment.mjs +18 -1
  102. package/dist-esm/lib/globals/environment.mjs.map +2 -2
  103. package/dist-esm/lib/hooks/useColorMode.mjs +19 -0
  104. package/dist-esm/lib/hooks/useColorMode.mjs.map +7 -0
  105. package/dist-esm/lib/hooks/useCursor.mjs +3 -7
  106. package/dist-esm/lib/hooks/useCursor.mjs.map +2 -2
  107. package/dist-esm/lib/hooks/useDarkMode.mjs +4 -4
  108. package/dist-esm/lib/hooks/useDarkMode.mjs.map +2 -2
  109. package/dist-esm/lib/utils/reparenting.mjs +2 -1
  110. package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
  111. package/dist-esm/lib/utils/richText.mjs.map +2 -2
  112. package/dist-esm/lib/utils/runtime.mjs +2 -1
  113. package/dist-esm/lib/utils/runtime.mjs.map +2 -2
  114. package/dist-esm/lib/utils/sync/hardReset.mjs +0 -8
  115. package/dist-esm/lib/utils/sync/hardReset.mjs.map +2 -2
  116. package/dist-esm/version.mjs +3 -3
  117. package/dist-esm/version.mjs.map +1 -1
  118. package/editor.css +0 -33
  119. package/package.json +7 -7
  120. package/src/index.ts +23 -6
  121. package/src/lib/TldrawEditor.tsx +90 -13
  122. package/src/lib/components/MenuClickCapture.tsx +20 -0
  123. package/src/lib/components/default-components/CanvasShapeIndicators.tsx +3 -3
  124. package/src/lib/config/createTLStore.ts +22 -1
  125. package/src/lib/config/defaultAssets.ts +19 -0
  126. package/src/lib/editor/Editor.ts +301 -27
  127. package/src/lib/editor/assets/AssetUtil.ts +85 -0
  128. package/src/lib/editor/managers/FontManager/FontManager.test.ts +9 -2
  129. package/src/lib/editor/managers/FontManager/FontManager.ts +1 -67
  130. package/src/lib/editor/managers/PerformanceManager/PerformanceApiAdapter.ts +82 -0
  131. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.test.ts +522 -0
  132. package/src/lib/editor/managers/PerformanceManager/PerformanceManager.ts +583 -0
  133. package/src/lib/editor/managers/PerformanceManager/perf-types.ts +196 -0
  134. package/src/lib/editor/managers/ThemeManager/ThemeManager.ts +116 -0
  135. package/src/lib/editor/managers/ThemeManager/defaultThemes.ts +605 -0
  136. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +23 -29
  137. package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +5 -3
  138. package/src/lib/editor/shapes/ShapeUtil.ts +28 -3
  139. package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +1 -1
  140. package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +7 -0
  141. package/src/lib/editor/tools/StateNode.ts +16 -18
  142. package/src/lib/editor/types/SvgExportContext.tsx +5 -0
  143. package/src/lib/editor/types/external-content.ts +1 -0
  144. package/src/lib/exports/getSvgJsx.tsx +21 -15
  145. package/src/lib/globals/environment.ts +18 -0
  146. package/src/lib/hooks/{useIsDarkMode.ts → useColorMode.ts} +9 -5
  147. package/src/lib/hooks/useCursor.ts +3 -7
  148. package/src/lib/hooks/useDarkMode.ts +4 -4
  149. package/src/lib/utils/reparenting.ts +6 -2
  150. package/src/lib/utils/richText.ts +1 -1
  151. package/src/lib/utils/runtime.ts +3 -1
  152. package/src/lib/utils/sync/hardReset.ts +0 -8
  153. package/src/version.ts +3 -3
  154. package/dist-cjs/lib/hooks/useIsDarkMode.js.map +0 -7
  155. package/dist-esm/lib/hooks/useIsDarkMode.mjs +0 -15
  156. package/dist-esm/lib/hooks/useIsDarkMode.mjs.map +0 -7
@@ -0,0 +1,605 @@
1
+ import {
2
+ DefaultFontFamilies,
3
+ TLDefaultColor,
4
+ TLDefaultColorStyle,
5
+ TLTheme,
6
+ TLThemeColors,
7
+ } from '@tldraw/tlschema'
8
+
9
+ /**
10
+ * The default theme definition containing color palettes for both light and dark modes.
11
+ *
12
+ * @public
13
+ */
14
+ export const DEFAULT_THEME: TLTheme = {
15
+ id: 'default',
16
+ fontSize: 16,
17
+ lineHeight: 1.35,
18
+ strokeWidth: 2,
19
+ fonts: {
20
+ draw: {
21
+ fontFamily: DefaultFontFamilies.draw,
22
+ faces: [
23
+ { family: 'tldraw_draw', src: { url: 'tldraw_draw', format: 'woff2' }, weight: 'normal' },
24
+ {
25
+ family: 'tldraw_draw',
26
+ src: { url: 'tldraw_draw_bold', format: 'woff2' },
27
+ weight: 'bold',
28
+ },
29
+ {
30
+ family: 'tldraw_draw',
31
+ src: { url: 'tldraw_draw_italic', format: 'woff2' },
32
+ weight: 'normal',
33
+ style: 'italic',
34
+ },
35
+ {
36
+ family: 'tldraw_draw',
37
+ src: { url: 'tldraw_draw_italic_bold', format: 'woff2' },
38
+ weight: 'bold',
39
+ style: 'italic',
40
+ },
41
+ ],
42
+ },
43
+ sans: {
44
+ fontFamily: DefaultFontFamilies.sans,
45
+ faces: [
46
+ {
47
+ family: 'tldraw_sans',
48
+ src: { url: 'tldraw_sans', format: 'woff2' },
49
+ weight: 'normal',
50
+ style: 'normal',
51
+ },
52
+ {
53
+ family: 'tldraw_sans',
54
+ src: { url: 'tldraw_sans_bold', format: 'woff2' },
55
+ weight: 'bold',
56
+ style: 'normal',
57
+ },
58
+ {
59
+ family: 'tldraw_sans',
60
+ src: { url: 'tldraw_sans_italic', format: 'woff2' },
61
+ weight: 'normal',
62
+ style: 'italic',
63
+ },
64
+ {
65
+ family: 'tldraw_sans',
66
+ src: { url: 'tldraw_sans_italic_bold', format: 'woff2' },
67
+ weight: 'bold',
68
+ style: 'italic',
69
+ },
70
+ ],
71
+ },
72
+ serif: {
73
+ fontFamily: DefaultFontFamilies.serif,
74
+ faces: [
75
+ {
76
+ family: 'tldraw_serif',
77
+ src: { url: 'tldraw_serif', format: 'woff2' },
78
+ weight: 'normal',
79
+ style: 'normal',
80
+ },
81
+ {
82
+ family: 'tldraw_serif',
83
+ src: { url: 'tldraw_serif_bold', format: 'woff2' },
84
+ weight: 'bold',
85
+ style: 'normal',
86
+ },
87
+ {
88
+ family: 'tldraw_serif',
89
+ src: { url: 'tldraw_serif_italic', format: 'woff2' },
90
+ weight: 'normal',
91
+ style: 'italic',
92
+ },
93
+ {
94
+ family: 'tldraw_serif',
95
+ src: { url: 'tldraw_serif_italic_bold', format: 'woff2' },
96
+ weight: 'bold',
97
+ style: 'italic',
98
+ },
99
+ ],
100
+ },
101
+ mono: {
102
+ fontFamily: DefaultFontFamilies.mono,
103
+ faces: [
104
+ {
105
+ family: 'tldraw_mono',
106
+ src: { url: 'tldraw_mono', format: 'woff2' },
107
+ weight: 'normal',
108
+ style: 'normal',
109
+ },
110
+ {
111
+ family: 'tldraw_mono',
112
+ src: { url: 'tldraw_mono_bold', format: 'woff2' },
113
+ weight: 'bold',
114
+ style: 'normal',
115
+ },
116
+ {
117
+ family: 'tldraw_mono',
118
+ src: { url: 'tldraw_mono_italic', format: 'woff2' },
119
+ weight: 'normal',
120
+ style: 'italic',
121
+ },
122
+ {
123
+ family: 'tldraw_mono',
124
+ src: { url: 'tldraw_mono_italic_bold', format: 'woff2' },
125
+ weight: 'bold',
126
+ style: 'italic',
127
+ },
128
+ ],
129
+ },
130
+ },
131
+ colors: {
132
+ light: {
133
+ text: '#000000',
134
+ background: '#f9fafb',
135
+ negativeSpace: '#f9fafb',
136
+ solid: '#fcfffe',
137
+ cursor: 'black',
138
+ noteBorder: 'rgb(144, 144, 144)',
139
+ black: {
140
+ solid: '#1d1d1d',
141
+ fill: '#1d1d1d',
142
+ linedFill: '#363636',
143
+ frameHeadingStroke: '#717171',
144
+ frameHeadingFill: '#ffffff',
145
+ frameStroke: '#717171',
146
+ frameFill: '#ffffff',
147
+ frameText: '#000000',
148
+ noteFill: '#FCE19C',
149
+ noteText: '#000000',
150
+ semi: '#e8e8e8',
151
+ pattern: '#494949',
152
+ highlightSrgb: '#fddd00',
153
+ highlightP3: 'color(display-p3 0.972 0.8205 0.05)',
154
+ },
155
+ blue: {
156
+ solid: '#4465e9',
157
+ fill: '#4465e9',
158
+ linedFill: '#6580ec',
159
+ frameHeadingStroke: '#6681ec',
160
+ frameHeadingFill: '#f9fafe',
161
+ frameStroke: '#6681ec',
162
+ frameFill: '#f9fafe',
163
+ frameText: '#000000',
164
+ noteFill: '#8AA3FF',
165
+ noteText: '#000000',
166
+ semi: '#dce1f8',
167
+ pattern: '#6681ee',
168
+ highlightSrgb: '#10acff',
169
+ highlightP3: 'color(display-p3 0.308 0.6632 0.9996)',
170
+ },
171
+ green: {
172
+ solid: '#099268',
173
+ fill: '#099268',
174
+ linedFill: '#0bad7c',
175
+ frameHeadingStroke: '#37a684',
176
+ frameHeadingFill: '#f8fcfa',
177
+ frameStroke: '#37a684',
178
+ frameFill: '#f8fcfa',
179
+ frameText: '#000000',
180
+ noteFill: '#6FC896',
181
+ noteText: '#000000',
182
+ semi: '#d3e9e3',
183
+ pattern: '#39a785',
184
+ highlightSrgb: '#00ffc8',
185
+ highlightP3: 'color(display-p3 0.2536 0.984 0.7981)',
186
+ },
187
+ grey: {
188
+ solid: '#9fa8b2',
189
+ fill: '#9fa8b2',
190
+ linedFill: '#bbc1c9',
191
+ frameHeadingStroke: '#aaaaab',
192
+ frameHeadingFill: '#fbfcfc',
193
+ frameStroke: '#aaaaab',
194
+ frameFill: '#fcfcfd',
195
+ frameText: '#000000',
196
+ noteFill: '#C0CAD3',
197
+ noteText: '#000000',
198
+ semi: '#eceef0',
199
+ pattern: '#bcc3c9',
200
+ highlightSrgb: '#cbe7f1',
201
+ highlightP3: 'color(display-p3 0.8163 0.9023 0.9416)',
202
+ },
203
+ 'light-blue': {
204
+ solid: '#4ba1f1',
205
+ fill: '#4ba1f1',
206
+ linedFill: '#7abaf5',
207
+ frameHeadingStroke: '#6cb2f3',
208
+ frameHeadingFill: '#f8fbfe',
209
+ frameStroke: '#6cb2f3',
210
+ frameFill: '#fafcff',
211
+ frameText: '#000000',
212
+ noteFill: '#9BC4FD',
213
+ noteText: '#000000',
214
+ semi: '#ddedfa',
215
+ pattern: '#6fbbf8',
216
+ highlightSrgb: '#00f4ff',
217
+ highlightP3: 'color(display-p3 0.1512 0.9414 0.9996)',
218
+ },
219
+ 'light-green': {
220
+ solid: '#4cb05e',
221
+ fill: '#4cb05e',
222
+ linedFill: '#7ec88c',
223
+ frameHeadingStroke: '#6dbe7c',
224
+ frameHeadingFill: '#f8fcf9',
225
+ frameStroke: '#6dbe7c',
226
+ frameFill: '#fafdfa',
227
+ frameText: '#000000',
228
+ noteFill: '#98D08A',
229
+ noteText: '#000000',
230
+ semi: '#dbf0e0',
231
+ pattern: '#65cb78',
232
+ highlightSrgb: '#65f641',
233
+ highlightP3: 'color(display-p3 0.563 0.9495 0.3857)',
234
+ },
235
+ 'light-red': {
236
+ solid: '#f87777',
237
+ fill: '#f87777',
238
+ linedFill: '#f99a9a',
239
+ frameHeadingStroke: '#f89090',
240
+ frameHeadingFill: '#fffafa',
241
+ frameStroke: '#f89090',
242
+ frameFill: '#fffbfb',
243
+ frameText: '#000000',
244
+ noteFill: '#F7A5A1',
245
+ noteText: '#000000',
246
+ semi: '#f4dadb',
247
+ pattern: '#fe9e9e',
248
+ highlightSrgb: '#ff7fa3',
249
+ highlightP3: 'color(display-p3 0.9988 0.5301 0.6397)',
250
+ },
251
+ 'light-violet': {
252
+ solid: '#e085f4',
253
+ fill: '#e085f4',
254
+ linedFill: '#e9abf7',
255
+ frameHeadingStroke: '#e59bf5',
256
+ frameHeadingFill: '#fefaff',
257
+ frameStroke: '#e59bf5',
258
+ frameFill: '#fefbff',
259
+ frameText: '#000000',
260
+ noteFill: '#DFB0F9',
261
+ noteText: '#000000',
262
+ semi: '#f5eafa',
263
+ pattern: '#e9acf8',
264
+ highlightSrgb: '#ff88ff',
265
+ highlightP3: 'color(display-p3 0.9676 0.5652 0.9999)',
266
+ },
267
+ orange: {
268
+ solid: '#e16919',
269
+ fill: '#e16919',
270
+ linedFill: '#ea8643',
271
+ frameHeadingStroke: '#e68544',
272
+ frameHeadingFill: '#fef9f6',
273
+ frameStroke: '#e68544',
274
+ frameFill: '#fef9f6',
275
+ frameText: '#000000',
276
+ noteFill: '#FAA475',
277
+ noteText: '#000000',
278
+ semi: '#f8e2d4',
279
+ pattern: '#f78438',
280
+ highlightSrgb: '#ffa500',
281
+ highlightP3: 'color(display-p3 0.9988 0.6905 0.266)',
282
+ },
283
+ red: {
284
+ solid: '#e03131',
285
+ fill: '#e03131',
286
+ linedFill: '#e75f5f',
287
+ frameHeadingStroke: '#e55757',
288
+ frameHeadingFill: '#fef7f7',
289
+ frameStroke: '#e55757',
290
+ frameFill: '#fef9f9',
291
+ frameText: '#000000',
292
+ noteFill: '#FC8282',
293
+ noteText: '#000000',
294
+ semi: '#f4dadb',
295
+ pattern: '#e55959',
296
+ highlightSrgb: '#ff636e',
297
+ highlightP3: 'color(display-p3 0.9992 0.4376 0.45)',
298
+ },
299
+ violet: {
300
+ solid: '#ae3ec9',
301
+ fill: '#ae3ec9',
302
+ linedFill: '#be68d4',
303
+ frameHeadingStroke: '#bc62d3',
304
+ frameHeadingFill: '#fcf7fd',
305
+ frameStroke: '#bc62d3',
306
+ frameFill: '#fdf9fd',
307
+ frameText: '#000000',
308
+ noteFill: '#DB91FD',
309
+ noteText: '#000000',
310
+ semi: '#ecdcf2',
311
+ pattern: '#bd63d3',
312
+ highlightSrgb: '#c77cff',
313
+ highlightP3: 'color(display-p3 0.7469 0.5089 0.9995)',
314
+ },
315
+ yellow: {
316
+ solid: '#f1ac4b',
317
+ fill: '#f1ac4b',
318
+ linedFill: '#f5c27a',
319
+ frameHeadingStroke: '#f3bb6c',
320
+ frameHeadingFill: '#fefcf8',
321
+ frameStroke: '#f3bb6c',
322
+ frameFill: '#fffdfa',
323
+ frameText: '#000000',
324
+ noteFill: '#FED49A',
325
+ noteText: '#000000',
326
+ semi: '#f9f0e6',
327
+ pattern: '#fecb92',
328
+ highlightSrgb: '#fddd00',
329
+ highlightP3: 'color(display-p3 0.972 0.8705 0.05)',
330
+ },
331
+ white: {
332
+ solid: '#FFFFFF',
333
+ fill: '#FFFFFF',
334
+ linedFill: '#ffffff',
335
+ semi: '#f5f5f5',
336
+ pattern: '#f9f9f9',
337
+ frameHeadingStroke: '#7d7d7d',
338
+ frameHeadingFill: '#ffffff',
339
+ frameStroke: '#7d7d7d',
340
+ frameFill: '#ffffff',
341
+ frameText: '#000000',
342
+ noteFill: '#FFFFFF',
343
+ noteText: '#000000',
344
+ highlightSrgb: '#ffffff',
345
+ highlightP3: 'color(display-p3 1 1 1)',
346
+ },
347
+ },
348
+ dark: {
349
+ text: 'hsl(210, 17%, 98%)',
350
+ background: 'hsl(240, 5%, 6.5%)',
351
+ negativeSpace: 'hsl(240, 5%, 6.5%)',
352
+ solid: '#010403',
353
+ cursor: 'white',
354
+ noteBorder: 'rgb(20, 20, 20)',
355
+
356
+ black: {
357
+ solid: '#f2f2f2',
358
+ fill: '#f2f2f2',
359
+ linedFill: '#ffffff',
360
+ frameHeadingStroke: '#5c5c5c',
361
+ frameHeadingFill: '#252525',
362
+ frameStroke: '#5c5c5c',
363
+ frameFill: '#0c0c0c',
364
+ frameText: '#f2f2f2',
365
+ noteFill: '#2c2c2c',
366
+ noteText: '#f2f2f2',
367
+ semi: '#2c3036',
368
+ pattern: '#989898',
369
+ highlightSrgb: '#d2b700',
370
+ highlightP3: 'color(display-p3 0.8078 0.6225 0.0312)',
371
+ },
372
+ blue: {
373
+ solid: '#4f72fc', // 3c60f0
374
+ fill: '#4f72fc',
375
+ linedFill: '#3c5cdd',
376
+ frameHeadingStroke: '#384994',
377
+ frameHeadingFill: '#1C2036',
378
+ frameStroke: '#384994',
379
+ frameFill: '#11141f',
380
+ frameText: '#f2f2f2',
381
+ noteFill: '#2A3F98',
382
+ noteText: '#f2f2f2',
383
+ semi: '#262d40',
384
+ pattern: '#3a4b9e',
385
+ highlightSrgb: '#0079d2',
386
+ highlightP3: 'color(display-p3 0.0032 0.4655 0.7991)',
387
+ },
388
+ green: {
389
+ solid: '#099268',
390
+ fill: '#099268',
391
+ linedFill: '#087856',
392
+ frameHeadingStroke: '#10513C',
393
+ frameHeadingFill: '#14241f',
394
+ frameStroke: '#10513C',
395
+ frameFill: '#0E1614',
396
+ frameText: '#f2f2f2',
397
+ noteFill: '#014429',
398
+ noteText: '#f2f2f2',
399
+ semi: '#253231',
400
+ pattern: '#366a53',
401
+ highlightSrgb: '#009774',
402
+ highlightP3: 'color(display-p3 0.0085 0.582 0.4604)',
403
+ },
404
+ grey: {
405
+ solid: '#9398b0',
406
+ fill: '#9398b0',
407
+ linedFill: '#8388a5',
408
+ frameHeadingStroke: '#42474D',
409
+ frameHeadingFill: '#23262A',
410
+ frameStroke: '#42474D',
411
+ frameFill: '#151719',
412
+ frameText: '#f2f2f2',
413
+ noteFill: '#56595F',
414
+ noteText: '#f2f2f2',
415
+ semi: '#33373c',
416
+ pattern: '#7c8187',
417
+ highlightSrgb: '#9cb4cb',
418
+ highlightP3: 'color(display-p3 0.6299 0.7012 0.7856)',
419
+ },
420
+ 'light-blue': {
421
+ solid: '#4dabf7',
422
+ fill: '#4dabf7',
423
+ linedFill: '#2793ec',
424
+ frameHeadingStroke: '#075797',
425
+ frameHeadingFill: '#142839',
426
+ frameStroke: '#075797',
427
+ frameFill: '#0B1823',
428
+ frameText: '#f2f2f2',
429
+ noteFill: '#1F5495',
430
+ noteText: '#f2f2f2',
431
+ semi: '#2a3642',
432
+ pattern: '#4d7aa9',
433
+ highlightSrgb: '#00bdc8',
434
+ highlightP3: 'color(display-p3 0.0023 0.7259 0.7735)',
435
+ },
436
+ 'light-green': {
437
+ solid: '#40c057',
438
+ fill: '#40c057',
439
+ linedFill: '#37a44b',
440
+ frameHeadingStroke: '#1C5427',
441
+ frameHeadingFill: '#18251A',
442
+ frameStroke: '#1C5427',
443
+ frameFill: '#0F1911',
444
+ frameText: '#f2f2f2',
445
+ noteFill: '#21581D',
446
+ noteText: '#f2f2f2',
447
+ semi: '#2a3830',
448
+ pattern: '#4e874e',
449
+ highlightSrgb: '#00a000',
450
+ highlightP3: 'color(display-p3 0.2711 0.6172 0.0195)',
451
+ },
452
+ 'light-red': {
453
+ solid: '#ff8787',
454
+ fill: '#ff8787',
455
+ linedFill: '#ff6666',
456
+ frameHeadingStroke: '#6f3232',
457
+ frameHeadingFill: '#341818',
458
+ frameStroke: '#6f3232',
459
+ frameFill: '#181212',
460
+ frameText: '#f2f2f2',
461
+ noteFill: '#7a3333',
462
+ noteText: '#f2f2f2',
463
+ semi: '#3c2b2b',
464
+ pattern: '#a56767',
465
+ highlightSrgb: '#db005b',
466
+ highlightP3: 'color(display-p3 0.7849 0.0585 0.3589)',
467
+ },
468
+ 'light-violet': {
469
+ solid: '#e599f7',
470
+ fill: '#e599f7',
471
+ linedFill: '#dc71f4',
472
+ frameHeadingStroke: '#6c367a',
473
+ frameHeadingFill: '#2D2230',
474
+ frameStroke: '#6c367a',
475
+ frameFill: '#1C151E',
476
+ frameText: '#f2f2f2',
477
+ noteFill: '#762F8E',
478
+ noteText: '#f2f2f2',
479
+ semi: '#383442',
480
+ pattern: '#9770a9',
481
+ highlightSrgb: '#c400c7',
482
+ highlightP3: 'color(display-p3 0.7024 0.0403 0.753)',
483
+ },
484
+ orange: {
485
+ solid: '#f76707',
486
+ fill: '#f76707',
487
+ linedFill: '#f54900',
488
+ frameHeadingStroke: '#773a0e',
489
+ frameHeadingFill: '#2f1d13',
490
+ frameStroke: '#773a0e',
491
+ frameFill: '#1c1512',
492
+ frameText: '#f2f2f2',
493
+ noteFill: '#7c3905',
494
+ noteText: '#f2f2f2',
495
+ semi: '#3b2e27',
496
+ pattern: '#9f552d',
497
+ highlightSrgb: '#d07a00',
498
+ highlightP3: 'color(display-p3 0.7699 0.4937 0.0085)',
499
+ },
500
+ red: {
501
+ solid: '#e03131',
502
+ fill: '#e03131',
503
+ linedFill: '#c31d1d',
504
+ frameHeadingStroke: '#701e1e',
505
+ frameHeadingFill: '#301616',
506
+ frameStroke: '#701e1e',
507
+ frameFill: '#1b1313',
508
+ frameText: '#f2f2f2',
509
+ noteFill: '#7e201f',
510
+ noteText: '#f2f2f2',
511
+ semi: '#382726',
512
+ pattern: '#8f3734',
513
+ highlightSrgb: '#de002c',
514
+ highlightP3: 'color(display-p3 0.7978 0.0509 0.2035)',
515
+ },
516
+ violet: {
517
+ solid: '#ae3ec9',
518
+ fill: '#ae3ec9',
519
+ linedFill: '#8f2fa7',
520
+ frameHeadingStroke: '#6d1583',
521
+ frameHeadingFill: '#27152e',
522
+ frameStroke: '#6d1583',
523
+ frameFill: '#1b0f21',
524
+ frameText: '#f2f2f2',
525
+ noteFill: '#5f1c70',
526
+ noteText: '#f2f2f2',
527
+ semi: '#342938',
528
+ pattern: '#763a8b',
529
+ highlightSrgb: '#9e00ee',
530
+ highlightP3: 'color(display-p3 0.5651 0.0079 0.8986)',
531
+ },
532
+ yellow: {
533
+ solid: '#ffc034',
534
+ fill: '#ffc034',
535
+ linedFill: '#ffae00',
536
+ frameHeadingStroke: '#684e12',
537
+ frameHeadingFill: '#2a2113',
538
+ frameStroke: '#684e12',
539
+ frameFill: '#1e1911',
540
+ frameText: '#f2f2f2',
541
+ noteFill: '#8a5e1c',
542
+ noteText: '#f2f2f2',
543
+ semi: '#3b352b',
544
+ pattern: '#fecb92',
545
+ highlightSrgb: '#d2b700',
546
+ highlightP3: 'color(display-p3 0.8078 0.7225 0.0312)',
547
+ },
548
+ white: {
549
+ solid: '#f3f3f3',
550
+ fill: '#f3f3f3',
551
+ linedFill: '#f3f3f3',
552
+ semi: '#f5f5f5',
553
+ pattern: '#f9f9f9',
554
+ frameHeadingStroke: '#ffffff',
555
+ frameHeadingFill: '#ffffff',
556
+ frameStroke: '#ffffff',
557
+ frameFill: '#ffffff',
558
+ frameText: '#000000',
559
+ noteFill: '#eaeaea',
560
+ noteText: '#1d1d1d',
561
+ highlightSrgb: '#ffffff',
562
+ highlightP3: 'color(display-p3 1 1 1)',
563
+ },
564
+ },
565
+ },
566
+ }
567
+
568
+ /**
569
+ * Resolves a color style value to its actual CSS color string for a given theme and variant.
570
+ * If the color is not a default theme color, returns the color value as-is.
571
+ *
572
+ * @param colors - The color palette for the current color mode (e.g. `theme.colors[colorMode]`)
573
+ * @param color - The color style value to resolve
574
+ * @param variant - Which variant of the color to return (solid, fill, pattern, etc.)
575
+ * @returns The CSS color string for the specified color and variant
576
+ *
577
+ * @example
578
+ * ```ts
579
+ * import { getColorValue } from 'tldraw'
580
+ *
581
+ * const colors = editor.getCurrentTheme().colors[editor.getColorMode()]
582
+ *
583
+ * // Get the solid variant of red
584
+ * const redSolid = getColorValue(colors, 'red', 'solid') // '#e03131'
585
+ *
586
+ * // Get the fill variant of blue
587
+ * const blueFill = getColorValue(colors, 'blue', 'fill') // '#4465e9'
588
+ *
589
+ * // Custom color passes through unchanged
590
+ * const customColor = getColorValue(colors, '#ff0000', 'solid') // '#ff0000'
591
+ * ```
592
+ *
593
+ * @public
594
+ */
595
+ export function getColorValue(
596
+ colors: TLThemeColors,
597
+ color: TLDefaultColorStyle | string,
598
+ variant: keyof TLDefaultColor
599
+ ): string {
600
+ const colorEntry = colors[color as TLDefaultColorStyle]
601
+ if (!colorEntry || typeof colorEntry === 'string') {
602
+ return color
603
+ }
604
+ return colorEntry[variant]
605
+ }