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.
Files changed (290) hide show
  1. package/README.md +23 -26
  2. package/index.ts +1 -0
  3. package/package.json +32 -27
  4. package/packages/core/package.json +32 -0
  5. package/packages/core/src/env.browser.ts +21 -0
  6. package/packages/core/src/env.node.ts +21 -0
  7. package/packages/core/src/global.ts +18 -0
  8. package/packages/core/src/index.ts +96 -0
  9. package/packages/core/src/lib/assignNodeProperties.ts +11 -0
  10. package/packages/core/src/lib/assignProperties.ts +57 -0
  11. package/packages/core/src/lib/chain.ts +17 -0
  12. package/packages/core/src/lib/dom.ts +20 -0
  13. package/packages/core/src/main.ts +4 -0
  14. package/{src → packages/core/src}/node/$Element.ts +25 -47
  15. package/packages/core/src/node/$EventTarget.ts +48 -0
  16. package/{src → packages/core/src}/node/$HTMLElement.ts +1 -1
  17. package/{src → packages/core/src}/node/$Node.ts +64 -73
  18. package/packages/core/src/node/$Virtual.ts +65 -0
  19. package/packages/css/package.json +17 -0
  20. package/{ext/css/src/lib → packages/css/src/ext}/colors/amber.ts +2 -2
  21. package/{ext/css/src/lib → packages/css/src/ext}/colors/blackwhite.ts +2 -2
  22. package/{ext/css/src/lib → packages/css/src/ext}/colors/blue.ts +2 -2
  23. package/{ext/css/src/lib → packages/css/src/ext}/colors/cyan.ts +2 -2
  24. package/{ext/css/src/lib → packages/css/src/ext}/colors/emerald.ts +2 -2
  25. package/{ext/css/src/lib → packages/css/src/ext}/colors/fuchsia.ts +2 -2
  26. package/{ext/css/src/lib → packages/css/src/ext}/colors/gray.ts +2 -2
  27. package/{ext/css/src/lib → packages/css/src/ext}/colors/green.ts +2 -2
  28. package/{ext/css/src/lib → packages/css/src/ext}/colors/indigo.ts +2 -2
  29. package/{ext/css/src/lib → packages/css/src/ext}/colors/lime.ts +2 -2
  30. package/{ext/css/src/lib → packages/css/src/ext}/colors/neutral.ts +2 -2
  31. package/{ext/css/src/lib → packages/css/src/ext}/colors/orange.ts +2 -2
  32. package/{ext/css/src/lib → packages/css/src/ext}/colors/pink.ts +2 -2
  33. package/{ext/css/src/lib → packages/css/src/ext}/colors/purple.ts +2 -2
  34. package/{ext/css/src/lib → packages/css/src/ext}/colors/red.ts +2 -2
  35. package/{ext/css/src/lib → packages/css/src/ext}/colors/rose.ts +2 -2
  36. package/{ext/css/src/lib → packages/css/src/ext}/colors/sky.ts +2 -2
  37. package/{ext/css/src/lib → packages/css/src/ext}/colors/slate.ts +2 -2
  38. package/{ext/css/src/lib → packages/css/src/ext}/colors/stone.ts +2 -2
  39. package/{ext/css/src/lib → packages/css/src/ext}/colors/teal.ts +2 -2
  40. package/{ext/css/src/lib → packages/css/src/ext}/colors/violet.ts +2 -2
  41. package/{ext/css/src/lib → packages/css/src/ext}/colors/yellow.ts +2 -2
  42. package/{ext/css/src/lib → packages/css/src/ext}/colors/zinc.ts +2 -2
  43. package/packages/css/src/ext/container.ts +32 -0
  44. package/packages/css/src/ext/keyframes.ts +54 -0
  45. package/packages/css/src/ext/media.ts +32 -0
  46. package/packages/css/src/ext/property.ts +48 -0
  47. package/packages/css/src/ext/variable.ts +51 -0
  48. package/{ext → packages}/css/src/index.ts +107 -183
  49. package/{ext → packages}/css/src/lib/colorAssign.ts +1 -1
  50. package/packages/css/src/lib/utils.ts +11 -0
  51. package/{ext → packages}/css/src/structure/$CSSContainerRule.ts +1 -1
  52. package/{ext → packages}/css/src/structure/$CSSKeyframesRule.ts +0 -1
  53. package/{ext → packages}/css/src/structure/$CSSMediaRule.ts +1 -1
  54. package/packages/css/src/structure/$CSSProperty.ts +19 -0
  55. package/{ext → packages}/css/src/structure/$CSSRule.ts +1 -1
  56. package/{ext → packages}/css/src/structure/$CSSStyleRule.ts +1 -1
  57. package/packages/css/src/structure/$CSSVariable.ts +30 -0
  58. package/packages/dom/package.json +20 -0
  59. package/packages/dom/src/lib/HTMLElementMap.ts +213 -0
  60. package/packages/dom/src/lib/assignAttributes.ts +16 -0
  61. package/packages/dom/src/structure/CSS.ts +7 -0
  62. package/packages/dom/src/structure/CSSStyleSheet.ts +10 -0
  63. package/packages/dom/src/structure/DOMTokenList.ts +19 -0
  64. package/packages/dom/src/structure/Document.ts +36 -0
  65. package/packages/dom/src/structure/Element.ts +106 -0
  66. package/packages/dom/src/structure/HTMLElement.ts +34 -0
  67. package/packages/dom/src/structure/History.ts +11 -0
  68. package/packages/dom/src/structure/Location.ts +9 -0
  69. package/packages/dom/src/structure/Node.ts +51 -0
  70. package/packages/dom/src/structure/NodeList.ts +10 -0
  71. package/packages/dom/src/structure/Storage.ts +8 -0
  72. package/packages/dom/src/structure/Text.ts +20 -0
  73. package/packages/dom/src/structure/Window.ts +14 -0
  74. package/packages/dom/src/structure/html/HTMLAbbrElement.ts +16 -0
  75. package/packages/dom/src/structure/html/HTMLAddressElement.ts +16 -0
  76. package/packages/dom/src/structure/html/HTMLAnchorElement.ts +25 -0
  77. package/packages/dom/src/structure/html/HTMLAreaElement.ts +26 -0
  78. package/packages/dom/src/structure/html/HTMLArticleElement.ts +16 -0
  79. package/packages/dom/src/structure/html/HTMLAsideElement.ts +16 -0
  80. package/packages/dom/src/structure/html/HTMLAudioElement.ts +16 -0
  81. package/packages/dom/src/structure/html/HTMLBDIElement.ts +16 -0
  82. package/packages/dom/src/structure/html/HTMLBDOElement.ts +16 -0
  83. package/packages/dom/src/structure/html/HTMLBElement.ts +16 -0
  84. package/packages/dom/src/structure/html/HTMLBRElement.ts +17 -0
  85. package/packages/dom/src/structure/html/HTMLBaseElement.ts +18 -0
  86. package/packages/dom/src/structure/html/HTMLBodyElement.ts +22 -0
  87. package/packages/dom/src/structure/html/HTMLButtonElement.ts +26 -0
  88. package/packages/dom/src/structure/html/HTMLCanvasElement.ts +18 -0
  89. package/packages/dom/src/structure/html/HTMLCiteElement.ts +16 -0
  90. package/packages/dom/src/structure/html/HTMLCodeElement.ts +16 -0
  91. package/packages/dom/src/structure/html/HTMLDDElement.ts +16 -0
  92. package/packages/dom/src/structure/html/HTMLDFNElement.ts +16 -0
  93. package/packages/dom/src/structure/html/HTMLDListElement.ts +17 -0
  94. package/packages/dom/src/structure/html/HTMLDTElement.ts +16 -0
  95. package/packages/dom/src/structure/html/HTMLDataElement.ts +17 -0
  96. package/packages/dom/src/structure/html/HTMLDataListElement.ts +16 -0
  97. package/packages/dom/src/structure/html/HTMLDetailsElement.ts +17 -0
  98. package/packages/dom/src/structure/html/HTMLDialogElement.ts +18 -0
  99. package/packages/dom/src/structure/html/HTMLDivElement.ts +17 -0
  100. package/packages/dom/src/structure/html/HTMLEMElement.ts +16 -0
  101. package/packages/dom/src/structure/html/HTMLEmbedElement.ts +20 -0
  102. package/packages/dom/src/structure/html/HTMLFieldSetElement.ts +19 -0
  103. package/packages/dom/src/structure/html/HTMLFigCaptionElement.ts +16 -0
  104. package/packages/dom/src/structure/html/HTMLFigureElement.ts +16 -0
  105. package/packages/dom/src/structure/html/HTMLFooterElement.ts +16 -0
  106. package/packages/dom/src/structure/html/HTMLFormElement.ts +24 -0
  107. package/packages/dom/src/structure/html/HTMLHGroupElement.ts +16 -0
  108. package/packages/dom/src/structure/html/HTMLHRElement.ts +21 -0
  109. package/packages/dom/src/structure/html/HTMLHeadElement.ts +16 -0
  110. package/packages/dom/src/structure/html/HTMLHeaderElement.ts +16 -0
  111. package/packages/dom/src/structure/html/HTMLHeadingElement.ts +17 -0
  112. package/packages/dom/src/structure/html/HTMLHtmlElement.ts +18 -0
  113. package/packages/dom/src/structure/html/HTMLIElement.ts +16 -0
  114. package/packages/dom/src/structure/html/HTMLIFrameElement.ts +31 -0
  115. package/packages/dom/src/structure/html/HTMLImageElement.ts +38 -0
  116. package/packages/dom/src/structure/html/HTMLInputElement.ts +55 -0
  117. package/packages/dom/src/structure/html/HTMLKBDElement.ts +16 -0
  118. package/packages/dom/src/structure/html/HTMLLIElement.ts +18 -0
  119. package/packages/dom/src/structure/html/HTMLLabelElement.ts +18 -0
  120. package/packages/dom/src/structure/html/HTMLLegendElement.ts +17 -0
  121. package/packages/dom/src/structure/html/HTMLLinkElement.ts +31 -0
  122. package/packages/dom/src/structure/html/HTMLMainElement.ts +16 -0
  123. package/packages/dom/src/structure/html/HTMLMapElement.ts +17 -0
  124. package/packages/dom/src/structure/html/HTMLMarkElement.ts +16 -0
  125. package/packages/dom/src/structure/html/HTMLMediaElement.ts +48 -0
  126. package/packages/dom/src/structure/html/HTMLMenuElement.ts +18 -0
  127. package/packages/dom/src/structure/html/HTMLMetaElement.ts +22 -0
  128. package/packages/dom/src/structure/html/HTMLMeterElement.ts +23 -0
  129. package/packages/dom/src/structure/html/HTMLModElement.ts +18 -0
  130. package/packages/dom/src/structure/html/HTMLNavElement.ts +16 -0
  131. package/packages/dom/src/structure/html/HTMLNoscriptElement.ts +16 -0
  132. package/packages/dom/src/structure/html/HTMLOListElement.ts +20 -0
  133. package/packages/dom/src/structure/html/HTMLObjectElement.ts +34 -0
  134. package/packages/dom/src/structure/html/HTMLOptGroupElement.ts +18 -0
  135. package/packages/dom/src/structure/html/HTMLOptionElement.ts +20 -0
  136. package/packages/dom/src/structure/html/HTMLOutputElement.ts +20 -0
  137. package/packages/dom/src/structure/html/HTMLParagraphElement.ts +17 -0
  138. package/packages/dom/src/structure/html/HTMLPictureElement.ts +16 -0
  139. package/packages/dom/src/structure/html/HTMLPreElement.ts +17 -0
  140. package/packages/dom/src/structure/html/HTMLProgressElement.ts +19 -0
  141. package/packages/dom/src/structure/html/HTMLQuoteElement.ts +17 -0
  142. package/packages/dom/src/structure/html/HTMLRPElement.ts +16 -0
  143. package/packages/dom/src/structure/html/HTMLRTElement.ts +16 -0
  144. package/packages/dom/src/structure/html/HTMLRubyElement.ts +16 -0
  145. package/packages/dom/src/structure/html/HTMLSElement.ts +16 -0
  146. package/packages/dom/src/structure/html/HTMLSampElement.ts +16 -0
  147. package/packages/dom/src/structure/html/HTMLScriptElement.ts +27 -0
  148. package/packages/dom/src/structure/html/HTMLSectionElement.ts +16 -0
  149. package/packages/dom/src/structure/html/HTMLSelectElement.ts +27 -0
  150. package/packages/dom/src/structure/html/HTMLSlotElement.ts +17 -0
  151. package/packages/dom/src/structure/html/HTMLSmallElement.ts +16 -0
  152. package/packages/dom/src/structure/html/HTMLSourceElement.ts +21 -0
  153. package/packages/dom/src/structure/html/HTMLSpanElement.ts +16 -0
  154. package/packages/dom/src/structure/html/HTMLStrongElement.ts +16 -0
  155. package/packages/dom/src/structure/html/HTMLStyleElement.ts +18 -0
  156. package/packages/dom/src/structure/html/HTMLSubElement.ts +16 -0
  157. package/packages/dom/src/structure/html/HTMLSummaryElement.ts +16 -0
  158. package/packages/dom/src/structure/html/HTMLSupElement.ts +16 -0
  159. package/packages/dom/src/structure/html/HTMLTableCaptionElement.ts +17 -0
  160. package/packages/dom/src/structure/html/HTMLTableCellElement.ts +31 -0
  161. package/packages/dom/src/structure/html/HTMLTableColElement.ts +23 -0
  162. package/packages/dom/src/structure/html/HTMLTableElement.ts +26 -0
  163. package/packages/dom/src/structure/html/HTMLTableRowElement.ts +23 -0
  164. package/packages/dom/src/structure/html/HTMLTableSectionElement.ts +20 -0
  165. package/packages/dom/src/structure/html/HTMLTemplateElement.ts +17 -0
  166. package/packages/dom/src/structure/html/HTMLTextAreaElement.ts +33 -0
  167. package/packages/dom/src/structure/html/HTMLTimeElement.ts +17 -0
  168. package/packages/dom/src/structure/html/HTMLTitleElement.ts +17 -0
  169. package/packages/dom/src/structure/html/HTMLTrackElement.ts +21 -0
  170. package/packages/dom/src/structure/html/HTMLUElement.ts +16 -0
  171. package/packages/dom/src/structure/html/HTMLUListElement.ts +18 -0
  172. package/packages/dom/src/structure/html/HTMLVarElement.ts +16 -0
  173. package/packages/dom/src/structure/html/HTMLVideoElement.ts +22 -0
  174. package/packages/dom/src/structure/html/HTMLWBRElement.ts +16 -0
  175. package/packages/html/package.json +18 -0
  176. package/{ext/html/html.ts → packages/html/src/index.ts} +1 -1
  177. package/{ext/html → packages/html/src}/node/$Anchor.ts +4 -4
  178. package/packages/html/src/node/$Canvas.ts +38 -0
  179. package/{ext/html → packages/html/src}/node/$Dialog.ts +4 -4
  180. package/{ext/html → packages/html/src}/node/$Form.ts +4 -4
  181. package/{ext/html → packages/html/src}/node/$Image.ts +4 -4
  182. package/{ext/html → packages/html/src}/node/$Input.ts +4 -4
  183. package/{ext/html → packages/html/src}/node/$Label.ts +4 -4
  184. package/{ext/html → packages/html/src}/node/$Media.ts +4 -4
  185. package/{ext/html → packages/html/src}/node/$OptGroup.ts +4 -4
  186. package/{ext/html → packages/html/src}/node/$Option.ts +4 -4
  187. package/{ext/html → packages/html/src}/node/$Select.ts +4 -4
  188. package/{ext/html → packages/html/src}/node/$TextArea.ts +4 -4
  189. package/{ext → packages}/i18n/README.md +20 -0
  190. package/packages/i18n/package.json +19 -0
  191. package/packages/i18n/src/index.ts +140 -0
  192. package/{ext → packages}/i18n/src/structure/I18n.ts +12 -8
  193. package/{ext → packages}/i18n/src/structure/I18nDictionary.ts +1 -1
  194. package/packages/i18n/src/structure/I18nTranslation.ts +41 -0
  195. package/packages/idb/package.json +19 -0
  196. package/{ext → packages}/idb/src/index.ts +2 -2
  197. package/{ext → packages}/idb/src/lib/$IDBRequest.ts +1 -1
  198. package/{ext → packages}/idb/src/structure/$IDB.ts +1 -1
  199. package/{ext → packages}/idb/src/structure/$IDBCursor.ts +1 -1
  200. package/{ext → packages}/idb/src/structure/$IDBIndex.ts +1 -1
  201. package/{ext → packages}/idb/src/structure/$IDBStore.ts +1 -1
  202. package/{ext → packages}/idb/src/structure/$IDBStoreBase.ts +1 -1
  203. package/{ext → packages}/idb/src/structure/$IDBTransaction.ts +1 -1
  204. package/{ext → packages}/idb/src/structure/builder/$IDBBuilder.ts +9 -10
  205. package/{ext → packages}/idb/src/structure/builder/$IDBStoreBuilder.ts +1 -1
  206. package/packages/markdown/README.md +53 -0
  207. package/packages/markdown/package.json +19 -0
  208. package/packages/markdown/src/index.ts +3 -0
  209. package/packages/markdown/src/lib/type.ts +26 -0
  210. package/packages/markdown/src/lib/util.ts +21 -0
  211. package/packages/markdown/src/structure/Markdown.ts +54 -0
  212. package/packages/markdown/src/structure/MarkdownLexer.ts +111 -0
  213. package/packages/markdown/src/structure/MarkdownParser.ts +34 -0
  214. package/packages/markdown/src/syntax/alert.ts +46 -0
  215. package/packages/markdown/src/syntax/blockquote.ts +35 -0
  216. package/packages/markdown/src/syntax/bold.ts +11 -0
  217. package/packages/markdown/src/syntax/code.ts +11 -0
  218. package/packages/markdown/src/syntax/codeblock.ts +44 -0
  219. package/packages/markdown/src/syntax/heading.ts +14 -0
  220. package/packages/markdown/src/syntax/horizontalRule.ts +11 -0
  221. package/packages/markdown/src/syntax/image.ts +23 -0
  222. package/packages/markdown/src/syntax/italic.ts +11 -0
  223. package/packages/markdown/src/syntax/link.ts +46 -0
  224. package/packages/markdown/src/syntax/list.ts +121 -0
  225. package/packages/markdown/src/syntax/table.ts +67 -0
  226. package/packages/markdown/src/syntax/text.ts +19 -0
  227. package/packages/router/README.md +175 -0
  228. package/packages/router/package.json +19 -0
  229. package/packages/router/src/index.ts +68 -0
  230. package/packages/router/src/node/Page.ts +38 -0
  231. package/packages/router/src/node/Router.ts +212 -0
  232. package/{ext/router → packages/router/src}/node/RouterAnchor.ts +13 -2
  233. package/packages/router/src/structure/PageBuilder.ts +24 -0
  234. package/packages/router/src/structure/Route.ts +105 -0
  235. package/packages/signal/README.md +93 -0
  236. package/packages/signal/package.json +18 -0
  237. package/packages/signal/src/index.ts +221 -0
  238. package/{src → packages/signal/src}/structure/Signal.ts +6 -10
  239. package/packages/ssr/package.json +19 -0
  240. package/packages/ssr/src/index.ts +38 -0
  241. package/packages/ui/lib/VirtualScroll.ts +25 -0
  242. package/packages/ui/node/Accordian.ts +97 -0
  243. package/packages/ui/node/Carousel.ts +20 -0
  244. package/packages/ui/node/Form.ts +54 -0
  245. package/packages/ui/node/Grid.ts +0 -0
  246. package/packages/ui/node/Modal.ts +45 -0
  247. package/packages/ui/node/Table.ts +43 -0
  248. package/packages/ui/node/Tabs.ts +129 -0
  249. package/packages/ui/node/Toast.ts +16 -0
  250. package/packages/ui/node/Waterfall.ts +94 -0
  251. package/packages/ui/package.json +21 -0
  252. package/packages/utils/package.json +17 -0
  253. package/{src → packages/utils/src}/global.ts +9 -15
  254. package/packages/utils/src/index.ts +90 -0
  255. package/tsconfig.json +1 -1
  256. package/ext/css/package.json +0 -9
  257. package/ext/css/src/structure/$CSSVariable.ts +0 -12
  258. package/ext/html/node/$Canvas.ts +0 -16
  259. package/ext/i18n/package.json +0 -10
  260. package/ext/i18n/src/index.ts +0 -54
  261. package/ext/i18n/src/node/I18nText.ts +0 -35
  262. package/ext/idb/package.json +0 -13
  263. package/ext/markdown/index.ts +0 -121
  264. package/ext/markdown/package.json +0 -8
  265. package/ext/router/README.md +0 -81
  266. package/ext/router/index.ts +0 -73
  267. package/ext/router/node/Page.ts +0 -27
  268. package/ext/router/node/Route.ts +0 -54
  269. package/ext/router/node/Router.ts +0 -149
  270. package/ext/ssr/env.ts +0 -61
  271. package/ext/ssr/index.ts +0 -49
  272. package/ext/ssr/package.json +0 -10
  273. package/src/core.ts +0 -114
  274. package/src/index.ts +0 -3
  275. package/src/lib/assign.ts +0 -38
  276. package/src/lib/assignHelper.ts +0 -18
  277. package/src/lib/chain.ts +0 -13
  278. package/src/lib/debounce.ts +0 -7
  279. package/src/lib/env.ts +0 -2
  280. package/src/lib/native.ts +0 -40
  281. package/src/lib/randomId.ts +0 -9
  282. package/src/lib/sleep.ts +0 -3
  283. package/src/lib/toArray.ts +0 -9
  284. package/src/lib/trycatch.ts +0 -17
  285. package/src/node.ts +0 -10
  286. /package/{ext → packages}/css/README.md +0 -0
  287. /package/{ext/css/src/lib → packages/css/src/ext}/colors.ts +0 -0
  288. /package/{ext → packages}/css/src/structure/$CSSDeclaration.ts +0 -0
  289. /package/{ext → packages}/idb/README.md +0 -0
  290. /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 "#lib/native";
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.subscribers, subs => subs(this.#value))
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.subscribers.add(callback);
29
+ this.#subscribers.add(callback);
34
30
  return this;
35
31
  }
36
32
 
37
33
  unsubscribe(callback: (value: T) => void) {
38
- this.subscribers.delete(callback);
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
+ }