jac-client 0.2.0__py3-none-any.whl → 0.2.3__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 (154) hide show
  1. jac_client/docs/README.md +50 -20
  2. jac_client/docs/advanced-state.md +13 -14
  3. jac_client/docs/asset-serving/intro.md +209 -0
  4. jac_client/docs/assets/pipe_line-v2.svg +32 -0
  5. jac_client/docs/file-system/app.jac.md +121 -0
  6. jac_client/docs/file-system/backend-frontend.md +217 -0
  7. jac_client/docs/file-system/intro.md +72 -0
  8. jac_client/docs/file-system/nested-imports.md +348 -0
  9. jac_client/docs/guide-example/intro.md +11 -13
  10. jac_client/docs/guide-example/step-01-setup.md +30 -20
  11. jac_client/docs/guide-example/step-02-components.md +24 -24
  12. jac_client/docs/guide-example/step-03-styling.md +24 -24
  13. jac_client/docs/guide-example/step-04-todo-ui.md +17 -17
  14. jac_client/docs/guide-example/step-05-local-state.md +23 -23
  15. jac_client/docs/guide-example/step-06-events.md +23 -24
  16. jac_client/docs/guide-example/step-07-effects.md +27 -28
  17. jac_client/docs/guide-example/step-08-walkers.md +23 -23
  18. jac_client/docs/guide-example/step-09-authentication.md +18 -18
  19. jac_client/docs/guide-example/step-10-routing.md +20 -21
  20. jac_client/docs/guide-example/step-11-final.md +34 -35
  21. jac_client/docs/imports.md +4 -5
  22. jac_client/docs/lifecycle-hooks.md +12 -13
  23. jac_client/docs/routing.md +21 -22
  24. jac_client/docs/styling/intro.md +249 -0
  25. jac_client/docs/styling/js-styling.md +367 -0
  26. jac_client/docs/styling/material-ui.md +341 -0
  27. jac_client/docs/styling/pure-css.md +299 -0
  28. jac_client/docs/styling/sass.md +403 -0
  29. jac_client/docs/styling/styled-components.md +395 -0
  30. jac_client/docs/styling/tailwind.md +298 -0
  31. jac_client/examples/all-in-one/.babelrc +9 -0
  32. jac_client/examples/all-in-one/README.md +16 -0
  33. jac_client/examples/all-in-one/app.jac +426 -0
  34. jac_client/examples/all-in-one/assets/burger.png +0 -0
  35. jac_client/examples/all-in-one/button.jac +7 -0
  36. jac_client/examples/all-in-one/components/button.jac +7 -0
  37. jac_client/examples/all-in-one/package.json +29 -0
  38. jac_client/examples/all-in-one/styles.css +26 -0
  39. jac_client/examples/all-in-one/vite.config.js +28 -0
  40. jac_client/examples/asset-serving/css-with-image/.babelrc +9 -0
  41. jac_client/examples/asset-serving/css-with-image/README.md +91 -0
  42. jac_client/examples/asset-serving/css-with-image/app.jac +88 -0
  43. jac_client/examples/asset-serving/css-with-image/assets/burger.png +0 -0
  44. jac_client/examples/asset-serving/css-with-image/package.json +28 -0
  45. jac_client/examples/asset-serving/css-with-image/styles.css +26 -0
  46. jac_client/examples/asset-serving/css-with-image/vite.config.js +28 -0
  47. jac_client/examples/asset-serving/image-asset/.babelrc +9 -0
  48. jac_client/examples/asset-serving/image-asset/README.md +119 -0
  49. jac_client/examples/asset-serving/image-asset/app.jac +55 -0
  50. jac_client/examples/asset-serving/image-asset/assets/burger.png +0 -0
  51. jac_client/examples/asset-serving/image-asset/package.json +28 -0
  52. jac_client/examples/asset-serving/image-asset/styles.css +26 -0
  53. jac_client/examples/asset-serving/image-asset/vite.config.js +28 -0
  54. jac_client/examples/asset-serving/import-alias/.babelrc +9 -0
  55. jac_client/examples/asset-serving/import-alias/README.md +83 -0
  56. jac_client/examples/asset-serving/import-alias/app.jac +111 -0
  57. jac_client/examples/asset-serving/import-alias/assets/burger.png +0 -0
  58. jac_client/examples/asset-serving/import-alias/package.json +28 -0
  59. jac_client/examples/asset-serving/import-alias/vite.config.js +28 -0
  60. jac_client/examples/basic/app.jac +14 -9
  61. jac_client/examples/basic/package.json +1 -1
  62. jac_client/examples/basic/vite.config.js +0 -1
  63. jac_client/examples/basic-auth/package.json +1 -1
  64. jac_client/examples/basic-auth/vite.config.js +0 -1
  65. jac_client/examples/basic-auth-with-router/package.json +1 -1
  66. jac_client/examples/basic-auth-with-router/vite.config.js +0 -1
  67. jac_client/examples/basic-full-stack/package.json +1 -1
  68. jac_client/examples/basic-full-stack/vite.config.js +0 -1
  69. jac_client/examples/css-styling/js-styling/.babelrc +9 -0
  70. jac_client/examples/css-styling/js-styling/README.md +183 -0
  71. jac_client/examples/css-styling/js-styling/app.jac +84 -0
  72. jac_client/examples/css-styling/js-styling/package.json +28 -0
  73. jac_client/examples/css-styling/js-styling/styles.js +100 -0
  74. jac_client/examples/css-styling/js-styling/vite.config.js +27 -0
  75. jac_client/examples/css-styling/material-ui/.babelrc +9 -0
  76. jac_client/examples/css-styling/material-ui/README.md +16 -0
  77. jac_client/examples/css-styling/material-ui/app.jac +122 -0
  78. jac_client/examples/css-styling/material-ui/package.json +32 -0
  79. jac_client/examples/css-styling/material-ui/vite.config.js +27 -0
  80. jac_client/examples/css-styling/pure-css/.babelrc +9 -0
  81. jac_client/examples/css-styling/pure-css/README.md +16 -0
  82. jac_client/examples/css-styling/pure-css/app.jac +64 -0
  83. jac_client/examples/css-styling/pure-css/package.json +28 -0
  84. jac_client/examples/css-styling/pure-css/styles.css +111 -0
  85. jac_client/examples/css-styling/pure-css/vite.config.js +27 -0
  86. jac_client/examples/css-styling/sass-example/.babelrc +9 -0
  87. jac_client/examples/css-styling/sass-example/README.md +16 -0
  88. jac_client/examples/css-styling/sass-example/app.jac +64 -0
  89. jac_client/examples/css-styling/sass-example/package.json +29 -0
  90. jac_client/examples/css-styling/sass-example/styles.scss +153 -0
  91. jac_client/examples/css-styling/sass-example/vite.config.js +27 -0
  92. jac_client/examples/css-styling/styled-components/.babelrc +9 -0
  93. jac_client/examples/css-styling/styled-components/README.md +16 -0
  94. jac_client/examples/css-styling/styled-components/app.jac +71 -0
  95. jac_client/examples/css-styling/styled-components/package.json +29 -0
  96. jac_client/examples/css-styling/styled-components/styled.js +90 -0
  97. jac_client/examples/css-styling/styled-components/vite.config.js +27 -0
  98. jac_client/examples/css-styling/tailwind-example/.babelrc +9 -0
  99. jac_client/examples/css-styling/tailwind-example/README.md +16 -0
  100. jac_client/examples/css-styling/tailwind-example/app.jac +63 -0
  101. jac_client/examples/css-styling/tailwind-example/global.css +1 -0
  102. jac_client/examples/css-styling/tailwind-example/package.json +30 -0
  103. jac_client/examples/css-styling/tailwind-example/vite.config.js +29 -0
  104. jac_client/examples/full-stack-with-auth/app.jac +20 -33
  105. jac_client/examples/full-stack-with-auth/package.json +1 -1
  106. jac_client/examples/full-stack-with-auth/vite.config.js +0 -1
  107. jac_client/examples/little-x/app.jac +327 -218
  108. jac_client/examples/little-x/submit-button.jac +1 -1
  109. jac_client/examples/nested-folders/nested-advance/.babelrc +9 -0
  110. jac_client/examples/nested-folders/nested-advance/ButtonRoot.jac +11 -0
  111. jac_client/examples/nested-folders/nested-advance/README.md +77 -0
  112. jac_client/examples/nested-folders/nested-advance/app.jac +35 -0
  113. jac_client/examples/nested-folders/nested-advance/level1/ButtonSecondL.jac +19 -0
  114. jac_client/examples/nested-folders/nested-advance/level1/Card.jac +43 -0
  115. jac_client/examples/nested-folders/nested-advance/level1/level2/ButtonThirdL.jac +25 -0
  116. jac_client/examples/nested-folders/nested-advance/package.json +29 -0
  117. jac_client/examples/nested-folders/nested-advance/vite.config.js +28 -0
  118. jac_client/examples/nested-folders/nested-basic/.babelrc +9 -0
  119. jac_client/examples/nested-folders/nested-basic/README.md +183 -0
  120. jac_client/examples/nested-folders/nested-basic/app.jac +13 -0
  121. jac_client/examples/nested-folders/nested-basic/app.js +7 -0
  122. jac_client/examples/nested-folders/nested-basic/button.jac +7 -0
  123. jac_client/examples/nested-folders/nested-basic/components/button.jac +7 -0
  124. jac_client/examples/nested-folders/nested-basic/package.json +28 -0
  125. jac_client/examples/nested-folders/nested-basic/vite.config.js +27 -0
  126. jac_client/examples/with-router/app.jac +1 -1
  127. jac_client/examples/with-router/package.json +1 -1
  128. jac_client/examples/with-router/vite.config.js +0 -1
  129. jac_client/plugin/cli.py +7 -2
  130. jac_client/plugin/client.py +68 -5
  131. jac_client/plugin/client_runtime.jac +1 -1
  132. jac_client/plugin/vite_client_bundle.py +162 -14
  133. jac_client/tests/__init__.py +0 -1
  134. jac_client/tests/fixtures/basic-app/app.jac +7 -2
  135. jac_client/tests/fixtures/cl_file/app.cl.jac +48 -0
  136. jac_client/tests/fixtures/cl_file/app.jac +15 -0
  137. jac_client/tests/fixtures/client_app_with_antd/app.jac +14 -8
  138. jac_client/tests/fixtures/js_import/app.jac +19 -15
  139. jac_client/tests/fixtures/js_import/utils.js +0 -1
  140. jac_client/tests/fixtures/package.json +1 -1
  141. jac_client/tests/fixtures/relative_import/app.jac +4 -6
  142. jac_client/tests/fixtures/relative_import/button.jac +7 -6
  143. jac_client/tests/fixtures/spawn_test/app.jac +1 -5
  144. jac_client/tests/fixtures/test_fragments_spread/app.jac +24 -10
  145. jac_client/tests/test_asset_examples.py +322 -0
  146. jac_client/tests/test_cl.py +480 -426
  147. jac_client/tests/test_create_jac_app.py +125 -133
  148. jac_client/tests/test_it.py +329 -0
  149. jac_client/tests/test_nested_file.py +374 -0
  150. {jac_client-0.2.0.dist-info → jac_client-0.2.3.dist-info}/METADATA +11 -3
  151. jac_client-0.2.3.dist-info/RECORD +171 -0
  152. jac_client-0.2.0.dist-info/RECORD +0 -72
  153. {jac_client-0.2.0.dist-info → jac_client-0.2.3.dist-info}/WHEEL +0 -0
  154. {jac_client-0.2.0.dist-info → jac_client-0.2.3.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,122 @@
1
+ cl import from react { useState, useEffect }
2
+ cl import from '@mui/material/Button' { default as Button }
3
+ cl import from '@mui/material/Card' { default as Card }
4
+ cl import from '@mui/material/CardContent' { default as CardContent }
5
+ cl import from '@mui/material/CardActions' { default as CardActions }
6
+ cl import from '@mui/material/Typography' { default as Typography }
7
+ cl import from '@mui/material/IconButton' { default as IconButton }
8
+ cl import from '@mui/material/Box' { default as Box }
9
+ cl import from '@mui/material/Divider' { default as Divider }
10
+ cl import from '@mui/icons-material/Add' { default as AddIcon }
11
+ cl import from '@mui/icons-material/Remove' { default as RemoveIcon }
12
+ cl import from '@mui/icons-material/Refresh' { default as RefreshIcon }
13
+
14
+ cl {
15
+ def app() -> any {
16
+ let [count, setCount] = useState(0);
17
+
18
+ useEffect(lambda -> None{ console.log("Count changed: ", count);} , [count]);
19
+
20
+ let handleIncrement = lambda e: any -> None{ setCount(count + 1);} ;
21
+
22
+ let handleDecrement = lambda e: any -> None{ setCount(count - 1);} ;
23
+
24
+ let handleReset = lambda e: any -> None{ setCount(0);} ;
25
+
26
+ return <Box
27
+ sx={{
28
+ "display": "flex",
29
+ "justifyContent": "center",
30
+ "alignItems": "center",
31
+ "minHeight": "100vh",
32
+ "backgroundColor": "#f5f5f5"
33
+ }}
34
+ >
35
+ <Card
36
+ sx={{"minWidth": 400, "boxShadow": 3}}
37
+ >
38
+ <CardContent>
39
+ <Typography
40
+ variant="h4"
41
+ component="div"
42
+ gutterBottom
43
+ sx={{"textAlign": "center", "color": "primary.main"}}
44
+ >
45
+ Counter Application
46
+ </Typography>
47
+ <Divider
48
+ sx={{"my": 2}}
49
+ />
50
+ <Box
51
+ sx={{
52
+ "display": "flex",
53
+ "flexDirection": "column",
54
+ "alignItems": "center",
55
+ "py": 3
56
+ }}
57
+ >
58
+ <Typography
59
+ variant="h6"
60
+ color="text.secondary"
61
+ gutterBottom
62
+ >
63
+ Current Count
64
+ </Typography>
65
+ <Typography
66
+ variant="h1"
67
+ component="div"
68
+ sx={{
69
+ "fontWeight": "bold",
70
+ "color": "success.main"
71
+ if count > 0
72
+ else "error.main" if count < 0 else "text.primary"
73
+ }}
74
+ >
75
+ {count}
76
+ </Typography>
77
+ </Box>
78
+ </CardContent>
79
+ <Divider />
80
+ <CardActions
81
+ sx={{"display": "flex", "justifyContent": "space-around", "p": 2}}
82
+ >
83
+ <IconButton
84
+ color="error"
85
+ size="large"
86
+ onClick={handleDecrement}
87
+ sx={{"border": "2px solid", "borderColor": "error.main"}}
88
+ >
89
+ <RemoveIcon />
90
+ </IconButton>
91
+ <IconButton
92
+ color="primary"
93
+ size="large"
94
+ onClick={handleReset}
95
+ sx={{"border": "2px solid", "borderColor": "primary.main"}}
96
+ >
97
+ <RefreshIcon />
98
+ </IconButton>
99
+ <IconButton
100
+ color="success"
101
+ size="large"
102
+ onClick={handleIncrement}
103
+ sx={{"border": "2px solid", "borderColor": "success.main"}}
104
+ >
105
+ <AddIcon />
106
+ </IconButton>
107
+ </CardActions>
108
+ <Box
109
+ sx={{"px": 3, "pb": 2}}
110
+ >
111
+ <Typography
112
+ variant="caption"
113
+ color="text.secondary"
114
+ sx={{"display": "block", "textAlign": "center"}}
115
+ >
116
+ Click the buttons to increment, decrement, or reset the counter
117
+ </Typography>
118
+ </Box>
119
+ </Card>
120
+ </Box>;
121
+ }
122
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "my-test-app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "build": "npm run compile && vite build",
7
+ "dev": "vite dev",
8
+ "preview": "vite preview",
9
+ "compile": "babel src --out-dir build --extensions \".jsx,.js\" --out-file-extension .js"
10
+ },
11
+ "keywords": [],
12
+ "author": "",
13
+ "license": "ISC",
14
+ "description": "Jac application: my-test-app",
15
+ "type": "module",
16
+ "devDependencies": {
17
+ "@babel/cli": "^7.28.3",
18
+ "@babel/core": "^7.28.5",
19
+ "@babel/preset-env": "^7.28.5",
20
+ "@babel/preset-react": "^7.28.5",
21
+ "vite": "^6.4.1"
22
+ },
23
+ "dependencies": {
24
+ "@emotion/react": "^11.14.0",
25
+ "@emotion/styled": "^11.14.1",
26
+ "@mui/icons-material": "^7.3.5",
27
+ "@mui/material": "^7.3.5",
28
+ "react": "^19.2.0",
29
+ "react-dom": "^19.2.0",
30
+ "react-router-dom": "^6.30.1"
31
+ }
32
+ }
@@ -0,0 +1,27 @@
1
+
2
+ import { defineConfig } from "vite";
3
+ import path from "path";
4
+ import { fileURLToPath } from "url";
5
+
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+
8
+ export default defineConfig({
9
+ root: ".", // base folder
10
+ build: {
11
+ rollupOptions: {
12
+ input: "build/main.js", // your compiled entry file
13
+ output: {
14
+ entryFileNames: "client.[hash].js", // name of the final js file
15
+ assetFileNames: "[name].[ext]",
16
+ },
17
+ },
18
+ outDir: "dist", // final bundled output
19
+ emptyOutDir: true,
20
+ },
21
+ publicDir: false,
22
+ resolve: {
23
+ alias: {
24
+ "@jac-client/utils": path.resolve(__dirname, "src/client_runtime.js"),
25
+ },
26
+ },
27
+ });
@@ -0,0 +1,9 @@
1
+
2
+ {
3
+ "presets": [[
4
+ "@babel/preset-env",
5
+ {
6
+ "modules": false
7
+ }
8
+ ], "@babel/preset-react"]
9
+ }
@@ -0,0 +1,16 @@
1
+ # my-test-app
2
+
3
+ ## Running Jac Code
4
+
5
+ make sure node modules are installed:
6
+ ```bash
7
+ npm install
8
+ ```
9
+
10
+ To run your Jac code, use the Jac CLI:
11
+
12
+ ```bash
13
+ jac serve app.jac
14
+ ```
15
+
16
+ Happy coding with Jac!
@@ -0,0 +1,64 @@
1
+ # Pages
2
+ cl import from react { useState, useEffect }
3
+ cl import ".styles.css";
4
+
5
+ cl {
6
+ def app() -> any {
7
+ let [count, setCount] = useState(0);
8
+
9
+ useEffect(lambda -> None{ console.log("Count changed: ", count);} , [count]);
10
+
11
+ let handleIncrement = lambda e: any -> None{ setCount(count + 1);} ;
12
+
13
+ let handleDecrement = lambda e: any -> None{ setCount(count - 1);} ;
14
+
15
+ let handleReset = lambda e: any -> None{ setCount(0);} ;
16
+
17
+ let countClass = "countDisplay " + (
18
+ "positive" if count > 0 else "negative" if count < 0 else "zero"
19
+ );
20
+
21
+ return <div className="container">
22
+ <div className="card">
23
+ <h1 className="title">
24
+ Counter Application
25
+ </h1>
26
+ <div className="divider"></div>
27
+ <div className="counterSection">
28
+ <div className="label">
29
+ Current Count
30
+ </div>
31
+ <div
32
+ className={countClass}
33
+ >
34
+ {count}
35
+ </div>
36
+ </div>
37
+ <div className="divider"></div>
38
+ <div className="buttonGroup">
39
+ <button
40
+ className="btn btnDecrement"
41
+ onClick={handleDecrement}
42
+ >
43
+ -
44
+ </button>
45
+ <button
46
+ className="btn btnReset"
47
+ onClick={handleReset}
48
+ >
49
+
50
+ </button>
51
+ <button
52
+ className="btn btnIncrement"
53
+ onClick={handleIncrement}
54
+ >
55
+ +
56
+ </button>
57
+ </div>
58
+ <div className="hint">
59
+ Click the buttons to increment, decrement, or reset the counter
60
+ </div>
61
+ </div>
62
+ </div>;
63
+ }
64
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "my-test-app",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "build": "npm run compile && vite build",
7
+ "dev": "vite dev",
8
+ "preview": "vite preview",
9
+ "compile": "babel src --out-dir build --extensions \".jsx,.js\" --out-file-extension .js"
10
+ },
11
+ "keywords": [],
12
+ "author": "",
13
+ "license": "ISC",
14
+ "description": "Jac application: my-test-app",
15
+ "type": "module",
16
+ "devDependencies": {
17
+ "vite": "^6.4.1",
18
+ "@babel/cli": "^7.28.3",
19
+ "@babel/core": "^7.28.5",
20
+ "@babel/preset-env": "^7.28.5",
21
+ "@babel/preset-react": "^7.28.5"
22
+ },
23
+ "dependencies": {
24
+ "react": "^19.2.0",
25
+ "react-dom": "^19.2.0",
26
+ "react-router-dom": "^6.30.1"
27
+ }
28
+ }
@@ -0,0 +1,111 @@
1
+ .container {
2
+ display: flex;
3
+ justify-content: center;
4
+ align-items: center;
5
+ min-height: 100vh;
6
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
7
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
8
+ }
9
+
10
+ .card {
11
+ background: white;
12
+ border-radius: 20px;
13
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
14
+ padding: 40px;
15
+ min-width: 400px;
16
+ text-align: center;
17
+ }
18
+
19
+ .title {
20
+ font-size: 2rem;
21
+ color: #667eea;
22
+ margin: 0 0 10px 0;
23
+ font-weight: 600;
24
+ }
25
+
26
+ .divider {
27
+ height: 2px;
28
+ background: linear-gradient(90deg, transparent, #667eea, transparent);
29
+ margin: 20px 0;
30
+ }
31
+
32
+ .counterSection {
33
+ padding: 30px 0;
34
+ }
35
+
36
+ .label {
37
+ font-size: 1.2rem;
38
+ color: #666;
39
+ margin-bottom: 10px;
40
+ }
41
+
42
+ .countDisplay {
43
+ font-size: 5rem;
44
+ font-weight: bold;
45
+ margin: 20px 0;
46
+ transition: color 0.3s ease;
47
+ }
48
+
49
+ .positive {
50
+ color: #4caf50;
51
+ }
52
+
53
+ .negative {
54
+ color: #f44336;
55
+ }
56
+
57
+ .zero {
58
+ color: #333;
59
+ }
60
+
61
+ .buttonGroup {
62
+ display: flex;
63
+ justify-content: space-around;
64
+ gap: 15px;
65
+ margin-top: 30px;
66
+ }
67
+
68
+ .btn {
69
+ border: none;
70
+ border-radius: 50%;
71
+ width: 70px;
72
+ height: 70px;
73
+ font-size: 1.5rem;
74
+ cursor: pointer;
75
+ transition: all 0.3s ease;
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ font-weight: bold;
80
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
81
+ }
82
+
83
+ .btn:hover {
84
+ transform: translateY(-3px);
85
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
86
+ }
87
+
88
+ .btn:active {
89
+ transform: translateY(0);
90
+ }
91
+
92
+ .btnDecrement {
93
+ background: linear-gradient(135deg, #f44336, #e91e63);
94
+ color: white;
95
+ }
96
+
97
+ .btnReset {
98
+ background: linear-gradient(135deg, #2196f3, #00bcd4);
99
+ color: white;
100
+ }
101
+
102
+ .btnIncrement {
103
+ background: linear-gradient(135deg, #4caf50, #8bc34a);
104
+ color: white;
105
+ }
106
+
107
+ .hint {
108
+ margin-top: 20px;
109
+ font-size: 0.9rem;
110
+ color: #999;
111
+ }
@@ -0,0 +1,27 @@
1
+
2
+ import { defineConfig } from "vite";
3
+ import path from "path";
4
+ import { fileURLToPath } from "url";
5
+
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+
8
+ export default defineConfig({
9
+ root: ".", // base folder
10
+ build: {
11
+ rollupOptions: {
12
+ input: "build/main.js", // your compiled entry file
13
+ output: {
14
+ entryFileNames: "client.[hash].js", // name of the final js file
15
+ assetFileNames: "[name].[ext]",
16
+ },
17
+ },
18
+ outDir: "dist", // final bundled output
19
+ emptyOutDir: true,
20
+ },
21
+ publicDir: false,
22
+ resolve: {
23
+ alias: {
24
+ "@jac-client/utils": path.resolve(__dirname, "src/client_runtime.js"),
25
+ },
26
+ },
27
+ });
@@ -0,0 +1,9 @@
1
+
2
+ {
3
+ "presets": [[
4
+ "@babel/preset-env",
5
+ {
6
+ "modules": false
7
+ }
8
+ ], "@babel/preset-react"]
9
+ }
@@ -0,0 +1,16 @@
1
+ # sass-example
2
+
3
+ ## Running Jac Code
4
+
5
+ make sure node modules are installed:
6
+ ```bash
7
+ npm install
8
+ ```
9
+
10
+ To run your Jac code, use the Jac CLI:
11
+
12
+ ```bash
13
+ jac serve app.jac
14
+ ```
15
+
16
+ Happy coding with Jac!
@@ -0,0 +1,64 @@
1
+ # Pages
2
+ cl import from react { useState, useEffect }
3
+ cl import ".styles.scss";
4
+
5
+ cl {
6
+ def app() -> any {
7
+ let [count, setCount] = useState(0);
8
+
9
+ useEffect(lambda -> None{ console.log("Count changed: ", count);} , [count]);
10
+
11
+ let handleIncrement = lambda e: any -> None{ setCount(count + 1);} ;
12
+
13
+ let handleDecrement = lambda e: any -> None{ setCount(count - 1);} ;
14
+
15
+ let handleReset = lambda e: any -> None{ setCount(0);} ;
16
+
17
+ let countClass = "countDisplay " + (
18
+ "positive" if count > 0 else "negative" if count < 0 else "zero"
19
+ );
20
+
21
+ return <div className="container">
22
+ <div className="card">
23
+ <h1 className="title">
24
+ Counter Application
25
+ </h1>
26
+ <div className="divider"></div>
27
+ <div className="counterSection">
28
+ <div className="label">
29
+ Current Count
30
+ </div>
31
+ <div
32
+ className={countClass}
33
+ >
34
+ {count}
35
+ </div>
36
+ </div>
37
+ <div className="divider"></div>
38
+ <div className="buttonGroup">
39
+ <button
40
+ className="btn btnDecrement"
41
+ onClick={handleDecrement}
42
+ >
43
+ -
44
+ </button>
45
+ <button
46
+ className="btn btnReset"
47
+ onClick={handleReset}
48
+ >
49
+
50
+ </button>
51
+ <button
52
+ className="btn btnIncrement"
53
+ onClick={handleIncrement}
54
+ >
55
+ +
56
+ </button>
57
+ </div>
58
+ <div className="hint">
59
+ Click the buttons to increment, decrement, or reset the counter
60
+ </div>
61
+ </div>
62
+ </div>;
63
+ }
64
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "sass-example",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "build": "npm run compile && vite build",
7
+ "dev": "vite dev",
8
+ "preview": "vite preview",
9
+ "compile": "babel src --out-dir build --extensions \".jsx,.js\" --out-file-extension .js"
10
+ },
11
+ "keywords": [],
12
+ "author": "",
13
+ "license": "ISC",
14
+ "description": "Jac application: sass-example",
15
+ "type": "module",
16
+ "devDependencies": {
17
+ "vite": "^6.4.1",
18
+ "@babel/cli": "^7.28.3",
19
+ "@babel/core": "^7.28.5",
20
+ "@babel/preset-env": "^7.28.5",
21
+ "@babel/preset-react": "^7.28.5",
22
+ "sass": "^1.77.8"
23
+ },
24
+ "dependencies": {
25
+ "react": "^19.2.0",
26
+ "react-dom": "^19.2.0",
27
+ "react-router-dom": "^6.30.1"
28
+ }
29
+ }