playhtml 1.0.0 → 1.2.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Change Log
2
+
3
+ The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
4
+
5
+ ## 1.2.0 - 2023-08-03
6
+
7
+ - Added support for yjs's `awareness` protocol to handle synced data that shouldn't be persisted.
package/README.md CHANGED
@@ -42,6 +42,12 @@ If you have dynamic elements that are hydrated after the initial load, you can c
42
42
  </script>
43
43
  ```
44
44
 
45
+ To create your own custom element, refer to the [can-play](#can-play) section.
46
+
47
+ ## Examples
48
+
49
+ Check out the [full gallery of community examples](https://gallery.playhtml.fun/) for more inspiration on what you can do! And [submit your own](https://coda.io/form/playhtml-example_dnUR7xNE7wz) once you've made one.
50
+
45
51
  ## Capabilities
46
52
 
47
53
  A full list can be found in `types.ts` under `TagType`.
@@ -1,48 +1,65 @@
1
1
  /// <reference lib="dom" />
2
2
  import { TagType } from "./types";
3
3
  type ModifierKey = "ctrlKey" | "altKey" | "shiftKey" | "metaKey";
4
- export interface ElementInitializer<T = any, U = any> {
4
+ export interface ElementInitializer<T = any, U = any, V = any> {
5
5
  defaultData: T | ((element: HTMLElement) => T);
6
6
  defaultLocalData?: U | ((element: HTMLElement) => U);
7
- updateElement: (data: ElementEventHandlerData<T, U>) => void;
8
- onDrag?: (e: MouseEvent, eventData: ElementEventHandlerData<T, U>) => void;
9
- onClick?: (e: MouseEvent, eventData: ElementEventHandlerData<T, U>) => void;
10
- onDragStart?: (e: MouseEvent, eventData: ElementEventHandlerData<T, U>) => void;
11
- additionalSetup?: (eventData: ElementSetupData<T, U>) => void;
7
+ myDefaultAwareness?: V | ((element: HTMLElement) => V);
8
+ updateElement: (data: ElementEventHandlerData<T, U, V>) => void;
9
+ updateElementAwareness?: (data: ElementAwarenessEventHandlerData<T, U, V>) => void;
10
+ onDrag?: (e: MouseEvent | TouchEvent, eventData: ElementEventHandlerData<T, U, V>) => void;
11
+ onClick?: (e: MouseEvent, eventData: ElementEventHandlerData<T, U, V>) => void;
12
+ onDragStart?: (e: MouseEvent | TouchEvent, eventData: ElementEventHandlerData<T, U, V>) => void;
13
+ additionalSetup?: (eventData: ElementSetupData<T, U, V>) => void;
12
14
  resetShortcut?: ModifierKey;
13
15
  debounceMs?: number;
14
16
  }
15
- export interface ElementData<T = any, U = any> extends ElementInitializer<T> {
17
+ export interface ElementData<T = any, U = any, V = any> extends ElementInitializer<T> {
16
18
  data?: T;
17
19
  localData?: U;
20
+ awareness?: V;
18
21
  element: HTMLElement;
19
22
  onChange: (data: T) => void;
23
+ onAwarenessChange: (data: V) => void;
24
+ triggerAwarenessUpdate: () => void;
20
25
  }
21
- interface ElementEventHandlerData<T = any, U = any> {
26
+ interface ElementEventHandlerData<T = any, U = any, V = any> {
22
27
  data: T;
23
28
  localData: U;
29
+ awareness: V[];
24
30
  element: HTMLElement;
25
31
  setData: (data: T) => void;
26
32
  setLocalData: (data: U) => void;
33
+ setLocalAwareness: (data: V) => void;
27
34
  }
28
- interface ElementSetupData<T = any, U = any> {
35
+ interface ElementAwarenessEventHandlerData<T = any, U = any, V = any> extends ElementEventHandlerData<T, U, V> {
36
+ myAwareness?: V;
37
+ }
38
+ interface ElementSetupData<T = any, U = any, V = any> {
29
39
  getData: () => T;
30
40
  getLocalData: () => U;
41
+ getAwareness: () => V[];
31
42
  getElement: () => HTMLElement;
32
43
  setData: (data: T) => void;
33
44
  setLocalData: (data: U) => void;
45
+ setLocalAwareness: (data: V) => void;
34
46
  }
35
47
  export declare const TagTypeToElement: Record<Exclude<TagType, "can-play">, ElementInitializer>;
36
- export declare class ElementHandler<T = any, U = any> {
48
+ export declare class ElementHandler<T = any, U = any, V = any> {
37
49
  defaultData: T;
38
50
  localData: U;
51
+ awareness: V[];
52
+ selfAwareness?: V;
39
53
  element: HTMLElement;
40
54
  _data: T;
41
55
  onChange: (data: T) => void;
56
+ onAwarenessChange: (data: V) => void;
42
57
  debouncedOnChange: (data: T) => void;
43
58
  resetShortcut?: ModifierKey;
44
- updateElement: (data: ElementEventHandlerData<T, U>) => void;
45
- constructor({ element, onChange, defaultData, defaultLocalData, data, updateElement, onClick, onDrag, onDragStart, additionalSetup, resetShortcut, debounceMs, }: ElementData<T>);
59
+ updateElement: (data: ElementEventHandlerData<T, U, V>) => void;
60
+ updateElementAwareness?: (data: ElementAwarenessEventHandlerData<T, U, V>) => void;
61
+ triggerAwarenessUpdate?: () => void;
62
+ constructor({ element, onChange, onAwarenessChange, defaultData, defaultLocalData, myDefaultAwareness, data, awareness: awarenessData, updateElement, updateElementAwareness, onClick, onDrag, onDragStart, additionalSetup, resetShortcut, debounceMs, triggerAwarenessUpdate, }: ElementData<T>);
46
63
  get data(): T;
47
64
  setLocalData(localData: U): void;
48
65
  /**
@@ -53,12 +70,15 @@ export declare class ElementHandler<T = any, U = any> {
53
70
  * (e.g. calling `updateElement` and `onChange`)
54
71
  */
55
72
  set __data(data: T);
56
- getEventHandlerData(): ElementEventHandlerData<T, U>;
73
+ set __awareness(data: V[]);
74
+ getEventHandlerData(): ElementEventHandlerData<T, U, V>;
75
+ getAwarenessEventHandlerData(): ElementAwarenessEventHandlerData<T, U, V>;
57
76
  getSetupData(): ElementSetupData<T, U>;
58
77
  /**
59
78
  * Public-use setter for data that makes the change to all clients.
60
79
  */
61
80
  setData(data: T): void;
81
+ setLocalAwareness(data: V): void;
62
82
  setDataDebounced(data: T): void;
63
83
  /**
64
84
  * Resets the element to its default state.
package/dist/main.d.ts CHANGED
@@ -3,7 +3,7 @@ import * as Y from "yjs";
3
3
  import { ElementHandler } from "./elements";
4
4
  export declare const globalData: Y.Map<Y.Map<any>>;
5
5
  export declare function getElementFromId(id: string): HTMLElement | null;
6
- export declare const elementHandlers: Map<string, Map<string, ElementHandler<any, any>>>;
6
+ export declare const elementHandlers: Map<string, Map<string, ElementHandler<any, any, any>>>;
7
7
  /**
8
8
  * Sets up any playhtml elements that are currently on the page.
9
9
  * Can be repeatedly called to set up new elements without affecting existing ones.