element-vir 26.12.0 → 26.12.1
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/declarative-element/custom-tag-name.js +1 -0
- package/dist/declarative-element/declarative-element-init.d.ts +56 -0
- package/dist/declarative-element/declarative-element-init.js +1 -0
- package/dist/declarative-element/declarative-element.d.ts +114 -0
- package/dist/declarative-element/declarative-element.js +36 -0
- package/dist/declarative-element/define-element.d.ts +41 -0
- package/dist/declarative-element/define-element.js +248 -0
- package/{src/declarative-element/definition-options.ts → dist/declarative-element/definition-options.d.ts} +2 -7
- package/dist/declarative-element/definition-options.js +9 -0
- package/dist/declarative-element/directives/assign.directive.d.ts +24 -0
- package/dist/declarative-element/directives/assign.directive.js +34 -0
- package/dist/declarative-element/directives/async-prop.d.ts +61 -0
- package/{src/declarative-element/directives/async-prop.ts → dist/declarative-element/directives/async-prop.js} +8 -42
- package/dist/declarative-element/directives/attributes.directive.d.ts +30 -0
- package/dist/declarative-element/directives/attributes.directive.js +35 -0
- package/dist/declarative-element/directives/create-attribute-directive.d.ts +28 -0
- package/dist/declarative-element/directives/create-attribute-directive.js +41 -0
- package/dist/declarative-element/directives/directive-helpers.d.ts +27 -0
- package/dist/declarative-element/directives/directive-helpers.js +37 -0
- package/dist/declarative-element/directives/listen-to-activate.d.ts +15 -0
- package/{src/declarative-element/directives/listen-to-activate.ts → dist/declarative-element/directives/listen-to-activate.js} +3 -8
- package/dist/declarative-element/directives/listen.directive.d.ts +92 -0
- package/dist/declarative-element/directives/listen.directive.js +48 -0
- package/dist/declarative-element/directives/mutate.directive.d.ts +38 -0
- package/dist/declarative-element/directives/mutate.directive.js +45 -0
- package/dist/declarative-element/directives/on-dom-created.directive.d.ts +44 -0
- package/dist/declarative-element/directives/on-dom-created.directive.js +51 -0
- package/dist/declarative-element/directives/on-dom-rendered.directive.d.ts +41 -0
- package/dist/declarative-element/directives/on-dom-rendered.directive.js +45 -0
- package/dist/declarative-element/directives/on-intersect.directive.d.ts +64 -0
- package/dist/declarative-element/directives/on-intersect.directive.js +89 -0
- package/dist/declarative-element/directives/on-resize.directive.d.ts +74 -0
- package/dist/declarative-element/directives/on-resize.directive.js +106 -0
- package/dist/declarative-element/directives/render-async.directive.d.ts +45 -0
- package/dist/declarative-element/directives/render-async.directive.js +33 -0
- package/dist/declarative-element/directives/render-if.directive.d.ts +32 -0
- package/{src/declarative-element/directives/render-if.directive.ts → dist/declarative-element/directives/render-if.directive.js} +3 -12
- package/dist/declarative-element/directives/test-id.directive.d.ts +52 -0
- package/{src/declarative-element/directives/test-id.directive.ts → dist/declarative-element/directives/test-id.directive.js} +2 -7
- package/dist/declarative-element/has-declarative-element-parent.d.ts +1 -0
- package/{src/declarative-element/has-declarative-element-parent.ts → dist/declarative-element/has-declarative-element-parent.js} +4 -7
- package/dist/declarative-element/is-declarative-element-definition.d.ts +17 -0
- package/{src/declarative-element/is-declarative-element-definition.ts → dist/declarative-element/is-declarative-element-definition.js} +11 -28
- package/dist/declarative-element/is-declarative-element.d.ts +15 -0
- package/{src/declarative-element/is-declarative-element.ts → dist/declarative-element/is-declarative-element.js} +5 -11
- package/dist/declarative-element/properties/assign-inputs.d.ts +1 -0
- package/dist/declarative-element/properties/assign-inputs.js +25 -0
- package/dist/declarative-element/properties/css-vars.d.ts +16 -0
- package/dist/declarative-element/properties/css-vars.js +1 -0
- package/dist/declarative-element/properties/element-events.d.ts +65 -0
- package/dist/declarative-element/properties/element-events.js +62 -0
- package/dist/declarative-element/properties/element-properties.js +1 -0
- package/dist/declarative-element/properties/host-classes.d.ts +36 -0
- package/dist/declarative-element/properties/host-classes.js +16 -0
- package/dist/declarative-element/properties/property-proxy.d.ts +22 -0
- package/{src/declarative-element/properties/property-proxy.ts → dist/declarative-element/properties/property-proxy.js} +21 -58
- package/dist/declarative-element/properties/string-names.d.ts +28 -0
- package/dist/declarative-element/properties/string-names.js +40 -0
- package/dist/declarative-element/properties/styles.d.ts +51 -0
- package/dist/declarative-element/properties/styles.js +41 -0
- package/dist/declarative-element/properties/tag-name.js +1 -0
- package/dist/declarative-element/render-callback.d.ts +56 -0
- package/dist/declarative-element/render-callback.js +27 -0
- package/dist/declarative-element/wrap-define-element.d.ts +36 -0
- package/dist/declarative-element/wrap-define-element.js +25 -0
- package/{src/index.ts → dist/index.d.ts} +0 -1
- package/dist/index.js +43 -0
- package/dist/lit-exports/all-lit-exports.js +2 -0
- package/{src/lit-exports/base-lit-exports.ts → dist/lit-exports/base-lit-exports.d.ts} +2 -10
- package/dist/lit-exports/base-lit-exports.js +24 -0
- package/{src/lit-exports/lit-repeat-fix.ts → dist/lit-exports/lit-repeat-fix.d.ts} +16 -45
- package/dist/lit-exports/lit-repeat-fix.js +37 -0
- package/dist/readme-examples/my-app.element.d.ts +1 -0
- package/{src/readme-examples/my-app.element.ts → dist/readme-examples/my-app.element.js} +4 -5
- package/dist/readme-examples/my-custom-action.event.d.ts +1 -0
- package/dist/readme-examples/my-custom-action.event.js +2 -0
- package/dist/readme-examples/my-custom-define.d.ts +4 -0
- package/{src/readme-examples/my-custom-define.ts → dist/readme-examples/my-custom-define.js} +4 -9
- package/dist/readme-examples/my-simple.element.d.ts +1 -0
- package/{src/readme-examples/my-simple.element.ts → dist/readme-examples/my-simple.element.js} +3 -4
- package/dist/readme-examples/my-with-assignment.element.d.ts +1 -0
- package/dist/readme-examples/my-with-assignment.element.js +15 -0
- package/dist/readme-examples/my-with-async-prop.element.d.ts +10 -0
- package/{src/readme-examples/my-with-async-prop.element.ts → dist/readme-examples/my-with-async-prop.element.js} +16 -24
- package/dist/readme-examples/my-with-cleanup-callback.element.d.ts +3 -0
- package/{src/readme-examples/my-with-cleanup-callback.element.ts → dist/readme-examples/my-with-cleanup-callback.element.js} +4 -5
- package/dist/readme-examples/my-with-css-vars.element.d.ts +1 -0
- package/{src/readme-examples/my-with-css-vars.element.ts → dist/readme-examples/my-with-css-vars.element.js} +4 -5
- package/dist/readme-examples/my-with-custom-events.element.d.ts +1 -0
- package/dist/readme-examples/my-with-custom-events.element.js +22 -0
- package/dist/readme-examples/my-with-event-listening.element.d.ts +3 -0
- package/{src/readme-examples/my-with-event-listening.element.ts → dist/readme-examples/my-with-event-listening.element.js} +9 -10
- package/dist/readme-examples/my-with-events.element.d.ts +4 -0
- package/dist/readme-examples/my-with-events.element.js +20 -0
- package/dist/readme-examples/my-with-host-class-definition.element.d.ts +3 -0
- package/{src/readme-examples/my-with-host-class-definition.element.ts → dist/readme-examples/my-with-host-class-definition.element.js} +6 -7
- package/dist/readme-examples/my-with-host-class-usage.element.d.ts +1 -0
- package/{src/readme-examples/my-with-host-class-usage.element.ts → dist/readme-examples/my-with-host-class-usage.element.js} +4 -5
- package/dist/readme-examples/my-with-inputs.element.d.ts +4 -0
- package/dist/readme-examples/my-with-inputs.element.js +9 -0
- package/dist/readme-examples/my-with-on-dom-created.element.d.ts +1 -0
- package/{src/readme-examples/my-with-on-dom-created.element.ts → dist/readme-examples/my-with-on-dom-created.element.js} +6 -7
- package/dist/readme-examples/my-with-on-resize.element.d.ts +1 -0
- package/dist/readme-examples/my-with-on-resize.element.js +18 -0
- package/dist/readme-examples/my-with-render-if.element.d.ts +3 -0
- package/dist/readme-examples/my-with-render-if.element.js +11 -0
- package/dist/readme-examples/my-with-styles-and-interpolated-selector.element.d.ts +1 -0
- package/{src/readme-examples/my-with-styles-and-interpolated-selector.element.ts → dist/readme-examples/my-with-styles-and-interpolated-selector.element.js} +5 -6
- package/dist/readme-examples/my-with-styles.element.d.ts +1 -0
- package/{src/readme-examples/my-with-styles.element.ts → dist/readme-examples/my-with-styles.element.js} +4 -5
- package/dist/readme-examples/my-with-update-state.element.d.ts +8 -0
- package/{src/readme-examples/my-with-update-state.element.ts → dist/readme-examples/my-with-update-state.element.js} +7 -8
- package/dist/readme-examples/require-declarative-element.d.ts +1 -0
- package/dist/readme-examples/require-declarative-element.js +2 -0
- package/dist/require-declarative-element.d.ts +14 -0
- package/{src/require-declarative-element.ts → dist/require-declarative-element.js} +0 -1
- package/{src/template-transforms/minimal-element-definition.ts → dist/template-transforms/minimal-element-definition.d.ts} +7 -19
- package/dist/template-transforms/minimal-element-definition.js +19 -0
- package/dist/template-transforms/nested-mapped-templates.d.ts +6 -0
- package/dist/template-transforms/nested-mapped-templates.js +96 -0
- package/{src/template-transforms/template-transform-type.ts → dist/template-transforms/template-transform-type.d.ts} +1 -3
- package/dist/template-transforms/template-transform-type.js +1 -0
- package/dist/template-transforms/transform-template.d.ts +14 -0
- package/{src/template-transforms/transform-template.ts → dist/template-transforms/transform-template.js} +22 -70
- package/dist/template-transforms/vir-css/css-transform.d.ts +4 -0
- package/dist/template-transforms/vir-css/css-transform.js +15 -0
- package/dist/template-transforms/vir-css/vir-css.d.ts +12 -0
- package/dist/template-transforms/vir-css/vir-css.js +21 -0
- package/dist/template-transforms/vir-html/html-interpolation.d.ts +42 -0
- package/dist/template-transforms/vir-html/html-interpolation.js +1 -0
- package/dist/template-transforms/vir-html/html-transform.d.ts +5 -0
- package/dist/template-transforms/vir-html/html-transform.js +96 -0
- package/dist/template-transforms/vir-html/tag-name-keys.d.ts +7 -0
- package/{src/template-transforms/vir-html/tag-name-keys.ts → dist/template-transforms/vir-html/tag-name-keys.js} +1 -1
- package/dist/template-transforms/vir-html/vir-html.d.ts +11 -0
- package/{src/template-transforms/vir-html/vir-html.ts → dist/template-transforms/vir-html/vir-html.js} +5 -13
- package/dist/typed-event/typed-event.d.ts +55 -0
- package/dist/typed-event/typed-event.js +50 -0
- package/dist/util/array.d.ts +5 -0
- package/{src/util/array.ts → dist/util/array.js} +5 -18
- package/{src/util/increment.ts → dist/util/increment.d.ts} +5 -24
- package/dist/util/increment.js +1 -0
- package/dist/util/lit-template.d.ts +9 -0
- package/{src/util/lit-template.ts → dist/util/lit-template.js} +10 -30
- package/dist/util/map-async-value.d.ts +7 -0
- package/{src/util/map-async-value.ts → dist/util/map-async-value.js} +10 -12
- package/dist/util/type.js +1 -0
- package/package.json +4 -4
- package/src/declarative-element/declarative-element-init.ts +0 -115
- package/src/declarative-element/declarative-element.ts +0 -372
- package/src/declarative-element/define-element.ts +0 -515
- package/src/declarative-element/directives/assign.directive.ts +0 -89
- package/src/declarative-element/directives/attributes.directive.ts +0 -63
- package/src/declarative-element/directives/create-attribute-directive.ts +0 -47
- package/src/declarative-element/directives/directive-helpers.ts +0 -67
- package/src/declarative-element/directives/listen.directive.ts +0 -206
- package/src/declarative-element/directives/mutate.directive.ts +0 -78
- package/src/declarative-element/directives/on-dom-created.directive.ts +0 -68
- package/src/declarative-element/directives/on-dom-rendered.directive.ts +0 -61
- package/src/declarative-element/directives/on-intersect.directive.ts +0 -139
- package/src/declarative-element/directives/on-resize.directive.ts +0 -142
- package/src/declarative-element/directives/render-async.directive.ts +0 -111
- package/src/declarative-element/properties/assign-inputs.ts +0 -30
- package/src/declarative-element/properties/css-vars.ts +0 -24
- package/src/declarative-element/properties/element-events.ts +0 -161
- package/src/declarative-element/properties/host-classes.ts +0 -63
- package/src/declarative-element/properties/string-names.ts +0 -83
- package/src/declarative-element/properties/styles.ts +0 -112
- package/src/declarative-element/render-callback.ts +0 -196
- package/src/declarative-element/wrap-define-element.ts +0 -127
- package/src/readme-examples/my-custom-action.event.ts +0 -3
- package/src/readme-examples/my-with-assignment.element.ts +0 -16
- package/src/readme-examples/my-with-custom-events.element.ts +0 -23
- package/src/readme-examples/my-with-events.element.ts +0 -23
- package/src/readme-examples/my-with-inputs.element.ts +0 -13
- package/src/readme-examples/my-with-on-resize.element.ts +0 -19
- package/src/readme-examples/my-with-render-if.element.ts +0 -15
- package/src/readme-examples/require-declarative-element.ts +0 -3
- package/src/template-transforms/nested-mapped-templates.ts +0 -157
- package/src/template-transforms/vir-css/css-transform.ts +0 -30
- package/src/template-transforms/vir-css/vir-css.ts +0 -30
- package/src/template-transforms/vir-html/html-interpolation.ts +0 -103
- package/src/template-transforms/vir-html/html-transform.ts +0 -149
- package/src/typed-event/typed-event.ts +0 -90
- /package/{src/declarative-element/custom-tag-name.ts → dist/declarative-element/custom-tag-name.d.ts} +0 -0
- /package/{src/declarative-element/properties/element-properties.ts → dist/declarative-element/properties/element-properties.d.ts} +0 -0
- /package/{src/declarative-element/properties/tag-name.ts → dist/declarative-element/properties/tag-name.d.ts} +0 -0
- /package/{src/lit-exports/all-lit-exports.ts → dist/lit-exports/all-lit-exports.d.ts} +0 -0
- /package/{src/util/type.ts → dist/util/type.d.ts} +0 -0
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import {directive, Directive, noChange, type PartInfo} from '../../lit-exports/all-lit-exports.js';
|
|
2
|
-
import {extractElement} from './directive-helpers.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Creates a lit directive that used simply for setting attributes on its parent element.
|
|
6
|
-
*
|
|
7
|
-
* @category Internal
|
|
8
|
-
*/
|
|
9
|
-
export function createAttributeDirective(attributeName: string) {
|
|
10
|
-
const newDirective = directive(
|
|
11
|
-
/** @internal */
|
|
12
|
-
class extends Directive {
|
|
13
|
-
public readonly element: Element;
|
|
14
|
-
|
|
15
|
-
constructor(partInfo: PartInfo) {
|
|
16
|
-
super(partInfo);
|
|
17
|
-
|
|
18
|
-
this.element = extractElement(partInfo, attributeName);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public render(attributeValue: string) {
|
|
22
|
-
this.element.setAttribute(attributeName, attributeValue);
|
|
23
|
-
return noChange;
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
return {
|
|
29
|
-
/**
|
|
30
|
-
* Creates a string for use with the
|
|
31
|
-
* [`querySelector`](https://developer.mozilla.org/docs/Web/API/Document/querySelector) API
|
|
32
|
-
* that selects this directive's attribute set to the given `attributeValue`.
|
|
33
|
-
*/
|
|
34
|
-
attributeSelector(this: void, attributeValue: string) {
|
|
35
|
-
return `[${attributeName}="${attributeValue}"]`;
|
|
36
|
-
},
|
|
37
|
-
/**
|
|
38
|
-
* Instantiates the attribute directive. This must be used on an element inside of an HTML
|
|
39
|
-
* template.
|
|
40
|
-
*/
|
|
41
|
-
attributeDirective(this: void, attributeValue: string) {
|
|
42
|
-
return newDirective(attributeValue);
|
|
43
|
-
},
|
|
44
|
-
/** The name of the attribute used in the directive. */
|
|
45
|
-
attributeName,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ChildPart,
|
|
3
|
-
type ElementPartInfo,
|
|
4
|
-
type PartInfo,
|
|
5
|
-
PartType,
|
|
6
|
-
} from '../../lit-exports/all-lit-exports.js';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* The full type for `ElementPartInfo` because `lit`'s built-in type leaves out of most of its
|
|
10
|
-
* interface.
|
|
11
|
-
*
|
|
12
|
-
* @category Internal
|
|
13
|
-
*/
|
|
14
|
-
export type FullElementPartInfo =
|
|
15
|
-
ElementPartInfo /** For some reason these aren't defined in lit's types already, even though they _do_ exist. */ & {
|
|
16
|
-
element: Element;
|
|
17
|
-
options: {
|
|
18
|
-
host: Element;
|
|
19
|
-
renderBefore: Element;
|
|
20
|
-
isConnected: boolean;
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Extracts the element from the given part info. Used in lit directives.
|
|
26
|
-
*
|
|
27
|
-
* @category Internal
|
|
28
|
-
*/
|
|
29
|
-
export function extractElement(partInfo: PartInfo, directiveName: string): Element {
|
|
30
|
-
assertIsElementPartInfo(partInfo, directiveName);
|
|
31
|
-
const element = partInfo.element;
|
|
32
|
-
return element;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function getPartHostTagName(partInfo: PartInfo): string | undefined {
|
|
36
|
-
try {
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
38
|
-
const tagName = ((partInfo as ChildPart).options!.host as Element).tagName.toLowerCase();
|
|
39
|
-
|
|
40
|
-
return tagName;
|
|
41
|
-
} catch {
|
|
42
|
-
return undefined;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Asserts that the given part info is an instance of {@link FullElementPartInfo}.
|
|
48
|
-
*
|
|
49
|
-
* @category Internal
|
|
50
|
-
*/
|
|
51
|
-
export function assertIsElementPartInfo(
|
|
52
|
-
partInfo: PartInfo,
|
|
53
|
-
directiveName: string,
|
|
54
|
-
): asserts partInfo is FullElementPartInfo {
|
|
55
|
-
const hostTagName = getPartHostTagName(partInfo);
|
|
56
|
-
const hostTagMessage = hostTagName ? `: in ${hostTagName}` : '';
|
|
57
|
-
|
|
58
|
-
if (partInfo.type !== PartType.ELEMENT) {
|
|
59
|
-
throw new Error(
|
|
60
|
-
`${directiveName} directive can only be attached directly to an element${hostTagMessage}.`,
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
64
|
-
if (!(partInfo as FullElementPartInfo).element) {
|
|
65
|
-
throw new Error(`${directiveName} directive found no element${hostTagMessage}.`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import {type MaybePromise} from '@augment-vir/common';
|
|
2
|
-
import {
|
|
3
|
-
directive,
|
|
4
|
-
Directive,
|
|
5
|
-
type DirectiveResult,
|
|
6
|
-
noChange,
|
|
7
|
-
type PartInfo,
|
|
8
|
-
} from '../../lit-exports/all-lit-exports.js';
|
|
9
|
-
import {
|
|
10
|
-
type DefinedTypedEvent,
|
|
11
|
-
defineTypedEvent,
|
|
12
|
-
type TypedEvent,
|
|
13
|
-
} from '../../typed-event/typed-event.js';
|
|
14
|
-
import {extractElement} from './directive-helpers.js';
|
|
15
|
-
|
|
16
|
-
/** We don't care at all what this returns, just allow anything! */
|
|
17
|
-
type ListenCallbackReturn = MaybePromise<any>;
|
|
18
|
-
|
|
19
|
-
type PossibleListenerCallbacks<
|
|
20
|
-
TypedEventTypeNameGeneric extends string,
|
|
21
|
-
TypedEventDetailGeneric,
|
|
22
|
-
NativeElementEventNameGeneric extends keyof HTMLElementEventMap,
|
|
23
|
-
> =
|
|
24
|
-
| ((
|
|
25
|
-
event: TypedEvent<TypedEventTypeNameGeneric, TypedEventDetailGeneric>,
|
|
26
|
-
) => ListenCallbackReturn)
|
|
27
|
-
| ((event: HTMLElementEventMap[NativeElementEventNameGeneric]) => ListenCallbackReturn);
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Listen to events. These can be native DOM events (use a string for the inputType argument) or
|
|
31
|
-
* typed events (pass in a return value from {@link defineTypedEvent}).
|
|
32
|
-
*
|
|
33
|
-
* @category Directives
|
|
34
|
-
* @example
|
|
35
|
-
*
|
|
36
|
-
* ```ts
|
|
37
|
-
* import {html, defineElement, listen} from 'element-vir';
|
|
38
|
-
*
|
|
39
|
-
* const MyElement = defineElement()({
|
|
40
|
-
* tagName: 'my-element',
|
|
41
|
-
* render() {
|
|
42
|
-
* return html`
|
|
43
|
-
* <div
|
|
44
|
-
* ${listen('click', () => {
|
|
45
|
-
* console.log('clicked!');
|
|
46
|
-
* })}
|
|
47
|
-
* >
|
|
48
|
-
* Some div
|
|
49
|
-
* </div>
|
|
50
|
-
* <${MyOtherElement}
|
|
51
|
-
* ${listen(MyOtherElement.events.someEvent, (event) => {
|
|
52
|
-
* console.log('event value', event.detail);
|
|
53
|
-
* })}
|
|
54
|
-
* ></${MyOtherElement}>
|
|
55
|
-
* `;
|
|
56
|
-
* },
|
|
57
|
-
* });
|
|
58
|
-
* ```
|
|
59
|
-
*/
|
|
60
|
-
export function listen<TypedEventTypeNameGeneric extends string, TypedEventDetailGeneric>(
|
|
61
|
-
/**
|
|
62
|
-
* Needs to come either from a declarative element (like MyDeclarativeElement.events.eventName),
|
|
63
|
-
* from a typed event created via the {@link defineTypedEvent} function, or be the name of a
|
|
64
|
-
* built-in event (like `'click'`).
|
|
65
|
-
*/
|
|
66
|
-
eventType: DefinedTypedEvent<TypedEventTypeNameGeneric, TypedEventDetailGeneric>,
|
|
67
|
-
/**
|
|
68
|
-
* The callback to fire when an event is caught. Assuming the {@link defineTypedEvent} input is
|
|
69
|
-
* properly typed, the event given to this callback will also be typed.
|
|
70
|
-
*/
|
|
71
|
-
listener: (
|
|
72
|
-
event: TypedEvent<TypedEventTypeNameGeneric, TypedEventDetailGeneric>,
|
|
73
|
-
) => ListenCallbackReturn,
|
|
74
|
-
): DirectiveResult<any>;
|
|
75
|
-
/**
|
|
76
|
-
* Listen to events. These can be native DOM events (use a string for the inputType argument) or
|
|
77
|
-
* typed events (pass in a return value from {@link defineTypedEvent}).
|
|
78
|
-
*
|
|
79
|
-
* @category Directives
|
|
80
|
-
* @example
|
|
81
|
-
*
|
|
82
|
-
* ```ts
|
|
83
|
-
* import {html, defineElement, listen} from 'element-vir';
|
|
84
|
-
*
|
|
85
|
-
* const MyElement = defineElement()({
|
|
86
|
-
* tagName: 'my-element',
|
|
87
|
-
* render() {
|
|
88
|
-
* return html`
|
|
89
|
-
* <div
|
|
90
|
-
* ${listen('click', () => {
|
|
91
|
-
* console.log('clicked!');
|
|
92
|
-
* })}
|
|
93
|
-
* >
|
|
94
|
-
* Some div
|
|
95
|
-
* </div>
|
|
96
|
-
* <${MyOtherElement}
|
|
97
|
-
* ${listen(MyOtherElement.events.someEvent, (event) => {
|
|
98
|
-
* console.log('event value', event.detail);
|
|
99
|
-
* })}
|
|
100
|
-
* ></${MyOtherElement}>
|
|
101
|
-
* `;
|
|
102
|
-
* },
|
|
103
|
-
* });
|
|
104
|
-
* ```
|
|
105
|
-
*/
|
|
106
|
-
export function listen<NativeElementEventNameGeneric extends keyof HTMLElementEventMap>(
|
|
107
|
-
/**
|
|
108
|
-
* Needs to come either from a declarative element (like MyDeclarativeElement.events.eventName),
|
|
109
|
-
* from a typed event created via the {@link defineTypedEvent} function, or be the name of a
|
|
110
|
-
* built-in event (like `'click'`).
|
|
111
|
-
*/
|
|
112
|
-
eventType: NativeElementEventNameGeneric,
|
|
113
|
-
/**
|
|
114
|
-
* The callback to fire when an event is caught. Assuming the {@link defineTypedEvent} input is
|
|
115
|
-
* properly typed, the event given to this callback will also be typed.
|
|
116
|
-
*/
|
|
117
|
-
listener: (event: HTMLElementEventMap[NativeElementEventNameGeneric]) => ListenCallbackReturn,
|
|
118
|
-
): DirectiveResult<any>;
|
|
119
|
-
export function listen<
|
|
120
|
-
TypedEventTypeNameGeneric extends string,
|
|
121
|
-
TypedEventDetailGeneric,
|
|
122
|
-
NativeElementEventNameGeneric extends keyof HTMLElementEventMap,
|
|
123
|
-
>(
|
|
124
|
-
eventType:
|
|
125
|
-
| DefinedTypedEvent<TypedEventTypeNameGeneric, TypedEventDetailGeneric>
|
|
126
|
-
| NativeElementEventNameGeneric,
|
|
127
|
-
listener: PossibleListenerCallbacks<
|
|
128
|
-
TypedEventTypeNameGeneric,
|
|
129
|
-
TypedEventDetailGeneric,
|
|
130
|
-
NativeElementEventNameGeneric
|
|
131
|
-
>,
|
|
132
|
-
): DirectiveResult<any> {
|
|
133
|
-
return listenDirective(eventType, listener);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
type ListenerMetaData = {
|
|
137
|
-
eventType: string;
|
|
138
|
-
callback: PossibleListenerCallbacks<any, any, any>;
|
|
139
|
-
listener: (event: any) => ListenCallbackReturn;
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* The directive generics here are not strong enough to maintain their values. Thus, the directive
|
|
144
|
-
* call is wrapped in the function above.
|
|
145
|
-
*/
|
|
146
|
-
const listenDirective = directive(
|
|
147
|
-
class extends Directive {
|
|
148
|
-
public readonly element: Element;
|
|
149
|
-
public lastListenerMetaData: ListenerMetaData | undefined;
|
|
150
|
-
|
|
151
|
-
constructor(partInfo: PartInfo) {
|
|
152
|
-
super(partInfo);
|
|
153
|
-
|
|
154
|
-
this.element = extractElement(partInfo, 'listen');
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
public resetListener(listenerMetaData: ListenerMetaData) {
|
|
158
|
-
if (this.lastListenerMetaData) {
|
|
159
|
-
this.element.removeEventListener(
|
|
160
|
-
this.lastListenerMetaData.eventType,
|
|
161
|
-
this.lastListenerMetaData.listener,
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
this.element.addEventListener(listenerMetaData.eventType, listenerMetaData.listener);
|
|
165
|
-
this.lastListenerMetaData = listenerMetaData;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
public createListenerMetaData(
|
|
169
|
-
eventType: string,
|
|
170
|
-
callback: (event: TypedEvent<string, unknown>) => ListenCallbackReturn,
|
|
171
|
-
): ListenerMetaData {
|
|
172
|
-
return {
|
|
173
|
-
eventType,
|
|
174
|
-
callback,
|
|
175
|
-
listener: (event: TypedEvent<string, unknown>) =>
|
|
176
|
-
this.lastListenerMetaData?.callback(event),
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
public render(
|
|
181
|
-
eventTypeInput: {type: string} | string,
|
|
182
|
-
callback: PossibleListenerCallbacks<any, any, any>,
|
|
183
|
-
) {
|
|
184
|
-
const eventType =
|
|
185
|
-
typeof eventTypeInput === 'string' ? eventTypeInput : eventTypeInput.type;
|
|
186
|
-
|
|
187
|
-
if (typeof eventType !== 'string') {
|
|
188
|
-
throw new TypeError(
|
|
189
|
-
`Cannot listen to an event with a name that is not a string. Given event name: '${String(eventType)}'`,
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (this.lastListenerMetaData && this.lastListenerMetaData.eventType === eventType) {
|
|
194
|
-
/**
|
|
195
|
-
* Store the callback here so we don't have to update the attached listener every
|
|
196
|
-
* time the callback is updated.
|
|
197
|
-
*/
|
|
198
|
-
this.lastListenerMetaData.callback = callback;
|
|
199
|
-
} else {
|
|
200
|
-
this.resetListener(this.createListenerMetaData(eventType, callback));
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return noChange;
|
|
204
|
-
}
|
|
205
|
-
},
|
|
206
|
-
);
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import {assertWrap} from '@augment-vir/assert';
|
|
2
|
-
import {directive, Directive, noChange, type PartInfo} from '../../lit-exports/all-lit-exports.js';
|
|
3
|
-
import {extractElement} from './directive-helpers.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Parameters for the callback given to the {@link mutate} directive.
|
|
7
|
-
*
|
|
8
|
-
* @category Internal
|
|
9
|
-
*/
|
|
10
|
-
export type MutateDirectiveParams<Params extends any[] = []> = {
|
|
11
|
-
directive: Directive;
|
|
12
|
-
element: HTMLElement;
|
|
13
|
-
params: Params;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* A directive that allows arbitrary modifications to be made to the element that it's attached to.
|
|
18
|
-
*
|
|
19
|
-
* @category Directives
|
|
20
|
-
*/
|
|
21
|
-
export const mutate = directive(
|
|
22
|
-
class extends Directive {
|
|
23
|
-
public readonly element: HTMLElement;
|
|
24
|
-
public lastKey: string | undefined;
|
|
25
|
-
|
|
26
|
-
constructor(partInfo: PartInfo) {
|
|
27
|
-
super(partInfo);
|
|
28
|
-
|
|
29
|
-
this.element = assertWrap.instanceOf(
|
|
30
|
-
extractElement(partInfo, 'modifyElement'),
|
|
31
|
-
HTMLElement,
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public render(callback: (params: Omit<MutateDirectiveParams, 'params'>) => void) {
|
|
36
|
-
callback({
|
|
37
|
-
directive: this,
|
|
38
|
-
element: this.element,
|
|
39
|
-
});
|
|
40
|
-
return noChange;
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* A helper for making new directives.
|
|
47
|
-
*
|
|
48
|
-
* @category Internal
|
|
49
|
-
*/
|
|
50
|
-
export function createMutateDirective<Params extends any[]>(
|
|
51
|
-
directiveName: string,
|
|
52
|
-
callback: (this: void, params: MutateDirectiveParams<Params>) => void,
|
|
53
|
-
) {
|
|
54
|
-
return directive(
|
|
55
|
-
class extends Directive {
|
|
56
|
-
public readonly element: HTMLElement;
|
|
57
|
-
|
|
58
|
-
constructor(partInfo: PartInfo) {
|
|
59
|
-
super(partInfo);
|
|
60
|
-
|
|
61
|
-
this.element = assertWrap.instanceOf(
|
|
62
|
-
extractElement(partInfo, directiveName),
|
|
63
|
-
HTMLElement,
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
public render(...params: Params) {
|
|
68
|
-
callback({
|
|
69
|
-
params,
|
|
70
|
-
directive: this,
|
|
71
|
-
element: this.element,
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
return noChange;
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
);
|
|
78
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import {type MaybePromise} from '@augment-vir/common';
|
|
2
|
-
import {directive, Directive, type PartInfo} from '../../lit-exports/all-lit-exports.js';
|
|
3
|
-
import {assertIsElementPartInfo} from './directive-helpers.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The callback / listener passed to {@link onDomCreated}. The `element` parameter is a reference to
|
|
7
|
-
* the DOM element that the directive was attached to.
|
|
8
|
-
*
|
|
9
|
-
* @category Internal
|
|
10
|
-
*/
|
|
11
|
-
export type OnDomCreatedCallback = (element: Element) => MaybePromise<void>;
|
|
12
|
-
|
|
13
|
-
const directiveName = 'onDomCreated';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* A directive that fires its listener only once, when the element that it's attached to is
|
|
17
|
-
* constructed. This is particularly useful for getting references to internal elements immediately
|
|
18
|
-
* after they've rendered.
|
|
19
|
-
*
|
|
20
|
-
* @category Directives
|
|
21
|
-
* @example
|
|
22
|
-
*
|
|
23
|
-
* ```ts
|
|
24
|
-
* import {html, defineElement, onDomCreated} from 'element-vir';
|
|
25
|
-
*
|
|
26
|
-
* const MyElement = defineElement()({
|
|
27
|
-
* tagName: 'my-element',
|
|
28
|
-
* render() {
|
|
29
|
-
* return html`
|
|
30
|
-
* <div
|
|
31
|
-
* ${onDomCreated((element) => {
|
|
32
|
-
* console.log('created!', element);
|
|
33
|
-
* })}
|
|
34
|
-
* >
|
|
35
|
-
* Some div
|
|
36
|
-
* </div>
|
|
37
|
-
* `;
|
|
38
|
-
* },
|
|
39
|
-
* });
|
|
40
|
-
* ```
|
|
41
|
-
*/
|
|
42
|
-
export const onDomCreated = directive(
|
|
43
|
-
class extends Directive {
|
|
44
|
-
public element: Element | undefined;
|
|
45
|
-
|
|
46
|
-
constructor(partInfo: PartInfo) {
|
|
47
|
-
super(partInfo);
|
|
48
|
-
|
|
49
|
-
assertIsElementPartInfo(partInfo, directiveName);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
public override update(partInfo: PartInfo, [callback]: [OnDomCreatedCallback]) {
|
|
53
|
-
assertIsElementPartInfo(partInfo, directiveName);
|
|
54
|
-
const newElement = partInfo.element;
|
|
55
|
-
if (newElement !== this.element) {
|
|
56
|
-
// use requestAnimationFrame here so it can fire property changes outside of a render loop
|
|
57
|
-
window.requestAnimationFrame(() => callback(newElement));
|
|
58
|
-
this.element = newElement;
|
|
59
|
-
}
|
|
60
|
-
return this.render(callback);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
64
|
-
public render(callback: OnDomCreatedCallback) {
|
|
65
|
-
return undefined;
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
);
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import {type MaybePromise} from '@augment-vir/common';
|
|
2
|
-
import {directive, Directive, type PartInfo} from '../../lit-exports/all-lit-exports.js';
|
|
3
|
-
import {assertIsElementPartInfo} from './directive-helpers.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The callback / listener passed to {@link onDomRendered}. The `element` parameter is a reference to
|
|
7
|
-
* the DOM element that the directive was attached to.
|
|
8
|
-
*
|
|
9
|
-
* @category Internal
|
|
10
|
-
*/
|
|
11
|
-
export type OnDomRenderedCallback = (element: Element) => MaybePromise<void>;
|
|
12
|
-
|
|
13
|
-
const directiveName = 'onDomRendered';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* A directive that fires its listener each time the element that it's attached to is rendered.
|
|
17
|
-
*
|
|
18
|
-
* @category Directives
|
|
19
|
-
* @example
|
|
20
|
-
*
|
|
21
|
-
* ```ts
|
|
22
|
-
* import {html, defineElement, onDomRendered} from 'element-vir';
|
|
23
|
-
*
|
|
24
|
-
* const MyElement = defineElement()({
|
|
25
|
-
* tagName: 'my-element',
|
|
26
|
-
* render() {
|
|
27
|
-
* return html`
|
|
28
|
-
* <div
|
|
29
|
-
* ${onDomRendered((element) => {
|
|
30
|
-
* console.log('rendered!', element);
|
|
31
|
-
* })}
|
|
32
|
-
* >
|
|
33
|
-
* Some div
|
|
34
|
-
* </div>
|
|
35
|
-
* `;
|
|
36
|
-
* },
|
|
37
|
-
* });
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export const onDomRendered = directive(
|
|
41
|
-
class extends Directive {
|
|
42
|
-
constructor(partInfo: PartInfo) {
|
|
43
|
-
super(partInfo);
|
|
44
|
-
|
|
45
|
-
assertIsElementPartInfo(partInfo, directiveName);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
public override update(partInfo: PartInfo, [callback]: [OnDomRenderedCallback]) {
|
|
49
|
-
assertIsElementPartInfo(partInfo, directiveName);
|
|
50
|
-
const element = partInfo.element;
|
|
51
|
-
// use `requestAnimationFrame` here so it can fire property changes outside of a render loop
|
|
52
|
-
window.requestAnimationFrame(() => callback(element));
|
|
53
|
-
return this.render(callback);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
57
|
-
public render(callback: OnDomRenderedCallback) {
|
|
58
|
-
return undefined;
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
);
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import {assert, assertWrap, check} from '@augment-vir/assert';
|
|
2
|
-
import {type MaybePromise} from '@augment-vir/common';
|
|
3
|
-
import {directive, Directive, type PartInfo} from '../../lit-exports/all-lit-exports.js';
|
|
4
|
-
import {assertIsElementPartInfo} from './directive-helpers.js';
|
|
5
|
-
|
|
6
|
-
const directiveName = 'onIntersect';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Callback called by the {@link onIntersect} directive.
|
|
10
|
-
*
|
|
11
|
-
* @category Internal
|
|
12
|
-
*/
|
|
13
|
-
export type OnIntersectCallback = (params: {
|
|
14
|
-
entry: IntersectionObserverEntry;
|
|
15
|
-
allEntries: IntersectionObserverEntry[];
|
|
16
|
-
observer: IntersectionObserver;
|
|
17
|
-
element: Element;
|
|
18
|
-
}) => MaybePromise<void>;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Options used for the {@link onIntersect} directive.
|
|
22
|
-
*
|
|
23
|
-
* @category Internal
|
|
24
|
-
*/
|
|
25
|
-
export type OnIntersectOptions = IntersectionObserverInit;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* A directive that fires its listener any time the element's configured "intersection" is crossed.
|
|
29
|
-
* This is commonly use for detecting when an element has scrolled into view. This uses the
|
|
30
|
-
* [built-in `IntersectionObserver`
|
|
31
|
-
* API](https://developer.mozilla.org/docs/Web/API/IntersectionObserver/IntersectionObserver), so it
|
|
32
|
-
* is very efficient.
|
|
33
|
-
*
|
|
34
|
-
* @category Directives
|
|
35
|
-
* @example
|
|
36
|
-
*
|
|
37
|
-
* ```ts
|
|
38
|
-
* import {html, defineElement, onIntersect} from 'element-vir';
|
|
39
|
-
*
|
|
40
|
-
* const MyElement = defineElement()({
|
|
41
|
-
* tagName: 'my-element',
|
|
42
|
-
* render() {
|
|
43
|
-
* return html`
|
|
44
|
-
* <div
|
|
45
|
-
* ${onIntersect({threshold: 1}, ({element, entry}) => {
|
|
46
|
-
* if (entry.isIntersecting) {
|
|
47
|
-
* console.log('is intersecting!');
|
|
48
|
-
* } else {
|
|
49
|
-
* console.log('is not intersecting');
|
|
50
|
-
* }
|
|
51
|
-
* })}
|
|
52
|
-
* >
|
|
53
|
-
* Some div
|
|
54
|
-
* </div>
|
|
55
|
-
* `;
|
|
56
|
-
* },
|
|
57
|
-
* });
|
|
58
|
-
* ```
|
|
59
|
-
*/
|
|
60
|
-
export const onIntersect = directive(
|
|
61
|
-
class extends Directive {
|
|
62
|
-
public element: Element | undefined;
|
|
63
|
-
public options: OnIntersectOptions | undefined;
|
|
64
|
-
public intersectionObserver: undefined | IntersectionObserver;
|
|
65
|
-
public callback: OnIntersectCallback | undefined;
|
|
66
|
-
|
|
67
|
-
constructor(partInfo: PartInfo) {
|
|
68
|
-
super(partInfo);
|
|
69
|
-
|
|
70
|
-
assertIsElementPartInfo(partInfo, directiveName);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
public fireCallback(entries: IntersectionObserverEntry[], observer: IntersectionObserver) {
|
|
74
|
-
assert.isLengthAtLeast(entries, 1);
|
|
75
|
-
|
|
76
|
-
void this.callback?.({
|
|
77
|
-
element: assertWrap.isDefined(this.element),
|
|
78
|
-
allEntries: entries,
|
|
79
|
-
observer,
|
|
80
|
-
entry: entries[0],
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
public override update(
|
|
85
|
-
partInfo: PartInfo,
|
|
86
|
-
[
|
|
87
|
-
options,
|
|
88
|
-
callback,
|
|
89
|
-
]: [
|
|
90
|
-
OnIntersectOptions,
|
|
91
|
-
OnIntersectCallback,
|
|
92
|
-
],
|
|
93
|
-
) {
|
|
94
|
-
assertIsElementPartInfo(partInfo, directiveName);
|
|
95
|
-
this.callback = callback;
|
|
96
|
-
let needsObserving = false;
|
|
97
|
-
|
|
98
|
-
const newOptions = options;
|
|
99
|
-
const oldOptions = this.options;
|
|
100
|
-
if (
|
|
101
|
-
!this.intersectionObserver ||
|
|
102
|
-
!oldOptions ||
|
|
103
|
-
!check.entriesEqual(newOptions, oldOptions)
|
|
104
|
-
) {
|
|
105
|
-
this.options = options;
|
|
106
|
-
this.intersectionObserver?.disconnect();
|
|
107
|
-
|
|
108
|
-
this.intersectionObserver = new IntersectionObserver(
|
|
109
|
-
(entries, observer) => this.fireCallback(entries, observer),
|
|
110
|
-
options,
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
needsObserving = true;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const newElement = partInfo.element;
|
|
117
|
-
const oldElement = this.element;
|
|
118
|
-
// if the element changes we need to observe the new one
|
|
119
|
-
if (newElement !== oldElement) {
|
|
120
|
-
this.element = newElement;
|
|
121
|
-
if (oldElement) {
|
|
122
|
-
this.intersectionObserver.unobserve(oldElement);
|
|
123
|
-
}
|
|
124
|
-
needsObserving = true;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (needsObserving) {
|
|
128
|
-
this.intersectionObserver.observe(newElement);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return this.render(options, callback);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
135
|
-
public render(options: OnIntersectOptions, callback: OnIntersectCallback) {
|
|
136
|
-
return undefined;
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
);
|