@tachui/cli 0.8.1-alpha → 0.8.8

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 (75) hide show
  1. package/README.md +37 -412
  2. package/bin/tacho.js +59 -7
  3. package/dist/commands/analyze-imports.d.ts +18 -0
  4. package/dist/commands/analyze-imports.d.ts.map +1 -0
  5. package/dist/commands/analyze-imports.js +152 -0
  6. package/dist/commands/analyze-imports.js.map +1 -0
  7. package/dist/commands/analyze.js +1 -1
  8. package/dist/commands/analyze.js.map +1 -1
  9. package/dist/commands/dev.js +3 -3
  10. package/dist/commands/dev.js.map +1 -1
  11. package/dist/commands/generate.d.ts +1 -1
  12. package/dist/commands/generate.d.ts.map +1 -1
  13. package/dist/commands/generate.js +1 -22
  14. package/dist/commands/generate.js.map +1 -1
  15. package/dist/commands/init.d.ts +10 -1
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +170 -680
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/migrate/remove-modifier-trigger.d.ts +3 -0
  20. package/dist/commands/migrate/remove-modifier-trigger.d.ts.map +1 -0
  21. package/dist/commands/migrate/remove-modifier-trigger.js +103 -0
  22. package/dist/commands/migrate/remove-modifier-trigger.js.map +1 -0
  23. package/dist/commands/migrate.d.ts.map +1 -1
  24. package/dist/commands/migrate.js +8 -6
  25. package/dist/commands/migrate.js.map +1 -1
  26. package/dist/commands/modifier-docs.d.ts +24 -0
  27. package/dist/commands/modifier-docs.d.ts.map +1 -0
  28. package/dist/commands/modifier-docs.js +375 -0
  29. package/dist/commands/modifier-docs.js.map +1 -0
  30. package/dist/import-optimizer.d.ts +50 -0
  31. package/dist/import-optimizer.d.ts.map +1 -0
  32. package/dist/import-optimizer.js +227 -0
  33. package/dist/import-optimizer.js.map +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +14 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/migrations/remove-modifier-trigger.d.ts +7 -0
  38. package/dist/migrations/remove-modifier-trigger.d.ts.map +1 -0
  39. package/dist/migrations/remove-modifier-trigger.js +99 -0
  40. package/dist/migrations/remove-modifier-trigger.js.map +1 -0
  41. package/dist/scaffold/core-version-map.d.ts +2 -0
  42. package/dist/scaffold/core-version-map.d.ts.map +1 -0
  43. package/dist/scaffold/core-version-map.js +130 -0
  44. package/dist/scaffold/core-version-map.js.map +1 -0
  45. package/dist/scaffold/create-project.d.ts +15 -0
  46. package/dist/scaffold/create-project.d.ts.map +1 -0
  47. package/dist/scaffold/create-project.js +84 -0
  48. package/dist/scaffold/create-project.js.map +1 -0
  49. package/dist/scaffold/package-root.d.ts +2 -0
  50. package/dist/scaffold/package-root.d.ts.map +1 -0
  51. package/dist/scaffold/package-root.js +34 -0
  52. package/dist/scaffold/package-root.js.map +1 -0
  53. package/dist/scaffold/templates.d.ts +11 -0
  54. package/dist/scaffold/templates.d.ts.map +1 -0
  55. package/dist/scaffold/templates.js +26 -0
  56. package/dist/scaffold/templates.js.map +1 -0
  57. package/dist/scaffold/validators.d.ts +2 -0
  58. package/dist/scaffold/validators.d.ts.map +1 -0
  59. package/dist/scaffold/validators.js +32 -0
  60. package/dist/scaffold/validators.js.map +1 -0
  61. package/package.json +7 -3
  62. package/templates/advanced/README.md.template +23 -0
  63. package/templates/advanced/index.html.template +23 -0
  64. package/templates/advanced/package.json.template +20 -0
  65. package/templates/advanced/src/App.ts.template +54 -0
  66. package/templates/advanced/src/main.ts.template +4 -0
  67. package/templates/advanced/tsconfig.json.template +14 -0
  68. package/templates/advanced/vite.config.ts.template +11 -0
  69. package/templates/basic/README.md.template +17 -0
  70. package/templates/basic/index.html.template +22 -0
  71. package/templates/basic/package.json.template +20 -0
  72. package/templates/basic/src/App.ts.template +35 -0
  73. package/templates/basic/src/main.ts.template +4 -0
  74. package/templates/basic/tsconfig.json.template +14 -0
  75. package/templates/basic/vite.config.ts.template +11 -0
@@ -0,0 +1,84 @@
1
+ import { readdirSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { basename, dirname, join, resolve } from 'node:path';
3
+ import { validateProjectName } from './validators.js';
4
+ const TEMPLATE_EXT = '.template';
5
+ function collectTemplateFiles(root) {
6
+ const output = [];
7
+ const entries = readdirSync(root, { withFileTypes: true });
8
+ for (const entry of entries) {
9
+ const entryPath = join(root, entry.name);
10
+ if (entry.isDirectory()) {
11
+ output.push(...collectTemplateFiles(entryPath));
12
+ continue;
13
+ }
14
+ if (entry.isFile()) {
15
+ output.push(entryPath);
16
+ }
17
+ }
18
+ return output;
19
+ }
20
+ function toOutputPath(absoluteTemplatePath, templateRoot) {
21
+ const relativePath = absoluteTemplatePath.slice(templateRoot.length + 1);
22
+ if (relativePath.endsWith(TEMPLATE_EXT)) {
23
+ return relativePath.slice(0, -TEMPLATE_EXT.length);
24
+ }
25
+ return relativePath;
26
+ }
27
+ function resolveTargetPath(cwd, target) {
28
+ if (target === '.') {
29
+ return cwd;
30
+ }
31
+ return resolve(cwd, target);
32
+ }
33
+ function ensureTargetIsWritable(targetPath, target) {
34
+ if (!existsSync(targetPath)) {
35
+ mkdirSync(targetPath, { recursive: true });
36
+ return;
37
+ }
38
+ const entries = readdirSync(targetPath);
39
+ if (entries.length > 0) {
40
+ if (target === '.') {
41
+ throw new Error('Current directory is not empty. Use an empty directory for "init ."');
42
+ }
43
+ throw new Error(`Directory "${target}" already exists and is not empty`);
44
+ }
45
+ }
46
+ function resolveProjectName(targetPath) {
47
+ return basename(targetPath);
48
+ }
49
+ export function createProject(options) {
50
+ const targetPath = resolveTargetPath(options.cwd, options.target);
51
+ const projectName = resolveProjectName(targetPath);
52
+ const nameValidation = validateProjectName(projectName);
53
+ if (nameValidation) {
54
+ throw new Error(nameValidation);
55
+ }
56
+ ensureTargetIsWritable(targetPath, options.target);
57
+ const templateRoot = join(options.templatesRoot, options.template.directoryName);
58
+ if (!existsSync(templateRoot)) {
59
+ throw new Error(`Template "${options.template.id}" is missing from templates directory`);
60
+ }
61
+ const templateFiles = collectTemplateFiles(templateRoot);
62
+ const replacements = {
63
+ '{{PROJECT_NAME}}': projectName,
64
+ '{{TACHUI_VERSION}}': options.tachuiVersion,
65
+ };
66
+ let createdFiles = 0;
67
+ for (const templateFile of templateFiles) {
68
+ const outputRelativePath = toOutputPath(templateFile, templateRoot);
69
+ const outputPath = join(targetPath, outputRelativePath);
70
+ mkdirSync(dirname(outputPath), { recursive: true });
71
+ let content = readFileSync(templateFile, 'utf-8');
72
+ for (const [token, replacement] of Object.entries(replacements)) {
73
+ content = content.replaceAll(token, replacement);
74
+ }
75
+ writeFileSync(outputPath, content, 'utf-8');
76
+ createdFiles += 1;
77
+ }
78
+ return {
79
+ projectName,
80
+ projectPath: targetPath,
81
+ createdFiles,
82
+ };
83
+ }
84
+ //# sourceMappingURL=create-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/scaffold/create-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function resolvePackageRoot(moduleUrl: string): string;
2
+ //# sourceMappingURL=package-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-root.d.ts","sourceRoot":"","sources":["../../src/scaffold/package-root.ts"],"names":[],"mappings":"AAkBA,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmB5D"}
@@ -0,0 +1,34 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ function isPackageRoot(path) {
5
+ const packageJsonPath = resolve(path, 'package.json');
6
+ if (!existsSync(packageJsonPath) || !existsSync(resolve(path, 'templates'))) {
7
+ return false;
8
+ }
9
+ try {
10
+ const parsed = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
11
+ return parsed.name === '@tachui/cli';
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ export function resolvePackageRoot(moduleUrl) {
18
+ const modulePath = fileURLToPath(moduleUrl);
19
+ const startDir = dirname(modulePath);
20
+ const candidates = [
21
+ resolve(startDir, '..'),
22
+ resolve(startDir, '../..'),
23
+ resolve(startDir, '../../..'),
24
+ resolve(startDir, '../../../..'),
25
+ resolve(startDir, '../../../../..'),
26
+ ];
27
+ for (const candidate of candidates) {
28
+ if (isPackageRoot(candidate)) {
29
+ return candidate;
30
+ }
31
+ }
32
+ throw new Error('Unable to resolve @tachui/cli package root for template loading');
33
+ }
34
+ //# sourceMappingURL=package-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-root.js","sourceRoot":"","sources":["../../src/scaffold/package-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IACrD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAuB,CAAA;QACtF,OAAO,MAAM,CAAC,IAAI,KAAK,aAAa,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAEpC,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;QACvB,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC1B,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC7B,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC;QAChC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KACpC,CAAA;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;AACpF,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type TemplateId = 'basic' | 'advanced';
2
+ export interface TemplateDefinition {
3
+ id: TemplateId;
4
+ name: string;
5
+ description: string;
6
+ features: string[];
7
+ directoryName: string;
8
+ }
9
+ export declare function getTemplateDefinition(templateId: string): TemplateDefinition | undefined;
10
+ export declare function listTemplateDefinitions(): TemplateDefinition[];
11
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,CAAA;AAE7C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,UAAU,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB;AAmBD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAMxF;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAE9D"}
@@ -0,0 +1,26 @@
1
+ const TEMPLATE_DEFINITIONS = {
2
+ basic: {
3
+ id: 'basic',
4
+ name: 'Basic TachUI App',
5
+ description: 'Minimal TachUI application with core components',
6
+ features: ['Core components', 'Single-page starter', 'Vite + TypeScript'],
7
+ directoryName: 'basic',
8
+ },
9
+ advanced: {
10
+ id: 'advanced',
11
+ name: 'Advanced TachUI App',
12
+ description: 'Starter with reactive state and richer component structure',
13
+ features: ['State management', 'Structured app layout', 'Extended starter patterns'],
14
+ directoryName: 'advanced',
15
+ },
16
+ };
17
+ export function getTemplateDefinition(templateId) {
18
+ if (templateId in TEMPLATE_DEFINITIONS) {
19
+ return TEMPLATE_DEFINITIONS[templateId];
20
+ }
21
+ return undefined;
22
+ }
23
+ export function listTemplateDefinitions() {
24
+ return Object.values(TEMPLATE_DEFINITIONS);
25
+ }
26
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAUA,MAAM,oBAAoB,GAA2C;IACnE,KAAK,EAAE;QACL,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,iDAAiD;QAC9D,QAAQ,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,CAAC;QACzE,aAAa,EAAE,OAAO;KACvB;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,4DAA4D;QACzE,QAAQ,EAAE,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,2BAA2B,CAAC;QACpF,aAAa,EAAE,UAAU;KAC1B;CACF,CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,IAAI,UAAU,IAAI,oBAAoB,EAAE,CAAC;QACvC,OAAO,oBAAoB,CAAC,UAAwB,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function validateProjectName(projectName: string): string | null;
2
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/scaffold/validators.ts"],"names":[],"mappings":"AAYA,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4BtE"}
@@ -0,0 +1,32 @@
1
+ const RESERVED_NAMES = new Set([
2
+ 'node_modules',
3
+ 'favicon.ico',
4
+ 'con',
5
+ 'prn',
6
+ 'aux',
7
+ 'nul',
8
+ ]);
9
+ const PACKAGE_NAME_PATTERN = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/;
10
+ export function validateProjectName(projectName) {
11
+ const normalized = projectName.trim();
12
+ if (normalized.length === 0) {
13
+ return 'Project name is required';
14
+ }
15
+ if (normalized.length > 214) {
16
+ return 'Project name must be 214 characters or fewer';
17
+ }
18
+ if (normalized.startsWith('.') || normalized.startsWith('_')) {
19
+ return 'Project name cannot start with "." or "_"';
20
+ }
21
+ if (/[A-Z]/.test(normalized)) {
22
+ return 'Project name must be lowercase';
23
+ }
24
+ if (!PACKAGE_NAME_PATTERN.test(normalized)) {
25
+ return 'Project name must be a valid npm package name';
26
+ }
27
+ if (RESERVED_NAMES.has(normalized)) {
28
+ return `Project name "${normalized}" is reserved`;
29
+ }
30
+ return null;
31
+ }
32
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/scaffold/validators.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,cAAc;IACd,aAAa;IACb,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC,CAAA;AAEF,MAAM,oBAAoB,GACxB,oDAAoD,CAAA;AAEtD,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;IAErC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,0BAA0B,CAAA;IACnC,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC5B,OAAO,8CAA8C,CAAA;IACvD,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,2CAA2C,CAAA;IACpD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,gCAAgC,CAAA;IACzC,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO,+CAA+C,CAAA;IACxD,CAAC;IAED,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,iBAAiB,UAAU,eAAe,CAAA;IACnD,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tachui/cli",
3
- "version": "0.8.1-alpha",
3
+ "version": "0.8.8",
4
4
  "description": "Tacho CLI - Comprehensive developer tooling for tachUI",
5
5
  "homepage": "https://tachui.dev/",
6
6
  "type": "module",
@@ -22,13 +22,17 @@
22
22
  "prompts": "^2.4.0",
23
23
  "fs-extra": "^11.0.0",
24
24
  "glob": "^10.0.0",
25
- "@tachui/core": "0.8.1-alpha"
25
+ "inquirer": "^9.0.0",
26
+ "cli-table3": "^0.6.0",
27
+ "typescript": "^5.8.0",
28
+ "@tachui/core": "0.8.8",
29
+ "@tachui/devtools": "0.8.8"
26
30
  },
27
31
  "devDependencies": {
28
32
  "@types/fs-extra": "^11.0.0",
29
33
  "@types/prompts": "^2.4.0",
30
34
  "@types/node": "^20.0.0",
31
- "typescript": "^5.8.0",
35
+ "@types/inquirer": "^9.0.0",
32
36
  "vitest": "^3.2.4"
33
37
  },
34
38
  "keywords": [
@@ -0,0 +1,23 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ Advanced TachUI starter generated by `@tachui/cli` with reactive state patterns.
4
+
5
+ ## Getting Started
6
+
7
+ ```bash
8
+ npm install
9
+ npm run dev
10
+ ```
11
+
12
+ ## Included
13
+
14
+ - Reactive state via `@tachui/core/state`
15
+ - Structured starter app with interactive UI
16
+ - Vite + TypeScript setup
17
+
18
+ ## Scripts
19
+
20
+ - `npm run dev` - Start development server
21
+ - `npm run build` - Build for production
22
+ - `npm run preview` - Preview production build
23
+ - `npm run typecheck` - TypeScript type-check
@@ -0,0 +1,23 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{PROJECT_NAME}}</title>
7
+ <style>
8
+ * {
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ body {
13
+ margin: 0;
14
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
15
+ background: #f5f7fb;
16
+ }
17
+ </style>
18
+ </head>
19
+ <body>
20
+ <div id="app"></div>
21
+ <script type="module" src="/src/main.ts"></script>
22
+ </body>
23
+ </html>
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "{{PROJECT_NAME}}",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview",
10
+ "typecheck": "tsc --noEmit"
11
+ },
12
+ "dependencies": {
13
+ "@tachui/core": "{{TACHUI_VERSION}}"
14
+ },
15
+ "devDependencies": {
16
+ "@types/node": "^20.0.0",
17
+ "typescript": "^5.8.0",
18
+ "vite": "^7.1.1"
19
+ }
20
+ }
@@ -0,0 +1,54 @@
1
+ import { Button, Layout, Text } from '@tachui/core'
2
+ import { State } from '@tachui/core/state'
3
+
4
+ export function App() {
5
+ const count = State(0)
6
+
7
+ return Layout.VStack({
8
+ children: [
9
+ Text('TachUI Advanced Starter')
10
+ .fontSize(30)
11
+ .fontWeight('bold')
12
+ .margin({ bottom: 12 })
13
+ .build(),
14
+
15
+ Text(() => `Counter: ${count.wrappedValue}`)
16
+ .fontSize(20)
17
+ .margin({ bottom: 20 })
18
+ .build(),
19
+
20
+ Layout.HStack({
21
+ children: [
22
+ Button({
23
+ title: '-',
24
+ onTap: () => {
25
+ count.wrappedValue -= 1
26
+ },
27
+ })
28
+ .padding(10, 14)
29
+ .cornerRadius(8)
30
+ .build(),
31
+
32
+ Button({
33
+ title: '+',
34
+ onTap: () => {
35
+ count.wrappedValue += 1
36
+ },
37
+ })
38
+ .padding(10, 14)
39
+ .cornerRadius(8)
40
+ .build(),
41
+ ],
42
+ spacing: 12,
43
+ alignment: 'center',
44
+ })
45
+ .build(),
46
+ ],
47
+ spacing: 0,
48
+ alignment: 'center',
49
+ })
50
+ .frame(undefined, '100vh')
51
+ .justifyContent('center')
52
+ .alignItems('center')
53
+ .build()
54
+ }
@@ -0,0 +1,4 @@
1
+ import { mount } from '@tachui/core'
2
+ import { App } from './App'
3
+
4
+ mount('#app', App())
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "allowSyntheticDefaultImports": true,
9
+ "skipLibCheck": true,
10
+ "forceConsistentCasingInFileNames": true
11
+ },
12
+ "include": ["src/**/*"],
13
+ "exclude": ["node_modules", "dist"]
14
+ }
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'vite'
2
+
3
+ export default defineConfig({
4
+ server: {
5
+ port: 3000,
6
+ open: true,
7
+ },
8
+ build: {
9
+ target: 'es2022',
10
+ },
11
+ })
@@ -0,0 +1,17 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ Minimal TachUI starter generated by `@tachui/cli`.
4
+
5
+ ## Getting Started
6
+
7
+ ```bash
8
+ npm install
9
+ npm run dev
10
+ ```
11
+
12
+ ## Scripts
13
+
14
+ - `npm run dev` - Start development server
15
+ - `npm run build` - Build for production
16
+ - `npm run preview` - Preview production build
17
+ - `npm run typecheck` - TypeScript type-check
@@ -0,0 +1,22 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{PROJECT_NAME}}</title>
7
+ <style>
8
+ * {
9
+ box-sizing: border-box;
10
+ }
11
+
12
+ body {
13
+ margin: 0;
14
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
15
+ }
16
+ </style>
17
+ </head>
18
+ <body>
19
+ <div id="app"></div>
20
+ <script type="module" src="/src/main.ts"></script>
21
+ </body>
22
+ </html>
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "{{PROJECT_NAME}}",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview",
10
+ "typecheck": "tsc --noEmit"
11
+ },
12
+ "dependencies": {
13
+ "@tachui/core": "{{TACHUI_VERSION}}"
14
+ },
15
+ "devDependencies": {
16
+ "@types/node": "^20.0.0",
17
+ "typescript": "^5.8.0",
18
+ "vite": "^7.1.1"
19
+ }
20
+ }
@@ -0,0 +1,35 @@
1
+ import { Button, Layout, Text } from '@tachui/core'
2
+
3
+ export function App() {
4
+ return Layout.VStack({
5
+ children: [
6
+ Text('Welcome to TachUI')
7
+ .fontSize(30)
8
+ .fontWeight('bold')
9
+ .margin({ bottom: 12 })
10
+ .build(),
11
+
12
+ Text('Your starter app is ready.')
13
+ .fontSize(18)
14
+ .foregroundColor('#666')
15
+ .margin({ bottom: 24 })
16
+ .build(),
17
+
18
+ Button({
19
+ title: 'Get Started',
20
+ onTap: () => console.log('TachUI starter ready'),
21
+ })
22
+ .backgroundColor('#0a84ff')
23
+ .foregroundColor('#fff')
24
+ .padding(12, 20)
25
+ .cornerRadius(10)
26
+ .build(),
27
+ ],
28
+ spacing: 0,
29
+ alignment: 'center',
30
+ })
31
+ .frame(undefined, '100vh')
32
+ .justifyContent('center')
33
+ .alignItems('center')
34
+ .build()
35
+ }
@@ -0,0 +1,4 @@
1
+ import { mount } from '@tachui/core'
2
+ import { App } from './App'
3
+
4
+ mount('#app', App())
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "allowSyntheticDefaultImports": true,
9
+ "skipLibCheck": true,
10
+ "forceConsistentCasingInFileNames": true
11
+ },
12
+ "include": ["src/**/*"],
13
+ "exclude": ["node_modules", "dist"]
14
+ }
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'vite'
2
+
3
+ export default defineConfig({
4
+ server: {
5
+ port: 3000,
6
+ open: true,
7
+ },
8
+ build: {
9
+ target: 'es2022',
10
+ },
11
+ })