@tldraw/editor
Version:
tldraw infinite canvas SDK (editor).
8 lines (7 loc) • 5.04 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/lib/utils/SharedStylesMap.ts"],
"sourcesContent": ["import { StyleProp } from '@tldraw/tlschema'\nimport { exhaustiveSwitchError } from '@tldraw/utils'\n\n/**\n * The value of a particular {@link @tldraw/tlschema#StyleProp}.\n *\n * A `mixed` style means that in the current selection, there are lots of different values for the\n * same style prop - e.g. a red and a blue shape are selected.\n *\n * A `shared` style means that all shapes in the selection share the same value for this style prop.\n *\n * @public\n */\nexport type SharedStyle<T> =\n\t| { readonly type: 'mixed' }\n\t| { readonly type: 'shared'; readonly value: T }\n\nfunction sharedStyleEquals<T>(a: SharedStyle<T>, b: SharedStyle<T> | undefined) {\n\tif (!b) return false\n\tswitch (a.type) {\n\t\tcase 'mixed':\n\t\t\treturn b.type === 'mixed'\n\t\tcase 'shared':\n\t\t\treturn b.type === 'shared' && a.value === b.value\n\t\tdefault:\n\t\t\tthrow exhaustiveSwitchError(a)\n\t}\n}\n\n/**\n * A map of {@link @tldraw/tlschema#StyleProp | StyleProps} to their {@link SharedStyle} values. See\n * {@link Editor.getSharedStyles}.\n *\n * @public\n */\nexport class ReadonlySharedStyleMap {\n\t/** @internal */\n\tprotected map: Map<StyleProp<any>, SharedStyle<unknown>>\n\n\tconstructor(entries?: Iterable<[StyleProp<unknown>, SharedStyle<unknown>]>) {\n\t\tthis.map = new Map(entries)\n\t}\n\n\tget<T>(prop: StyleProp<T>): SharedStyle<T> | undefined {\n\t\treturn this.map.get(prop) as SharedStyle<T> | undefined\n\t}\n\n\tgetAsKnownValue<T>(prop: StyleProp<T>): T | undefined {\n\t\tconst value = this.get(prop)\n\t\tif (!value) return undefined\n\t\tif (value.type === 'mixed') return undefined\n\t\treturn value.value\n\t}\n\n\t// eslint-disable-next-line no-restricted-syntax\n\tget size() {\n\t\treturn this.map.size\n\t}\n\n\tequals(other: ReadonlySharedStyleMap) {\n\t\tif (this.size !== other.size) return false\n\n\t\tconst checkedKeys = new Set()\n\t\tfor (const [styleProp, value] of this) {\n\t\t\tif (!sharedStyleEquals(value, other.get(styleProp))) return false\n\t\t\tcheckedKeys.add(styleProp)\n\t\t}\n\t\tfor (const [styleProp, value] of other) {\n\t\t\tif (checkedKeys.has(styleProp)) continue\n\t\t\tif (!sharedStyleEquals(value, this.get(styleProp))) return false\n\t\t}\n\n\t\treturn true\n\t}\n\n\tkeys() {\n\t\treturn this.map.keys()\n\t}\n\n\tvalues() {\n\t\treturn this.map.values()\n\t}\n\n\tentries() {\n\t\treturn this.map.entries()\n\t}\n\n\t[Symbol.iterator]() {\n\t\treturn this.map[Symbol.iterator]()\n\t}\n}\n\n/** @internal */\nexport class SharedStyleMap extends ReadonlySharedStyleMap {\n\tset<T>(prop: StyleProp<T>, value: SharedStyle<T>) {\n\t\tthis.map.set(prop, value)\n\t}\n\n\tapplyValue<T>(prop: StyleProp<T>, value: T) {\n\t\tconst existingValue = this.get(prop)\n\n\t\t// if we don't have a value yet, set it\n\t\tif (!existingValue) {\n\t\t\tthis.set(prop, { type: 'shared', value })\n\t\t\treturn\n\t\t}\n\n\t\tswitch (existingValue.type) {\n\t\t\tcase 'mixed':\n\t\t\t\t// we're already mixed, adding new values won't help\n\t\t\t\treturn\n\t\t\tcase 'shared':\n\t\t\t\tif (existingValue.value !== value) {\n\t\t\t\t\t// if the value is different, we're now mixed:\n\t\t\t\t\tthis.set(prop, { type: 'mixed' })\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\texhaustiveSwitchError(existingValue, 'type')\n\t\t}\n\t}\n}\n"],
"mappings": "AACA,SAAS,6BAA6B;AAgBtC,SAAS,kBAAqB,GAAmB,GAA+B;AAC/E,MAAI,CAAC,EAAG,QAAO;AACf,UAAQ,EAAE,MAAM;AAAA,IACf,KAAK;AACJ,aAAO,EAAE,SAAS;AAAA,IACnB,KAAK;AACJ,aAAO,EAAE,SAAS,YAAY,EAAE,UAAU,EAAE;AAAA,IAC7C;AACC,YAAM,sBAAsB,CAAC;AAAA,EAC/B;AACD;AAQO,MAAM,uBAAuB;AAAA;AAAA,EAEzB;AAAA,EAEV,YAAY,SAAgE;AAC3E,SAAK,MAAM,IAAI,IAAI,OAAO;AAAA,EAC3B;AAAA,EAEA,IAAO,MAAgD;AACtD,WAAO,KAAK,IAAI,IAAI,IAAI;AAAA,EACzB;AAAA,EAEA,gBAAmB,MAAmC;AACrD,UAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,MAAM,SAAS,QAAS,QAAO;AACnC,WAAO,MAAM;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,OAAO;AACV,WAAO,KAAK,IAAI;AAAA,EACjB;AAAA,EAEA,OAAO,OAA+B;AACrC,QAAI,KAAK,SAAS,MAAM,KAAM,QAAO;AAErC,UAAM,cAAc,oBAAI,IAAI;AAC5B,eAAW,CAAC,WAAW,KAAK,KAAK,MAAM;AACtC,UAAI,CAAC,kBAAkB,OAAO,MAAM,IAAI,SAAS,CAAC,EAAG,QAAO;AAC5D,kBAAY,IAAI,SAAS;AAAA,IAC1B;AACA,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO;AACvC,UAAI,YAAY,IAAI,SAAS,EAAG;AAChC,UAAI,CAAC,kBAAkB,OAAO,KAAK,IAAI,SAAS,CAAC,EAAG,QAAO;AAAA,IAC5D;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,OAAO;AACN,WAAO,KAAK,IAAI,KAAK;AAAA,EACtB;AAAA,EAEA,SAAS;AACR,WAAO,KAAK,IAAI,OAAO;AAAA,EACxB;AAAA,EAEA,UAAU;AACT,WAAO,KAAK,IAAI,QAAQ;AAAA,EACzB;AAAA,EAEA,CAAC,OAAO,QAAQ,IAAI;AACnB,WAAO,KAAK,IAAI,OAAO,QAAQ,EAAE;AAAA,EAClC;AACD;AAGO,MAAM,uBAAuB,uBAAuB;AAAA,EAC1D,IAAO,MAAoB,OAAuB;AACjD,SAAK,IAAI,IAAI,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,WAAc,MAAoB,OAAU;AAC3C,UAAM,gBAAgB,KAAK,IAAI,IAAI;AAGnC,QAAI,CAAC,eAAe;AACnB,WAAK,IAAI,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC;AACxC;AAAA,IACD;AAEA,YAAQ,cAAc,MAAM;AAAA,MAC3B,KAAK;AAEJ;AAAA,MACD,KAAK;AACJ,YAAI,cAAc,UAAU,OAAO;AAElC,eAAK,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,QACjC;AACA;AAAA,MACD;AACC,8BAAsB,eAAe,MAAM;AAAA,IAC7C;AAAA,EACD;AACD;",
"names": []
}