alemonjs 2.1.83 → 2.1.85

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 (235) hide show
  1. package/lib/{app → application}/define-children.js +2 -1
  2. package/lib/{app → application/format}/message-api.d.ts +2 -2
  3. package/lib/{app → application/format}/message-api.js +12 -4
  4. package/lib/{app → application/format}/message-format-old.d.ts +1 -1
  5. package/lib/{app → application/format}/message-format.d.ts +1 -2
  6. package/lib/{app → application/format}/message-format.js +0 -2
  7. package/lib/{app/hook-use → application/hooks}/announce.js +4 -3
  8. package/lib/{app/hook-use → application/hooks}/channel.js +4 -3
  9. package/lib/{app/hook-use → application/hooks}/client.d.ts +1 -1
  10. package/lib/{app/hook-use → application/hooks}/client.js +4 -11
  11. package/lib/{app/hook-use → application/hooks}/common.d.ts +7 -7
  12. package/lib/{app/hook-use → application/hooks}/common.js +9 -8
  13. package/lib/{app/hook-use → application/hooks}/event.js +1 -1
  14. package/lib/{app/hook-use → application/hooks}/guild.js +4 -3
  15. package/lib/{app/hook-use → application/hooks}/history.js +4 -3
  16. package/lib/{app/hook-use → application/hooks}/me.js +12 -7
  17. package/lib/{app/hook-use → application/hooks}/media.d.ts +3 -3
  18. package/lib/{app/hook-use → application/hooks}/media.js +4 -3
  19. package/lib/{app/hook-use → application/hooks}/member.js +4 -3
  20. package/lib/{app/hook-use → application/hooks}/mention.js +4 -3
  21. package/lib/{app/hook-use → application/hooks}/message.js +6 -5
  22. package/lib/{app/hook-use → application/hooks}/permission.js +4 -3
  23. package/lib/{app/hook-use → application/hooks}/reaction.js +4 -3
  24. package/lib/{app/hook-use → application/hooks}/request.js +12 -7
  25. package/lib/{app/hook-use → application/hooks}/role.js +4 -3
  26. package/lib/{app/hook-use → application/hooks}/subscribe.js +4 -4
  27. package/lib/{app/hook-use → application/hooks}/user.js +12 -7
  28. package/lib/application/index.d.ts +29 -0
  29. package/lib/application/index.js +58 -0
  30. package/lib/{app → application}/router/dsl.d.ts +1 -1
  31. package/lib/{app → application}/router/dsl.js +14 -10
  32. package/lib/{cbp → application/runtime/cbp}/connects/client.d.ts +1 -1
  33. package/lib/{cbp → application/runtime/cbp}/connects/client.js +43 -50
  34. package/lib/application/runtime/cbp/index.d.ts +3 -0
  35. package/lib/application/runtime/cbp/index.js +3 -0
  36. package/lib/application/runtime/cbp/processor/actions.d.ts +3 -0
  37. package/lib/application/runtime/cbp/processor/actions.js +58 -0
  38. package/lib/application/runtime/cbp/processor/api.d.ts +3 -0
  39. package/lib/application/runtime/cbp/processor/api.js +58 -0
  40. package/lib/application/runtime/cbp/processor/request-registry.d.ts +8 -0
  41. package/lib/application/runtime/cbp/processor/request-registry.js +6 -0
  42. package/lib/application/runtime/client-runtime.d.ts +1 -0
  43. package/lib/application/runtime/client-runtime.js +95 -0
  44. package/lib/{app → application/runtime}/event-error.d.ts +1 -1
  45. package/lib/{app → application/runtime}/event-error.js +1 -1
  46. package/lib/{app → application/runtime}/event-group.d.ts +1 -1
  47. package/lib/{app → application/runtime}/event-middleware.d.ts +1 -1
  48. package/lib/{app → application/runtime}/event-middleware.js +1 -1
  49. package/lib/{app → application/runtime}/event-processor-callHandler.d.ts +1 -1
  50. package/lib/{app → application/runtime}/event-processor-callHandler.js +8 -1
  51. package/lib/{app → application/runtime}/event-processor-cycle.d.ts +1 -1
  52. package/lib/{app → application/runtime}/event-processor-cycleFiles.d.ts +1 -1
  53. package/lib/{app → application/runtime}/event-processor-cycleFiles.js +2 -2
  54. package/lib/{app → application/runtime}/event-processor-cycleRoute.d.ts +1 -1
  55. package/lib/{app → application/runtime}/event-processor-cycleRoute.js +9 -2
  56. package/lib/{app → application/runtime}/event-processor-event.d.ts +1 -1
  57. package/lib/{app → application/runtime}/event-processor-middleware.d.ts +1 -1
  58. package/lib/{app → application/runtime}/event-processor-subscribe.d.ts +1 -1
  59. package/lib/{app → application/runtime}/event-processor-subscribe.js +9 -2
  60. package/lib/{app → application/runtime}/event-processor.d.ts +1 -1
  61. package/lib/{app → application/runtime}/event-processor.js +4 -3
  62. package/lib/{app → application/runtime}/event-response.d.ts +1 -1
  63. package/lib/{app → application/runtime}/event-utils.d.ts +1 -1
  64. package/lib/{app → application/runtime}/event-utils.js +2 -2
  65. package/lib/{app → application/runtime}/hook-event-context.d.ts +2 -2
  66. package/lib/{app → application/runtime}/hook-event-context.js +2 -2
  67. package/lib/application/runtime/http/index.d.ts +4 -0
  68. package/lib/application/runtime/http/index.js +4 -0
  69. package/lib/application/runtime/http/routers/hello.html.d.ts +4 -0
  70. package/lib/application/runtime/http/routers/hello.html.js +363 -0
  71. package/lib/{server → application/runtime/http}/routers/router.js +265 -179
  72. package/lib/{server → application/runtime/http}/routers/utils.d.ts +1 -1
  73. package/lib/{server → application/runtime/http}/routers/utils.js +22 -8
  74. package/lib/{server/main.js → application/runtime/http-server.js} +2 -6
  75. package/lib/{app → application/runtime}/lifecycle-callbacks.d.ts +1 -1
  76. package/lib/{app → application/runtime}/lifecycle-callbacks.js +2 -7
  77. package/lib/{app/load_modules → application/runtime/load-modules}/load.js +2 -2
  78. package/lib/{app/load_modules → application/runtime/load-modules}/loadChild.js +14 -5
  79. package/lib/{app → application/runtime}/schedule-store.d.ts +1 -1
  80. package/lib/{app → application/runtime}/schedule-store.js +1 -1
  81. package/lib/{app → application/runtime}/store.d.ts +14 -19
  82. package/lib/{app → application/runtime}/store.js +8 -103
  83. package/lib/application/schedule.d.ts +17 -0
  84. package/lib/{app/api → application}/schedule.js +1 -1
  85. package/lib/client.d.ts +1 -1
  86. package/lib/client.js +1 -117
  87. package/lib/common/cbp/constants.d.ts +11 -0
  88. package/lib/common/cbp/constants.js +13 -0
  89. package/lib/{cbp/connects/connect.js → common/cbp/heartbeat.js} +3 -6
  90. package/lib/common/cbp/normalize.d.ts +16 -0
  91. package/lib/common/cbp/normalize.js +324 -0
  92. package/lib/common/cbp/runtime.d.ts +2 -0
  93. package/lib/common/cbp/runtime.js +10 -0
  94. package/lib/common/cbp/typings.d.ts +159 -0
  95. package/lib/{cbp/connects/base.js → common/cbp/ws-connector.js} +7 -9
  96. package/lib/{core → common}/config.d.ts +2 -2
  97. package/lib/{core → common}/config.js +5 -4
  98. package/lib/common/identity.d.ts +11 -0
  99. package/lib/common/identity.js +34 -0
  100. package/lib/common/index.d.ts +15 -0
  101. package/lib/common/index.js +14 -0
  102. package/lib/common/logger.d.ts +6 -0
  103. package/lib/common/logger.js +99 -0
  104. package/lib/{core → common}/react.js +22 -3
  105. package/lib/common/result.d.ts +7 -0
  106. package/lib/common/result.js +19 -0
  107. package/lib/{core → common}/utils.d.ts +3 -18
  108. package/lib/{core → common}/utils.js +6 -49
  109. package/lib/{core → common}/variable.js +1 -1
  110. package/lib/core/cbp/index.d.ts +1 -0
  111. package/lib/core/cbp/index.js +1 -0
  112. package/lib/core/cbp/processor/config.d.ts +8 -0
  113. package/lib/core/cbp/processor/config.js +29 -0
  114. package/lib/{cbp → core/cbp}/routers/hello.html.js +1 -1
  115. package/lib/{cbp → core/cbp}/server/main.js +57 -35
  116. package/lib/{cbp → core/cbp}/server/testone.d.ts +1 -1
  117. package/lib/{cbp → core/cbp}/server/testone.js +8 -2
  118. package/lib/core/index.d.ts +1 -3
  119. package/lib/core/index.js +1 -3
  120. package/lib/core/process/index.d.ts +3 -0
  121. package/lib/{process → core/process}/index.js +0 -1
  122. package/lib/{process → core/process}/ipc-bridge.js +16 -2
  123. package/lib/{process → core/process}/module.js +13 -4
  124. package/lib/{process → core/process}/platform.js +12 -3
  125. package/lib/core/start.d.ts +2 -0
  126. package/lib/core/start.js +76 -0
  127. package/lib/global.d.ts +4 -3
  128. package/lib/index.d.ts +10 -2
  129. package/lib/index.js +74 -54
  130. package/lib/main.d.ts +1 -2
  131. package/lib/main.js +1 -76
  132. package/lib/{cbp/connects/platform.d.ts → platform/cbp-platform.d.ts} +2 -2
  133. package/lib/{cbp/connects/platform.js → platform/cbp-platform.js} +52 -75
  134. package/lib/{app → platform}/define-platform.js +2 -0
  135. package/lib/platform/event-value.d.ts +7 -0
  136. package/lib/platform/event-value.js +5 -0
  137. package/lib/platform/index.d.ts +5 -0
  138. package/lib/platform/index.js +5 -0
  139. package/lib/types/actions.d.ts +20 -1
  140. package/lib/types/apis.d.ts +2 -1
  141. package/lib/types/client/index.d.ts +1 -1
  142. package/lib/types/cycle/index.d.ts +1 -1
  143. package/lib/types/event/index.d.ts +1 -1
  144. package/lib/types/subscribe/index.d.ts +1 -1
  145. package/package.json +22 -1
  146. package/lib/app/api/schedule.d.ts +0 -17
  147. package/lib/app/index.d.ts +0 -25
  148. package/lib/app/index.js +0 -47
  149. package/lib/cbp/index.d.ts +0 -3
  150. package/lib/cbp/index.js +0 -3
  151. package/lib/cbp/processor/actions.d.ts +0 -3
  152. package/lib/cbp/processor/actions.js +0 -48
  153. package/lib/cbp/processor/api.d.ts +0 -3
  154. package/lib/cbp/processor/api.js +0 -48
  155. package/lib/cbp/processor/config.d.ts +0 -29
  156. package/lib/cbp/processor/config.js +0 -52
  157. package/lib/cbp/typings.d.ts +0 -20
  158. package/lib/process/index.d.ts +0 -4
  159. package/lib/server/routers/hello.html.d.ts +0 -2
  160. package/lib/server/routers/hello.html.js +0 -31
  161. /package/lib/{app → application}/define-children.d.ts +0 -0
  162. /package/lib/{app → application}/define-middleware.d.ts +0 -0
  163. /package/lib/{app → application}/define-middleware.js +0 -0
  164. /package/lib/{app → application}/define-response.d.ts +0 -0
  165. /package/lib/{app → application}/define-response.js +0 -0
  166. /package/lib/{app → application}/define-router.d.ts +0 -0
  167. /package/lib/{app → application}/define-router.js +0 -0
  168. /package/lib/{app → application}/expose.d.ts +0 -0
  169. /package/lib/{app → application}/expose.js +0 -0
  170. /package/lib/{app → application/format}/message-format-old.js +0 -0
  171. /package/lib/{app/hook-use → application/hooks}/announce.d.ts +0 -0
  172. /package/lib/{app/hook-use → application/hooks}/channel.d.ts +0 -0
  173. /package/lib/{app/hook-use → application/hooks}/event.d.ts +0 -0
  174. /package/lib/{app/hook-use → application/hooks}/guild.d.ts +0 -0
  175. /package/lib/{app/hook-use → application/hooks}/history.d.ts +0 -0
  176. /package/lib/{app/hook-use → application/hooks}/index.d.ts +0 -0
  177. /package/lib/{app/hook-use → application/hooks}/index.js +0 -0
  178. /package/lib/{app/hook-use → application/hooks}/me.d.ts +0 -0
  179. /package/lib/{app/hook-use → application/hooks}/member.d.ts +0 -0
  180. /package/lib/{app/hook-use → application/hooks}/mention.d.ts +0 -0
  181. /package/lib/{app/hook-use → application/hooks}/message.d.ts +0 -0
  182. /package/lib/{app/hook-use → application/hooks}/permission.d.ts +0 -0
  183. /package/lib/{app/hook-use → application/hooks}/reaction.d.ts +0 -0
  184. /package/lib/{app/hook-use → application/hooks}/request.d.ts +0 -0
  185. /package/lib/{app/hook-use → application/hooks}/role.d.ts +0 -0
  186. /package/lib/{app/hook-use → application/hooks}/route.d.ts +0 -0
  187. /package/lib/{app/hook-use → application/hooks}/route.js +0 -0
  188. /package/lib/{app/hook-use → application/hooks}/subscribe.d.ts +0 -0
  189. /package/lib/{app/hook-use → application/hooks}/user.d.ts +0 -0
  190. /package/lib/{app → application}/router/fallback.d.ts +0 -0
  191. /package/lib/{app → application}/router/fallback.js +0 -0
  192. /package/lib/{app → application}/router/main.d.ts +0 -0
  193. /package/lib/{app → application}/router/main.js +0 -0
  194. /package/lib/{app → application}/router/parser.d.ts +0 -0
  195. /package/lib/{app → application}/router/parser.js +0 -0
  196. /package/lib/{app → application}/router/types.d.ts +0 -0
  197. /package/lib/{app → application}/router/types.js +0 -0
  198. /package/lib/{app → application}/router/validator.d.ts +0 -0
  199. /package/lib/{app → application}/router/validator.js +0 -0
  200. /package/lib/{cbp → application/runtime/cbp}/processor/transport.d.ts +0 -0
  201. /package/lib/{cbp → application/runtime/cbp}/processor/transport.js +0 -0
  202. /package/lib/{app → application/runtime}/event-group.js +0 -0
  203. /package/lib/{app → application/runtime}/event-processor-cycle.js +0 -0
  204. /package/lib/{app → application/runtime}/event-processor-event.js +0 -0
  205. /package/lib/{app → application/runtime}/event-processor-middleware.js +0 -0
  206. /package/lib/{app → application/runtime}/event-response.js +0 -0
  207. /package/lib/{server → application/runtime/http}/routers/middleware.d.ts +0 -0
  208. /package/lib/{server → application/runtime/http}/routers/middleware.js +0 -0
  209. /package/lib/{cbp → application/runtime/http}/routers/router.d.ts +0 -0
  210. /package/lib/{server/main.d.ts → application/runtime/http-server.d.ts} +0 -0
  211. /package/lib/{app/load_modules → application/runtime/load-modules}/index.d.ts +0 -0
  212. /package/lib/{app/load_modules → application/runtime/load-modules}/index.js +0 -0
  213. /package/lib/{app/load_modules → application/runtime/load-modules}/load.d.ts +0 -0
  214. /package/lib/{app/load_modules → application/runtime/load-modules}/loadChild.d.ts +0 -0
  215. /package/lib/{app/config.d.ts → application/runtime/subscribe-status.d.ts} +0 -0
  216. /package/lib/{app/config.js → application/runtime/subscribe-status.js} +0 -0
  217. /package/lib/{app → common}/SinglyLinkedList.d.ts +0 -0
  218. /package/lib/{app → common}/SinglyLinkedList.js +0 -0
  219. /package/lib/{cbp/connects/connect.d.ts → common/cbp/heartbeat.d.ts} +0 -0
  220. /package/lib/{cbp → common/cbp}/typings.js +0 -0
  221. /package/lib/{cbp/connects/base.d.ts → common/cbp/ws-connector.d.ts} +0 -0
  222. /package/lib/{process → common}/direct-channel.d.ts +0 -0
  223. /package/lib/{process → common}/direct-channel.js +0 -0
  224. /package/lib/{core → common}/react.d.ts +0 -0
  225. /package/lib/{core → common}/variable.d.ts +0 -0
  226. /package/lib/{cbp → core/cbp}/routers/hello.html.d.ts +0 -0
  227. /package/lib/{server → core/cbp}/routers/router.d.ts +0 -0
  228. /package/lib/{cbp → core/cbp}/routers/router.js +0 -0
  229. /package/lib/{cbp → core/cbp}/server/main.d.ts +0 -0
  230. /package/lib/{process → core/process}/ipc-bridge.d.ts +0 -0
  231. /package/lib/{process → core/process}/module.d.ts +0 -0
  232. /package/lib/{process → core/process}/platform.d.ts +0 -0
  233. /package/lib/{app → platform}/define-platform.d.ts +0 -0
  234. /package/lib/{app → platform}/event-format.d.ts +0 -0
  235. /package/lib/{app → platform}/event-format.js +0 -0
@@ -0,0 +1,363 @@
1
+ import { DOCTYPE, renderToString, createElement, Component, Html, Head, Title, Style, Body, Div, P } from '../../../../common/react.js';
2
+
3
+ const escapeHtml = (value) => String(value).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
4
+ const styles = `
5
+ :root {
6
+ --bg: #f3efe5;
7
+ --panel: rgba(255, 251, 245, 0.88);
8
+ --panel-strong: #fffaf2;
9
+ --text: #17212b;
10
+ --muted: #6a7684;
11
+ --line: rgba(23, 33, 43, 0.08);
12
+ --accent: #d96c28;
13
+ --accent-strong: #a54a13;
14
+ --shadow: 0 24px 60px rgba(47, 35, 20, 0.12);
15
+ }
16
+ * { box-sizing: border-box; }
17
+ html, body { margin: 0; min-height: 100%; }
18
+ body {
19
+ font-family: "SF Pro Display", "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
20
+ color: var(--text);
21
+ background:
22
+ radial-gradient(circle at top left, rgba(217, 108, 40, 0.18), transparent 28%),
23
+ radial-gradient(circle at right center, rgba(78, 140, 124, 0.14), transparent 26%),
24
+ linear-gradient(180deg, #f8f4ec 0%, var(--bg) 100%);
25
+ }
26
+ .page {
27
+ width: min(1680px, calc(100vw - 32px));
28
+ margin: 0 auto;
29
+ padding: clamp(28px, 4vw, 56px) 0 64px;
30
+ }
31
+ .hero {
32
+ position: relative;
33
+ overflow: hidden;
34
+ padding: clamp(28px, 4vw, 56px);
35
+ border-radius: 32px;
36
+ background: linear-gradient(135deg, rgba(255, 250, 242, 0.95), rgba(255, 244, 231, 0.88));
37
+ border: 1px solid rgba(255, 255, 255, 0.72);
38
+ box-shadow: var(--shadow);
39
+ }
40
+ .hero::after {
41
+ content: "";
42
+ position: absolute;
43
+ inset: auto -8% -48% auto;
44
+ width: min(38vw, 520px);
45
+ aspect-ratio: 1;
46
+ border-radius: 999px;
47
+ background: radial-gradient(circle, rgba(217, 108, 40, 0.18), transparent 62%);
48
+ pointer-events: none;
49
+ }
50
+ .hero-kicker {
51
+ margin: 0 0 12px;
52
+ font-size: clamp(14px, 1.2vw, 18px);
53
+ letter-spacing: 0.18em;
54
+ text-transform: uppercase;
55
+ color: var(--accent-strong);
56
+ }
57
+ .hero-title {
58
+ margin: 0;
59
+ max-width: 12ch;
60
+ font-size: clamp(40px, 7vw, 86px);
61
+ line-height: 0.95;
62
+ letter-spacing: -0.04em;
63
+ }
64
+ .hero-desc {
65
+ margin: 18px 0 0;
66
+ max-width: 56rem;
67
+ font-size: clamp(18px, 2vw, 28px);
68
+ line-height: 1.6;
69
+ color: var(--muted);
70
+ }
71
+ .hero-meta {
72
+ display: flex;
73
+ flex-wrap: wrap;
74
+ gap: 14px;
75
+ margin-top: 28px;
76
+ }
77
+ .hero-pill {
78
+ display: inline-flex;
79
+ align-items: center;
80
+ gap: 10px;
81
+ padding: 12px 18px;
82
+ border-radius: 999px;
83
+ background: rgba(255, 255, 255, 0.78);
84
+ border: 1px solid rgba(23, 33, 43, 0.08);
85
+ font-size: clamp(14px, 1.4vw, 18px);
86
+ }
87
+ .hero-pill strong {
88
+ color: var(--accent-strong);
89
+ }
90
+ .section-head {
91
+ display: flex;
92
+ align-items: end;
93
+ justify-content: space-between;
94
+ gap: 20px;
95
+ margin: 28px 0 18px;
96
+ padding: 0 6px;
97
+ }
98
+ .section-title {
99
+ margin: 0;
100
+ font-size: clamp(28px, 3vw, 42px);
101
+ }
102
+ .section-note {
103
+ margin: 0;
104
+ font-size: clamp(14px, 1.3vw, 18px);
105
+ color: var(--muted);
106
+ }
107
+ .app-grid {
108
+ display: grid;
109
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
110
+ gap: 18px;
111
+ }
112
+ .app-card {
113
+ display: flex;
114
+ flex-direction: column;
115
+ gap: 18px;
116
+ min-height: 280px;
117
+ padding: 24px;
118
+ border-radius: 28px;
119
+ text-decoration: none;
120
+ color: inherit;
121
+ background: var(--panel);
122
+ border: 1px solid var(--line);
123
+ box-shadow: 0 14px 40px rgba(30, 37, 44, 0.08);
124
+ transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
125
+ }
126
+ .app-card:hover {
127
+ transform: translateY(-4px);
128
+ border-color: rgba(217, 108, 40, 0.28);
129
+ box-shadow: 0 24px 50px rgba(30, 37, 44, 0.12);
130
+ }
131
+ .app-card__top,
132
+ .app-card__bottom {
133
+ display: flex;
134
+ align-items: center;
135
+ justify-content: space-between;
136
+ gap: 16px;
137
+ }
138
+ .app-eyebrow {
139
+ margin: 0 0 8px;
140
+ font-size: 13px;
141
+ letter-spacing: 0.16em;
142
+ text-transform: uppercase;
143
+ color: var(--accent-strong);
144
+ }
145
+ .app-title {
146
+ margin: 0;
147
+ font-size: clamp(28px, 2.8vw, 38px);
148
+ line-height: 1;
149
+ }
150
+ .app-desc {
151
+ margin: 0;
152
+ font-size: clamp(16px, 1.4vw, 20px);
153
+ line-height: 1.7;
154
+ color: var(--muted);
155
+ }
156
+ .app-tags {
157
+ display: flex;
158
+ flex-wrap: wrap;
159
+ gap: 10px;
160
+ }
161
+ .app-tag {
162
+ padding: 8px 12px;
163
+ border-radius: 999px;
164
+ background: rgba(217, 108, 40, 0.1);
165
+ color: var(--accent-strong);
166
+ font-size: 14px;
167
+ }
168
+ .app-rank {
169
+ min-width: 84px;
170
+ text-align: right;
171
+ }
172
+ .app-rank__label,
173
+ .app-link {
174
+ display: block;
175
+ font-size: 13px;
176
+ color: var(--muted);
177
+ }
178
+ .app-rank__value {
179
+ font-size: clamp(24px, 2vw, 30px);
180
+ font-weight: 700;
181
+ }
182
+ .app-action {
183
+ padding: 12px 18px;
184
+ border-radius: 999px;
185
+ background: #1d2d38;
186
+ color: #fff;
187
+ font-size: 15px;
188
+ }
189
+ .empty-state {
190
+ padding: 32px;
191
+ border-radius: 28px;
192
+ background: var(--panel-strong);
193
+ border: 1px dashed rgba(23, 33, 43, 0.16);
194
+ }
195
+ .empty-state__title {
196
+ margin: 0;
197
+ font-size: 24px;
198
+ }
199
+ .empty-state__desc {
200
+ margin: 10px 0 0;
201
+ color: var(--muted);
202
+ font-size: 16px;
203
+ }
204
+ @media (max-width: 820px) {
205
+ .page { width: min(100vw - 20px, 100%); padding-top: 18px; }
206
+ .hero { border-radius: 24px; padding: 22px; }
207
+ .section-head { align-items: start; flex-direction: column; }
208
+ .app-card { min-height: 0; padding: 20px; border-radius: 22px; }
209
+ .app-card__top,
210
+ .app-card__bottom { align-items: start; flex-direction: column; }
211
+ .app-rank { text-align: left; min-width: 0; }
212
+ }
213
+ `;
214
+ const appHref = (app) => {
215
+ return app.kind === 'main' ? '/app/' : `/apps/${app.name}/`;
216
+ };
217
+ const appTags = (app) => {
218
+ const tags = [app.kind === 'main' ? '主应用' : '插件'];
219
+ if (app.capabilities.web) {
220
+ tags.push('页面');
221
+ }
222
+ if (app.capabilities.httpApi) {
223
+ tags.push('接口');
224
+ }
225
+ if (app.capabilities.event) {
226
+ tags.push('事件');
227
+ }
228
+ if (app.capabilities.expose) {
229
+ tags.push('Expose');
230
+ }
231
+ return tags;
232
+ };
233
+ const renderCardHtml = (app) => {
234
+ const href = appHref(app);
235
+ const tags = appTags(app)
236
+ .map(tag => `<span class="app-tag">${escapeHtml(tag)}</span>`)
237
+ .join('');
238
+ const desc = app.kind === 'main' ? '访问主应用页面、接口与默认资源。' : '访问插件页面、接口与公开入口。';
239
+ return `
240
+ <a
241
+ class="app-card"
242
+ href="${escapeHtml(href)}"
243
+ data-app-id="${escapeHtml(app.name)}"
244
+ data-app-kind="${escapeHtml(app.kind)}"
245
+ data-app-href="${escapeHtml(href)}"
246
+ >
247
+ <div class="app-card__top">
248
+ <div>
249
+ <p class="app-eyebrow">${app.kind === 'main' ? 'Main App' : 'Plugin App'}</p>
250
+ <h2 class="app-title">${escapeHtml(app.name)}</h2>
251
+ </div>
252
+ <div class="app-rank">
253
+ <span class="app-rank__label">热度</span>
254
+ <span class="app-rank__value" data-click-count>0</span>
255
+ </div>
256
+ </div>
257
+ <p class="app-desc">${escapeHtml(desc)}</p>
258
+ <div class="app-tags">${tags}</div>
259
+ <div class="app-card__bottom">
260
+ <span class="app-link">${escapeHtml(href)}</span>
261
+ <span class="app-action">进入</span>
262
+ </div>
263
+ </a>
264
+ `;
265
+ };
266
+ const renderEmptyHtml = () => {
267
+ return `
268
+ <div class="empty-state">
269
+ <p class="empty-state__title">当前没有可展示的应用。</p>
270
+ <p class="empty-state__desc">可能你并启动扩展,或选择的扩展并没有支持WEB应用</p>
271
+ </div>
272
+ `;
273
+ };
274
+ const renderLaunchpadScript = (apps) => {
275
+ const payload = JSON.stringify(apps.map(app => ({
276
+ id: app.name,
277
+ href: appHref(app),
278
+ kind: app.kind
279
+ })));
280
+ return `
281
+ (() => {
282
+ const storageKey = 'alemonjs:launchpad:clicks';
283
+ const apps = ${payload};
284
+ const grid = document.getElementById('app-grid');
285
+ if (!grid) return;
286
+
287
+ const readClicks = () => {
288
+ try {
289
+ return JSON.parse(localStorage.getItem(storageKey) || '{}');
290
+ } catch {
291
+ return {};
292
+ }
293
+ };
294
+
295
+ const writeClicks = (value) => {
296
+ localStorage.setItem(storageKey, JSON.stringify(value));
297
+ };
298
+
299
+ const scoreOf = (id, clicks) => Number(clicks[id] || 0);
300
+ const clicks = readClicks();
301
+ const cards = Array.from(grid.querySelectorAll('[data-app-id]'));
302
+
303
+ const refreshCounts = () => {
304
+ cards.forEach((card) => {
305
+ const id = card.getAttribute('data-app-id') || '';
306
+ const node = card.querySelector('[data-click-count]');
307
+ if (node) {
308
+ node.textContent = String(scoreOf(id, clicks));
309
+ }
310
+ });
311
+ };
312
+
313
+ const sortCards = () => {
314
+ cards
315
+ .sort((left, right) => {
316
+ const leftId = left.getAttribute('data-app-id') || '';
317
+ const rightId = right.getAttribute('data-app-id') || '';
318
+ const diff = scoreOf(rightId, clicks) - scoreOf(leftId, clicks);
319
+ if (diff !== 0) return diff;
320
+ return leftId.localeCompare(rightId);
321
+ })
322
+ .forEach(card => grid.appendChild(card));
323
+ };
324
+
325
+ cards.forEach((card) => {
326
+ card.addEventListener('click', () => {
327
+ const id = card.getAttribute('data-app-id') || '';
328
+ clicks[id] = scoreOf(id, clicks) + 1;
329
+ writeClicks(clicks);
330
+ refreshCounts();
331
+ sortCards();
332
+ });
333
+ });
334
+
335
+ refreshCounts();
336
+ sortCards();
337
+ })();
338
+ `;
339
+ };
340
+ class LaunchpadPage extends Component {
341
+ render() {
342
+ const visibleApps = this.props.apps
343
+ .filter(app => app.enabled && app.status === 'ready' && (app.capabilities.web || app.capabilities.httpApi))
344
+ .sort((left, right) => {
345
+ if (left.kind === 'main' && right.kind !== 'main') {
346
+ return -1;
347
+ }
348
+ if (left.kind !== 'main' && right.kind === 'main') {
349
+ return 1;
350
+ }
351
+ return left.name.localeCompare(right.name);
352
+ });
353
+ const cards = visibleApps.length ? visibleApps.map(renderCardHtml).join('') : renderEmptyHtml();
354
+ const script = renderLaunchpadScript(visibleApps);
355
+ return Html({ lang: 'zh-CN' }, Head(createElement('meta', { charset: 'utf-8' }), createElement('meta', { name: 'viewport', content: 'width=device-width, initial-scale=1, viewport-fit=cover' }), Title('ALemonJS 应用入口'), Style(styles)), Body(createElement('main', { className: 'page' }, createElement('section', { className: 'hero' }, P({ className: 'hero-kicker' }, 'ALemonJS Launchpad'), createElement('h1', { className: 'hero-title' }, '阿柠檬机器人'), P({ className: 'hero-desc' }, '这里会自动列出当前已准备好的主应用与插件。默认入口优先走静态页面,缺失时再回落到应用路由。'), Div({ className: 'hero-meta' }, createElement('span', { className: 'hero-pill' }, createElement('strong', null, String(visibleApps.length)), ' 个可访问入口'), createElement('span', { className: 'hero-pill' }, '主应用统一在 ', createElement('strong', null, '/app/')), createElement('span', { className: 'hero-pill' }, '插件统一在 ', createElement('strong', null, '/apps/<name>/')))), createElement('section', null, Div({ className: 'section-head' }, Div(null, createElement('h2', { className: 'section-title' }, '应用列表'), P({ className: 'section-note' }, '点击次数越高,卡片排序越靠前。'))), Div({ className: 'app-grid', id: 'app-grid', dangerouslySetInnerHTML: { __html: cards } }))), createElement('script', { dangerouslySetInnerHTML: { __html: script } })));
356
+ }
357
+ }
358
+ const renderHelloHtml = (apps) => {
359
+ return DOCTYPE + renderToString(createElement(LaunchpadPage, { apps }));
360
+ };
361
+ var hello_html = renderHelloHtml([]);
362
+
363
+ export { hello_html as default, renderHelloHtml };