jac-client 0.2.2__py3-none-any.whl → 0.2.6__py3-none-any.whl

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 (202) hide show
  1. jac_client/examples/all-in-one/assets/workers/worker.py +5 -0
  2. jac_client/examples/all-in-one/src/app.jac +841 -0
  3. jac_client/examples/all-in-one/{button.jac → src/button.jac} +1 -1
  4. jac_client/examples/all-in-one/{components → src/components}/button.jac +1 -1
  5. jac_client/examples/asset-serving/css-with-image/{app.jac → src/app.jac} +2 -2
  6. jac_client/examples/asset-serving/image-asset/{app.jac → src/app.jac} +2 -2
  7. jac_client/examples/asset-serving/import-alias/{app.jac → src/app.jac} +7 -7
  8. jac_client/examples/basic/{app.jac → src/app.jac} +2 -2
  9. jac_client/examples/basic-auth/src/app.jac +377 -0
  10. jac_client/examples/basic-auth-with-router/{app.jac → src/app.jac} +18 -18
  11. jac_client/examples/basic-full-stack/{app.jac → src/app.jac} +175 -130
  12. jac_client/examples/css-styling/js-styling/{app.jac → src/app.jac} +6 -6
  13. jac_client/examples/css-styling/material-ui/{app.jac → src/app.jac} +5 -5
  14. jac_client/examples/css-styling/pure-css/{app.jac → src/app.jac} +6 -6
  15. jac_client/examples/css-styling/sass-example/{app.jac → src/app.jac} +6 -6
  16. jac_client/examples/css-styling/styled-components/{app.jac → src/app.jac} +5 -5
  17. jac_client/examples/css-styling/tailwind-example/{app.jac → src/app.jac} +6 -6
  18. jac_client/examples/full-stack-with-auth/{app.jac → src/app.jac} +37 -37
  19. jac_client/examples/little-x/{app.jac → src/app.jac} +27 -32
  20. jac_client/examples/little-x/src/submit-button.jac +16 -0
  21. jac_client/examples/nested-folders/nested-advance/{ButtonRoot.jac → src/ButtonRoot.jac} +1 -1
  22. jac_client/examples/nested-folders/nested-advance/{app.jac → src/app.jac} +1 -1
  23. jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/ButtonSecondL.jac +1 -1
  24. jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/Card.jac +1 -1
  25. jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/level2/ButtonThirdL.jac +1 -1
  26. jac_client/examples/nested-folders/nested-basic/{app.jac → src/app.jac} +2 -2
  27. jac_client/examples/nested-folders/nested-basic/{button.jac → src/button.jac} +1 -1
  28. jac_client/examples/nested-folders/nested-basic/{components → src/components}/button.jac +1 -1
  29. jac_client/examples/ts-support/src/app.jac +35 -0
  30. jac_client/examples/with-router/{app.jac → src/app.jac} +11 -11
  31. jac_client/plugin/cli.jac +547 -0
  32. jac_client/plugin/client.jac +52 -0
  33. jac_client/plugin/client_runtime.cl.jac +38 -0
  34. jac_client/plugin/impl/client.impl.jac +134 -0
  35. jac_client/plugin/impl/client_runtime.impl.jac +177 -0
  36. jac_client/plugin/impl/vite_client_bundle.impl.jac +72 -0
  37. jac_client/plugin/plugin_config.jac +195 -0
  38. jac_client/plugin/src/__init__.jac +20 -0
  39. jac_client/plugin/src/asset_processor.jac +33 -0
  40. jac_client/plugin/src/babel_processor.jac +18 -0
  41. jac_client/plugin/src/compiler.jac +66 -0
  42. jac_client/plugin/src/config_loader.jac +32 -0
  43. jac_client/plugin/src/impl/asset_processor.impl.jac +127 -0
  44. jac_client/plugin/src/impl/babel_processor.impl.jac +84 -0
  45. jac_client/plugin/src/impl/compiler.impl.jac +251 -0
  46. jac_client/plugin/src/impl/config_loader.impl.jac +119 -0
  47. jac_client/plugin/src/impl/import_processor.impl.jac +33 -0
  48. jac_client/plugin/src/impl/jac_to_js.impl.jac +41 -0
  49. jac_client/plugin/src/impl/package_installer.impl.jac +105 -0
  50. jac_client/plugin/src/impl/vite_bundler.impl.jac +513 -0
  51. jac_client/plugin/src/import_processor.jac +19 -0
  52. jac_client/plugin/src/jac_to_js.jac +35 -0
  53. jac_client/plugin/src/package_installer.jac +26 -0
  54. jac_client/plugin/src/vite_bundler.jac +36 -0
  55. jac_client/plugin/vite_client_bundle.jac +31 -0
  56. jac_client/tests/conftest.py +281 -0
  57. jac_client/tests/fixtures/basic-app/app.jac +2 -2
  58. jac_client/tests/fixtures/cl_file/app.cl.jac +2 -2
  59. jac_client/tests/fixtures/client_app_with_antd/app.jac +1 -1
  60. jac_client/tests/fixtures/js_import/app.jac +5 -5
  61. jac_client/tests/fixtures/spawn_test/app.jac +7 -7
  62. jac_client/tests/fixtures/with-ts/app.jac +35 -0
  63. jac_client/tests/test_cli.py +755 -0
  64. jac_client/tests/test_it.py +347 -67
  65. {jac_client-0.2.2.dist-info → jac_client-0.2.6.dist-info}/METADATA +30 -24
  66. jac_client-0.2.6.dist-info/RECORD +74 -0
  67. {jac_client-0.2.2.dist-info → jac_client-0.2.6.dist-info}/WHEEL +2 -1
  68. jac_client-0.2.6.dist-info/entry_points.txt +4 -0
  69. jac_client-0.2.6.dist-info/top_level.txt +1 -0
  70. jac_client/docs/README.md +0 -689
  71. jac_client/docs/advanced-state.md +0 -1265
  72. jac_client/docs/asset-serving/intro.md +0 -209
  73. jac_client/docs/assets/pipe_line-v2.svg +0 -32
  74. jac_client/docs/assets/pipe_line.png +0 -0
  75. jac_client/docs/file-system/app.jac.md +0 -121
  76. jac_client/docs/file-system/backend-frontend.md +0 -217
  77. jac_client/docs/file-system/intro.md +0 -72
  78. jac_client/docs/file-system/nested-imports.md +0 -348
  79. jac_client/docs/guide-example/intro.md +0 -115
  80. jac_client/docs/guide-example/step-01-setup.md +0 -270
  81. jac_client/docs/guide-example/step-02-components.md +0 -416
  82. jac_client/docs/guide-example/step-03-styling.md +0 -478
  83. jac_client/docs/guide-example/step-04-todo-ui.md +0 -477
  84. jac_client/docs/guide-example/step-05-local-state.md +0 -530
  85. jac_client/docs/guide-example/step-06-events.md +0 -749
  86. jac_client/docs/guide-example/step-07-effects.md +0 -468
  87. jac_client/docs/guide-example/step-08-walkers.md +0 -534
  88. jac_client/docs/guide-example/step-09-authentication.md +0 -586
  89. jac_client/docs/guide-example/step-10-routing.md +0 -539
  90. jac_client/docs/guide-example/step-11-final.md +0 -963
  91. jac_client/docs/imports.md +0 -1141
  92. jac_client/docs/lifecycle-hooks.md +0 -773
  93. jac_client/docs/routing.md +0 -659
  94. jac_client/docs/styling/intro.md +0 -249
  95. jac_client/docs/styling/js-styling.md +0 -367
  96. jac_client/docs/styling/material-ui.md +0 -341
  97. jac_client/docs/styling/pure-css.md +0 -299
  98. jac_client/docs/styling/sass.md +0 -403
  99. jac_client/docs/styling/styled-components.md +0 -395
  100. jac_client/docs/styling/tailwind.md +0 -298
  101. jac_client/examples/all-in-one/.babelrc +0 -9
  102. jac_client/examples/all-in-one/README.md +0 -16
  103. jac_client/examples/all-in-one/app.jac +0 -426
  104. jac_client/examples/all-in-one/assets/burger.png +0 -0
  105. jac_client/examples/all-in-one/package.json +0 -29
  106. jac_client/examples/all-in-one/styles.css +0 -26
  107. jac_client/examples/all-in-one/vite.config.js +0 -28
  108. jac_client/examples/asset-serving/css-with-image/.babelrc +0 -9
  109. jac_client/examples/asset-serving/css-with-image/README.md +0 -91
  110. jac_client/examples/asset-serving/css-with-image/assets/burger.png +0 -0
  111. jac_client/examples/asset-serving/css-with-image/package.json +0 -28
  112. jac_client/examples/asset-serving/css-with-image/styles.css +0 -26
  113. jac_client/examples/asset-serving/css-with-image/vite.config.js +0 -28
  114. jac_client/examples/asset-serving/image-asset/.babelrc +0 -9
  115. jac_client/examples/asset-serving/image-asset/README.md +0 -119
  116. jac_client/examples/asset-serving/image-asset/assets/burger.png +0 -0
  117. jac_client/examples/asset-serving/image-asset/package.json +0 -28
  118. jac_client/examples/asset-serving/image-asset/styles.css +0 -26
  119. jac_client/examples/asset-serving/image-asset/vite.config.js +0 -28
  120. jac_client/examples/asset-serving/import-alias/.babelrc +0 -9
  121. jac_client/examples/asset-serving/import-alias/README.md +0 -83
  122. jac_client/examples/asset-serving/import-alias/assets/burger.png +0 -0
  123. jac_client/examples/asset-serving/import-alias/package.json +0 -28
  124. jac_client/examples/asset-serving/import-alias/vite.config.js +0 -28
  125. jac_client/examples/basic/.babelrc +0 -9
  126. jac_client/examples/basic/README.md +0 -16
  127. jac_client/examples/basic/package.json +0 -27
  128. jac_client/examples/basic/vite.config.js +0 -27
  129. jac_client/examples/basic-auth/.babelrc +0 -9
  130. jac_client/examples/basic-auth/README.md +0 -16
  131. jac_client/examples/basic-auth/app.jac +0 -308
  132. jac_client/examples/basic-auth/package.json +0 -27
  133. jac_client/examples/basic-auth/vite.config.js +0 -27
  134. jac_client/examples/basic-auth-with-router/.babelrc +0 -9
  135. jac_client/examples/basic-auth-with-router/README.md +0 -60
  136. jac_client/examples/basic-auth-with-router/package.json +0 -28
  137. jac_client/examples/basic-auth-with-router/vite.config.js +0 -27
  138. jac_client/examples/basic-full-stack/.babelrc +0 -9
  139. jac_client/examples/basic-full-stack/README.md +0 -18
  140. jac_client/examples/basic-full-stack/package.json +0 -28
  141. jac_client/examples/basic-full-stack/vite.config.js +0 -27
  142. jac_client/examples/css-styling/js-styling/.babelrc +0 -9
  143. jac_client/examples/css-styling/js-styling/README.md +0 -183
  144. jac_client/examples/css-styling/js-styling/package.json +0 -28
  145. jac_client/examples/css-styling/js-styling/styles.js +0 -100
  146. jac_client/examples/css-styling/js-styling/vite.config.js +0 -27
  147. jac_client/examples/css-styling/material-ui/.babelrc +0 -9
  148. jac_client/examples/css-styling/material-ui/README.md +0 -16
  149. jac_client/examples/css-styling/material-ui/package.json +0 -32
  150. jac_client/examples/css-styling/material-ui/vite.config.js +0 -27
  151. jac_client/examples/css-styling/pure-css/.babelrc +0 -9
  152. jac_client/examples/css-styling/pure-css/README.md +0 -16
  153. jac_client/examples/css-styling/pure-css/package.json +0 -28
  154. jac_client/examples/css-styling/pure-css/styles.css +0 -111
  155. jac_client/examples/css-styling/pure-css/vite.config.js +0 -27
  156. jac_client/examples/css-styling/sass-example/.babelrc +0 -9
  157. jac_client/examples/css-styling/sass-example/README.md +0 -16
  158. jac_client/examples/css-styling/sass-example/package.json +0 -29
  159. jac_client/examples/css-styling/sass-example/styles.scss +0 -153
  160. jac_client/examples/css-styling/sass-example/vite.config.js +0 -27
  161. jac_client/examples/css-styling/styled-components/.babelrc +0 -9
  162. jac_client/examples/css-styling/styled-components/README.md +0 -16
  163. jac_client/examples/css-styling/styled-components/package.json +0 -29
  164. jac_client/examples/css-styling/styled-components/styled.js +0 -90
  165. jac_client/examples/css-styling/styled-components/vite.config.js +0 -27
  166. jac_client/examples/css-styling/tailwind-example/.babelrc +0 -9
  167. jac_client/examples/css-styling/tailwind-example/README.md +0 -16
  168. jac_client/examples/css-styling/tailwind-example/global.css +0 -1
  169. jac_client/examples/css-styling/tailwind-example/package.json +0 -30
  170. jac_client/examples/css-styling/tailwind-example/vite.config.js +0 -29
  171. jac_client/examples/full-stack-with-auth/.babelrc +0 -9
  172. jac_client/examples/full-stack-with-auth/README.md +0 -16
  173. jac_client/examples/full-stack-with-auth/package.json +0 -28
  174. jac_client/examples/full-stack-with-auth/vite.config.js +0 -29
  175. jac_client/examples/little-x/package.json +0 -23
  176. jac_client/examples/little-x/submit-button.jac +0 -8
  177. jac_client/examples/nested-folders/nested-advance/.babelrc +0 -9
  178. jac_client/examples/nested-folders/nested-advance/README.md +0 -77
  179. jac_client/examples/nested-folders/nested-advance/package.json +0 -29
  180. jac_client/examples/nested-folders/nested-advance/vite.config.js +0 -28
  181. jac_client/examples/nested-folders/nested-basic/.babelrc +0 -9
  182. jac_client/examples/nested-folders/nested-basic/README.md +0 -183
  183. jac_client/examples/nested-folders/nested-basic/app.js +0 -7
  184. jac_client/examples/nested-folders/nested-basic/package.json +0 -28
  185. jac_client/examples/nested-folders/nested-basic/vite.config.js +0 -27
  186. jac_client/examples/with-router/.babelrc +0 -9
  187. jac_client/examples/with-router/README.md +0 -17
  188. jac_client/examples/with-router/package.json +0 -28
  189. jac_client/examples/with-router/vite.config.js +0 -27
  190. jac_client/plugin/cli.py +0 -244
  191. jac_client/plugin/client.py +0 -152
  192. jac_client/plugin/client_runtime.jac +0 -234
  193. jac_client/plugin/vite_client_bundle.py +0 -503
  194. jac_client/tests/fixtures/js_import/utils.js +0 -21
  195. jac_client/tests/fixtures/package-lock.json +0 -329
  196. jac_client/tests/fixtures/package.json +0 -11
  197. jac_client/tests/test_asset_examples.py +0 -322
  198. jac_client/tests/test_cl.py +0 -530
  199. jac_client/tests/test_create_jac_app.py +0 -131
  200. jac_client/tests/test_nested_file.py +0 -374
  201. jac_client-0.2.2.dist-info/RECORD +0 -171
  202. jac_client-0.2.2.dist-info/entry_points.txt +0 -4
@@ -1,6 +1,6 @@
1
1
  cl import from antd { Button }
2
2
 
3
- cl def CustomButtonRoot() -> any {
3
+ cl def:pub CustomButtonRoot -> any {
4
4
  return <Button>
5
5
  Root Button
6
6
  </Button>;
@@ -1,6 +1,6 @@
1
1
  cl import from antd { Button }
2
2
 
3
- cl def CustomButton() -> any {
3
+ cl def:pub CustomButton -> any {
4
4
  return <Button>
5
5
  Nested Button
6
6
  </Button>;
@@ -3,8 +3,8 @@ cl import from react { useState, useEffect }
3
3
  cl import ".styles.css";
4
4
 
5
5
  cl {
6
- def app() -> any {
7
- let [count, setCount] = useState(0);
6
+ def:pub app -> any {
7
+ [count, setCount] = useState(0);
8
8
  useEffect(lambda -> None{ console.log("Count: ", count);} , [count]);
9
9
  return <div
10
10
  style={{
@@ -2,8 +2,8 @@
2
2
  cl import from react { useState, useEffect }
3
3
 
4
4
  cl {
5
- def app() -> any {
6
- let [count, setCount] = useState(0);
5
+ def:pub app -> any {
6
+ [count, setCount] = useState(0);
7
7
  useEffect(lambda -> None{ console.log("Count: ", count);} , [count]);
8
8
  return <div
9
9
  style={{
@@ -6,8 +6,8 @@ cl import from "@jac-client/assets/burger.png" {
6
6
  }
7
7
 
8
8
  cl {
9
- def app() -> any {
10
- let [count, setCount] = useState(0);
9
+ def:pub app -> any {
10
+ [count, setCount] = useState(0);
11
11
  useEffect(lambda -> None{ console.log("Count: ", count);} , [count]);
12
12
  return <div
13
13
  style={{
@@ -26,7 +26,7 @@ cl {
26
26
  <code>
27
27
  @jac-client/assets
28
28
  </code>
29
- alias to import assets
29
+ alias to import assets
30
30
  </p>
31
31
  <img
32
32
  src={burgerImage}
@@ -46,7 +46,7 @@ cl {
46
46
  <strong>
47
47
  {count}
48
48
  </strong>
49
- times!
49
+ times!
50
50
  </p>
51
51
  <button
52
52
  onClick={lambda e: any -> None{ setCount(count + 1);} }
@@ -95,11 +95,11 @@ cl {
95
95
  <code>
96
96
  assets/
97
97
  </code>
98
- to
98
+ to
99
99
  <code>
100
- src/assets/
100
+ compiled/assets/
101
101
  </code>
102
- during build
102
+ during build
103
103
  </li>
104
104
  <li>
105
105
  Automatic hash generation for cache busting
@@ -1,8 +1,8 @@
1
1
  # Pages
2
2
  cl import from react { useState, useEffect }
3
3
  cl {
4
- def app() -> any {
5
- let [count, setCount] = useState(0);
4
+ def:pub app -> any {
5
+ [count, setCount] = useState(0);
6
6
  useEffect(lambda -> None{ console.log("Count: ", count);} , [count]);
7
7
  return <div>
8
8
  <h1>
@@ -0,0 +1,377 @@
1
+ # Simple Authentication App with Jac Client Utils
2
+ cl import from react {
3
+ useState,
4
+ useEffect
5
+ }
6
+ cl import from '@jac-client/utils' { jacSignup, jacLogin, jacLogout, jacIsLoggedIn }
7
+
8
+ cl {
9
+ def:pub app -> any {
10
+ [isLoggedIn, setIsLoggedIn] = useState(False);
11
+ [isSignup, setIsSignup] = useState(False);
12
+ [username, setUsername] = useState("");
13
+ [password, setPassword] = useState("");
14
+ [error, setError] = useState("");
15
+ [loading, setLoading] = useState(False);
16
+
17
+ # Check login status on mount
18
+ useEffect(lambda -> None{ setIsLoggedIn(jacIsLoggedIn());} , []);
19
+
20
+ # Handle login
21
+ async def handleLogin -> None {
22
+ setError("");
23
+ if not username.trim() or not password {
24
+ setError("Please fill in all fields");
25
+ return;
26
+ }
27
+ setLoading(True);
28
+ success = await jacLogin(username, password);
29
+ setLoading(False);
30
+ if success {
31
+ setIsLoggedIn(True);
32
+ setUsername("");
33
+ setPassword("");
34
+ } else {
35
+ setError("Invalid username or password");
36
+ }
37
+ }
38
+
39
+ # Handle signup
40
+ async def handleSignup -> None {
41
+ setError("");
42
+ if not username.trim() or not password {
43
+ setError("Please fill in all fields");
44
+ return;
45
+ }
46
+ if password.length < 6 {
47
+ setError("Password must be at least 6 characters");
48
+ return;
49
+ }
50
+ setLoading(True);
51
+ result = await jacSignup(username, password);
52
+ setLoading(False);
53
+ if result["success"] {
54
+ setIsLoggedIn(True);
55
+ setUsername("");
56
+ setPassword("");
57
+ } else {
58
+ setError(result["error"] if result["error"] else "Signup failed");
59
+ }
60
+ }
61
+
62
+ # Handle logout
63
+ def handleLogout -> None {
64
+ jacLogout();
65
+ setIsLoggedIn(False);
66
+ setUsername("");
67
+ setPassword("");
68
+ setError("");
69
+ }
70
+
71
+ # Handle form submit
72
+ async def handleSubmit(e: any) -> None {
73
+ e.preventDefault();
74
+ if isSignup {
75
+ await handleSignup();
76
+ } else {
77
+ await handleLogin();
78
+ }
79
+ }
80
+
81
+ # Logged in view - Dashboard
82
+ if isLoggedIn {
83
+ return <div
84
+ style={{
85
+ "minHeight": "100vh",
86
+ "background": "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
87
+ "display": "flex",
88
+ "alignItems": "center",
89
+ "justifyContent": "center",
90
+ "fontFamily": "system-ui, -apple-system, sans-serif"
91
+ }}
92
+ >
93
+ <div
94
+ style={{
95
+ "background": "#ffffff",
96
+ "borderRadius": "16px",
97
+ "padding": "48px",
98
+ "boxShadow": "0 20px 60px rgba(0,0,0,0.3)",
99
+ "maxWidth": "500px",
100
+ "width": "90%",
101
+ "textAlign": "center"
102
+ }}
103
+ >
104
+ <h1
105
+ style={{
106
+ "fontSize": "2.5rem",
107
+ "marginBottom": "16px",
108
+ "color": "#1f2937",
109
+ "fontWeight": "700"
110
+ }}
111
+ >
112
+ ✅ Welcome!
113
+ </h1>
114
+ <p
115
+ style={{
116
+ "fontSize": "1.1rem",
117
+ "color": "#6b7280",
118
+ "marginBottom": "32px"
119
+ }}
120
+ >
121
+ You are successfully logged in
122
+ </p>
123
+ <div
124
+ style={{
125
+ "background": "#f3f4f6",
126
+ "padding": "24px",
127
+ "borderRadius": "12px",
128
+ "marginBottom": "32px"
129
+ }}
130
+ >
131
+ <p
132
+ style={{
133
+ "fontSize": "0.9rem",
134
+ "color": "#6b7280",
135
+ "marginBottom": "8px"
136
+ }}
137
+ >
138
+ Logged in as:
139
+ </p>
140
+ <p
141
+ style={{
142
+ "fontSize": "1.2rem",
143
+ "fontWeight": "600",
144
+ "color": "#667eea"
145
+ }}
146
+ >
147
+ User
148
+ </p>
149
+ </div>
150
+ <button
151
+ onClick={handleLogout}
152
+ style={{
153
+ "width": "100%",
154
+ "padding": "14px 24px",
155
+ "background": "#ef4444",
156
+ "color": "#ffffff",
157
+ "border": "none",
158
+ "borderRadius": "10px",
159
+ "fontSize": "16px",
160
+ "fontWeight": "600",
161
+ "cursor": "pointer",
162
+ "transition": "all 0.3s",
163
+ "boxShadow": "0 4px 12px rgba(239,68,68,0.3)"
164
+ }}
165
+ >
166
+ Logout
167
+ </button>
168
+ </div>
169
+ </div>;
170
+ }
171
+
172
+ # Login/Signup view
173
+ return <div
174
+ style={{
175
+ "minHeight": "100vh",
176
+ "background": "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
177
+ "display": "flex",
178
+ "alignItems": "center",
179
+ "justifyContent": "center",
180
+ "fontFamily": "system-ui, -apple-system, sans-serif",
181
+ "padding": "20px"
182
+ }}
183
+ >
184
+ <div
185
+ style={{
186
+ "background": "#ffffff",
187
+ "borderRadius": "16px",
188
+ "padding": "48px",
189
+ "boxShadow": "0 20px 60px rgba(0,0,0,0.3)",
190
+ "maxWidth": "400px",
191
+ "width": "100%"
192
+ }}
193
+ >
194
+ # Header
195
+ <div
196
+ style={{"textAlign": "center", "marginBottom": "32px"}}
197
+ >
198
+ <h1
199
+ style={{
200
+ "fontSize": "2rem",
201
+ "fontWeight": "700",
202
+ "color": "#1f2937",
203
+ "marginBottom": "8px"
204
+ }}
205
+ >
206
+ {("Create Account" if isSignup else "Welcome Back")}
207
+ </h1>
208
+ <p
209
+ style={{"color": "#6b7280", "fontSize": "0.95rem"}}
210
+ >
211
+ {(
212
+ "Sign up to get started"
213
+ if isSignup
214
+ else "Sign in to continue"
215
+ )}
216
+ </p>
217
+ </div>
218
+ # Form
219
+ <form
220
+ onSubmit={handleSubmit}
221
+ style={{"marginBottom": "24px"}}
222
+ >
223
+ <div
224
+ style={{"marginBottom": "20px"}}
225
+ >
226
+ <label
227
+ style={{
228
+ "display": "block",
229
+ "marginBottom": "8px",
230
+ "color": "#374151",
231
+ "fontSize": "14px",
232
+ "fontWeight": "600"
233
+ }}
234
+ >
235
+ Username
236
+ </label>
237
+ <input
238
+ type="text"
239
+ value={username}
240
+ onChange={lambda e: any -> None{ setUsername(
241
+ e.target.value
242
+ );} }
243
+ placeholder="Enter your username"
244
+ style={{
245
+ "width": "100%",
246
+ "padding": "12px 16px",
247
+ "border": "2px solid #e5e7eb",
248
+ "borderRadius": "10px",
249
+ "fontSize": "16px",
250
+ "outline": "none",
251
+ "transition": "border 0.2s",
252
+ "boxSizing": "border-box"
253
+ }}
254
+ />
255
+ </div>
256
+ <div
257
+ style={{"marginBottom": "24px"}}
258
+ >
259
+ <label
260
+ style={{
261
+ "display": "block",
262
+ "marginBottom": "8px",
263
+ "color": "#374151",
264
+ "fontSize": "14px",
265
+ "fontWeight": "600"
266
+ }}
267
+ >
268
+ Password
269
+ </label>
270
+ <input
271
+ type="password"
272
+ value={password}
273
+ onChange={lambda e: any -> None{ setPassword(
274
+ e.target.value
275
+ );} }
276
+ placeholder="Enter your password"
277
+ style={{
278
+ "width": "100%",
279
+ "padding": "12px 16px",
280
+ "border": "2px solid #e5e7eb",
281
+ "borderRadius": "10px",
282
+ "fontSize": "16px",
283
+ "outline": "none",
284
+ "transition": "border 0.2s",
285
+ "boxSizing": "border-box"
286
+ }}
287
+ />
288
+ </div>
289
+ {(
290
+ <div
291
+ style={{
292
+ "padding": "12px",
293
+ "background": "#fee2e2",
294
+ "border": "1px solid #fecaca",
295
+ "borderRadius": "8px",
296
+ "marginBottom": "20px"
297
+ }}
298
+ >
299
+ <p
300
+ style={{
301
+ "color": "#dc2626",
302
+ "fontSize": "14px",
303
+ "margin": "0"
304
+ }}
305
+ >
306
+ {error}
307
+ </p>
308
+ </div>
309
+ )
310
+ if error
311
+ else None}
312
+ <button
313
+ type="submit"
314
+ disabled={loading}
315
+ style={{
316
+ "width": "100%",
317
+ "padding": "14px 24px",
318
+ "background": (("#9ca3af" if loading else "#667eea")),
319
+ "color": "#ffffff",
320
+ "border": "none",
321
+ "borderRadius": "10px",
322
+ "fontSize": "16px",
323
+ "fontWeight": "600",
324
+ "cursor": (("not-allowed" if loading else "pointer")),
325
+ "transition": "all 0.3s",
326
+ "boxShadow": "0 4px 12px rgba(102,126,234,0.4)"
327
+ }}
328
+ >
329
+ {(
330
+ (
331
+ "Processing..."
332
+ if loading
333
+ else ("Sign Up" if isSignup else "Sign In")
334
+ )
335
+ )}
336
+ </button>
337
+ </form>
338
+ # Toggle between login/signup
339
+ <div
340
+ style={{"textAlign": "center"}}
341
+ >
342
+ <p
343
+ style={{
344
+ "color": "#6b7280",
345
+ "fontSize": "14px",
346
+ "marginBottom": "8px"
347
+ }}
348
+ >
349
+ {(
350
+ (
351
+ "Already have an account?"
352
+ if isSignup
353
+ else "Don't have an account?"
354
+ )
355
+ )}
356
+ </p>
357
+ <button
358
+ onClick={lambda -> None{ setIsSignup(not isSignup);setError(
359
+ ""
360
+ );setUsername("");setPassword("");} }
361
+ style={{
362
+ "background": "none",
363
+ "border": "none",
364
+ "color": "#667eea",
365
+ "fontSize": "14px",
366
+ "fontWeight": "600",
367
+ "cursor": "pointer",
368
+ "textDecoration": "underline"
369
+ }}
370
+ >
371
+ {(("Sign In" if isSignup else "Create Account"))}
372
+ </button>
373
+ </div>
374
+ </div>
375
+ </div>;
376
+ }
377
+ }
@@ -19,9 +19,9 @@ cl import from "@jac-client/utils" {
19
19
 
20
20
  cl {
21
21
  # Navigation Component
22
- def Navigation() -> any {
23
- let isLoggedIn = jacIsLoggedIn();
24
- let navigate = useNavigate();
22
+ def Navigation -> any {
23
+ isLoggedIn = jacIsLoggedIn();
24
+ navigate = useNavigate();
25
25
 
26
26
  def handleLogout(e: any) -> None {
27
27
  e.preventDefault();
@@ -108,11 +108,11 @@ cl {
108
108
  }
109
109
 
110
110
  # Login Page
111
- def LoginPage() -> any {
112
- let [username, setUsername] = useState("");
113
- let [password, setPassword] = useState("");
114
- let [error, setError] = useState("");
115
- let navigate = useNavigate();
111
+ def LoginPage -> any {
112
+ [username, setUsername] = useState("");
113
+ [password, setPassword] = useState("");
114
+ [error, setError] = useState("");
115
+ navigate = useNavigate();
116
116
 
117
117
  async def handleLogin(e: any) -> None {
118
118
  e.preventDefault();
@@ -137,7 +137,7 @@ cl {
137
137
  setPassword(e.target.value);
138
138
  }
139
139
 
140
- let errorDisplay = None;
140
+ errorDisplay = None;
141
141
  if error {
142
142
  errorDisplay = <div
143
143
  style={{"color": "#dc2626", "fontSize": "14px", "marginBottom": "12px"}}
@@ -234,11 +234,11 @@ cl {
234
234
  }
235
235
 
236
236
  # Signup Page
237
- def SignupPage() -> any {
238
- let [username, setUsername] = useState("");
239
- let [password, setPassword] = useState("");
240
- let [error, setError] = useState("");
241
- let navigate = useNavigate();
237
+ def SignupPage -> any {
238
+ [username, setUsername] = useState("");
239
+ [password, setPassword] = useState("");
240
+ [error, setError] = useState("");
241
+ navigate = useNavigate();
242
242
 
243
243
  async def handleSignup(e: any) -> None {
244
244
  e.preventDefault();
@@ -263,7 +263,7 @@ cl {
263
263
  setPassword(e.target.value);
264
264
  }
265
265
 
266
- let errorDisplay = None;
266
+ errorDisplay = None;
267
267
  if error {
268
268
  errorDisplay = <div
269
269
  style={{"color": "#dc2626", "fontSize": "14px", "marginBottom": "12px"}}
@@ -360,7 +360,7 @@ cl {
360
360
  }
361
361
 
362
362
  # Dashboard Page (Protected Route)
363
- def DashboardPage() -> any {
363
+ def DashboardPage -> any {
364
364
  # Check if user is logged in, redirect if not
365
365
  if not jacIsLoggedIn() {
366
366
  return <Navigate to="/login" />;
@@ -423,7 +423,7 @@ cl {
423
423
  }
424
424
 
425
425
  # Home/Landing Page - auto-redirect based on auth status
426
- def HomePage() -> any {
426
+ def HomePage -> any {
427
427
  if jacIsLoggedIn() {
428
428
  return <Navigate to="/dashboard" />;
429
429
  }
@@ -431,7 +431,7 @@ cl {
431
431
  }
432
432
 
433
433
  # Main App with React Router
434
- def app() -> any {
434
+ def:pub app -> any {
435
435
  return <Router>
436
436
  <div
437
437
  style={{