@tldraw/editor 4.6.0-next.793daa9fe264 → 4.6.0-next.a31a8a6b83f2
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-cjs/index.d.ts +376 -98
- package/dist-cjs/index.js +12 -3
- package/dist-cjs/index.js.map +3 -3
- package/dist-cjs/lib/TldrawEditor.js +55 -12
- package/dist-cjs/lib/TldrawEditor.js.map +3 -3
- package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js +3 -3
- package/dist-cjs/lib/components/default-components/CanvasShapeIndicators.js.map +2 -2
- package/dist-cjs/lib/config/createTLStore.js +7 -0
- package/dist-cjs/lib/config/createTLStore.js.map +2 -2
- package/dist-cjs/lib/config/defaultAssets.js +36 -0
- package/dist-cjs/lib/config/defaultAssets.js.map +7 -0
- package/dist-cjs/lib/editor/Editor.js +200 -5
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/assets/AssetUtil.js +66 -0
- package/dist-cjs/lib/editor/assets/AssetUtil.js.map +7 -0
- package/dist-cjs/lib/editor/managers/FontManager/FontManager.js.map +2 -2
- package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js +106 -0
- package/dist-cjs/lib/editor/managers/ThemeManager/ThemeManager.js.map +7 -0
- package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js +586 -0
- package/dist-cjs/lib/editor/managers/ThemeManager/defaultThemes.js.map +7 -0
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js +6 -4
- package/dist-cjs/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +9 -0
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/types/SvgExportContext.js.map +2 -2
- package/dist-cjs/lib/editor/types/external-content.js.map +1 -1
- package/dist-cjs/lib/exports/getSvgJsx.js +12 -7
- package/dist-cjs/lib/exports/getSvgJsx.js.map +2 -2
- package/dist-cjs/lib/globals/environment.js +18 -1
- package/dist-cjs/lib/globals/environment.js.map +2 -2
- package/dist-cjs/lib/hooks/{useIsDarkMode.js → useColorMode.js} +14 -10
- package/dist-cjs/lib/hooks/useColorMode.js.map +7 -0
- package/dist-cjs/lib/hooks/useCursor.js +3 -7
- package/dist-cjs/lib/hooks/useCursor.js.map +2 -2
- package/dist-cjs/lib/hooks/useDarkMode.js +4 -4
- package/dist-cjs/lib/hooks/useDarkMode.js.map +2 -2
- package/dist-cjs/lib/utils/reparenting.js +2 -1
- package/dist-cjs/lib/utils/reparenting.js.map +2 -2
- package/dist-cjs/lib/utils/richText.js.map +2 -2
- package/dist-cjs/version.js +3 -3
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +376 -98
- package/dist-esm/index.mjs +13 -6
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/TldrawEditor.mjs +58 -12
- package/dist-esm/lib/TldrawEditor.mjs.map +3 -3
- package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs +3 -3
- package/dist-esm/lib/components/default-components/CanvasShapeIndicators.mjs.map +2 -2
- package/dist-esm/lib/config/createTLStore.mjs +10 -1
- package/dist-esm/lib/config/createTLStore.mjs.map +2 -2
- package/dist-esm/lib/config/defaultAssets.mjs +16 -0
- package/dist-esm/lib/config/defaultAssets.mjs.map +7 -0
- package/dist-esm/lib/editor/Editor.mjs +200 -5
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/assets/AssetUtil.mjs +46 -0
- package/dist-esm/lib/editor/assets/AssetUtil.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/FontManager/FontManager.mjs.map +2 -2
- package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs +88 -0
- package/dist-esm/lib/editor/managers/ThemeManager/ThemeManager.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs +568 -0
- package/dist-esm/lib/editor/managers/ThemeManager/defaultThemes.mjs.map +7 -0
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs +6 -4
- package/dist-esm/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +9 -0
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/types/SvgExportContext.mjs.map +2 -2
- package/dist-esm/lib/exports/getSvgJsx.mjs +12 -10
- package/dist-esm/lib/exports/getSvgJsx.mjs.map +2 -2
- package/dist-esm/lib/globals/environment.mjs +18 -1
- package/dist-esm/lib/globals/environment.mjs.map +2 -2
- package/dist-esm/lib/hooks/useColorMode.mjs +19 -0
- package/dist-esm/lib/hooks/useColorMode.mjs.map +7 -0
- package/dist-esm/lib/hooks/useCursor.mjs +3 -7
- package/dist-esm/lib/hooks/useCursor.mjs.map +2 -2
- package/dist-esm/lib/hooks/useDarkMode.mjs +4 -4
- package/dist-esm/lib/hooks/useDarkMode.mjs.map +2 -2
- package/dist-esm/lib/utils/reparenting.mjs +2 -1
- package/dist-esm/lib/utils/reparenting.mjs.map +2 -2
- package/dist-esm/lib/utils/richText.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/editor.css +0 -33
- package/package.json +7 -7
- package/src/index.ts +8 -6
- package/src/lib/TldrawEditor.tsx +90 -13
- package/src/lib/components/default-components/CanvasShapeIndicators.tsx +3 -3
- package/src/lib/config/createTLStore.ts +22 -1
- package/src/lib/config/defaultAssets.ts +19 -0
- package/src/lib/editor/Editor.ts +285 -27
- package/src/lib/editor/assets/AssetUtil.ts +85 -0
- package/src/lib/editor/managers/FontManager/FontManager.test.ts +9 -2
- package/src/lib/editor/managers/FontManager/FontManager.ts +1 -67
- package/src/lib/editor/managers/ThemeManager/ThemeManager.ts +116 -0
- package/src/lib/editor/managers/ThemeManager/defaultThemes.ts +605 -0
- package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.test.ts +23 -29
- package/src/lib/editor/managers/UserPreferencesManager/UserPreferencesManager.ts +5 -3
- package/src/lib/editor/shapes/ShapeUtil.ts +26 -1
- package/src/lib/editor/types/SvgExportContext.tsx +5 -0
- package/src/lib/editor/types/external-content.ts +1 -0
- package/src/lib/exports/getSvgJsx.tsx +21 -15
- package/src/lib/globals/environment.ts +18 -0
- package/src/lib/hooks/{useIsDarkMode.ts → useColorMode.ts} +9 -5
- package/src/lib/hooks/useCursor.ts +3 -7
- package/src/lib/hooks/useDarkMode.ts +4 -4
- package/src/lib/utils/reparenting.ts +6 -2
- package/src/lib/utils/richText.ts +1 -1
- package/src/version.ts +3 -3
- package/dist-cjs/lib/hooks/useIsDarkMode.js.map +0 -7
- package/dist-esm/lib/hooks/useIsDarkMode.mjs +0 -15
- package/dist-esm/lib/hooks/useIsDarkMode.mjs.map +0 -7
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { Atom, atom, computed } from '@tldraw/state'
|
|
2
|
+
import { TLTheme, TLThemeId, TLThemes } from '@tldraw/tlschema'
|
|
3
|
+
import { structuredClone } from '@tldraw/utils'
|
|
4
|
+
import type { Editor } from '../../Editor'
|
|
5
|
+
import { DEFAULT_THEME } from './defaultThemes'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a partial set of user-provided themes into a complete `TLThemes`
|
|
9
|
+
* record by merging with `DEFAULT_THEME`. The result is suitable for passing to
|
|
10
|
+
* `registerColorsFromThemes`, `registerFontsFromThemes`, and the
|
|
11
|
+
* `ThemeManager` constructor.
|
|
12
|
+
*
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
export function resolveThemes(themes?: Partial<TLThemes>): TLThemes {
|
|
16
|
+
return { default: DEFAULT_THEME, ...themes } as TLThemes
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Manages the editor's color themes.
|
|
21
|
+
*
|
|
22
|
+
* Stores named theme definitions (each containing light and dark color palettes
|
|
23
|
+
* alongside shared properties like font size). The current theme is resolved by
|
|
24
|
+
* combining the current theme name with the user's color mode preference.
|
|
25
|
+
*
|
|
26
|
+
* **Terminology:**
|
|
27
|
+
* - **Theme** (`TLTheme`): A named set of colors and typographic values for both light and dark modes.
|
|
28
|
+
* - **Color mode** (`'light' | 'dark'`): The resolved appearance mode, derived from the user's
|
|
29
|
+
* `colorScheme` preference (`'light' | 'dark' | 'system'`). Access via `getColorMode()`.
|
|
30
|
+
*
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export class ThemeManager {
|
|
34
|
+
private readonly _themes: Atom<TLThemes>
|
|
35
|
+
private readonly _currentThemeId: Atom<TLThemeId>
|
|
36
|
+
|
|
37
|
+
constructor(
|
|
38
|
+
private readonly editor: Editor,
|
|
39
|
+
options: {
|
|
40
|
+
themes: TLThemes
|
|
41
|
+
initial: TLThemeId
|
|
42
|
+
}
|
|
43
|
+
) {
|
|
44
|
+
this._themes = atom('ThemeManager._definitions', options.themes)
|
|
45
|
+
this._currentThemeId = atom('ThemeManager._currentThemeName', options.initial)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Get the current color mode based on the user's dark mode preference. */
|
|
49
|
+
@computed getColorMode(): 'light' | 'dark' {
|
|
50
|
+
return this.editor.user.getIsDarkMode() ? 'dark' : 'light'
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Get all registered theme definitions. */
|
|
54
|
+
getThemes(): TLThemes {
|
|
55
|
+
return this._themes.get()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Get a single theme definition by id. */
|
|
59
|
+
getTheme(id: TLThemeId): TLTheme | undefined {
|
|
60
|
+
return this._themes.get()[id]
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Get the id of the current theme. */
|
|
64
|
+
getCurrentThemeId(): TLThemeId {
|
|
65
|
+
return this._currentThemeId.get()
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
getCurrentTheme(): TLTheme {
|
|
69
|
+
return this._themes.get()[this.getCurrentThemeId()]!
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Set the current theme by id. The theme must have been previously registered. */
|
|
73
|
+
setCurrentTheme(id: TLThemeId): void {
|
|
74
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
75
|
+
if (!(id in this._themes.get())) {
|
|
76
|
+
console.warn(
|
|
77
|
+
`Theme '${id}' not found. Available themes: ${Object.keys(this._themes.get()).join(', ')}`
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
this._currentThemeId.set(id)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Replace all theme definitions, or update them via a callback that receives a deep copy. */
|
|
86
|
+
updateThemes(themes: TLThemes | ((themes: TLThemes) => TLThemes)): void {
|
|
87
|
+
this._themes.update((prev) => {
|
|
88
|
+
const next = typeof themes === 'function' ? themes(structuredClone(prev)) : themes
|
|
89
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
90
|
+
if (!('default' in next)) {
|
|
91
|
+
console.warn("The 'default' theme cannot be removed.")
|
|
92
|
+
return prev
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// If the current theme was removed, fall back to 'default'
|
|
96
|
+
if (!(this._currentThemeId.get() in next)) {
|
|
97
|
+
this._currentThemeId.set('default')
|
|
98
|
+
}
|
|
99
|
+
return next
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Register or update a named theme definition. */
|
|
104
|
+
updateTheme(theme: TLTheme): void {
|
|
105
|
+
this._themes.update((prev) => ({
|
|
106
|
+
...prev,
|
|
107
|
+
[theme.id]: theme,
|
|
108
|
+
}))
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Clean up any resources held by the manager. */
|
|
112
|
+
dispose() {
|
|
113
|
+
// currently no subscriptions to tear down, but here for consistency
|
|
114
|
+
// with the manager pattern and for future use
|
|
115
|
+
}
|
|
116
|
+
}
|