amateras 0.5.0 → 0.7.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/README.md +23 -26
- package/index.ts +1 -0
- package/package.json +32 -27
- package/packages/core/package.json +32 -0
- package/packages/core/src/env.browser.ts +21 -0
- package/packages/core/src/env.node.ts +21 -0
- package/packages/core/src/global.ts +18 -0
- package/packages/core/src/index.ts +96 -0
- package/packages/core/src/lib/assignNodeProperties.ts +11 -0
- package/packages/core/src/lib/assignProperties.ts +57 -0
- package/packages/core/src/lib/chain.ts +17 -0
- package/packages/core/src/lib/dom.ts +20 -0
- package/packages/core/src/main.ts +4 -0
- package/{src → packages/core/src}/node/$Element.ts +25 -47
- package/packages/core/src/node/$EventTarget.ts +48 -0
- package/{src → packages/core/src}/node/$HTMLElement.ts +1 -1
- package/{src → packages/core/src}/node/$Node.ts +64 -73
- package/packages/core/src/node/$Virtual.ts +65 -0
- package/packages/css/package.json +17 -0
- package/{ext/css/src/lib → packages/css/src/ext}/colors/amber.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/blackwhite.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/blue.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/cyan.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/emerald.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/fuchsia.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/gray.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/green.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/indigo.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/lime.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/neutral.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/orange.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/pink.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/purple.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/red.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/rose.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/sky.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/slate.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/stone.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/teal.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/violet.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/yellow.ts +2 -2
- package/{ext/css/src/lib → packages/css/src/ext}/colors/zinc.ts +2 -2
- package/packages/css/src/ext/container.ts +32 -0
- package/packages/css/src/ext/keyframes.ts +54 -0
- package/packages/css/src/ext/media.ts +32 -0
- package/packages/css/src/ext/property.ts +48 -0
- package/packages/css/src/ext/variable.ts +51 -0
- package/{ext → packages}/css/src/index.ts +107 -183
- package/{ext → packages}/css/src/lib/colorAssign.ts +1 -1
- package/packages/css/src/lib/utils.ts +11 -0
- package/{ext → packages}/css/src/structure/$CSSContainerRule.ts +1 -1
- package/{ext → packages}/css/src/structure/$CSSKeyframesRule.ts +0 -1
- package/{ext → packages}/css/src/structure/$CSSMediaRule.ts +1 -1
- package/packages/css/src/structure/$CSSProperty.ts +19 -0
- package/{ext → packages}/css/src/structure/$CSSRule.ts +1 -1
- package/{ext → packages}/css/src/structure/$CSSStyleRule.ts +1 -1
- package/packages/css/src/structure/$CSSVariable.ts +30 -0
- package/packages/dom/package.json +20 -0
- package/packages/dom/src/lib/HTMLElementMap.ts +213 -0
- package/packages/dom/src/lib/assignAttributes.ts +16 -0
- package/packages/dom/src/structure/CSS.ts +7 -0
- package/packages/dom/src/structure/CSSStyleSheet.ts +10 -0
- package/packages/dom/src/structure/DOMTokenList.ts +19 -0
- package/packages/dom/src/structure/Document.ts +36 -0
- package/packages/dom/src/structure/Element.ts +106 -0
- package/packages/dom/src/structure/HTMLElement.ts +34 -0
- package/packages/dom/src/structure/History.ts +11 -0
- package/packages/dom/src/structure/Location.ts +9 -0
- package/packages/dom/src/structure/Node.ts +51 -0
- package/packages/dom/src/structure/NodeList.ts +10 -0
- package/packages/dom/src/structure/Storage.ts +8 -0
- package/packages/dom/src/structure/Text.ts +20 -0
- package/packages/dom/src/structure/Window.ts +14 -0
- package/packages/dom/src/structure/html/HTMLAbbrElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLAddressElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLAnchorElement.ts +25 -0
- package/packages/dom/src/structure/html/HTMLAreaElement.ts +26 -0
- package/packages/dom/src/structure/html/HTMLArticleElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLAsideElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLAudioElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLBDIElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLBDOElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLBElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLBRElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLBaseElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLBodyElement.ts +22 -0
- package/packages/dom/src/structure/html/HTMLButtonElement.ts +26 -0
- package/packages/dom/src/structure/html/HTMLCanvasElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLCiteElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLCodeElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLDDElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLDFNElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLDListElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLDTElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLDataElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLDataListElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLDetailsElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLDialogElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLDivElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLEMElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLEmbedElement.ts +20 -0
- package/packages/dom/src/structure/html/HTMLFieldSetElement.ts +19 -0
- package/packages/dom/src/structure/html/HTMLFigCaptionElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLFigureElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLFooterElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLFormElement.ts +24 -0
- package/packages/dom/src/structure/html/HTMLHGroupElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLHRElement.ts +21 -0
- package/packages/dom/src/structure/html/HTMLHeadElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLHeaderElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLHeadingElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLHtmlElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLIElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLIFrameElement.ts +31 -0
- package/packages/dom/src/structure/html/HTMLImageElement.ts +38 -0
- package/packages/dom/src/structure/html/HTMLInputElement.ts +55 -0
- package/packages/dom/src/structure/html/HTMLKBDElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLLIElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLLabelElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLLegendElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLLinkElement.ts +31 -0
- package/packages/dom/src/structure/html/HTMLMainElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLMapElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLMarkElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLMediaElement.ts +48 -0
- package/packages/dom/src/structure/html/HTMLMenuElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLMetaElement.ts +22 -0
- package/packages/dom/src/structure/html/HTMLMeterElement.ts +23 -0
- package/packages/dom/src/structure/html/HTMLModElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLNavElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLNoscriptElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLOListElement.ts +20 -0
- package/packages/dom/src/structure/html/HTMLObjectElement.ts +34 -0
- package/packages/dom/src/structure/html/HTMLOptGroupElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLOptionElement.ts +20 -0
- package/packages/dom/src/structure/html/HTMLOutputElement.ts +20 -0
- package/packages/dom/src/structure/html/HTMLParagraphElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLPictureElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLPreElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLProgressElement.ts +19 -0
- package/packages/dom/src/structure/html/HTMLQuoteElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLRPElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLRTElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLRubyElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLSElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLSampElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLScriptElement.ts +27 -0
- package/packages/dom/src/structure/html/HTMLSectionElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLSelectElement.ts +27 -0
- package/packages/dom/src/structure/html/HTMLSlotElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLSmallElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLSourceElement.ts +21 -0
- package/packages/dom/src/structure/html/HTMLSpanElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLStrongElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLStyleElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLSubElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLSummaryElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLSupElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLTableCaptionElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLTableCellElement.ts +31 -0
- package/packages/dom/src/structure/html/HTMLTableColElement.ts +23 -0
- package/packages/dom/src/structure/html/HTMLTableElement.ts +26 -0
- package/packages/dom/src/structure/html/HTMLTableRowElement.ts +23 -0
- package/packages/dom/src/structure/html/HTMLTableSectionElement.ts +20 -0
- package/packages/dom/src/structure/html/HTMLTemplateElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLTextAreaElement.ts +33 -0
- package/packages/dom/src/structure/html/HTMLTimeElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLTitleElement.ts +17 -0
- package/packages/dom/src/structure/html/HTMLTrackElement.ts +21 -0
- package/packages/dom/src/structure/html/HTMLUElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLUListElement.ts +18 -0
- package/packages/dom/src/structure/html/HTMLVarElement.ts +16 -0
- package/packages/dom/src/structure/html/HTMLVideoElement.ts +22 -0
- package/packages/dom/src/structure/html/HTMLWBRElement.ts +16 -0
- package/packages/html/package.json +18 -0
- package/{ext/html/html.ts → packages/html/src/index.ts} +1 -1
- package/{ext/html → packages/html/src}/node/$Anchor.ts +4 -4
- package/packages/html/src/node/$Canvas.ts +38 -0
- package/{ext/html → packages/html/src}/node/$Dialog.ts +4 -4
- package/{ext/html → packages/html/src}/node/$Form.ts +4 -4
- package/{ext/html → packages/html/src}/node/$Image.ts +4 -4
- package/{ext/html → packages/html/src}/node/$Input.ts +4 -4
- package/{ext/html → packages/html/src}/node/$Label.ts +4 -4
- package/{ext/html → packages/html/src}/node/$Media.ts +4 -4
- package/{ext/html → packages/html/src}/node/$OptGroup.ts +4 -4
- package/{ext/html → packages/html/src}/node/$Option.ts +4 -4
- package/{ext/html → packages/html/src}/node/$Select.ts +4 -4
- package/{ext/html → packages/html/src}/node/$TextArea.ts +4 -4
- package/{ext → packages}/i18n/README.md +20 -0
- package/packages/i18n/package.json +19 -0
- package/packages/i18n/src/index.ts +140 -0
- package/{ext → packages}/i18n/src/structure/I18n.ts +12 -8
- package/{ext → packages}/i18n/src/structure/I18nDictionary.ts +1 -1
- package/packages/i18n/src/structure/I18nTranslation.ts +41 -0
- package/packages/idb/package.json +19 -0
- package/{ext → packages}/idb/src/index.ts +2 -2
- package/{ext → packages}/idb/src/lib/$IDBRequest.ts +1 -1
- package/{ext → packages}/idb/src/structure/$IDB.ts +1 -1
- package/{ext → packages}/idb/src/structure/$IDBCursor.ts +1 -1
- package/{ext → packages}/idb/src/structure/$IDBIndex.ts +1 -1
- package/{ext → packages}/idb/src/structure/$IDBStore.ts +1 -1
- package/{ext → packages}/idb/src/structure/$IDBStoreBase.ts +1 -1
- package/{ext → packages}/idb/src/structure/$IDBTransaction.ts +1 -1
- package/{ext → packages}/idb/src/structure/builder/$IDBBuilder.ts +9 -10
- package/{ext → packages}/idb/src/structure/builder/$IDBStoreBuilder.ts +1 -1
- package/packages/markdown/README.md +53 -0
- package/packages/markdown/package.json +19 -0
- package/packages/markdown/src/index.ts +3 -0
- package/packages/markdown/src/lib/type.ts +26 -0
- package/packages/markdown/src/lib/util.ts +21 -0
- package/packages/markdown/src/structure/Markdown.ts +54 -0
- package/packages/markdown/src/structure/MarkdownLexer.ts +111 -0
- package/packages/markdown/src/structure/MarkdownParser.ts +34 -0
- package/packages/markdown/src/syntax/alert.ts +46 -0
- package/packages/markdown/src/syntax/blockquote.ts +35 -0
- package/packages/markdown/src/syntax/bold.ts +11 -0
- package/packages/markdown/src/syntax/code.ts +11 -0
- package/packages/markdown/src/syntax/codeblock.ts +44 -0
- package/packages/markdown/src/syntax/heading.ts +14 -0
- package/packages/markdown/src/syntax/horizontalRule.ts +11 -0
- package/packages/markdown/src/syntax/image.ts +23 -0
- package/packages/markdown/src/syntax/italic.ts +11 -0
- package/packages/markdown/src/syntax/link.ts +46 -0
- package/packages/markdown/src/syntax/list.ts +121 -0
- package/packages/markdown/src/syntax/table.ts +67 -0
- package/packages/markdown/src/syntax/text.ts +19 -0
- package/packages/router/README.md +175 -0
- package/packages/router/package.json +19 -0
- package/packages/router/src/index.ts +68 -0
- package/packages/router/src/node/Page.ts +38 -0
- package/packages/router/src/node/Router.ts +212 -0
- package/{ext/router → packages/router/src}/node/RouterAnchor.ts +13 -2
- package/packages/router/src/structure/PageBuilder.ts +24 -0
- package/packages/router/src/structure/Route.ts +105 -0
- package/packages/signal/README.md +93 -0
- package/packages/signal/package.json +18 -0
- package/packages/signal/src/index.ts +221 -0
- package/{src → packages/signal/src}/structure/Signal.ts +6 -10
- package/packages/ssr/package.json +19 -0
- package/packages/ssr/src/index.ts +38 -0
- package/packages/ui/lib/VirtualScroll.ts +25 -0
- package/packages/ui/node/Accordian.ts +97 -0
- package/packages/ui/node/Carousel.ts +20 -0
- package/packages/ui/node/Form.ts +54 -0
- package/packages/ui/node/Grid.ts +0 -0
- package/packages/ui/node/Modal.ts +45 -0
- package/packages/ui/node/Table.ts +43 -0
- package/packages/ui/node/Tabs.ts +129 -0
- package/packages/ui/node/Toast.ts +16 -0
- package/packages/ui/node/Waterfall.ts +94 -0
- package/packages/ui/package.json +21 -0
- package/packages/utils/package.json +17 -0
- package/{src → packages/utils/src}/global.ts +9 -15
- package/packages/utils/src/index.ts +90 -0
- package/tsconfig.json +1 -1
- package/ext/css/package.json +0 -9
- package/ext/css/src/structure/$CSSVariable.ts +0 -12
- package/ext/html/node/$Canvas.ts +0 -16
- package/ext/i18n/package.json +0 -10
- package/ext/i18n/src/index.ts +0 -54
- package/ext/i18n/src/node/I18nText.ts +0 -35
- package/ext/idb/package.json +0 -13
- package/ext/markdown/index.ts +0 -121
- package/ext/markdown/package.json +0 -8
- package/ext/router/README.md +0 -81
- package/ext/router/index.ts +0 -73
- package/ext/router/node/Page.ts +0 -27
- package/ext/router/node/Route.ts +0 -54
- package/ext/router/node/Router.ts +0 -149
- package/ext/ssr/env.ts +0 -61
- package/ext/ssr/index.ts +0 -49
- package/ext/ssr/package.json +0 -10
- package/src/core.ts +0 -114
- package/src/index.ts +0 -3
- package/src/lib/assign.ts +0 -38
- package/src/lib/assignHelper.ts +0 -18
- package/src/lib/chain.ts +0 -13
- package/src/lib/debounce.ts +0 -7
- package/src/lib/env.ts +0 -2
- package/src/lib/native.ts +0 -40
- package/src/lib/randomId.ts +0 -9
- package/src/lib/sleep.ts +0 -3
- package/src/lib/toArray.ts +0 -9
- package/src/lib/trycatch.ts +0 -17
- package/src/node.ts +0 -10
- /package/{ext → packages}/css/README.md +0 -0
- /package/{ext/css/src/lib → packages/css/src/ext}/colors.ts +0 -0
- /package/{ext → packages}/css/src/structure/$CSSDeclaration.ts +0 -0
- /package/{ext → packages}/idb/README.md +0 -0
- /package/{ext → packages}/idb/src/core.ts +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { Signal } from "#structure/Signal";
|
|
2
|
+
import { $Node, $Text, type $NodeContentResolver } from "@amateras/core/node/$Node";
|
|
3
|
+
import { _instanceof, isObject, _JSON_stringify, _Object_assign, forEach, _null, _Object_defineProperty, _Object_entries, isNull, isFunction, _Promise, toArray } from "@amateras/utils";
|
|
4
|
+
|
|
5
|
+
// handle $Node content process
|
|
6
|
+
$Node.processors.add((_, content) => {
|
|
7
|
+
const signal = (content as SignalFunction<any>)?.signal;
|
|
8
|
+
if (_instanceof(signal, Signal)) {
|
|
9
|
+
const signalValue = (content as SignalFunction<any>)();
|
|
10
|
+
const signalHandler = (resolver: any): $NodeContentResolver<any> => {
|
|
11
|
+
if (_instanceof(resolver, _Promise)) {
|
|
12
|
+
return resolver.then(signalHandler) as any;
|
|
13
|
+
}
|
|
14
|
+
else if (_instanceof(resolver, $Node)) {
|
|
15
|
+
// handler signal $Node result
|
|
16
|
+
let node = resolver;
|
|
17
|
+
const set = (value: any) => {
|
|
18
|
+
node.replace(value);
|
|
19
|
+
node = value;
|
|
20
|
+
}
|
|
21
|
+
signal.subscribe(set);
|
|
22
|
+
return [resolver];
|
|
23
|
+
} else {
|
|
24
|
+
// handler signal other type result
|
|
25
|
+
const $text = new $Text()
|
|
26
|
+
const set = (value: any) => $text.textContent(isObject(value) ? _JSON_stringify(value) : value);
|
|
27
|
+
signal.subscribe(set);
|
|
28
|
+
set(resolver);
|
|
29
|
+
return [$text];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return signalHandler(signalValue);
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
// handle $Node native method setter
|
|
37
|
+
$Node.setters.add((value, set) => {
|
|
38
|
+
const signal = value?.signal;
|
|
39
|
+
if (isFunction(value) && _instanceof(signal, Signal)) {
|
|
40
|
+
signal.subscribe(set);
|
|
41
|
+
return value();
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
declare module '@amateras/core' {
|
|
46
|
+
export namespace $ {
|
|
47
|
+
export function signal<T>(value: T): SignalFunction<T>;
|
|
48
|
+
export function compute<T>(process: (untrack: UntrackHandler) => T): ComputeFunction<T>;
|
|
49
|
+
export function effect(process: (untrack: UntrackHandler) => void): void;
|
|
50
|
+
export function await<K, O extends SignalAwaitOptions<K, unknown>>(signalFn: SignalFunction<OrPromise<K>> | ComputeFunction<OrPromise<K>>, options: O): O[keyof O];
|
|
51
|
+
export interface $NodeContentMap {
|
|
52
|
+
signalFn: SignalFunction<any>;
|
|
53
|
+
computeFn: ComputeFunction<any>;
|
|
54
|
+
}
|
|
55
|
+
export interface $NodeParameterMap<T> {
|
|
56
|
+
// Distribute T type
|
|
57
|
+
signalFn: T extends any ? SignalFunction<Narrow<T>> : never;
|
|
58
|
+
computeFn: T extends any ? ComputeFunction<Narrow<T>> : never;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type SignalObject<T> = T extends Array<any> ? {} : T extends object ? { [key in keyof T as `${string & key}$`]: SignalFunction<T[key]> } : {};
|
|
64
|
+
type SignalValue<T> = T extends Promise<infer R> ? T | R : T;
|
|
65
|
+
export type SignalPromiseState = 'await' | 'then' | 'catch';
|
|
66
|
+
export type SignalAwaitOptions<T, R> = {
|
|
67
|
+
await: R | (() => R);
|
|
68
|
+
then: R | ((value: T) => R);
|
|
69
|
+
catch: R | ((error: any) => R);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export type SignalFunction<T> = {
|
|
73
|
+
(): T;
|
|
74
|
+
signal: Signal<T>;
|
|
75
|
+
set: (newValue: SignalValue<T> | ((oldValue: T) => SignalValue<T>)) => SignalFunction<T>;
|
|
76
|
+
value: () => T;
|
|
77
|
+
state: SignalPromiseState;
|
|
78
|
+
await: <R>(resolver: R) => AwaitFunction<T, R>
|
|
79
|
+
} & SignalObject<T>;
|
|
80
|
+
|
|
81
|
+
export type ComputeFunction<T> = {
|
|
82
|
+
(): T;
|
|
83
|
+
signal: Signal<T>;
|
|
84
|
+
state: SignalPromiseState;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export type AwaitFunction<T, R> = {
|
|
88
|
+
(): R;
|
|
89
|
+
then<D>(resolver: (value: Awaited<T>) => D): AwaitFunction<T, R | D>;
|
|
90
|
+
then<D>(resolver: D): AwaitFunction<T, R | D>;
|
|
91
|
+
catch<D>(resolver: (error: any) => D): AwaitFunction<T, R | D>;
|
|
92
|
+
catch<D>(resolver: D): AwaitFunction<T, R | D>;
|
|
93
|
+
} & ComputeFunction<T>
|
|
94
|
+
|
|
95
|
+
export type SignalListener = (signal: Signal<any>) => void;
|
|
96
|
+
export type UntrackHandler = <T>(fn: () => T) => T
|
|
97
|
+
|
|
98
|
+
const signalComputeListeners = new Set<SignalListener>();
|
|
99
|
+
const signalEffectListeners = new Set<SignalListener>();
|
|
100
|
+
const signalFnMap = new Map<any, SignalFunction<any> | ComputeFunction<any>>();
|
|
101
|
+
|
|
102
|
+
// experiment feature
|
|
103
|
+
const nestedComputeFn = (value: any, parentSignalFn: SignalFunction<any> | ComputeFunction<any>) => {
|
|
104
|
+
if (isObject(value) && !isNull(value)) {
|
|
105
|
+
forEach(_Object_entries(value), ([key, val]) => {
|
|
106
|
+
const cachedFn = signalFnMap.get(val);
|
|
107
|
+
const val$ = cachedFn ?? $.compute(() => parentSignalFn()[key]);
|
|
108
|
+
if (!cachedFn && isObject(val)) {
|
|
109
|
+
signalFnMap.set(val, val$);
|
|
110
|
+
nestedComputeFn(val, val$)
|
|
111
|
+
}
|
|
112
|
+
_Object_defineProperty(parentSignalFn, `${key}$`, {value: val$});
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const AWAIT = 'await';
|
|
118
|
+
const THEN = 'then';
|
|
119
|
+
const CATCH = 'catch';
|
|
120
|
+
|
|
121
|
+
_Object_assign($, {
|
|
122
|
+
// signal function
|
|
123
|
+
signal<T>(value: T): SignalFunction<T> {
|
|
124
|
+
const signal = new Signal<T>(value);
|
|
125
|
+
const signalFn = function () {
|
|
126
|
+
forEach([...signalComputeListeners, ...signalEffectListeners], fn => fn(signal));
|
|
127
|
+
return signal.value();
|
|
128
|
+
} as SignalFunction<T>
|
|
129
|
+
nestedComputeFn(value, signalFn);
|
|
130
|
+
if (_instanceof(value, _Promise)) {
|
|
131
|
+
value.catch(err => {
|
|
132
|
+
signalFn.state = CATCH;
|
|
133
|
+
signal.value(err);
|
|
134
|
+
}).then(v => {
|
|
135
|
+
signalFn.state = THEN;
|
|
136
|
+
signal.value(v as any);
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
_Object_assign(signalFn, {
|
|
140
|
+
signal,
|
|
141
|
+
set: (newValue: T) => (signal.value(newValue), signalFn),
|
|
142
|
+
value: () => signal.value(),
|
|
143
|
+
state: _instanceof(value, _Promise) ? AWAIT : THEN,
|
|
144
|
+
|
|
145
|
+
await(awaitResolver: any) {
|
|
146
|
+
let thenResolver: any = _null
|
|
147
|
+
let catchResolver: any = _null
|
|
148
|
+
const awaitFn = $.compute(untrack => {
|
|
149
|
+
const value = signalFn();
|
|
150
|
+
return untrack(() => {
|
|
151
|
+
switch (signalFn.state) {
|
|
152
|
+
case AWAIT: return isFunction(awaitResolver) ? awaitResolver() : awaitResolver;
|
|
153
|
+
case THEN: return isFunction(thenResolver) ? thenResolver(value as any) : thenResolver;
|
|
154
|
+
case CATCH: return isFunction(catchResolver) ? catchResolver(value) : catchResolver;
|
|
155
|
+
}
|
|
156
|
+
})
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
_Object_assign(awaitFn, {
|
|
160
|
+
then(resolver: any) {
|
|
161
|
+
thenResolver = resolver;
|
|
162
|
+
return awaitFn;
|
|
163
|
+
},
|
|
164
|
+
catch(resolver: any) {
|
|
165
|
+
catchResolver = resolver;
|
|
166
|
+
return awaitFn;
|
|
167
|
+
}
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
return awaitFn;
|
|
171
|
+
}
|
|
172
|
+
})
|
|
173
|
+
return signalFn
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
// compute function
|
|
177
|
+
compute<T>(process: (untrack: UntrackHandler) => T): ComputeFunction<T> {
|
|
178
|
+
let subscribed = false;
|
|
179
|
+
const signalFn: SignalFunction<any> = $.signal(_null);
|
|
180
|
+
const computeFn = () => {
|
|
181
|
+
if (!subscribed) return signalFn.set(subscribe()).value();
|
|
182
|
+
else return signalFn.set(process(untrack)).value();
|
|
183
|
+
}
|
|
184
|
+
const untrack = <T>(fn: () => T) => {
|
|
185
|
+
if (subscribed) return fn();
|
|
186
|
+
signalComputeListeners.delete(signalListener);
|
|
187
|
+
const result = fn();
|
|
188
|
+
signalComputeListeners.add(signalListener);
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
const signalListener = (signal: Signal<any>) =>
|
|
192
|
+
signal.subscribe(() => signalFn.set(process(untrack)))
|
|
193
|
+
const subscribe = () => {
|
|
194
|
+
signalComputeListeners.add(signalListener);
|
|
195
|
+
const result = process(untrack);
|
|
196
|
+
signalComputeListeners.delete(signalListener);
|
|
197
|
+
subscribed = true;
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
_Object_assign(computeFn, { signal: signalFn.signal });
|
|
201
|
+
return computeFn as ComputeFunction<T>
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
// effect
|
|
205
|
+
effect(process: (untrack: UntrackHandler) => void) {
|
|
206
|
+
let subscribed = false;
|
|
207
|
+
const signalListener = (signal: Signal<any>) =>
|
|
208
|
+
signal.subscribe(_ => process(untrack));
|
|
209
|
+
const untrack = <T>(fn: () => T) => {
|
|
210
|
+
if (subscribed) return fn();
|
|
211
|
+
signalEffectListeners.delete(signalListener);
|
|
212
|
+
const result = fn();
|
|
213
|
+
signalEffectListeners.add(signalListener);
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
signalEffectListeners.add(signalListener);
|
|
217
|
+
process(untrack);
|
|
218
|
+
signalEffectListeners.delete(signalListener);
|
|
219
|
+
subscribed = true;
|
|
220
|
+
},
|
|
221
|
+
})
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { _instanceof, forEach, isFunction, isUndefined } from "
|
|
1
|
+
import { _instanceof, forEach, isFunction, isUndefined } from "@amateras/utils";
|
|
2
2
|
|
|
3
3
|
export class Signal<T> {
|
|
4
4
|
#value: T;
|
|
5
|
-
subscribers = new Set<(value: T) => void>();
|
|
6
|
-
static listeners = new Set<(signal: Signal<any>) => void>();
|
|
5
|
+
#subscribers = new Set<(value: T) => void>();
|
|
7
6
|
constructor(value: T) {
|
|
8
7
|
this.#value = value;
|
|
9
8
|
}
|
|
@@ -12,10 +11,7 @@ export class Signal<T> {
|
|
|
12
11
|
value(newValue: T): this;
|
|
13
12
|
value(callback: (oldValue: T) => T): this;
|
|
14
13
|
value(resolver?: T | ((oldValue: T) => T)) {
|
|
15
|
-
if (!arguments.length)
|
|
16
|
-
forEach(Signal.listeners, fn => fn(this));
|
|
17
|
-
return this.#value;
|
|
18
|
-
}
|
|
14
|
+
if (!arguments.length) return this.#value;
|
|
19
15
|
if (isFunction(resolver)) this.value(resolver(this.#value));
|
|
20
16
|
else if (!isUndefined(resolver)) {
|
|
21
17
|
this.#value = resolver;
|
|
@@ -25,17 +21,17 @@ export class Signal<T> {
|
|
|
25
21
|
}
|
|
26
22
|
|
|
27
23
|
emit() {
|
|
28
|
-
forEach(this
|
|
24
|
+
forEach(this.#subscribers, subs => subs(this.#value))
|
|
29
25
|
return this;
|
|
30
26
|
}
|
|
31
27
|
|
|
32
28
|
subscribe(callback: (value: T) => void) {
|
|
33
|
-
this
|
|
29
|
+
this.#subscribers.add(callback);
|
|
34
30
|
return this;
|
|
35
31
|
}
|
|
36
32
|
|
|
37
33
|
unsubscribe(callback: (value: T) => void) {
|
|
38
|
-
this
|
|
34
|
+
this.#subscribers.delete(callback);
|
|
39
35
|
return this;
|
|
40
36
|
}
|
|
41
37
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@amateras/ssr",
|
|
3
|
+
"peerDependencies": {
|
|
4
|
+
"@amateras/core": "workspace:*",
|
|
5
|
+
"@amateras/utils": "workspace:*",
|
|
6
|
+
"@amateras/router": "workspace:*",
|
|
7
|
+
"@amateras/signal": "workspace:*"
|
|
8
|
+
},
|
|
9
|
+
"imports": {
|
|
10
|
+
"#structure/*": "./src/structure/*.ts",
|
|
11
|
+
"#lib/*": "./src/lib/*.ts",
|
|
12
|
+
"#node/*": "./src/node/*.ts"
|
|
13
|
+
},
|
|
14
|
+
"exports": {
|
|
15
|
+
"./structure/*": "./src/structure/*.ts",
|
|
16
|
+
"./lib/*": "./src/lib/*.ts",
|
|
17
|
+
"./node/*": "./src/node/*.ts"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import '@amateras/signal';
|
|
2
|
+
import { Page } from "@amateras/router";
|
|
3
|
+
import type { SignalFunction } from "@amateras/signal";
|
|
4
|
+
import { isAsyncFunction, isFunction } from '@amateras/utils';
|
|
5
|
+
import { onclient, onserver } from '@amateras/core/env';
|
|
6
|
+
|
|
7
|
+
declare global {
|
|
8
|
+
export var hydrate: Record<string, any>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
declare module '@amateras/router' {
|
|
12
|
+
export interface Page {
|
|
13
|
+
data<D>(data: D | (() => OrPromise<D>)): Promise<SignalFunction<D>>
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
onclient(() => {
|
|
18
|
+
if (typeof window.hydrate === 'undefined') window.hydrate = {};
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
//@ts-expect-error
|
|
22
|
+
onserver(() => global.hydrate = {})
|
|
23
|
+
|
|
24
|
+
Object.assign(Page.prototype, {
|
|
25
|
+
async data<D>(this: Page, data: D | (() => OrPromise<D>)) {
|
|
26
|
+
const hydrateData = hydrate[this.pathId];
|
|
27
|
+
const d = hydrateData ?? (
|
|
28
|
+
isFunction(data)
|
|
29
|
+
? isAsyncFunction(data)
|
|
30
|
+
? await data()
|
|
31
|
+
: data()
|
|
32
|
+
: data
|
|
33
|
+
)
|
|
34
|
+
const data$ = $.signal(d);
|
|
35
|
+
onserver(() => $.effect(() => hydrate[this.pathId] = data$()))
|
|
36
|
+
return data$;
|
|
37
|
+
}
|
|
38
|
+
})
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { _document } from "@amateras/core/env";
|
|
2
|
+
import { $HTMLElement } from "@amateras/core/node/$HTMLElement";
|
|
3
|
+
import type { $Node } from "@amateras/core/node/$Node";
|
|
4
|
+
import type { $Virtual } from "@amateras/core/node/$Virtual";
|
|
5
|
+
import { _Array_from, _instanceof, forEach } from "@amateras/utils";
|
|
6
|
+
|
|
7
|
+
export const VirtualScroll = ($parent: $Virtual, scroller: $Node = $(_document)) => {
|
|
8
|
+
scroller.on('scroll', () => render($parent), true);
|
|
9
|
+
$parent.on('layout', () => render($parent));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const render = ($parent: $Virtual) => {
|
|
13
|
+
const number = parseInt;
|
|
14
|
+
const parentRect = $parent.getBoundingClientRect();
|
|
15
|
+
const children = _Array_from($parent.nodes);
|
|
16
|
+
forEach(children, $child => {
|
|
17
|
+
if (!_instanceof($child, $HTMLElement)) return;
|
|
18
|
+
const { top, height } = $child.style();
|
|
19
|
+
const topPos = parentRect.top + number(top);
|
|
20
|
+
const bottomPos = topPos + number(height);
|
|
21
|
+
if (bottomPos < 0 || topPos > outerHeight + 200) $parent.hide($child);
|
|
22
|
+
else $parent.show($child);
|
|
23
|
+
})
|
|
24
|
+
$parent.render();
|
|
25
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { chain } from "@amateras/core/lib/chain";
|
|
2
|
+
import { $HTMLElement } from "@amateras/core/node/$HTMLElement";
|
|
3
|
+
import type { $Node, $NodeContentResolver } from "@amateras/core/node/$Node";
|
|
4
|
+
import { _Array_from, _instanceof, forEach, isNull } from "@amateras/utils";
|
|
5
|
+
|
|
6
|
+
const [ACCORDIAN, ACCORDIAN_ITEM, ACCORDIAN_TRIGGER, ACCORDIAN_CONTENT, ACCORDIAN_CONTAINER] = ['accordian', 'accordian-item', 'accordian-trigger', 'accordian-content', 'accordian-container'] as const;
|
|
7
|
+
forEach([
|
|
8
|
+
`${ACCORDIAN},${ACCORDIAN_ITEM},${ACCORDIAN_TRIGGER}{display:block}`,
|
|
9
|
+
`${ACCORDIAN_CONTENT}{display:grid;grid-template-rows:0fr}`,
|
|
10
|
+
`${ACCORDIAN_CONTENT}[opened]{grid-template-rows:1fr}`,
|
|
11
|
+
`${ACCORDIAN_CONTAINER}{overflow:hidden}`,
|
|
12
|
+
], $.style)
|
|
13
|
+
|
|
14
|
+
export class Accordian extends $HTMLElement {
|
|
15
|
+
#autoclose = false;
|
|
16
|
+
constructor() {
|
|
17
|
+
super(ACCORDIAN);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
autoclose(): boolean;
|
|
21
|
+
autoclose(autoclose: boolean): this;
|
|
22
|
+
autoclose(autoclose?: boolean) {
|
|
23
|
+
return chain(this, arguments, () => this.#autoclose, autoclose, autoclose => this.#autoclose = autoclose);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get items() {
|
|
27
|
+
return _Array_from($(this.childNodes)).filter($child => _instanceof($child, AccordianItem))
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class AccordianItem extends $HTMLElement {
|
|
32
|
+
$content: null | AccordianContent = null;
|
|
33
|
+
$trigger: null | AccordianTrigger = null;
|
|
34
|
+
$root: null | Accordian = null;
|
|
35
|
+
constructor() {
|
|
36
|
+
super(ACCORDIAN_ITEM);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
mounted($parent: $Node): this {
|
|
40
|
+
if (_instanceof($parent, Accordian)) this.$root = $parent;
|
|
41
|
+
forEach($(this.childNodes), $c => {
|
|
42
|
+
if (_instanceof($c, AccordianTrigger)) this.$trigger = $c;
|
|
43
|
+
if (_instanceof($c, AccordianContent)) this.$content = $c;
|
|
44
|
+
})
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export class AccordianTrigger extends $HTMLElement {
|
|
50
|
+
$item: null | AccordianItem = null;
|
|
51
|
+
constructor() {
|
|
52
|
+
super(ACCORDIAN_TRIGGER);
|
|
53
|
+
this.on('click', _ => {
|
|
54
|
+
const $item = this.$item;
|
|
55
|
+
const $root = $item?.$root;
|
|
56
|
+
this.$item?.$content?.use($content => isNull($content.attr('opened')) ? $content.open() : $content.close());
|
|
57
|
+
$root?.autoclose() && $root.items.forEach($i => $i !== $item && $i.$content?.close())
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
mounted($parent: $Node): this {
|
|
62
|
+
if (_instanceof($parent, AccordianItem)) this.$item = $parent;
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export class AccordianContent extends $HTMLElement {
|
|
68
|
+
$container = $(AccordianContainer);
|
|
69
|
+
constructor() {
|
|
70
|
+
super(ACCORDIAN_CONTENT);
|
|
71
|
+
super.insert(this.$container);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
content(children: $NodeContentResolver<AccordianContainer>): this {
|
|
75
|
+
this.$container.content(children);
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
insert(resolver: $NodeContentResolver<AccordianContainer>, position?: number): this {
|
|
80
|
+
this.$container.insert(resolver, position);
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
open() {
|
|
85
|
+
return this.attr({opened: ''})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
close() {
|
|
89
|
+
return this.attr({opened: null});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export class AccordianContainer extends $HTMLElement {
|
|
94
|
+
constructor() {
|
|
95
|
+
super(ACCORDIAN_CONTAINER);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { chain } from "@amateras/core/lib/chain";
|
|
2
|
+
import { $HTMLElement } from "@amateras/core/node/$HTMLElement";
|
|
3
|
+
|
|
4
|
+
const CAROUSEL = 'carousel';
|
|
5
|
+
const CAROUSEL_ITEM = 'carousel-item';
|
|
6
|
+
|
|
7
|
+
export class Carousel extends $HTMLElement {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(CAROUSEL);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class CarouselItem extends $HTMLElement {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(CAROUSEL_ITEM)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type CarouselDirection = 'horizontal' | 'vertical';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { $HTMLElement } from "@amateras/core/node/$HTMLElement";
|
|
2
|
+
import type { $Node } from "@amateras/core/node/$Node";
|
|
3
|
+
import { $Form } from "@amateras/html/node/$Form";
|
|
4
|
+
import { $Input } from "@amateras/html/node/$Input";
|
|
5
|
+
import { $Label } from "@amateras/html/node/$Label";
|
|
6
|
+
import { _instanceof, _undefined } from "@amateras/utils";
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
export class Form extends $Form {
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
get data() {
|
|
15
|
+
return Object.fromEntries(new FormData(this.node).entries());
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class FormField extends $HTMLElement {
|
|
20
|
+
constructor() {
|
|
21
|
+
super('form-field');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class FormItem extends $HTMLElement {
|
|
26
|
+
constructor(name?: string) {
|
|
27
|
+
super('form-item');
|
|
28
|
+
this.attr({ name });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class Label extends $Label {
|
|
33
|
+
constructor() {
|
|
34
|
+
super();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
mounted($parent: $Node): void {
|
|
38
|
+
if (_instanceof($parent, FormItem))
|
|
39
|
+
this.htmlFor($parent.attr('name') ?? _undefined);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class Input extends $Input {
|
|
44
|
+
constructor() {
|
|
45
|
+
super();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
mounted($parent: $Node): void {
|
|
49
|
+
if (_instanceof($parent, FormItem)) {
|
|
50
|
+
const name = $parent.attr('name') ?? _undefined;
|
|
51
|
+
this.id(name).name(name);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { $HTMLElement } from "@amateras/core/node/$HTMLElement";
|
|
2
|
+
import { forEach, isNull } from "@amateras/utils";
|
|
3
|
+
const MODAL = 'modal';
|
|
4
|
+
const MODAL_CONTENT = 'modal-content'
|
|
5
|
+
|
|
6
|
+
forEach([
|
|
7
|
+
`${MODAL}{display:flex;justify-content:center;align-items:center;position:fixed;top:0;left:0;height:100%;width:100%;background:#00000050}`,
|
|
8
|
+
`${MODAL_CONTENT}{display:block;}`
|
|
9
|
+
], $.style)
|
|
10
|
+
export class Modal extends $HTMLElement {
|
|
11
|
+
name?: string;
|
|
12
|
+
constructor(name?: string) {
|
|
13
|
+
super(MODAL);
|
|
14
|
+
this.name = name;
|
|
15
|
+
if (name)
|
|
16
|
+
$(window).on('routeopen', e => {
|
|
17
|
+
const url = new URL(location.href);
|
|
18
|
+
const param = url.searchParams.get(name);
|
|
19
|
+
if (isNull(param)) return this.close();
|
|
20
|
+
this.open();
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
open() {
|
|
25
|
+
$(document.body).insert(this);
|
|
26
|
+
this.once('click', e => {
|
|
27
|
+
if ($(e) === $(e.target)) {
|
|
28
|
+
if (!this.name) this.close();
|
|
29
|
+
else history.back();
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
close() {
|
|
36
|
+
this.remove();
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class ModalContent extends $HTMLElement {
|
|
42
|
+
constructor() {
|
|
43
|
+
super(MODAL_CONTENT);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { $HTMLElement } from "@amateras/core/node/$HTMLElement";
|
|
2
|
+
|
|
3
|
+
export class Table extends $HTMLElement {
|
|
4
|
+
constructor() {
|
|
5
|
+
super('table');
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class TableHeader extends $HTMLElement {
|
|
10
|
+
constructor() {
|
|
11
|
+
super('thead')
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class TableBody extends $HTMLElement {
|
|
16
|
+
constructor() {
|
|
17
|
+
super('tbody')
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class TableRow extends $HTMLElement {
|
|
22
|
+
constructor() {
|
|
23
|
+
super('tr')
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class TableHead extends $HTMLElement {
|
|
28
|
+
constructor() {
|
|
29
|
+
super('th')
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class TableCell extends $HTMLElement {
|
|
34
|
+
constructor() {
|
|
35
|
+
super('td')
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export class TableFooter extends $HTMLElement {
|
|
40
|
+
constructor() {
|
|
41
|
+
super('tfoot')
|
|
42
|
+
}
|
|
43
|
+
}
|