amateras 0.10.1 → 0.11.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 (175) hide show
  1. package/README.md +30 -25
  2. package/build/core.js +1 -0
  3. package/build/css.js +1 -0
  4. package/build/for.js +1 -0
  5. package/build/i18n.js +1 -0
  6. package/build/idb.js +1 -0
  7. package/build/if.js +1 -0
  8. package/build/import-map.js +1 -0
  9. package/build/markdown.js +1 -0
  10. package/build/match.js +1 -0
  11. package/build/meta.js +1 -0
  12. package/build/prefetch.js +1 -0
  13. package/build/router.js +1 -0
  14. package/build/signal.js +1 -0
  15. package/build/ui.js +1 -0
  16. package/build/utils.js +1 -0
  17. package/build/widget.js +1 -0
  18. package/package.json +9 -7
  19. package/packages/core/package.json +19 -0
  20. package/packages/core/src/env.browser.ts +21 -0
  21. package/packages/core/src/env.node.ts +21 -0
  22. package/packages/core/src/global.ts +5 -0
  23. package/packages/core/src/index.ts +184 -0
  24. package/packages/core/src/lib/hmr.ts +145 -0
  25. package/packages/core/src/lib/symbols.ts +2 -0
  26. package/packages/core/src/structure/ElementProto.ts +95 -0
  27. package/packages/core/src/structure/GlobalState.ts +9 -0
  28. package/packages/core/src/structure/NodeProto.ts +18 -0
  29. package/packages/core/src/structure/Proto.ts +90 -0
  30. package/packages/core/src/structure/ProxyProto.ts +20 -0
  31. package/packages/core/src/structure/TextProto.ts +22 -0
  32. package/packages/core/src/structure/WidgetEvent.ts +17 -0
  33. package/packages/css/README.md +128 -0
  34. package/packages/css/package.json +15 -0
  35. package/packages/css/src/ext/colors/amber.ts +25 -0
  36. package/packages/css/src/ext/colors/blackwhite.ts +13 -0
  37. package/packages/css/src/ext/colors/blue.ts +25 -0
  38. package/packages/css/src/ext/colors/cyan.ts +25 -0
  39. package/packages/css/src/ext/colors/emerald.ts +25 -0
  40. package/packages/css/src/ext/colors/fuchsia.ts +25 -0
  41. package/packages/css/src/ext/colors/gray.ts +25 -0
  42. package/packages/css/src/ext/colors/green.ts +25 -0
  43. package/packages/css/src/ext/colors/indigo.ts +25 -0
  44. package/packages/css/src/ext/colors/lime.ts +25 -0
  45. package/packages/css/src/ext/colors/neutral.ts +25 -0
  46. package/packages/css/src/ext/colors/orange.ts +25 -0
  47. package/packages/css/src/ext/colors/pink.ts +25 -0
  48. package/packages/css/src/ext/colors/purple.ts +25 -0
  49. package/packages/css/src/ext/colors/red.ts +25 -0
  50. package/packages/css/src/ext/colors/rose.ts +25 -0
  51. package/packages/css/src/ext/colors/sky.ts +25 -0
  52. package/packages/css/src/ext/colors/slate.ts +25 -0
  53. package/packages/css/src/ext/colors/stone.ts +25 -0
  54. package/packages/css/src/ext/colors/teal.ts +25 -0
  55. package/packages/css/src/ext/colors/violet.ts +25 -0
  56. package/packages/css/src/ext/colors/yellow.ts +25 -0
  57. package/packages/css/src/ext/colors/zinc.ts +25 -0
  58. package/packages/css/src/ext/colors.ts +23 -0
  59. package/packages/css/src/ext/keyframes.ts +37 -0
  60. package/packages/css/src/ext/property.ts +68 -0
  61. package/packages/css/src/ext/variable.ts +51 -0
  62. package/packages/css/src/index.ts +103 -0
  63. package/packages/css/src/lib/cache.ts +27 -0
  64. package/packages/css/src/lib/colorAssign.ts +6 -0
  65. package/packages/css/src/lib/createRule.ts +31 -0
  66. package/packages/css/src/lib/utils.ts +1 -0
  67. package/packages/css/src/structure/$CSS.ts +4 -0
  68. package/packages/css/src/structure/$CSSKeyframes.ts +13 -0
  69. package/packages/css/src/structure/$CSSProperty.ts +21 -0
  70. package/packages/css/src/structure/$CSSRule.ts +39 -0
  71. package/packages/css/src/structure/$CSSVariable.ts +34 -0
  72. package/packages/css/src/types.ts +300 -0
  73. package/packages/for/package.json +15 -0
  74. package/packages/for/src/global.ts +7 -0
  75. package/packages/for/src/index.ts +15 -0
  76. package/packages/for/src/structure/For.ts +74 -0
  77. package/packages/hmr/package.json +13 -0
  78. package/packages/hmr/src/index.ts +27 -0
  79. package/packages/i18n/README.md +73 -0
  80. package/packages/i18n/package.json +15 -0
  81. package/packages/i18n/src/index.ts +78 -0
  82. package/packages/i18n/src/structure/I18n.ts +51 -0
  83. package/packages/i18n/src/structure/I18nDictionary.ts +31 -0
  84. package/packages/i18n/src/structure/I18nTranslation.ts +51 -0
  85. package/packages/i18n/src/types.ts +77 -0
  86. package/packages/idb/README.md +127 -0
  87. package/packages/idb/package.json +16 -0
  88. package/packages/idb/src/core.ts +6 -0
  89. package/packages/idb/src/index.ts +17 -0
  90. package/packages/idb/src/lib/$IDBRequest.ts +8 -0
  91. package/packages/idb/src/structure/$IDB.ts +63 -0
  92. package/packages/idb/src/structure/$IDBCursor.ts +34 -0
  93. package/packages/idb/src/structure/$IDBIndex.ts +48 -0
  94. package/packages/idb/src/structure/$IDBStore.ts +103 -0
  95. package/packages/idb/src/structure/$IDBStoreBase.ts +30 -0
  96. package/packages/idb/src/structure/$IDBTransaction.ts +38 -0
  97. package/packages/idb/src/structure/builder/$IDBBuilder.ts +229 -0
  98. package/packages/idb/src/structure/builder/$IDBStoreBuilder.ts +100 -0
  99. package/packages/if/package.json +15 -0
  100. package/packages/if/src/global.ts +15 -0
  101. package/packages/if/src/index.ts +51 -0
  102. package/packages/if/src/structure/Condition.ts +44 -0
  103. package/packages/if/src/structure/ConditionStatement.ts +25 -0
  104. package/packages/if/src/structure/Else.ts +6 -0
  105. package/packages/if/src/structure/ElseIf.ts +6 -0
  106. package/packages/if/src/structure/If.ts +6 -0
  107. package/packages/markdown/README.md +53 -0
  108. package/packages/markdown/package.json +15 -0
  109. package/packages/markdown/src/index.ts +3 -0
  110. package/packages/markdown/src/lib/type.ts +26 -0
  111. package/packages/markdown/src/lib/util.ts +21 -0
  112. package/packages/markdown/src/structure/Markdown.ts +57 -0
  113. package/packages/markdown/src/structure/MarkdownLexer.ts +111 -0
  114. package/packages/markdown/src/structure/MarkdownParser.ts +34 -0
  115. package/packages/markdown/src/syntax/alert.ts +46 -0
  116. package/packages/markdown/src/syntax/blockquote.ts +35 -0
  117. package/packages/markdown/src/syntax/bold.ts +11 -0
  118. package/packages/markdown/src/syntax/code.ts +11 -0
  119. package/packages/markdown/src/syntax/codeblock.ts +44 -0
  120. package/packages/markdown/src/syntax/heading.ts +14 -0
  121. package/packages/markdown/src/syntax/horizontalRule.ts +11 -0
  122. package/packages/markdown/src/syntax/image.ts +23 -0
  123. package/packages/markdown/src/syntax/italic.ts +11 -0
  124. package/packages/markdown/src/syntax/link.ts +46 -0
  125. package/packages/markdown/src/syntax/list.ts +121 -0
  126. package/packages/markdown/src/syntax/table.ts +67 -0
  127. package/packages/markdown/src/syntax/text.ts +19 -0
  128. package/packages/match/package.json +15 -0
  129. package/packages/match/src/global.ts +14 -0
  130. package/packages/match/src/index.ts +33 -0
  131. package/packages/match/src/structure/Case.ts +15 -0
  132. package/packages/match/src/structure/Default.ts +12 -0
  133. package/packages/match/src/structure/Match.ts +78 -0
  134. package/packages/meta/package.json +14 -0
  135. package/packages/meta/src/index.ts +36 -0
  136. package/packages/meta/src/lib/resolveMeta.ts +27 -0
  137. package/packages/meta/src/types.ts +36 -0
  138. package/packages/prefetch/package.json +14 -0
  139. package/packages/prefetch/src/index.ts +70 -0
  140. package/packages/router/README.md +18 -0
  141. package/packages/router/package.json +16 -0
  142. package/packages/router/src/global.ts +22 -0
  143. package/packages/router/src/index.ts +106 -0
  144. package/packages/router/src/structure/Link.ts +17 -0
  145. package/packages/router/src/structure/NavLink.ts +19 -0
  146. package/packages/router/src/structure/Page.ts +30 -0
  147. package/packages/router/src/structure/Route.ts +123 -0
  148. package/packages/router/src/structure/RouteGroup.ts +24 -0
  149. package/packages/router/src/structure/RouteNode.ts +54 -0
  150. package/packages/router/src/structure/RouteSlot.ts +34 -0
  151. package/packages/router/src/structure/Router.ts +192 -0
  152. package/packages/router/src/structure/RouterConstructor.ts +18 -0
  153. package/packages/router/src/types.ts +41 -0
  154. package/packages/signal/README.md +93 -0
  155. package/packages/signal/package.json +15 -0
  156. package/packages/signal/src/index.ts +97 -0
  157. package/packages/signal/src/lib/track.ts +18 -0
  158. package/packages/signal/src/structure/Signal.ts +59 -0
  159. package/packages/ui/package.json +14 -0
  160. package/packages/ui/src/index.ts +4 -0
  161. package/packages/ui/src/lib/slideshowAnimations.ts +39 -0
  162. package/packages/ui/src/structure/Radio.ts +77 -0
  163. package/packages/ui/src/structure/Slide.ts +11 -0
  164. package/packages/ui/src/structure/Slideshow.ts +99 -0
  165. package/packages/utils/package.json +18 -0
  166. package/packages/utils/src/global.ts +39 -0
  167. package/packages/utils/src/index.bun.ts +3 -0
  168. package/packages/utils/src/index.ts +2 -0
  169. package/packages/utils/src/lib/debugger.ts +14 -0
  170. package/packages/utils/src/lib/utils.ts +119 -0
  171. package/packages/utils/src/structure/UID.ts +18 -0
  172. package/packages/widget/README.md +29 -0
  173. package/packages/widget/package.json +14 -0
  174. package/packages/widget/src/index.ts +82 -0
  175. package/packages/widget/src/structure/Widget.ts +42 -0
package/README.md CHANGED
@@ -1,14 +1,12 @@
1
1
  # Amateras
2
- Amateras 是一个构建用户界面的 JavaScript 库,目标是无需编译器也能直接编写和运行,让开发者只需用 JavaScript 或 TypeScript 的语法就能高效地构建用户界面。支持响应式数据、模板函数和组件化。
3
-
4
- [English](/docs/README_en.md)
2
+ Amateras 是一个构建用户界面的 JavaScript 库,目标是无需编译器也能直接编写和运行,让开发者只需用 JavaScript 或 TypeScript 的语法就能高效地构建用户界面。
5
3
 
6
4
  ## 优势
7
5
  - **极简开发**:无需 JSX,无需编译器。
8
6
  - **原生性能**:没有 Diff 开销,没有 VDOM,细粒度响应式框架。
9
- - **类型安全**:强类型安全的编写环境(通过 TypeScript 编译)。
7
+ - **类型安全**:提供 TypeScript 类型安全的编写体验。
10
8
  - **两端运行**:能够在客户端和服务端运行。
11
- - **轻量体积**:极小的包体积,所有功能模块化,按需导入模块库。
9
+ - **轻量体积**:极小的包体积,所有功能模块化,按需导入项目。
12
10
 
13
11
  ## 功能
14
12
  - 组件化模块(Widget)
@@ -20,20 +18,26 @@ Amateras 是一个构建用户界面的 JavaScript 库,目标是无需编译
20
18
  - 样式表直写(CSS-in-JS)
21
19
  - 服务端渲染(SSR)
22
20
 
23
- ## 安装库
21
+ ## 如何使用
22
+ Amateras 提供了两种导入库的方式
23
+ ### 使用导入映射(Import Map)
24
+ 这个代码将会为你的网页自动创建一个导入映射脚本,将这段代码安插在你的项目代码之前即可。
25
+ ```html
26
+ <script src="https://unpkg.com/amateras"></script>
27
+ ```
28
+
29
+ ### 安装代码库
24
30
  ```
25
31
  bun add amateras
26
32
  ```
27
33
 
28
- ## 使用方式
34
+ ## 基础范例
29
35
  ```ts
30
36
  import 'amateras';
31
37
 
32
- const App = $('app', () => {
33
- $('h1', {class: 'title'}, () => $`Hello World!`)
34
- })
38
+ const $h1 = $('h1', {class: 'title'}, () => $`Hello World!`)
35
39
 
36
- $.render(App, () => document.body);
40
+ $.render($h1, () => document.body);
37
41
  ```
38
42
 
39
43
  ## 计数组件范例
@@ -75,20 +79,21 @@ Amateras 能让你编写接近 HTML 排版的模板代码,实现了在原生 J
75
79
 
76
80
  | 模块库 | 体积 | Gzip | 简介 |
77
81
  | --- | --- | --- | --- |
78
- | amateras/core | 4.97 kB | 2.13 kB | 核心模块 |
79
- | amateras/widget | 0.36 kB | 0.17 kB | 组件模块 |
80
- | amateras/signal | 1.41 kB | 0.56 kB | 响应式数据模块 |
81
- | amateras/css | 1.55 kB | 0.71 kB | 样式模块 |
82
- | amateras/for | 1.03 kB | 0.34 kB | 控制流 For 模块 |
83
- | amateras/if | 1.75 kB | 0.62 kB | 控制流 If 模块 |
84
- | amateras/match | 1.29 kB | 0.40 kB | 控制流 Match 模块 |
85
- | amateras/router | 5.76 kB | 2.16 kB | 页面路由器模块 |
86
- | amateras/i18n | 1.99 kB | 0.75 kB | 多语言界面模块 |
87
- | amateras/idb | 5.27 kB | 2.01 kB | IndexedDB 模块 |
88
- | amateras/markdown | 7.47 kB | 2.93 kB | Markdown 转换 HTML 模块 |
89
- | amateras/prefetch | 0.56 kB | 0.26 kB | SSR 数据预取 |
90
- | amateras/meta | 0.07 kB | 0.04 kB | SSR 页面 `meta` 标签管理 |
91
- | amateras/ui | 2.83 kB | 1.13 kB | UI 组件模块 |
82
+ | core | 4.97 kB | 2.13 kB | 核心模块 |
83
+ | widget | 5.33 kB | 2.31 kB | 组件模块 |
84
+ | signal | 6.38 kB | 2.69 kB | 响应式数据模块 |
85
+ | css | 6.52 kB | 2.85 kB | 样式模块 |
86
+ | for | 6.00 kB | 2.47 kB | 控制流 For 模块 |
87
+ | if | 7.64 kB | 3.11 kB | 控制流 If 模块 |
88
+ | match | 6.26 kB | 2.53 kB | 控制流 Match 模块 |
89
+ | router | 10.73 kB | 4.29 kB | 页面路由器模块 |
90
+ | i18n | 6.97 kB | 2.88 kB | 多语言界面模块 |
91
+ | idb | 10.24 kB | 4.14 kB | IndexedDB 模块 |
92
+ | markdown | 12.44 kB | 5.06 kB | Markdown 转换 HTML 模块 |
93
+ | prefetch | 5.53 kB | 2.40 kB | SSR 数据预取 |
94
+ | meta | 5.05 kB | 2.17 kB | SSR 页面 `meta` 标签管理 |
95
+ | ui | 7.80 kB | 3.26 kB | UI 组件模块 |
96
+ | utils | 4.97 kB | 2.13 kB | 通用工具库 |
92
97
 
93
98
  ## 文档
94
99
  1. [基础入门](/docs/Basic.md)
package/build/core.js ADDED
@@ -0,0 +1 @@
1
+ import{forEach as t,_null as e,map as s,_Object_entries as r,isUndefined as o,isNull as n,_Array_from as i,isFunction as a,_instanceof as l,isString as h,isArray as d}from"@amateras/utils";const p=window,c=document,u=t=>!t||t(),f=t=>!1,m=/* @__PURE__ */Symbol("ProtoType"),w=/* @__PURE__ */Symbol("Statement");class g{static disposers=/* @__PURE__ */new Set;dispose(){t(g.disposers,t=>t(this))}}class M{static proto=e;static[m]="Proto";static[w]=!1;protos=/* @__PURE__ */new Set;disposers=/* @__PURE__ */new Set;layout;#t=e;global=M.proto?.global??new g;constructor(t){this.layout=t??e}set parent(t){this.#t?.protos.delete(this),this.#t=t,t&&(this.global=t.global),t?.protos.add(this)}get parent(){return this.#t}get children(){return s(this.protos,t=>t.constructor[w]?t.children:t).flat()}build(e=!0){return this.clear(!0),$.context(M,this,()=>this.layout?.(this)),e&&t(this.protos,t=>{t.build()}),this}toString(){return s(this.protos,t=>`${t}`).join("")}toDOM(t=!0){return t?s(this.protos,e=>e.toDOM(t)).flat():[]}dispose(){t(this.disposers,t=>t()),t(this.protos,t=>t.dispose())}removeNode(){t(this.protos,t=>t.removeNode())}clear(e=!1){this.protos.clear(),e&&t(this.protos,t=>t.dispose())}findAbove(t){let s=this.parent;return s?t(s)?s:s.findAbove(t):e}findBelow(t){for(let e of this.protos){if(t(e))return e;let s=e.findBelow(t);if(s)return s}return e}}class S extends M{node=e;modifiers=/* @__PURE__ */new Set;constructor(t){super(t)}ondom(t){this.modifiers.add(t)}removeNode(){this.node?.remove()}}const v=["img","hr","br","input","link","meta"];class y extends S{tagname;#e=/* @__PURE__ */new Map;#s="";constructor(t,e,s){super(()=>s?.(this)),this.tagname=t,e&&this.attrProcess(e)}on(t,e){this.ondom(s=>{s.addEventListener(t,e),this.disposers.add(()=>s.removeEventListener(t,e))})}toString(){return this.parseHTML()}parseHTML(t){let e=this.tagname,r=t?.children??(this.#s||s(this.protos,t=>`${t}`).join("")),o=t?.attr??s(this.#e,([t,e])=>e.length?`${t}="${e}"`:t).join(" "),n=o.length?" "+o:"";return v.includes(e)?`<${e}${n} />`:`<${e}${n}>${r}</${e}>`}toDOM(e=!0){if(this.node)return[this.node];let r=document.createElement(this.tagname);return this.node=r,this.#s?this.node.innerHTML=this.#s:e&&r.append(...s(this.protos,t=>t.toDOM(e)).flat()),t(this.#e,([t,e])=>r.setAttribute(t,e)),t(this.modifiers,t=>t(r)),[r]}attrProcess(e){t(r(e),([t,e])=>{for(let s of $.process.attr){let r=s(t,e,this);if(!o(r))return}this.attr(t,e)})}innerHTML(t){this.#s=t}attr(t,e){return arguments.length?o(e)?this.#e.get(t):(n(e)?(this.#e.delete(t),this.node?.removeAttribute(t)):(this.#e.set(t,e),this.node?.setAttribute(t,e)),this):this.#e}addClass(...t){this.token("add","class",...t),this.node?.classList.add(...t)}removeClass(...t){this.token("delete","class",...t),this.node?.classList.remove(...t)}token(e,s,...r){let o=this.#e.get(s),n=new Set(o?.split(" ")??[]);t(r,t=>n[e](t)),this.#e.set(s,i(n).join(" "))}}class b extends S{constructor(t){super(t),u()&&(this.node=new Text)}toDOM(){return[this.node,...super.toDOM()]}removeNode(){super.removeNode(),t(this.protos,t=>t.removeNode())}}class L extends S{content;constructor(t){super(),this.content=t}toString(){return this.content}toDOM(){if(this.node)return[this.node];let e=new Text(this.content);return this.node=e,t(this.modifiers,t=>t(e)),[e]}}function T(...s){const r=M.proto;let n=[];const i=t=>{t.parent=r,n.push(t)};for(let t of T.process.craft){let e=t(...s);if(!o(e))return e}const[p,c,u]=s;if(l(p,M))return i(p),p;if(h(p)){let t=a(c)?[,c]:[c,u],e=new y(p,...t);return i(e),e}if(a(p)){let t=new p(...a(c)?[{},c]:[c,u]);if(l(t,M))return i(t),t}if(d(p)){let r=t=>{for(let e of T.process.text){let s=e(t);if(!o(s))return i(s)}let s=o(t)?e:new L(`${t}`);s&&i(s)},[a,...l]=s;return a.raw?t(a,(t,s)=>{let o=t.length?new L(t):e,n=l[s];o&&i(o),r(n)}):t(a,t=>r(t)),n}}var x;(x=T||(T={})).process={craft:/* @__PURE__ */new Set,text:/* @__PURE__ */new Set,attr:/* @__PURE__ */new Set},x.dispose=t=>{M.proto?.disposers.add(t)},x.render=(t,e)=>{e=a(e)?e():e;{let s=t.build().toDOM();e.replaceChildren(...s)}},x.context=(t,e,s)=>{let r=t.proto;t.proto=e,s(),t.proto=r},x.call=t=>t(),x.match=(t,e)=>{var s=/* @__PURE__ */new Map,r=/* @__PURE__ */Symbol("default"),o={case:(t,e)=>(s.set(t,e),o),default:t=>(s.set(r,t),o)};return e(o),s.get(t)?.()??s.get(r)?.()},x.stylesheet=u()?new CSSStyleSheet:e,x.styleMap=/* @__PURE__ */new Map,x.style=(t,e)=>{t&&x.styleMap.set(t,e),x.stylesheet?.insertRule(e)},x.stylesheet&&document.adoptedStyleSheets.push(x.stylesheet),u()&&document.querySelector("style#__ssr__")?.remove(),globalThis.$=T;export{T as $,y as ElementProto,g as GlobalState,S as NodeProto,M as Proto,b as ProxyProto,L as TextProto,c as _document,p as _window,u as onclient,f as onserver,m as symbol_ProtoType,w as symbol_Statement};
package/build/css.js ADDED
@@ -0,0 +1 @@
1
+ import{_null as e,map as t,_Object_entries as s,isString as r,isNumber as l,_instanceof as a,_JSON_stringify as n,_Object_assign as o,forEach as c,_Array_from as i,UID as u}from"@amateras/utils";import{ElementProto as p,onserver as d}from"@amateras/core";const h=/* @__PURE__ */new WeakMap,w=/* @__PURE__ */new Set,f=/* @__PURE__ */new Map;class S{}class m extends S{declarations=/* @__PURE__ */new Map;rules=/* @__PURE__ */new Map;selector;parent=e;css;constructor(e,t,s){super(),this.selector=e,this.parent=s,t&&g(this,t),this.css=t}toString(){let e=t(this.declarations,([e,t])=>`${e.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}: ${t};`),s=t(this.rules,([e,t])=>`${t}`);return`${this.selector} { ${[...e,...s].join(" ")} }`}}const g=(e,t)=>{for(let[n,o]of s(t))if(r(o)||l(o)||a(o,S))e.declarations.set(n,`${o}`);else{let t=e.selector.startsWith("@")&&!e.parent?n:`${/^[@]|&/.test(n)?n:`& ${n}`}`;e.rules.set(t,new m(t,o,e))}},C=(t,s,r=!0)=>{let l=r?n(s):"";if(r){let e=f.get(l);if(e)return e}let a=new m(t(),s,e);return $.style(e,`${a}`),r&&f.set(l,a),a};o($,{css:e=>a(e,m)?e:C(()=>`.${u.generate("css")}`,e),CSS:e=>t(s(e),([e,t])=>{let s=C(()=>e,{...t,__selector__:e});return w.add(s),s})}),o(p.prototype,{css(...e){return c(e,e=>M(this,e)),this}});const M=(e,t)=>{let s=$.css(t),r=s.selector.slice(1);e.addClass(r),h.set(e,s)};d()&&o($.CSS,{rules(e){let t=/* @__PURE__ */new Set;return c([e,...e.protos],s=>{let r=h.get(s);r&&t.add(r),e!==s&&c(this.rules(s),e=>t.add(e))}),i(t)},text(e){return[...w,...this.rules(e)].join("\n")}}),$.process.attr.add((e,t,s)=>{if("css"===e)return M(s,t),!0});export{S as $CSS,m as $CSSRule,M as assignCSS};
package/build/for.js ADDED
@@ -0,0 +1 @@
1
+ import{ProxyProto as t,symbol_Statement as e,onclient as s,Proto as r}from"@amateras/core";import{forEach as i}from"@amateras/utils";class o extends t{static[e]=!0;#t;list$;#e=/* @__PURE__ */new WeakMap;constructor(t,e){super(),this.list$=t,this.#t=e;let r=()=>{let{n:t,d:e}=this.run();if(i(t,t=>t.build()),!this.node?.parentNode)return;i(e,t=>t.removeNode());let r,o=s()?this.toDOM():[];i(o,t=>{r=t.parentNode?t:r?.parentNode?.insertBefore(t,r.nextSibling)})};this.list$.subscribe(r),this.disposers.add(()=>this.list$.unsubscribe(r))}build(){return this.#e=/* @__PURE__ */new WeakMap,this.run(),i(this.protos,t=>t.build()),this}run(){let t=[],e=new Set(this.protos);return this.clear(),i(this.list$.value,(s,r)=>{let i=this.#e.get(s);i?e.delete(i):(i=new a,t.push(i),this.#e.set(s,i),i.layout=()=>this.#t(s,r)),i.parent=this}),{n:t,d:e}}removeNode(){this.node?.remove(),i(this.protos,t=>t.removeNode())}}class a extends r{static[e]=!0}globalThis.For=o,$.process.craft.add((t,e,s)=>{if(t===o){let t=new o(e,s);return t.parent=r.proto,t}});export{o as For,a as ForItem};
package/build/i18n.js ADDED
@@ -0,0 +1 @@
1
+ import{isFunction as t,isObject as e,isUndefined as s,map as i,forEach as a,_null as n,_Object_assign as r,_instanceof as o}from"@amateras/utils";import{ProxyProto as l,GlobalState as c}from"@amateras/core";class h{#t=null;#e=null;constructor(e){t(e)?this.#e=e:this.#t=e}async context(){if(this.#t)return await this.#t;if(!this.#e)throw"I18n Context Fetch Error";return this.#t=this.#e().then(t=>t.default)}async find(t,s){s||(s=await this.context());const[i,...a]=t.split("."),n=s[i];return e(n)?a.length?this.find(a.join("."),n):n._:a.length?t:n}}class u extends l{i18n;key;options;constructor(t,e,s){super(),this.i18n=t,this.key=e,this.options=s,this.i18n.translations.add(this)}build(){return this.update(),this}async update(){const{key:t,i18n:e,options:n}=this,r=(t,e=[])=>{this.layout=()=>{t.raw=t,$(t,...e)},a(this.protos,t=>t.removeNode()),super.build(),this.node?.replaceWith(...this.toDOM())};t:{const a=e.dictionary();if(!a){r([t]);break t}const o=a.find(t);this.global.i18n.promises.push(o);const l=await o;if(s(l))break t;const c=l.split(/\$[a-zA-Z0-9_]+\$/);if(1===c.length||!n){r([l]);break t}const h=l.matchAll(/(\$([a-zA-Z0-9_]+)\$)/g);r(c,i(h,([,,t])=>n[t]))}return this}}class d{map=/* @__PURE__ */new Map;#s;translations=/* @__PURE__ */new Set;locale;constructor(t){this.#s=t,this.locale=t}defaultLocale(t){return arguments.length?(t&&(this.#s=t),this):this.#s}async setLocale(t){if(!arguments.length)return this.locale;if(t){if(!this.map.get(t))return t=t.split("-")[0],this.setLocale(t);t!==this.locale&&(this.locale=t,await Promise.all(i(this.translations,t=>t.update())))}return this}dictionary(t=this.locale){if(!t)return n;return this.map.get(t)}translate(t,e){return new u(this,t,e)}}r(c.prototype,{i18n:{promises:[]}}),c.disposers.add(t=>{t.i18n.promises=[]}),r($,{i18n(t){const e=new d(t),s=(t,s)=>e.translate(t,s);return r(s,{i18n:e,async locale(t){await e.setLocale(t)},add(t,s){return e.map.set(t,new h(s)),this},delete(t){return e.map.delete(t),this},dir:t=>(s,i)=>e.translate(`${t}.${s}`,i)}),s}}),$.process.text.add(t=>{if(o(t,u))return t});export{d as I18n,h as I18nDictionary,u as I18nTranslation};
package/build/idb.js ADDED
@@ -0,0 +1 @@
1
+ import{_Promise as e,_instanceof as t,_Object_assign as r,forEach as s,_Array_from as n,isBoolean as o,isFunction as i,_Object_fromEntries as a,_null as c,trycatch as u,_JSON_stringify as d}from"@amateras/utils";const h=(t,r)=>new e((e,s)=>{t.onsuccess=s=>r?r(t,e):e(t.result),t.onerror=e=>s(t.error)});class l{#e;store;direction;constructor(e,r){this.#e=r,this.store=t(e,y)?e.store:e,this.direction=r.direction}get value(){return this.#e.value}get key(){return this.#e.key}get primaryKey(){return this.#e.primaryKey}async update(e){return h(this.#e.update(e))}async delete(){return h(this.#e.delete())}continue(e){this.#e.continue(e)}continuePrimaryKey(e,t){this.#e.continuePrimaryKey(e,t)}advance(e){this.#e.advance(e)}abort(){this.#e.request.transaction?.abort()}}class m{#t;constructor(e){this.#t=e}cursor(e,t,r){return h(this.#t.openCursor(t,r),(t,r)=>t.result?e(new l(this,t.result)):r(null))}keyCursor(e,t,r){return h(this.#t.openCursor(t,r),(t,r)=>t.result?e(new l(this,t.result)):r(null))}count(e){return h(this.#t.count(e))}get(e){return h(this.#t.get(e))}getAll(e){return h(this.#t.getAll(e))}}class y extends m{store;constructor(e,t,s){super(t),this.store=e,r(this,s)}}class p extends m{#r;constructor(e,t){super(e),this.#r=e,r(this,t)}put(e,t){return h(this.#r.put(e,t))}add(e,t){return h(this.#r.add(e,t))}delete(e){return h(this.#r.delete(e))}clear(){return h(this.#r.clear())}index(e){return new y(this,this.#r.index(e),this.indexes[e])}}class g{#s;#n;writable;stores={};durability;constructor(e,t){this.#s=t,this.#n=e,this.writable="readonly"!==t.mode,this.durability=t.durability,s(n(t.objectStoreNames),t=>{r(this.stores,{[t]:e.stores[t]})})}store(e){return new p(this.#s.objectStore(e),this.#n.stores[e])}commit(){return this.#s.commit()}abort(){return this.#s.abort()}}class b{idb;name;version;constructor(e,t){this.idb=e,this.name=e.name,this.version=e.version,r(this,t)}async store(e,t,r){return o(t)?this.transaction(e,t,t=>r(t.store(e))):this.transaction(e,r=>t(r.store(e)))}async transaction(t,r,s){s=o(r)?s:r,r=!!o(r)&&r;const n=this.idb.transaction(t,r?"readwrite":"readonly"),i=s(new g(this,n));return new e((e,t)=>{n.oncomplete=t=>e(i),n.onerror=n.onabort=e=>n.error&&t(n.error)})}}class w{config;upgrades=/* @__PURE__ */new Map;indexes=/* @__PURE__ */new Map;constructor(e){this.config=e}keyPath(e){return this.config.keyPath=e,this}autoIncrement(e){return this.config.autoIncrement=e,this}schema(){return this}index(e,t){return this.indexes.set(e,{...t,name:e,multiEntry:t.multiEntry??!1,unique:t.unique??!1}),this}upgrade(e,t){return this.upgrades.set(e,t),this}}const v="objectStoreNames",f="deleteObjectStore",x="createObjectStore",k=indexedDB,I="onupgradeneeded",M="onsuccess";class P{#o=!1;storeMap=/* @__PURE__ */new Map;#i=!1;constructor(e){r(this,e)}devMode(e){return this.#i=e,this}deleteUnused(e){return this.#o=e,this}store(e,t){return this.storeMap.set(e,i(t)?t(new w({autoIncrement:!1,keyPath:null,indexes:{},name:e,schema:null})):t),this}async open(){return new e((e,t)=>{const{version:r,name:o,storeMap:i}=this,h=k.open(o),l=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map,y=/* @__PURE__ */new Map,p=/* @__PURE__ */new Map,g=[],w=e=>this.#i&&console.debug(`[$IDBBuilder (${o})]`,e),P=a(n(i).map(([e,{config:{keyPath:t,autoIncrement:r},indexes:s}])=>[e,{autoIncrement:r,keyPath:t,name:e,schema:c,indexes:a(n(s).map(([e,{keyPath:t,multiEntry:r,unique:s}])=>[e,{keyPath:t,multiEntry:r,unique:s}]))}])),S={version:r,name:o,stores:P},$=e=>{w("Upgrade DB");const t=e.result,r=e.transaction;s(l,([e,{config:r}])=>{t[x](e,r),w(`Store Created: ${e}`)}),s(y,([e,{config:r}])=>{t[f](e),t[x](e,r),w(`Store Upgraded: ${e}`)}),s(m,([{config:{name:e}},t])=>{const n=r.objectStore(e);s(t,([t,{keyPath:r,...s}])=>{n.indexNames.contains(t)&&n.deleteIndex(t),n.createIndex(t,r,s),w(`Store '${e}' Index Created: ${t}`)})}),this.#o&&s(g,e=>{t[f](e),w(`Unused Store Deleted: ${e}`)}),s(p,([e,t])=>{const n=r.objectStore(e);s(t,({key:e,value:t})=>{n.autoIncrement||n.keyPath?n.add(t):n.add(t,e)}),w(`Recovered Store Objects: ${t.length} objects of store '${e}'`)})};h[I]=()=>{w("No IDB detected, create IDB");const{transaction:e,result:t}=h;s(i,([e,t])=>{l.set(e,t),m.set(t,new Map(t.indexes))}),t.version===r?$(h):e.oncomplete=e=>{const t=indexedDB.open(o,r);t.onupgradeneeded=e=>$(t)}},h[M]=async()=>{w("IDB Detected");const t=h.result,a=new b(t,S),c=t[v].length?t.transaction(n(t[v]),"readonly"):null,f=()=>{w("No Upgrade"),e(a)};if(t.version===r)return f();if(c&&s(n(c[v]),e=>i.has(e)&&g.push(e)),s(i,([e,o])=>{const{keyPath:i,autoIncrement:a}=o.config,h=/* @__PURE__ */new Map,p=()=>s(o.indexes,([e,t])=>{const[r]=u(()=>g?.index(e)),s=d(t.keyPath)!==d(r?.keyPath)||!!t.multiEntry!==r?.multiEntry||!!t.unique!==r?.unique;r&&!s||(h.set(e,t),m.set(o,h))}),[g]=u(()=>c?.objectStore(e));if(!g)return l.set(e,o),p();const b=n(o.upgrades).find(([e])=>r>=e&&t.version<e),w=d(i)!==d(g.keyPath)||a!==g?.autoIncrement,v=b||w;p(),g&&!v||y.set(e,o)}),!(r!==t.version||l.size||y.size||g.length||m.size))return f();for(const[e,s]of y){const o=[],i=n(s.upgrades).filter(([e])=>r>=e&&t.version<e).sort((e,t)=>e[0]-t[0]).map(e=>e[1]);await a.transaction(e,!1,async t=>{p.set(e,o),await t.store(e).cursor(async e=>{o.push({key:e.key,value:e.value}),e.continue()})});for(const t of i)p.set(e,await t(o,a))}t.close();const x=k.open(o,r);x[I]=e=>$(x),x[M]=t=>{w("IDB Upgrade Completed"),e(new b(x.result,S))}},h.onerror=e=>t(h.error)})}}r($,{idb:(e,t)=>new P({name:e,version:t,stores:{}})});
package/build/if.js ADDED
@@ -0,0 +1 @@
1
+ import{Proto as e,symbol_Statement as t,ProxyProto as s}from"@amateras/core";import{_null as a,forEach as i,_instanceof as l,isEqual as r}from"@amateras/utils";import{Signal as d}from"@amateras/signal";class n extends e{static[t]=!0;exp$;builded=!1;constructor(e,t){super(t),this.exp$=e}build(e){return super.build(e),this.builded=!0,this}validate(){return!this.exp$||!!this.exp$.value}}class o extends n{}class u extends n{}class h extends n{}class m extends s{static[t]=!0;statements=/* @__PURE__ */new Set;statement=a;build(){super.build(!1),this.validate()?.build();let e=()=>{let e=this.validate();e?.builded||e?.build(),this.statement!==e&&(this.statement=e??a,i(this.statements,t=>t!==e&&t.removeNode()),this.node?.replaceWith(...this.toDOM()))};return i(this.statements,t=>{t.exp$?.subscribe(e),t.disposers.add(()=>t.exp$?.unsubscribe(e))}),this}validate(){this.clear();for(let e of this.statements)if(e.validate())return e.parent=this,e}}globalThis.If=h,globalThis.Else=o,globalThis.ElseIf=u;let p=/* @__PURE__ */new WeakMap;$.process.craft.add((t,s,i)=>{let n=e.proto,b=n?p.get(n):a;if(t===h&&(b=new m,n&&(b.parent=n,p.set(n,b))),l(b,m)){if(r(t,[h,o,u])){{let e=new t(...l(s,d)?[s,i]:[a,s]);b.statements.add(e)}return b}n&&p.delete(n)}else if(r(t,[o,u]))throw"ElseIf/Else must be after If or ElseIf"});
@@ -0,0 +1 @@
1
+ const t=`https://unpkg.com/amateras@${"0.10.3"}/build`,e={...{amateras:"/core.js"},...Object.fromEntries(["core","utils","signal","for","if","match","css","i18n","idb","meta","prefetch","router","widget"].map(e=>{const r=`amateras/${e}`,s=`${t}/${e}.js`;return[[r,s],[`@${r}`,s]]}).flat())},r=document.querySelector('script[type="importmap"]');if(r){const t=JSON.parse(r.innerHTML);t.imports={...t.imports,...e},r.innerHTML=JSON.stringify(t,null,"\t")}else{const t=document.createElement("script");t.setAttribute("type","importmap"),t.innerHTML=JSON.stringify({imports:e},null,"\t"),document.head.prepend(t)}
@@ -0,0 +1 @@
1
+ import{isString as t,forEach as e,uppercase as n,isUndefined as o,isEqual as a,_Array_from as s}from"@amateras/utils";const r="BLOCK",l="IMAGE",i="LINK",c="QUICK_LINK",h="CODE",p="ITALIC",u="BOLD",d="TEXT_LINE",k="HEADING",T="CODE_START",g="CODE_END",f="UNORDERED_LIST_ITEM",m="ORDERED_LIST_ITEM",E="BLOCKQUOTE",y="ALERT",w="ALERT_LINE",L="HORIZONTAL_RULE",b="TABLE",x="EMPTY_LINE",I="INLINE_TEXT";class ${blockTokenizers=/* @__PURE__ */new Map;inlineTokenizers=/* @__PURE__ */new Map;blockTokenize(t){const e=t?.split(/\r?\n/)??[],n=[];let o=0;t:for(;o<e.length;){let t,a=e[o];if(void 0===a)throw"LINE ERROR";for(const[s,l]of this.blockTokenizers){const i=a.match(l.regex);if(i){const{content:a,multiLine:c,data:h}=l.handle(i,o,e);if(t={layout:r,type:s,content:a,data:h},c){n.push(t),n.push(...c.tokens),o=c.skip;continue t}break}}t||(t={layout:r,...a.length?{type:d,content:this.inlineTokenize(a)}:{type:x,content:[]}}),n.push(t),o++}return n}inlineTokenize(e){const n=[];let o=e;for(;o.length;){let e;for(const[a,s]of this.inlineTokenizers){const r=o.match(s.regex);if(r){const{index:l,0:i}=r;0!=l&&n.push(...this.inlineTokenize(o.substring(0,l)));const{content:c,data:h}=s.handle(r);e={type:a,...t(c)?{layout:I,text:c}:{layout:"INLINE_CONTENT",content:c}},h&&(e.data=h),o=o.substring(l+i.length);break}}e||(e={type:"TEXT",layout:I,text:o},o=""),n.push(e)}return n}use(...t){return e(t,t=>t(this)),this}}class N{processors=/* @__PURE__ */new Map;parse(e){let n="",o=0;if(!e)return n;for(;o<e.length;){const a=e[o],s=this.processors.get(a.type);if(s){const r=s(a,e.slice(o));t(r)?n+=r:(n+=r.html,o+=r.skipTokens)}o++}return n}use(...t){return e(t,t=>t(this)),this}}const z=(t,e,n)=>t.blockTokenizers.set(e,n),O=(t,e,n)=>t.inlineTokenizers.set(e,n),_=(t,e,n)=>t.processors.set(e,n),A=(t,e)=>`<${t}>${e}</${t}>`,R=t=>(e([["&","&amp;"],["<","&lt;"],[">","&gt;"],['"',"&quot;"],["'","&#39;"]],e=>t=t.replaceAll(...e)),t),C=t=>_(t,y,(e,o)=>{let a="",s=1;for(;s<o.length;){const e=o[s];if(e.type!==w)break;a+=t.parse(e.content[0].content),s++}const r=e.data?.alertType;return{html:`<blockquote class="alert alert-${r}"><p class="alert-title">${n(r,0,1)}</p>${a}</blockquote>`,skipTokens:s}}),M=t=>z(t,y,{regex:/^> ?\[!(?:(?:NOTE)|(?:TIP)|(?:IMPORTANT)|(?:WARNING)|(?:CAUTION))\]/,handle(e,n,o){const a=[],s=o[n].match(/> ?\[!(.+?)\]/),l=s?.[1]?.toLowerCase();for(n++;n<o.length;){const e=o[n].match(/^> ?(.+)/);if(!e)break;a.push({layout:r,type:w,content:t.blockTokenize(e[1])}),n++}return{content:[],data:{alertType:l},multiLine:{skip:n,tokens:a}}}}),D=t=>_(t,E,(e,n)=>{let o=0;const a=e=>{let s="";for(;o<n.length;){const{type:r,content:l,data:i}=n[o];if(r!==E)break;if(i.deep>e)s+=a(i.deep);else{if(i.deep<e)break;s+=t.parse(l),o++}}return A("blockquote",s)};return{html:a(e.data.deep),skipTokens:o}}),B=t=>z(t,E,{regex:/^(>+) ?(.+)?/,handle:e=>({content:t.blockTokenize(e[2]??""),data:{deep:e[1].length-1}})}),U=t=>_(t,u,e=>A("b",t.parse(e.content))),X=t=>O(t,u,{regex:/\*\*(.+?\*?)\*\*/,handle:e=>({content:t.inlineTokenize(e[1])})}),K=t=>_(t,h,t=>A("code",R(t.text))),S=t=>O(t,h,{regex:/`(.+?)`/,handle:t=>({content:t[1]})}),q=t=>_(t,T,(t,e)=>{let n="",o=1;for(;o<e.length;){const t=e[o];if(t.type===g)break;n+=t.content[0].text,o++}return{html:`<pre><code${t.data?.lang?` lang="${t.data.lang}"`:""}>${R(n)}</code></pre>`,skipTokens:o}}),v=t=>z(t,T,{regex:/^```(\w+)?/,handle:(t,e,n)=>{const o=[];for(e++;e<n.length;){const t=n[e];if(e++,t.includes("```")){o.push({layout:r,type:g,content:[]});break}o.push({layout:r,type:"CODE_LINE",content:[{layout:"INLINE_TEXT",type:"CODE_TEXT",text:`${t}\n`}]})}return{content:[],data:{lang:t[1]},multiLine:{skip:e,tokens:o}}}}),G=t=>_(t,k,e=>{const n=`h${e.data.level}`;return A(n,t.parse(e.content))}),H=t=>z(t,k,{regex:/^(#+) (.+)/,handle:e=>({content:t.inlineTokenize(e[2]),data:{level:e[1].length}})}),P=t=>_(t,L,t=>"<hr>"),j=t=>z(t,L,{regex:/^---/,handle:t=>({content:[]})}),Q=t=>_(t,l,e=>{const{url:n,title:o}=e.data;return`<img alt="${t.parse(e.content)}" src="${n}"${o?` title="${o}"`:""}>`}),W=t=>O(t,l,{regex:/^!\[(.+?)\]\((.+?)\)/,handle:e=>{const[n,o,a]=e,[s,r,l]=a.match(/(\w\w+?:\/\/[^\s]+)(?: "(.+?)")?/);return{content:t.inlineTokenize(o),data:{url:r,title:l}}}}),Y=t=>_(t,p,e=>`<i>${t.parse(e.content)}</i>`),Z=t=>O(t,p,{regex:/\*(.+?)\*/,handle:e=>({content:t.inlineTokenize(e[1])})}),F=t=>{const e=e=>{const{href:n,email:a,title:s}=e.data;return`<a href="${o(n)?`mailto:${a}`:n}"${s?` title="${s}"`:""}>${e.text??t.parse(e.content)}</a>`};_(t,c,e),_(t,i,e)},J=t=>{O(t,i,{regex:/\[(.+?)\]\(((?:\w+?@(?:\w|\.\w)+)|(?:\w\w+?:[^\s)]+))(?: "(.+)?")?\)/,handle:e=>{const[n,o,a,s]=e,r=a.match(/(?:\w+?@(?:\w|\.\w)+)|(?:\w\w+?:\/\/[^\s]+)/),[l]=r,i=l.includes("@")?{email:l}:{href:l};return{content:t.inlineTokenize(o),data:{title:s,...i}}}}),O(t,c,{regex:/<((?:\w+?@(?:\w|\.\w)+)|(?:\w\w+?:[^\s>]+))>/,handle:t=>{const[e,n]=t,o=n.match(/(?:\w+?@(?:\w|\.\w)+)|(?:\w\w+?:\/\/[^\s]+)/),[a]=o,s=a.includes("@")?{email:a}:{href:a};return{content:a,data:s}}})},V=e=>{const n=t=>t===m?"ol":"ul",o=(t,o)=>{let l=0;const i=/* @__PURE__ */new Map,c=(t,h)=>{const p=i.get(h),u=p&&n(t)===p.tagname?p:r(n(t),[]);for(i.set(h,u);l<o.length;){const n=o[l],r=n.type;if(!a(r,[m,f,x,d])){l--;break}if(r===d){const t=n.content[0]?.text;if(t?.match(/^\s\s/)){const e=t.match(/^(\s+)(.+)?/);if(!e[2]){l++;continue}n.data={deep:Math.trunc(e[1].length/2)-1}}else{if(!t?.match(/^\t/)){l--;break}{const e=t.match(/^(\t+)(.+)?/);if(!e[2]){l++;continue}n.data={deep:e[1].length-1}}}}if(r===x)l++;else if(n.data.deep!==h){if(!(n.data.deep>h)){i.delete(h);break}i.get(h)?.items.at(-1)?.content.push(c(r,n.data.deep))}else if(r===d)u.paragraph=!0,u.items.at(-1)?.content.push(e.parse(n.content)),l++;else{if(r!==t){i.delete(h);break}u.items.push(s([e.parse(n.content)])),l++}}return u};return{html:`${c(t.type,t.data.deep)}`,skipTokens:l}},s=t=>({content:t,toString(){return A("li",this.content.join(""))}}),r=(e,n)=>({tagname:e,items:n,paragraph:!1,toString(){return this.paragraph&&this.items.forEach(e=>e.content.forEach((n,o)=>t(n)&&(e.content[o]=A("p",n)))),A(this.tagname,this.items.join(""))}});_(e,f,o),_(e,m,o)},tt=t=>{const e=e=>{const n=e[0].split(/[-*]/)[0],o=n.match(/\s/)?.length??0,a=n.match(/\t/)?.length??0;return{content:t.inlineTokenize(e[1]),data:{deep:Math.trunc(a+o/2)}}};z(t,f,{regex:/^(?:[\s\t]+)?[-*] (.+)/,handle:e}),z(t,m,{regex:/^(?:[\s\t]+)?\d+\. (.+)/,handle:e})},et=t=>_(t,b,e=>{let n="",o="",a=0;for(const s of e.content){let r="";for(let n=0;n<s.content.length;n++){const o=s.content[n],l=0===a?"th":"td";r+=`<${l} align="${e.data.align[n]??"left"}">${t.parse(o.content)}</${l}>`}0===a?n+=A("thead",A("tr",r)):o+=A("tr",r),a++}return o=A("tbody",o),A("table",n+o)}),nt=t=>z(t,b,{regex:/\|(?:.+\|)+/,handle(e,n,o){const a=[],l=[];for(;n<o.length;){const e={type:"TABLE_ROW",layout:r,content:[]},i=o[n],c=s(i.matchAll(/\| ([^|]+)/g));if(!c.length)break;for(const n of c){const o=n[1],a=o.match(/(:)?---+(:)?/);if(a){const[t,e,n]=a;l.push(n?e?"center":"right":"left");continue}e.content.push({type:"TABLE_COLUMN",content:t.inlineTokenize(o.trim()),layout:r})}e.content.length&&a.push(e),n++}return{content:a,data:{align:l},multiLine:{skip:n,tokens:[]}}}}),ot=t=>_(t,"TEXT",t=>t.text),at=t=>_(t,d,(e,n)=>{let o="",a=0;for(const s of n){if(s.type===x)break;o+=t.parse(s.content),a++}return{html:A("p",o),skipTokens:a}});class st{lexer=new $;parser=new N;constructor(){this.lexer.use(H,v,tt,nt,M,B,j,W,J,S,X,Z),this.parser.use(ot,Q,F,K,Y,U,at,G,q,V,et,C,D,P)}parseHTML(t){return this.parser.parse(this.lexer.blockTokenize(t))}}export{st as Markdown,$ as MarkdownLexer,N as MarkdownParser};
package/build/match.js ADDED
@@ -0,0 +1 @@
1
+ import{Proto as t,symbol_Statement as e,ProxyProto as s}from"@amateras/core";import{isArray as i,_null as a,forEach as r,is as d}from"@amateras/utils";class l extends t{static[e]=!0;condition;constructor(t,e){super(e),this.condition=i(t)?t:[t]}}class o extends t{static[e]=!0;constructor(t){super(t)}}class h extends s{static[e]=!0;exp$;cases=/* @__PURE__ */new Set;matched=a;#t=a;constructor(t,e){super(()=>{e((t,e,s)=>{$(t,e,s)})}),this.exp$=t}build(){super.build(),this.validate();let t=()=>{let t=this.matched,e=this.validate();t!==e&&(r(this.cases,t=>t!==e&&t.removeNode()),e!==this.#t&&this.#t?.removeNode(),this.node?.replaceWith(...this.toDOM()))};return r(this.cases,e=>{e.build(),this.exp$.subscribe(t),e.disposers.add(()=>this.exp$.unsubscribe(t))}),this.#t?.build(),this}case(t,e){let s=new l(t,e);return this.cases.add(s),s}default(t){let e=new o(t);return this.#t=e,e}validate(){this.clear();for(let t of this.cases)if(t.condition.includes(this.exp$.value))return t.parent=this,this.matched=t;if(this.#t)return this.#t.parent=this,this.matched=this.#t}}globalThis.Match=h,globalThis.Case=l,globalThis.Default=o,$.process.craft.add((e,s,i)=>{if(e===h){let e=new h(s,i);return e.parent=t.proto,e}return e===l?d(t.proto,h)?.case(s,i):e===o?d(t.proto,h)?.default(s):void 0});
package/build/meta.js ADDED
@@ -0,0 +1 @@
1
+ import{_Object_entries as t,isString as e,isArray as o,forEach as r,_Object_assign as n}from"@amateras/utils";import{onclient as a,Proto as i,onserver as m}from"@amateras/core";const s=(n,a,i,m)=>{let p=t=>i?`${i}:${t}`:t,c=(t,e)=>a.push({[m]:p(t),content:e});for(const[l,f]of t(n))e(f)?c(l,f):o(f)?r(f,t=>{e(t)?c(l,t):s(t,a,p(l),m)}):s(f,a,p(l),m)};n($,{meta(t){if(a())return;let e=i.proto;e&&(e.global.meta=t)}}),m()&&n($.meta,{resolve:function(t){let e=[],{description:o,og:r,twitter:n}=t;return o&&e.push({name:"description",content:o}),r&&s(r,e,"og","property"),n&&s(n,e,"twitter","name"),e}});
@@ -0,0 +1 @@
1
+ import{GlobalState as e,Proto as t,onclient as r,onserver as a}from"@amateras/core";import{_Object_assign as c,toURL as o,_null as h,isAsyncFunction as f}from"@amateras/utils";c(e.prototype,{prefetch:{fetches:/* @__PURE__ */new Set,caches:{}}}),e.disposers.add(e=>{e.prefetch.fetches.clear()}),globalThis.prefetch||(globalThis.prefetch={}),c($,{async fetch(e,c){e=o(e);let s=t.proto,p=r()?prefetch[e.href]:h,i=c?.then,l=new Promise(async r=>{if(p&&Date.now()<p.expired)return i?.(p.data),void r(p);let o=await fetch(e,c),h=c?.record;if(h){const c=f(h)?await h(o):h(o);a()&&s&&(s.global.prefetch.caches[e.href]={data:c,expired:Date.now()+3e4}),$.context(t,s,()=>{i?.(c)}),r(c)}});return a()&&s?.global.prefetch.fetches.add(l),l}});
@@ -0,0 +1 @@
1
+ import{ElementProto as t,ProxyProto as e,onserver as s,Proto as r,symbol_ProtoType as i,onclient as o,GlobalState as l}from"@amateras/core";import{toURL as a,_null as n,_undefined as h,isUndefined as c,isFunction as u,map as p,isArray as d,forEach as f,_JSON_parse as v,_Object_entries as g,_JSON_stringify as w,_Object_assign as b,_instanceof as y}from"@amateras/utils";class m extends t{constructor(t,e){super("a",t,e),this.on("click",t=>{if(t.shiftKey||t.ctrlKey)return;t.preventDefault();let e=this.attr("target"),s=this.attr("href");s&&("_replace"===e?$.replace(s):$.open(s,e))})}}class k extends e{page=n;constructor(){super()}render(t){if(this.page!==t){if(this.clear(),this.layout=()=>$(t),t.parent=this,this.page!==t&&this.page?.removeNode(),this.page=t,this.node){t.builded||t.build();let e=this.toDOM();this.node.replaceWith(...e),t.title&&(document.title=t.title,t.global.title=t.title)}s()&&(t.builded||t.build(),t.global.title=t.title)}}}class x extends r{slot=new k;builded=!1;route;title=n;constructor(t,e,s){super(()=>e({params:s,slot:this.slot})),this.route=t}build(){return this.builded||(this.builded=!0),super.build()}}class P{routes=/* @__PURE__ */new Map;path;paths=/* @__PURE__ */new Map;validPaths=[];constructor(t){this.path=t,this.paths.set(t,h)}routing(t){let e=t.split("/"),s={},r="";t:for(let[o,l]of this.paths){s={};let t=o.split("/"),i=[];for(let s=0;s<Math.max(e.length,t.length);s++)i.push([t[s],e[s]]);e:for(let[e,o]of i){let t=()=>{r=""},i=()=>{r+=("/"!==r?"/":"")+o};if(c(e))break e;if(c(o)){t();continue t}if(e?.includes(":")){let[r,l]=e.split(":");if(!o.startsWith(r)){t();continue t}s[l]=o.replace(r,""),i();continue e}if(e!==o){t();continue t}i()}if(r){s={...s,...u(l)?l():l};break t}}if(!r)return;let i=P.resolvePath(this.path,s);return this.validPaths=p(this.paths,t=>P.resolvePath(t[0],s)),[i,r,s]}static resolvePath(t,e){return t.replaceAll(/:([^/]+)/g,(t,s)=>`${e[s]}`)}alias(t,e){this.paths.set(t,e)}}class S extends P{constructor(t){super(t)}async resolve(t,e,s){let r=this.routing(t);if(!r)return;let[,i,o]=r;s={...s,...o};let l=t.replace(i,"");for(let[a,n]of this.routes){let t=await n.resolve(l||"/",e,s);if(t)return[this,...t]}return[this]}}class R extends P{pages=/* @__PURE__ */new Map;page=n;#t;constructor(t,e){super(t),this.#t=e}async resolve(t,e,s){let r=this.routing(t);if(!r)return;let[i,o,l]=r;s={...s,...l};let a=await this.usePage(i,s,e),n=t.replace(o,"");for(let[h,c]of this.routes){let t=await c.resolve(n||"/",a.slot,s);if(t)return[this,...t]}return n?void 0:[this]}async usePage(t,e,s){let r=this.pages.get(t);if(!r){let s,o=this.#t;if(d(o)){let t=await o[0]().then(t=>t.default);s=()=>$(t,e,()=>$(r.slot))}else s="Widget"===this.#t[i]?()=>$(this.#t,e,()=>$(r.slot)):this.#t;r=new x(this,s,e),this.pages.set(t,r)}return this.page=r,s.render(r),r}}let E=0;const[_,L]=[1,2],[M,D]=["forward","back"],T="__scroll_history__",A=o()?sessionStorage:n,H=o()?window.addEventListener:n,W=o()?window.removeEventListener:n;o()&&(history.scrollRestoration="manual");const I=t=>{const e=K.scrollHistory;if(t){let s=t.target;if(""===s.id)return;e[E]={[s.id]:{x:s.scrollLeft,y:s.scrollTop}}}else f(g(e),([t])=>+t>=E&&delete e[+t]);A?.setItem(T,w(e))};class K extends r{direction=M;prev=n;routes=/* @__PURE__ */new Map;slot=new k;static routers=/* @__PURE__ */new Set;constructor(){super(()=>$(this.slot)),o()&&K.routers.add(this)}set href(t){this.global.router.href=t}build(){if(o()){const t=()=>{const t=history.state?.index??0;E>t&&(this.direction=D),E<t&&(this.direction=M),E=t,this.prev=this.href,this.href=a(location.href),this.resolve(location.href)};t(),H?.("popstate",t),H?.("scroll",I,{capture:!0,passive:!1}),this.disposers.add(()=>{W?.("popstate",t),W?.("scroll",I,{capture:!0})})}return super.build()}async resolve(t){if(!t)return;let e=a(t);for(let[,s]of this.routes){let t=await s.resolve(e.pathname,this.slot,{});if(t){this.global.router.routes=t;let e=[""],s=[];f(t,t=>(e=p(t.validPaths,t=>p(e,e=>e+t)).flat(),s.push(...e),e)),this.global.router.matchPaths=s;break}}f(this.global.router.navlinks,t=>t.checkActive()),K.dispatchEvent(),K.scrollRestoration()}static open(t,e){K.writeState(t,_,e)}static forward(){history.forward()}static back(){history.back()}static replace(t){K.writeState(t,L)}static get scrollData(){return this.scrollHistory[E]??{}}static get scrollHistory(){return v(A?.getItem(T)??"{}")}static scrollRestoration(){if(o()){let t=K.scrollData??{x:0,y:0};f(g(t),([t,{x:e,y:s}])=>document.querySelector(`#${t}`)?.scrollTo(e,s))}}static writeState(t,e,s){if(!t)return;let r=a(t);if(!o()||r.href!==location.href){if(s&&"_self"!==s)return open(r,s);e===_&&E++,o()&&I(),f(this.routers,s=>{s.direction=M,o()&&(s.prev=a(location.href),history[e===_?"pushState":"replaceState"]({index:E},"",r)),s.href=r,s.resolve(t)}),K.dispatchEvent()}}static dispatchEvent(){o()&&window.dispatchEvent(new Event("pathchange"))}}const N=t=>class extends K{static[i]="Router";constructor(){super(),t(this)}};let q={route(t,e,s){let r=new R(t,e);this.routes.set(t,r),s?.(r)},group(t,e){let s=new S(t);this.routes.set(t,s),e?.(s)},notfound(){}};b(P.prototype,q),b(K.prototype,q),b(l.prototype,{router:{routers:/* @__PURE__ */new Set,resolve(t){return p(this.routers,e=>e.resolve(t))},href:new URL("http://localhost"),routes:[],matchPaths:[],navlinks:/* @__PURE__ */new Set}}),l.disposers.add(({router:t})=>{t.routers.clear(),t.routes=[],t.matchPaths=[],t.navlinks.clear()}),b($,{router:t=>N(t),open:K.open,replace:K.replace,back:K.back,forward:K.forward,scrollRestoration:K.scrollRestoration,title(t){let e=r.proto;y(e,x)&&(e.title=t)}}),globalThis.Link=m,globalThis.NavLink=class extends m{constructor(t,e){super(t,e),this.global.router.navlinks.add(this)}checkActive(){let t=this.attr("href");if(t){for(let e of this.global.router.matchPaths)if(a(e).href===a(t).href)return this.attr("active","");this.attr("active",n)}}},$.process.craft.add(t=>{if(u(t)&&"Router"===t[i]){let e=r.proto,s=new t;return e?.global.router.routers.add(s),s.parent=e,s}});export{m as Link,x as Page,P as Route,S as RouteGroup,R as RouteNode,k as RouteSlot,K as RouterProto};
@@ -0,0 +1 @@
1
+ import{isFunction as e,forEach as t,_Object_assign as s,_instanceof as r,isEqual as u,isBoolean as i}from"@amateras/utils";import{TextProto as a,Proto as n}from"@amateras/core";let l=!1,o=/* @__PURE__ */new Set,c=e=>{l=!1;let t=e();return l=!0,t},b=e=>{l=!0;let t=e(c);return l=!1,t},d=/* @__PURE__ */new WeakMap,h=e=>d.get(e);class p{key;constructor(e){const t=()=>(l&&o.add(this),h(t).value);return Object.setPrototypeOf(t,this),d.set(t,{value:e,subs:/* @__PURE__ */new Set}),this.key=t,t}get value(){return h(this.key).value}get subs(){return h(this.key).subs}set(t){e(t)?this.set(t(this.value)):this.value!==t&&(h(this).value=t,this.emit())}modify(e){e(this.value),this.emit()}emit(){t(h(this).subs,e=>e(this.value))}subscribe(e){this.subs.add(e)}unsubscribe(e){this.subs.delete(e)}toString(){return`${this.value}`}}s($,{signal:e=>new p(e),effect(e){b(e),t(o,t=>t.subscribe(t=>e(c))),o.clear()},compute(e){let s=b(e),r=new p(s);return t(o,t=>t.subscribe(t=>r.set(e(c)))),o.clear(),r}});let m=e=>{if(r(e,p)){let t=new a(`${e}`);t.ondom(s=>{let r=e=>s.textContent=`${e}`;e.subscribe(r),t.disposers.add(()=>e.unsubscribe(r))});let s=e=>t.content=`${e}`;return e.subscribe(s),s(e.value),t.parent=n.proto,t}};$.process.text.add(m),$.process.craft.add(m),$.process.attr.add((e,t,s)=>{if(r(t,p)){if("input"===s.tagname){if(u(e,["value","checked"])){s.on("input",s=>t.set(s.currentTarget[e]));let r=t.value;i(r)?r&&s.attr(e,""):s.attr(e,`${r}`)}}else s.ondom(r=>{let u=()=>((e,t,s)=>{e in t?t[e]=s.value:t.setAttribute(e,`${s}`)})(e,r,t);t.subscribe(u),u(),s.disposers.add(()=>t.unsubscribe(u))});return!0}});export{p as Signal};
package/build/ui.js ADDED
@@ -0,0 +1 @@
1
+ var t,e=Object.defineProperty,i=t=>{throw TypeError(t)},s=(t,i,s)=>((t,i,s)=>i in t?e(t,i,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[i]=s)(t,"symbol"!=typeof i?i+"":i,s),a=(t,e,s)=>e.has(t)||i("Cannot "+s),n=(t,e,i)=>(a(t,e,"read from private field"),i?i.call(t):e.get(t)),r=(t,e,i,s)=>(a(t,e,"write to private field"),s?s.call(t,i):e.set(t,i),i);import{onclient as l,ElementProto as o}from"@amateras/core";import{_null as h,is as d,UID as u}from"@amateras/utils";const p=t=>(e,i,s)=>{if(e.slide=i,!l())return;let a=i.toDOM();e.node?.append(...a);let n={duration:t?.duration??500,easing:t?.easing??"ease"},r=$.match(t?.direction,t=>t.case("up",()=>[["0 100%","0 0"],["0 0","0 -100%"]]).case("down",()=>[["0 -100%","0 0"],["0 0","0 100%"]]).case("left",()=>[["100% 0","0 0"],["0 0","-100% 0"]]).case("right",()=>[["-100% 0","0 0"],["0 0","100% 0"]]).default(()=>[["100% 0","0 0"],["0 0","-100% 0"]]));i.node?.animate({translate:r[0]},n);const o=s?.node?.animate({translate:r[1]},n);o&&(o.onfinish=()=>s?.node?.remove())},c=class extends o{constructor(t,e){super("slide",t,e)}};$.style(c,"slide{display:block;height:100%;width:100%;position:absolute}");let m=c;const v=class extends o{constructor({index:e,interval:a,autoplay:n,animation:r,...l},o){var d,u,p;super("slideshow",l,o),s(this,"slide",h),s(this,"index"),s(this,"timer",h),s(this,"interval"),s(this,"autoplay"),s(this,"animation"),d=this,p=0,(u=t).has(d)?i("Cannot add the same private member more than once"):u instanceof WeakSet?u.add(d):u.set(d,p),this.index=e??0,this.interval=a??5,this.autoplay=n??!1,this.animation=r??h,this.disposers.add(()=>this.pause()),this.ondom(()=>{this.autoplay&&this.play()})}build(){return super.build(),this.switch(this.index),this}toString(){return this.parseHTML({children:this.slide?.toString()})}toDOM(t=!0){return super.toDOM(!1),t&&this.slide&&this.node?.append(...this.slide.toDOM()),[this.node]}play(){this.timer=setInterval(()=>{var e,i,s,a;(e=this,i=t,{set _(t){r(e,i,t,s)},get _(){return n(e,i,a)}})._++,n(this,t)>=100*this.interval&&(this.next(),r(this,t,0))},10)}pause(){this.timer&&clearTimeout(this.timer)}next(){let t=this.children.length,e=this.index+1;e>=t&&(e=0),this.switch(e)}prev(){let t=this.children.length,e=this.index-1;e<=0&&(e=t-1),this.switch(e)}switch(t){this.index=t;let e=this.children.at(t);this.slide!==e&&e&&(this.animation?this.animation(this,e,this.slide):(e.parent=this,this.slide=e,this.node?.replaceChildren(...e.toDOM())))}};t=new WeakMap,$.style(v,"slideshow{display:block;position:relative;overflow:clip}");let b=v;const y=class extends o{value;constructor({value:t,...e},i){super("radio-group",e,i),this.value=t,this.on("input",t=>{this.value=d(t.target,HTMLInputElement)?.value})}};$.style(y,"radio-group{display:block}");let f=y;const x=class extends o{inputId;name;value;constructor({inputId:t,name:e,value:i,...s},a){super("radio-item",s,a),this.inputId=t??`input-${u.persistInProto(this,"radio-item")}`,this.name=e??h,this.value=i}};$.style(x,"radio-item{display:block}");let g=x;class w extends o{constructor(t,e){super("input",{type:"radio",...t},e)}build(t){let e=this.findAbove(t=>d(t,g));return e&&(this.attr("id",e.inputId),this.attr("name",e.name)),super.build(t)}}class I extends o{constructor(t,e){super("label",t,e)}build(t){let e=this.findAbove(t=>d(t,g));return e&&this.attr("for",e.inputId),super.build(t)}}export{I as Label,w as Radio,f as RadioGroup,g as RadioItem,m as Slide,b as Slideshow,p as slideInOut};
package/build/utils.js ADDED
@@ -0,0 +1 @@
1
+ import{onclient as e}from"@amateras/core";const t=null,r=void 0,n=Object,s=n.fromEntries,o=n.entries,a=n.assign,i=n.values,c=n.defineProperty,l=n.getOwnPropertyDescriptors,p=Array,u=p.from,g=async(e,t)=>{let r=0;return v(t)?(async()=>{for(let n of e)await t(n,r,e),r++})():(()=>{for(let n of e)t(n,r,e),r++})()},m=(e,t)=>u(e).map(t),f=(e,t)=>typeof e===t,y=(e,t)=>t.includes(e),d=e=>f(e,"string"),h=e=>f(e,"boolean"),w=e=>f(e,"number"),b=e=>f(e,"object"),j=e=>f(e,"function"),v=e=>E(e,(async()=>0).constructor),O=e=>void 0===e,P=e=>e===t,A=p.isArray,E=(e,...t)=>!!t.find(t=>e instanceof t),M=(e,r)=>E(e,r)?e:t,S=JSON.stringify,T=JSON.parse,U=(e,...t)=>!!t.find(t=>e.startsWith(t)),$=(e,t,r)=>e.slice(t,r),x=(e,t)=>e.bind(t),C=Promise,J=()=>{let e;return(t,r)=>{e&&clearTimeout(e),e=setTimeout(t,r)}},N="abcdefghijklmnopqrstuvwxyz",k=N.toUpperCase(),q=e=>{const t="any"===(e={length:5,lettercase:"any",...e}).lettercase?N+k:"lower"===e.lettercase?N:k;return u({length:e.length},(e,r)=>t[Math.round(Math.random()*t.length)]).join("")},z=async e=>new C(t=>setTimeout(t,e)),D=e=>E(e,Array)?e:[e],I=e=>{try{return[e(),t]}catch(r){return[t,E(r,Error)?r:new Error(S(r))]}},L=(e,t,r)=>`${$(e,0,t)}${$(e,t,r).toUpperCase()}${r?$(e,r):""}`,R=URL,W=t=>E(t,R)?t:U(t,"http")?new R(t):e()?new R(U(t,origin)?t:origin+t):new R("https://localhost"+t);class B{static map=/* @__PURE__ */new Map;static generate(e,t){const r=B.map.get(e)??/* @__PURE__ */new Set,n=q(t);return r.has(n)?B.generate(e):n}static persistInProto(e,t,r){const n=B.generate(t,r);e.disposers.add(()=>B.map.get(t)?.delete(n))}}export{B as UID,u as _Array_from,T as _JSON_parse,S as _JSON_stringify,a as _Object_assign,c as _Object_defineProperty,o as _Object_entries,s as _Object_fromEntries,l as _Object_getOwnPropertyDescriptors,i as _Object_values,C as _Promise,x as _bind,E as _instanceof,t as _null,f as _typeof,r as _undefined,J as debounce,g as forEach,M as is,A as isArray,v as isAsyncFunction,h as isBoolean,y as isEqual,j as isFunction,P as isNull,w as isNumber,b as isObject,d as isString,O as isUndefined,m as map,q as randomId,z as sleep,$ as slice,U as startsWith,D as toArray,W as toURL,I as trycatch,L as uppercase};
@@ -0,0 +1 @@
1
+ import{Proto as t,symbol_ProtoType as e}from"@amateras/core";import{forEach as s,_Object_assign as r}from"@amateras/utils";const o=o=>{let a=/* @__PURE__ */new WeakMap;return class extends t{static[e]="Widget";static stores=a;constructor(...t){super(()=>{let e=t[0]??{},i=t[1],{store:c,layout:n,ancestors:l}=o(e);c||(c={}),l&&s(l,t=>{let e=this.findAbove(e=>e.constructor===t&&e);if(e){let s=t.stores.get(e);r(c,s)}}),a.set(this,c),n({store:c,children:t=>i?.(t)})})}}};r($,{widget:t=>o(t)});export{o as WidgetConstructor};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amateras",
3
- "version": "0.10.1",
3
+ "version": "0.11.0",
4
4
  "description": "Amateras is a JavaScript library for building user interface.",
5
5
  "module": "index.ts",
6
6
  "type": "module",
@@ -17,7 +17,7 @@
17
17
  "exports": {
18
18
  ".": {
19
19
  "default": "./index.ts",
20
- "unpkg": "./unpkg/amateras.js"
20
+ "unpkg": "./build/import-map.js"
21
21
  },
22
22
  "./env": {
23
23
  "browser": "./packages/core/src/env.browser.ts",
@@ -25,9 +25,9 @@
25
25
  "default": "./packages/core/src/env.browser.ts"
26
26
  },
27
27
  "./utils": {
28
- "browser": "./packages/utils/src/index.browser.ts",
28
+ "browser": "./packages/utils/src/index.ts",
29
29
  "bun": "./packages/utils/src/index.bun.ts",
30
- "default": "./packages/utils/src/index.browser.ts"
30
+ "default": "./packages/utils/src/index.ts"
31
31
  },
32
32
  "./core": "./packages/core/src/index.ts",
33
33
  "./css/*": "./packages/css/src/ext/*.ts",
@@ -44,11 +44,13 @@
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/bun": "^1.3.6",
47
- "vite": "^7.3.1"
47
+ "vite": "^7.3.1",
48
+ "terser": "^5.46.0"
48
49
  },
49
50
  "files": [
50
- "pakcages",
51
+ "packages",
51
52
  "index.ts",
52
- "tsconfig.json"
53
+ "tsconfig.json",
54
+ "build"
53
55
  ]
54
56
  }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@amateras/core",
3
+ "dependencies": {
4
+ "@amateras/utils": "workspace:*"
5
+ },
6
+ "imports": {
7
+ "#structure/*": "./src/structure/*.ts",
8
+ "#lib/*": "./src/lib/*.ts",
9
+ "#node/*": "./src/node/*.ts",
10
+ "#env": {
11
+ "browser": "./src/env.browser.ts",
12
+ "node": "./src/env.node.ts",
13
+ "default": "./src/env.browser.ts"
14
+ }
15
+ },
16
+ "exports": {
17
+ ".": "./src/index.ts"
18
+ }
19
+ }
@@ -0,0 +1,21 @@
1
+ // window and document
2
+ export const _window = window;
3
+ export const _document = document;
4
+
5
+ interface onclient {
6
+ (): boolean;
7
+ (fn: Function): void
8
+ }
9
+
10
+ interface onserver {
11
+ (): boolean;
12
+ (fn: Function): void
13
+ }
14
+
15
+ export const onclient: onclient = (fn?: Function) => {
16
+ if (fn) return fn();
17
+ return true
18
+ }
19
+ export const onserver: onserver = (fn?: Function) => {
20
+ return false;
21
+ }
@@ -0,0 +1,21 @@
1
+ // window and document
2
+ export const _window = undefined;
3
+ export const _document = undefined;
4
+
5
+ interface onclient {
6
+ (): boolean;
7
+ (fn: Function): void
8
+ }
9
+
10
+ interface onserver {
11
+ (): boolean;
12
+ (fn: Function): void
13
+ }
14
+
15
+ export const onclient: onclient = (fn?: Function) => {
16
+ return false;
17
+ }
18
+ export const onserver: onserver = (fn?: Function) => {
19
+ if (fn) return fn();
20
+ return true
21
+ }
@@ -0,0 +1,5 @@
1
+ import * as core from './index';
2
+
3
+ declare global {
4
+ export import $ = core.$
5
+ }
@@ -0,0 +1,184 @@
1
+ import { onclient, onserver } from '#env';
2
+ import { hmr } from '#lib/hmr';
3
+ import { _instanceof, _null, forEach, isArray, isFunction, isString, isUndefined } from '@amateras/utils';
4
+ import './global';
5
+ import { ElementProto } from './structure/ElementProto';
6
+ import { Proto } from './structure/Proto';
7
+ import { TextProto } from './structure/TextProto';
8
+
9
+ type ElementProtoArguments<C extends Constructor> =
10
+ RequiredKeys<RemoveIndexSignature<ConstructorParameters<C>[0]>> extends never
11
+ ? [layout?: ConstructorParameters<C>[1]] | [props: ConstructorParameters<C>[0], layout?: ConstructorParameters<C>[1]]
12
+ : [props: ConstructorParameters<C>[0], layout?: ConstructorParameters<C>[1]]
13
+
14
+ export function $<T extends ElementProto<any>, C extends Constructor<T>, R extends InstanceType<C>>(constructor: C, ...args: ElementProtoArguments<C>): R;
15
+ export function $(template: TemplateStringsArray, ...args: any[]): Proto[];
16
+ export function $(proto: Proto): Proto;
17
+ export function $(args: any[]): Proto[];
18
+ export function $<T extends keyof HTMLElementTagNameMap>(tagname: T, layout?: $.Layout<ElementProto<HTMLElementTagNameMap[T]>>): ElementProto;
19
+ export function $<T extends string>(tagname: T, layout?: $.Layout<ElementProto>): ElementProto;
20
+ export function $<T extends keyof HTMLElementTagNameMap>(tagname: T, attr: $.Props, layout?: $.Layout<ElementProto<HTMLElementTagNameMap[T]>>): ElementProto;
21
+ export function $<T extends string>(tagname: T, attr: $.Props, layout?: $.Layout<ElementProto>): ElementProto;
22
+ export function $(...args: any): any {
23
+ const prevProtoParent = Proto.proto;
24
+ let protos: Proto[] = []
25
+ const addProtoToParent = (proto: Proto) => {
26
+ proto.parent = prevProtoParent;
27
+ protos.push(proto);
28
+ }
29
+ for (let process of $.process.craft) {
30
+ let result = process(...args);
31
+ if (!isUndefined(result)) return result;
32
+ }
33
+ const [arg1, arg2, arg3] = args;
34
+
35
+ // Proto
36
+ if (_instanceof(arg1, Proto)) {
37
+ addProtoToParent(arg1);
38
+ return arg1;
39
+ }
40
+
41
+ // Element Proto
42
+ if (isString(arg1)) {
43
+ let args: [any, any] = isFunction(arg2) ? [,arg2] : [arg2, arg3];
44
+ let eleProto = new ElementProto(arg1, ...args);
45
+ addProtoToParent(eleProto);
46
+ return eleProto;
47
+ }
48
+
49
+ // Function Handler
50
+ if (isFunction(arg1)) {
51
+ let args: [any, any] = isFunction(arg2) ? [{}, arg2] : [arg2, arg3];
52
+ let target = new arg1(...args);
53
+ // Widget Handler
54
+ if (_instanceof(target, Proto)) {
55
+ addProtoToParent(target);
56
+ return target;
57
+ }
58
+ }
59
+
60
+ if (isArray(arg1)) {
61
+ let valueBuilder = (value: any) => {
62
+ for (let process of $.process.text) {
63
+ let proto = process(value);
64
+ if (!isUndefined(proto)) return addProtoToParent(proto);
65
+ }
66
+ let valueTextProto = isUndefined(value) ? _null : new TextProto(`${value}`);
67
+ if (valueTextProto) addProtoToParent(valueTextProto);
68
+ }
69
+
70
+ let [arg1, ...values] = args
71
+
72
+ // Variables Array Handler
73
+ if (!arg1.raw) {
74
+ forEach(arg1, arg => valueBuilder(arg))
75
+ }
76
+
77
+ // Template String Array Handler
78
+ else {
79
+ forEach(arg1 as string[], (str, index) => {
80
+ let strTextProto = str.length ? new TextProto(str) : _null;
81
+ let value = values[index];
82
+ if (strTextProto) addProtoToParent(strTextProto);
83
+ valueBuilder(value)
84
+ })
85
+ }
86
+ return protos;
87
+ }
88
+ }
89
+
90
+
91
+ export namespace $ {
92
+ /** Layout 是一个 Proto 模板函数,所有在此函数中运行 $ 函数所创建的 Proto 都会被加入到运行 Layout 的 Proto 中。 */
93
+ export type Layout<E extends Proto = any> = (proto: E) => void;
94
+ /** Props 是组件函数的参数,集合了该组件的自定义属性,以及组件 Layout 函数和元素属性的传递。 */
95
+ export type Props<T = {}> = { [key: string]: any } & T;
96
+
97
+ export interface AttrMap {}
98
+
99
+ export type CraftMiddleware = (...args: any[]) => any;
100
+ export type TextMiddleware = (value: any) => Proto | undefined;
101
+ export type AttrMiddleware = (name: string, value: any, proto: ElementProto) => any;
102
+
103
+ export const process = {
104
+ craft: new Set<CraftMiddleware>(),
105
+ text: new Set<TextMiddleware>(),
106
+ attr: new Set<AttrMiddleware>()
107
+ }
108
+
109
+ export const dispose = (disposer: () => void) => {
110
+ Proto.proto?.disposers.add(disposer);
111
+ }
112
+
113
+ export const render = (proto: Proto, element: HTMLElement | (() => HTMLElement)) => {
114
+ // Disable render on server side
115
+ if (onserver()) return;
116
+ element = isFunction(element) ? element() : element;
117
+
118
+ if (!hmr(element, proto)) {
119
+ let nodes = proto.build().toDOM()
120
+ element.replaceChildren(...nodes);
121
+ };
122
+ }
123
+
124
+ export const context = (proto: {proto: Proto | null}, parent: Proto | null, callback: () => void) => {
125
+ let cacheProtoParent = proto.proto;
126
+ proto.proto = parent;
127
+ callback();
128
+ proto.proto = cacheProtoParent;
129
+ }
130
+
131
+ export const call = <T>(callback: () => T) => callback();
132
+
133
+ interface MatchCase<T, Rec extends T = never, Res = never, Def = never> {
134
+ case<C extends Exclude<T, Rec>, V>(condition: C, callback: () => V): MatchCase<T, Rec | C, Res | V, Def>
135
+ default<V>(callback: () => V): MatchCase<T, Rec, Res, V>
136
+ }
137
+
138
+ export const match = <T, M extends MatchCase<T>>(condition: T, callback: ($$: MatchCase<T>) => M):
139
+ M extends MatchCase<T, infer Rec, infer Res, infer Def>
140
+ ? Exclude<T, Rec> extends never
141
+ ? Res
142
+ : Def extends never
143
+ ? Res | undefined
144
+ : Res | Def
145
+ : never => {
146
+ var cases = new Map();
147
+ var symbol_default = Symbol('default');
148
+ var match = {
149
+ case: (condition: any, callback: () => any) => {
150
+ cases.set(condition, callback);
151
+ return match;
152
+ },
153
+ default: (callback: () => any) => {
154
+ cases.set(symbol_default, callback);
155
+ return match;
156
+ }
157
+ }
158
+ callback(match as any);
159
+ return cases.get(condition)?.() ?? cases.get(symbol_default)?.();
160
+ }
161
+ export const stylesheet = onclient() ? new CSSStyleSheet() : _null;
162
+ export const styleMap = new Map<Constructor<ElementProto>, string>();
163
+ export const style = (proto: Constructor<ElementProto> | null, css: string) => {
164
+ if (proto) styleMap.set(proto, css);
165
+ stylesheet?.insertRule(css);
166
+ }
167
+
168
+ if (stylesheet) document.adoptedStyleSheets.push(stylesheet);
169
+
170
+ if (onclient()) document.querySelector('style#__ssr__')?.remove();
171
+ }
172
+
173
+ export type $ = typeof $;
174
+
175
+ globalThis.$ = $;
176
+
177
+ export * from "#structure/ElementProto";
178
+ export * from "#structure/GlobalState";
179
+ export * from "#structure/NodeProto";
180
+ export * from "#structure/Proto";
181
+ export * from "#structure/ProxyProto";
182
+ export * from "#structure/TextProto";
183
+ export * from "#env";
184
+ export * from "#lib/symbols";