diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..0f441892 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,48 @@ +--- +name: ๐Ÿ› Bug Report +about: Report a bug to help us improve FlutterJS +title: '[BUG] ' +labels: bug +assignees: '' + +--- + +## ๐Ÿ› Bug Description +A clear and concise description of what the bug is. + +## ๐Ÿ‘ฃ To Reproduce +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '...' +3. Scroll down to '...' +4. See error + +## ๐Ÿ‘ Expected Behavior +A clear and concise description of what you expected to happen. + +## ๐Ÿ“ธ Screenshots +If applicable, add screenshots to help explain your problem. + +## ๐Ÿ’ป Code Sample +Please provide a minimal code sample that reproduces the issue. + +```dart +// Your code here +``` + +## โš ๏ธ Error Message +If there is an error message, please paste it here. + +```text +// Paste error message here +``` + +## ๐ŸŒ Environment +- **FlutterJS version**: [e.g. 0.0.1] +- **OS**: [e.g. macOS, Windows, Linux] +- **Node.js version**: [e.g. 18.0.0] +- **Dart version**: [e.g. 3.0.0] +- **Browser (if applicable)**: [e.g. Chrome 114] + +## ๐Ÿ“‹ Additional Context +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..14a14c67 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,30 @@ +--- +name: ๐Ÿš€ Feature Request +about: Suggest a new feature or improvement +title: '[FEATURE] ' +labels: enhancement +assignees: '' + +--- + +## ๐Ÿš€ Feature Description +A clear and concise description of what the new feature is. + +## ๐Ÿ’ก Use Case +Describe the problem you are trying to solve or the scenario where this feature would be useful. + +## ๐Ÿ› ๏ธ Proposed Solution +Describe your proposed solution or implementation. + +## ๐Ÿ”„ Alternatives Considered +Describe any alternative solutions or features you've considered. + +## ๐Ÿ’ป Example Code +If applicable, show how the feature would be used. + +```dart +// Example usage +``` + +## ๐Ÿ“‹ Additional Context +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/widget_request.md b/.github/ISSUE_TEMPLATE/widget_request.md new file mode 100644 index 00000000..4d017a2b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/widget_request.md @@ -0,0 +1,30 @@ +--- +name: ๐Ÿงฉ Widget Request +about: Request support for a specific Flutter widget +title: '[WIDGET] ' +labels: widget +assignees: '' + +--- + +## ๐Ÿงฉ Widget Name +Name of the widget you want ported from Flutter. + +## ๐Ÿ”— Reference URL +Link to the official Flutter widget documentation (api.flutter.dev). + +## ๐Ÿ’ก Use Case +Describe where and how you would use this widget in your web app. + +## โš–๏ธ Priority +- [ ] **Critical** (Blocks development) +- [ ] **High** (Needed soon) +- [ ] **Medium** (Nice to have) +- [ ] **Low** (Can wait) + +## ๐Ÿค Willing to Contribute? +- [ ] Yes, I can help implement this! +- [ ] No, just requesting it. + +## ๐Ÿ“‹ Additional Context +Add any other context or screenshots covering the widget's visual appearance. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..22327a6b --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,35 @@ +## ๐Ÿ“ Description +Please include a summary of the change and which issue is fixed. + +## ๐Ÿ”— Related Issue +Fixes # (issue) + +## ๐Ÿ—๏ธ Type of Change +- [ ] ๐Ÿ› Bug fix (non-breaking change which fixes an issue) +- [ ] โœจ New feature (non-breaking change which adds functionality) +- [ ] ๐Ÿ’ฅ Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] ๐Ÿ“š Documentation update +- [ ] ๐ŸŽจ Code style update (formatting, local variables) +- [ ] ๐Ÿ”จ Refactoring (no functional changes, no api changes) +- [ ] ๐Ÿงช Tests +- [ ] โš™๏ธ CI/CD + +## ๐Ÿ“‹ Checklist +- [ ] I have read the [CONTRIBUTING](CONTRIBUTING.md) doc +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes +- [ ] Any dependent changes have been merged and published in downstream modules + +## ๐Ÿ“ธ Screenshots (if applicable) +| Before | After | +| - | - | +| | | + +## ๐Ÿงช How to Test +1. +2. +3. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..a8e3cb0a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "pub" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..d8430e3c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,31 @@ +name: FlutterJS CI + +on: + push: + branches: [ "main", "master" ] + pull_request: + branches: [ "main", "master" ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Dart SDK + uses: dart-lang/setup-dart@v1 + with: + sdk: dev + + - name: Install dependencies + run: dart pub get + + - name: Verify formatting + run: dart format --output=none --set-exit-if-changed . + + - name: Analyze project source + run: dart analyze + + - name: Run tests + run: dart test diff --git a/QUICKSTART.md b/QUICKSTART.md index 362e7b14..90f5699c 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -4,19 +4,20 @@ This guide shows you the **easiest ways** to run FlutterJS commands without typi ## ๐ŸŽฏ Quick Commands -### Option 1: Using Wrapper Scripts (Easiest!) +### Option 1: Global CLI (Recommended) -**PowerShell (Recommended for Windows):** -```powershell -# From the flutterjs root directory -.\flutterjs.ps1 run --to-js --serve +First, activate the CLI globally: +```bash +dart pub global activate --source path . +``` -# With verbose logging -.\flutterjs.ps1 -v run --to-js --serve +Then run commands from anywhere: +```bash +# Run dev server +flutterjs run --to-js --serve -# Other commands -.\flutterjs.ps1 doctor -.\flutterjs.ps1 build +# Build for production +flutterjs build ``` **Command Prompt (cmd.exe):** @@ -108,8 +109,8 @@ Most commands should be run from: ## ๐Ÿ’ก Tips -1. **Use `.\flutterjs.ps1`** for the quickest development workflow on Windows. -2. **Access from anywhere**: Add `C:\Jay\_Plugin\flutterjs` to your PATH +1. **Use Global CLI**: `flutterjs` is the fastest way to work. +2. **Access from anywhere**: Provide full paths if running outside a project, or just cd in. 3. **Check logs**: Use `-v` if something goes wrong. --- @@ -118,10 +119,10 @@ Most commands should be run from: ```bash # Start development (simplest way) -.\flutterjs.ps1 run --to-js --serve +flutterjs run --to-js --serve # Build (production) -.\flutterjs.ps1 build +flutterjs build # Rebuild engine after changes cd packages/flutterjs_engine diff --git a/README.md b/README.md index 3c48e9e5..764da3d3 100644 --- a/README.md +++ b/README.md @@ -88,13 +88,12 @@ FlutterJS compiles your Flutter/Dart code to **semantic HTML + CSS + JavaScript* npm install -g flutterjs ``` -### Option 2: From Source +### Option 2: From Source (Development) ```bash git clone https://github.com/flutterjsdev/flutterjs.git -cd flutterjs/packages/flutterjs_engine -npm install -npm link +cd flutterjs +dart pub global activate --source path . ``` --- @@ -591,6 +590,7 @@ PHASES 4-6: Converting IR to JavaScript... - [x] Engine Bridge (Dart CLI โ†” JS Runtime) - [x] Incremental compilation - [x] DevTools IR Viewer +- [x] Dart Core Libraries (`dart:math`, `dart:async`, `dart:convert`, etc.) - [ ] Animation support - [ ] Full Material 3 theming - [ ] Route-based code splitting @@ -600,6 +600,22 @@ PHASES 4-6: Converting IR to JavaScript... --- +## Known Limitations + +### Method Tear-offs (Callback Context) +Currently, passing methods directly as callbacks (tear-offs) may causing binding issues where `this` becomes undefined. +**Workaround:** Wrap callbacks in a lambda to preserve context. + +```dart +// โŒ Avoid (may fail based on transpiler version) +onPressed: _incrementCounter + +// โœ… Recommended +onPressed: () => _incrementCounter() +``` + +--- + ## Initialization To set up the project for development (both Dart and JavaScript packages), run the following command from the root directory: diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..adff1d25 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,43 @@ +# ๐Ÿ›ก๏ธ Security Policy + +## ๐Ÿ“ฆ Supported Versions + +| Version | Supported | Notes | +| ------- | ------------------ | ----- | +| 0.0.x | :white_check_mark: | Current development version | +| < 0.0.x | :x: | No longer supported | + +## ๐Ÿž Reporting a Vulnerability + +We take the security of FlutterJS seriously. If you have discovered a security vulnerability, we appreciate your help in disclosing it to us in a responsible manner. + +> [!IMPORTANT] +> **Please DO NOT report security vulnerabilities through public GitHub issues.** + +### How to Report + +Please email a detailed report to **[info@flutterjs.dev](mailto:info@flutterjs.dev)**. + +Include the following details: +- **Type of issue** (e.g., XSS, Injection, logical flaw) +- **Full paths** of source file(s) related to the manifestation of the issue +- **Location** of the affected source code (tag/branch/commit or direct URL) +- **Step-by-step instructions** to reproduce the issue +- **Proof-of-concept** or exploit code (if available) +- **Impact** of the issue, including how an attacker might exploit it + +### Our Response Policy + +1. **Response**: We will acknowledge receipt of your report within **48 hours**. +2. **Assessment**: We will investigate the issue and determine its impact. +3. **Fix**: If verified, we will work on a fix and release a patch as soon as possible. +4. **Disclosure**: We will coordinate the public disclosure of the vulnerability with you. + +## ๐Ÿ”’ Security Best Practices + +When using FlutterJS in your applications: + +1. **Secrets Management**: Never commit API keys or secrets to version control. Use environment variables. +2. **Input Validation**: Always sanitize and validate user input to prevent injection attacks. +3. **Dependency Updates**: Keep your dependencies up to date using `dart pub upgrade` and `npm update`. +4. **Transport Security**: Always use HTTPS in production environments. \ No newline at end of file diff --git a/bin/flutterjs.dart b/bin/flutterjs.dart index bceee71f..e03943b5 100644 --- a/bin/flutterjs.dart +++ b/bin/flutterjs.dart @@ -99,7 +99,13 @@ const String kVersion = '2.0.0'; const String kAppName = 'Flutter.js'; Future main(List args) async { + final debugFile = File( + 'c:/Jay/_Plugin/flutterjs/examples/routing_app/debug_main.txt', + ); + debugFile.writeAsStringSync('DEBUG: BIN MAIN START\n'); + print('DEBUG: BIN MAIN START'); print('๐Ÿฆ– FLUTTERJS CLI - DEBUG MODE ACTIVE ๐Ÿฆ–'); + // Parse verbose flags early final bool veryVerbose = args.contains('-vv'); final bool verbose = @@ -127,27 +133,50 @@ Future main(List args) async { final bool muteCommandLogging = (help || doctor) && !veryVerbose; final bool verboseHelp = help && verbose; - final bool watch = args.contains('--watch'); + + debugFile.writeAsStringSync( + 'DEBUG: Parsed args. Creating runner...\n', + mode: FileMode.append, + ); // โœ… INITIALIZE DEBUGGER HERE + /* FlutterJSIntegratedDebugger.initFromCliFlags( verbose: verbose, verboseHelp: veryVerbose, watch: watch, ); + */ // Create and run command runner + print('DEBUG: Creating runner...'); final runner = FlutterJSCommandRunner( verbose: verbose, verboseHelp: verboseHelp, muteCommandLogging: muteCommandLogging, ); + print('DEBUG: Runner created'); + debugFile.writeAsStringSync('DEBUG: Runner created\n', mode: FileMode.append); try { + print('DEBUG: Calling runner.run(args)...'); + debugFile.writeAsStringSync( + 'DEBUG: Calling runner.run(args)...\n', + mode: FileMode.append, + ); await runner.run(args); + print('DEBUG: runner.run(args) returned'); + debugFile.writeAsStringSync( + 'DEBUG: runner.run(args) returned\n', + mode: FileMode.append, + ); } on UsageException catch (e) { print('${e.message}\n'); print(e.usage); exit(64); // Command line usage error - } catch (e) { + } catch (e, st) { + debugFile.writeAsStringSync( + 'ERROR: $e\nSTACK: $st\n', + mode: FileMode.append, + ); if (verbose) { print('Error: $e'); } else { diff --git a/docs/implementation_plan.md b/docs/implementation_plan.md new file mode 100644 index 00000000..4ed0cfec --- /dev/null +++ b/docs/implementation_plan.md @@ -0,0 +1,68 @@ +# Implementation Plan - Dart Core Libraries (Single Package Strategy) + +To avoid cluttering the codebase with many small packages, we will consolidate all Dart standard library implementations into a **single** infrastructure package. + +## Architecture Change +**New Package**: `packages/flutterjs_dart` +**NPM Name**: `@flutterjs/dart` + +This package will contain implementations for all core libraries as sub-modules. The transpiler will map `dart:` imports to specific paths within this single package. + +### Structure +```text +packages/flutterjs_dart/ +โ”œโ”€โ”€ package.json (exports: @flutterjs/dart) +โ”œโ”€โ”€ src/ +โ”‚ โ”œโ”€โ”€ math/ +โ”‚ โ”‚ โ”œโ”€โ”€ index.js (exports Point, Random, etc.) +โ”‚ โ”‚ โ””โ”€โ”€ random.js +โ”‚ โ”œโ”€โ”€ async/ +โ”‚ โ”‚ โ”œโ”€โ”€ index.js (exports Future, Stream, Timer) +โ”‚ โ”‚ โ”œโ”€โ”€ future.js +โ”‚ โ”‚ โ””โ”€โ”€ timer.js +โ”‚ โ”œโ”€โ”€ convert/ +โ”‚ โ”‚ โ””โ”€โ”€ index.js +โ”‚ โ”œโ”€โ”€ collection/ +โ”‚ โ”‚ โ””โ”€โ”€ index.js +โ”‚ โ”œโ”€โ”€ developer/ +โ”‚ โ”‚ โ””โ”€โ”€ index.js +โ”‚ โ””โ”€โ”€ typed_data/ +โ”‚ โ””โ”€โ”€ index.js +โ””โ”€โ”€ index.js (Main entry point, aggregates exports if needed) +``` + +## Mappings +The [flutterjs.imports.json](file:///c:/Jay/_Plugin/flutterjs/packages/flutterjs_engine/flutterjs.imports.json) (or the internal compiler resolution) will be configured to map: + +| Dart Import | Maps To (Physical Path) | +| :--- | :--- | +| `dart:math` | `@flutterjs/dart/math` | +| `dart:async` | `@flutterjs/dart/async` | +| `dart:convert` | `@flutterjs/dart/convert` | +| `dart:collection` | `@flutterjs/dart/collection` | +| `dart:developer` | `@flutterjs/dart/developer` | +| `dart:typed_data` | `@flutterjs/dart/typed_data` | + +## Execution Steps + +### 1. Create `packages/flutterjs_dart` +- Initialize [package.json](file:///c:/Jay/_Plugin/flutterjs/packages/flutterjs_engine/package.json) with name `@flutterjs/dart`. +- Configure `exports` in [package.json](file:///c:/Jay/_Plugin/flutterjs/packages/flutterjs_engine/package.json) to expose subpaths `./math`, `./async`, etc. + +### 2. Implement Modules +- **Math**: Wrapper for JS `Math`. +- **Async**: `Future` (Promise wrapper), `Timer`. +- **Convert**: `JSON` wrapper. +- **Collection**: `List` (Array), `Map` (Map), `Set` (Set). +- **TypedData**: `Uint8Array` wrapper. + +### 3. Update Transpiler +- Modify `flutterjs_gen` to rewrite `dart:` to `@flutterjs/dart/`. + +### 4. Register in Engine +- Update [packages/flutterjs_engine/flutterjs.imports.json](file:///c:/Jay/_Plugin/flutterjs/packages/flutterjs_engine/flutterjs.imports.json) to point `@flutterjs/dart` to the local implementation. + +## Benefits +- **Cleanliness**: One folder `packages/flutterjs_dart` instead of 6+. +- **Maintainability**: Shared utilities (like a base JS wrapper class) can live in `packages/flutterjs_dart/src/utils` and be reused across libs. +- **Scalability**: Adding `dart:isolate` or `dart:ui` later just means adding a folder. diff --git a/docs/placement_implementation_plan.md b/docs/placement_implementation_plan.md new file mode 100644 index 00000000..4ed0cfec --- /dev/null +++ b/docs/placement_implementation_plan.md @@ -0,0 +1,68 @@ +# Implementation Plan - Dart Core Libraries (Single Package Strategy) + +To avoid cluttering the codebase with many small packages, we will consolidate all Dart standard library implementations into a **single** infrastructure package. + +## Architecture Change +**New Package**: `packages/flutterjs_dart` +**NPM Name**: `@flutterjs/dart` + +This package will contain implementations for all core libraries as sub-modules. The transpiler will map `dart:` imports to specific paths within this single package. + +### Structure +```text +packages/flutterjs_dart/ +โ”œโ”€โ”€ package.json (exports: @flutterjs/dart) +โ”œโ”€โ”€ src/ +โ”‚ โ”œโ”€โ”€ math/ +โ”‚ โ”‚ โ”œโ”€โ”€ index.js (exports Point, Random, etc.) +โ”‚ โ”‚ โ””โ”€โ”€ random.js +โ”‚ โ”œโ”€โ”€ async/ +โ”‚ โ”‚ โ”œโ”€โ”€ index.js (exports Future, Stream, Timer) +โ”‚ โ”‚ โ”œโ”€โ”€ future.js +โ”‚ โ”‚ โ””โ”€โ”€ timer.js +โ”‚ โ”œโ”€โ”€ convert/ +โ”‚ โ”‚ โ””โ”€โ”€ index.js +โ”‚ โ”œโ”€โ”€ collection/ +โ”‚ โ”‚ โ””โ”€โ”€ index.js +โ”‚ โ”œโ”€โ”€ developer/ +โ”‚ โ”‚ โ””โ”€โ”€ index.js +โ”‚ โ””โ”€โ”€ typed_data/ +โ”‚ โ””โ”€โ”€ index.js +โ””โ”€โ”€ index.js (Main entry point, aggregates exports if needed) +``` + +## Mappings +The [flutterjs.imports.json](file:///c:/Jay/_Plugin/flutterjs/packages/flutterjs_engine/flutterjs.imports.json) (or the internal compiler resolution) will be configured to map: + +| Dart Import | Maps To (Physical Path) | +| :--- | :--- | +| `dart:math` | `@flutterjs/dart/math` | +| `dart:async` | `@flutterjs/dart/async` | +| `dart:convert` | `@flutterjs/dart/convert` | +| `dart:collection` | `@flutterjs/dart/collection` | +| `dart:developer` | `@flutterjs/dart/developer` | +| `dart:typed_data` | `@flutterjs/dart/typed_data` | + +## Execution Steps + +### 1. Create `packages/flutterjs_dart` +- Initialize [package.json](file:///c:/Jay/_Plugin/flutterjs/packages/flutterjs_engine/package.json) with name `@flutterjs/dart`. +- Configure `exports` in [package.json](file:///c:/Jay/_Plugin/flutterjs/packages/flutterjs_engine/package.json) to expose subpaths `./math`, `./async`, etc. + +### 2. Implement Modules +- **Math**: Wrapper for JS `Math`. +- **Async**: `Future` (Promise wrapper), `Timer`. +- **Convert**: `JSON` wrapper. +- **Collection**: `List` (Array), `Map` (Map), `Set` (Set). +- **TypedData**: `Uint8Array` wrapper. + +### 3. Update Transpiler +- Modify `flutterjs_gen` to rewrite `dart:` to `@flutterjs/dart/`. + +### 4. Register in Engine +- Update [packages/flutterjs_engine/flutterjs.imports.json](file:///c:/Jay/_Plugin/flutterjs/packages/flutterjs_engine/flutterjs.imports.json) to point `@flutterjs/dart` to the local implementation. + +## Benefits +- **Cleanliness**: One folder `packages/flutterjs_dart` instead of 6+. +- **Maintainability**: Shared utilities (like a base JS wrapper class) can live in `packages/flutterjs_dart/src/utils` and be reused across libs. +- **Scalability**: Adding `dart:isolate` or `dart:ui` later just means adding a folder. diff --git a/examples/core_lib_demo/flutterjs.config.js b/examples/core_lib_demo/flutterjs.config.js new file mode 100644 index 00000000..4e535e70 --- /dev/null +++ b/examples/core_lib_demo/flutterjs.config.js @@ -0,0 +1,6 @@ +module.exports = { + packages: { + 'flutterjs': null, // TODO: Set to 'flutterjs_flutterjs:version' or { path: './...' } + 'flutterjs_material': null, // TODO: Set to 'flutterjs_flutterjs_material:version' or { path: './...' } + } +}; diff --git a/examples/core_lib_demo/lib/main.dart b/examples/core_lib_demo/lib/main.dart new file mode 100644 index 00000000..0130fba2 --- /dev/null +++ b/examples/core_lib_demo/lib/main.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'dart:math'; +import 'dart:async'; +import 'dart:developer' as developer; +import 'dart:collection'; +import 'dart:typed_data'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + // --- Test dart:math --- + final rand = Random().nextInt(100); + final point = Point(10, 20); + + // --- Test dart:async --- + Timer(const Duration(seconds: 1), () { + developer.log('Timer fired!'); + }); + Future.delayed(const Duration(milliseconds: 500), () { + developer.log('Future completed'); + }); + + + // --- Test dart:collection --- + final queue = Queue(); + queue.add(1); + queue.addLast(2); + + // --- Test dart:typed_data --- + final bytes = Uint8List(8); + bytes[0] = 255; + + // --- Test dart:developer --- + developer.log('Build complete. Random: $rand, Point: $point'); + + return Container(); + } +} diff --git a/examples/core_lib_demo/pubspec.yaml b/examples/core_lib_demo/pubspec.yaml new file mode 100644 index 00000000..2beb272e --- /dev/null +++ b/examples/core_lib_demo/pubspec.yaml @@ -0,0 +1,7 @@ +name: core_lib_demo +description: A new FlutterJS project. +dependencies: + flutterjs: + path: ../../packages/flutterjs + flutterjs_material: + path: ../../packages/flutterjs_material diff --git a/examples/counter/lib/final_test/test.dart b/examples/counter/lib/final_test/test.dart deleted file mode 100644 index 89c31a3c..00000000 --- a/examples/counter/lib/final_test/test.dart +++ /dev/null @@ -1,138 +0,0 @@ -// lib/main.dart -// The ultimate minimal stress-test for your FlutterJs compiler -// If this file compiles to working <80 KB JS โ†’ you have won. - -import 'package:flutter/material.dart'; // โ† your @flutterjs/material -import 'package:provider/provider.dart'; // โ† your @flutterjs/provider -import 'package:http/http.dart' as http; // โ† your @flutterjs/http -import 'dart:convert'; // โ† your @flutterjs/convert -import 'dart:math' as math; // โ† your @flutterjs/math -import 'dart:async'; - -void main() => runApp(MyApp()); - -class CounterModel extends ChangeNotifier { - int _count = 0; - String status = 'Idle'; - List history = []; - - int get count => _count; - - void increment() { - _count++; - history.add('+$count at ${DateTime.now().toIso8601String()}'); - status = 'Last action: increment'; - notifyListeners(); - } - - Future fetchQuote() async { - status = 'Fetching...'; - notifyListeners(); - - try { - final resp = await http.get(Uri.parse('https://api.quotable.io/random')); - if (resp.statusCode == 200) { - final data = jsonDecode(resp.body); - final quote = data['content'] as String; - history.add('Quote: ${quote.substring(0, 30)}...'); - status = 'Quote loaded'; - } else { - status = 'HTTP ${resp.statusCode}'; - } - } catch (e) { - status = 'Error: $e'; - } - notifyListeners(); - } - - void reset() { - _count = 0; - history.clear(); - status = 'Reset'; - notifyListeners(); - } -} - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (_) => CounterModel(), - child: MaterialApp( - title: 'FlutterJs Stress Test', - debugShowCheckedModeBanner: false, - theme: ThemeData(primarySwatch: Colors.indigo), - home: HomePage(), - ), - ); - } -} - -class HomePage extends StatelessWidget { - @override - Widget build(BuildContext context) { - final model = context.watch(); - - return Scaffold( - appBar: AppBar( - title: Text('FlutterJs Stress Test'), - backgroundColor: Colors.indigo, - ), - body: Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 1. Reactive Text + Theme - Text( - 'Count: ${model.count} ${math.min(10, 20)}', - style: Theme.of(context).textTheme.headlineMedium!.copyWith( - color: model.count.isEven ? Colors.indigo : Colors.purple, - ), - ), - SizedBox(height: 20), - - // 2. Row of buttons - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ElevatedButton(onPressed: model.increment, child: Text('+1')), - SizedBox(width: 16), - ElevatedButton(onPressed: model.reset, child: Text('Reset')), - SizedBox(width: 16), - ElevatedButton( - onPressed: model.fetchQuote, - child: Text('Fetch Quote'), - ), - ], - ), - SizedBox(height: 20), - - // 3. Async status - Text('Status: ${model.status}'), - - SizedBox(height: 20), - - // 4. ListView with dynamic data - Expanded( - child: ListView.builder( - itemCount: model.history.length, - itemBuilder: (context, i) => Card( - child: ListTile( - leading: CircleAvatar(child: Text('${i + 1}')), - title: Text(model.history[i]), - subtitle: Text('Item $i'), - ), - ), - ), - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: model.increment, - child: Icon(Icons.add), - ), - ); - } -} diff --git a/examples/counter/pubspec.yaml b/examples/counter/pubspec.yaml index d5d6a865..8a71dd25 100644 --- a/examples/counter/pubspec.yaml +++ b/examples/counter/pubspec.yaml @@ -35,9 +35,8 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 - provider: - http: + # cupertino_icons: ^1.0.8 + dev_dependencies: flutter_test: diff --git a/examples/flutterjs_website b/examples/flutterjs_website index b2b392de..ce8abf61 160000 --- a/examples/flutterjs_website +++ b/examples/flutterjs_website @@ -1 +1 @@ -Subproject commit b2b392def2374bdf7a1a95357bf118f3e0e33d16 +Subproject commit ce8abf61d9dfd351c774e80a240fff4ea560d84a diff --git a/examples/material_advanced_demo/lib/main.dart b/examples/material_advanced_demo/lib/main.dart new file mode 100644 index 00000000..03bcbb92 --- /dev/null +++ b/examples/material_advanced_demo/lib/main.dart @@ -0,0 +1,177 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const AdvancedDemoApp()); +} + +class AdvancedDemoApp extends StatelessWidget { + const AdvancedDemoApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Advanced Demo', + theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.teal), + home: const AdvancedPage(), + ); + } +} + +class AdvancedPage extends StatefulWidget { + const AdvancedPage({super.key}); + + @override + State createState() => _AdvancedPageState(); +} + +class _AdvancedPageState extends State { + String _dropdownValue = 'One'; + DateTime? _selectedDate; + + // Clean mock for refresh + Future _handleRefresh() async { + await Future.delayed(const Duration(seconds: 2)); + print('Refreshed!'); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Advanced Widgets'), + actions: [ + IconButton( + icon: const Icon(Icons.info), + onPressed: () { + showAboutDialog( + context: context, + applicationName: 'Advanced Demo', + applicationVersion: '1.0.0', + applicationLegalese: 'ยฉ 2026 FlutterJS', + children: [const Text('This demo showcases complex widgets.')], + ); + }, + ), + ], + ), + body: RefreshIndicator( + onRefresh: _handleRefresh, + child: SingleChildScrollView( + physics: + const AlwaysScrollableScrollPhysics(), // Ensure scroll for refresh + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Carousel', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + const SizedBox(height: 10), + Container( + height: 150, + color: Colors.grey.shade200, + alignment: Alignment.center, + child: const Text( + 'Carousel (Custom widget - see src/material/carousel.js)', + ), + ), + const Divider(height: 30), + + const Text( + 'Dropdown', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + DropdownButton( + value: _dropdownValue, + onChanged: (String? newValue) { + setState(() { + _dropdownValue = newValue!; + }); + }, + items: ['One', 'Two', 'Three', 'Four'] + .map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }) + .toList(), + ), + const Divider(height: 30), + + const Text( + 'Pickers', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + ElevatedButton( + onPressed: () async { + final DateTime? picked = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2020), + lastDate: DateTime(2030), + ); + if (picked != null && picked != _selectedDate) { + setState(() { + _selectedDate = picked; + }); + } + }, + child: Text( + _selectedDate == null + ? 'Select Date' + : 'Date: ${_selectedDate!.toLocal()}'.split(' ')[0], + ), + ), + + const Divider(height: 30), + const Text( + 'Ink & Interaction', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + + Material( + color: Colors.amberAccent, + child: InkWell( + onTap: () { + print('InkWell tapped'); + }, + splashColor: Colors.blue.withOpacity(0.3), + child: Container( + width: 100, + height: 100, + alignment: Alignment.center, + child: Text('Tap Me (InkWell)'), + ), + ), + ), + + const Divider(height: 30), + const Text( + 'Extras', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + const Row( + children: [ + FlutterLogo(size: 48), + SizedBox(width: 20), + BackButton(), + SizedBox(width: 10), + CloseButton(), + ], + ), + + const SizedBox(height: 50), // Pad for scrolling + const Center(child: Text('Pull down to refresh...')), + ], + ), + ), + ), + ); + } +} diff --git a/examples/material_advanced_demo/pubspec.yaml b/examples/material_advanced_demo/pubspec.yaml new file mode 100644 index 00000000..4bdaa694 --- /dev/null +++ b/examples/material_advanced_demo/pubspec.yaml @@ -0,0 +1,15 @@ +name: material_advanced_demo +description: "Demo of Advanced Material Widgets" +publish_to: 'none' +version: 1.0.0+1 +environment: + sdk: ^3.10.0-278.0.dev +dependencies: + flutter: + sdk: flutter +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 +flutter: + uses-material-design: true diff --git a/examples/material_advanced_demo/web/index.html b/examples/material_advanced_demo/web/index.html new file mode 100644 index 00000000..8b4d16cb --- /dev/null +++ b/examples/material_advanced_demo/web/index.html @@ -0,0 +1,15 @@ + + + + + + + + Advanced Demo + + + + + + + \ No newline at end of file diff --git a/examples/material_buttons_demo/lib/main.dart b/examples/material_buttons_demo/lib/main.dart new file mode 100644 index 00000000..c1233972 --- /dev/null +++ b/examples/material_buttons_demo/lib/main.dart @@ -0,0 +1,180 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const ButtonsDemoApp()); +} + +class ButtonsDemoApp extends StatelessWidget { + const ButtonsDemoApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Buttons Demo', + theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.blue), + home: const ButtonsPage(), + ); + } +} + +class ButtonsPage extends StatefulWidget { + const ButtonsPage({super.key}); + + @override + State createState() => _ButtonsPageState(); +} + +class _ButtonsPageState extends State { + final List _toggleState = [true, false, false]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Buttons & Toggles')), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Common Buttons', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + ElevatedButton(onPressed: () {}, child: const Text('Elevated')), + FilledButton(onPressed: () {}, child: const Text('Filled')), + FilledButton.tonal( + onPressed: () {}, + child: const Text('Filled Tonal'), + ), + OutlinedButton(onPressed: () {}, child: const Text('Outlined')), + TextButton(onPressed: () {}, child: const Text('Text')), + ], + ), + const Divider(height: 30), + + const Text( + 'Icon Buttons', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + Row( + children: [ + IconButton(icon: const Icon(Icons.add), onPressed: () {}), + IconButton.filled( + icon: const Icon(Icons.edit), + onPressed: () {}, + ), + IconButton.outlined( + icon: const Icon(Icons.delete), + onPressed: () {}, + ), + ], + ), + const Divider(height: 30), + + const Text( + 'Floating Action Buttons', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + Row( + children: [ + FloatingActionButton( + onPressed: () {}, + child: const Icon(Icons.add), + ), + const SizedBox(width: 10), + FloatingActionButton.small( + onPressed: () {}, + child: const Icon(Icons.remove), + ), + const SizedBox(width: 10), + FloatingActionButton.large( + onPressed: () {}, + child: const Icon(Icons.check), + ), + const SizedBox(width: 10), + FloatingActionButton.extended( + onPressed: () {}, + label: const Text('Extended'), + icon: const Icon(Icons.edit), + ), + ], + ), + const Divider(height: 30), + + const Text( + 'Toggle Buttons', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + ToggleButtons( + isSelected: _toggleState, + onPressed: (index) { + setState(() { + _toggleState[index] = !_toggleState[index]; + }); + }, + children: const [ + Icon(Icons.format_bold), + Icon(Icons.format_italic), + Icon(Icons.format_underline), + ], + ), + const Divider(height: 30), + + const Text( + 'Menu Buttons', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + MenuAnchor( + builder: + ( + BuildContext context, + MenuController controller, + Widget? child, + ) { + return FilledButton( + onPressed: () { + if (controller.isOpen) { + controller.close(); + } else { + controller.open(); + } + }, + child: const Text('Show Menu'), + ); + }, + menuChildren: [ + MenuItemButton(onPressed: () {}, child: const Text('Item 1')), + MenuItemButton(onPressed: () {}, child: const Text('Item 2')), + SubmenuButton( + menuChildren: [ + MenuItemButton( + onPressed: () {}, + child: const Text('Subitem 1'), + ), + ], + child: const Text('Submenu'), + ), + ], + ), + const SizedBox(height: 10), + PopupMenuButton( + itemBuilder: (context) => [ + const PopupMenuItem(child: Text('Popup 1')), + const PopupMenuItem(child: Text('Popup 2')), + ], + ), + ], + ), + ), + ); + } +} diff --git a/examples/material_buttons_demo/pubspec.yaml b/examples/material_buttons_demo/pubspec.yaml new file mode 100644 index 00000000..5a4de6a7 --- /dev/null +++ b/examples/material_buttons_demo/pubspec.yaml @@ -0,0 +1,15 @@ +name: material_buttons_demo +description: "Demo of Material Buttons" +publish_to: 'none' +version: 1.0.0+1 +environment: + sdk: ^3.10.0-278.0.dev +dependencies: + flutter: + sdk: flutter +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 +flutter: + uses-material-design: true diff --git a/examples/material_buttons_demo/web/index.html b/examples/material_buttons_demo/web/index.html new file mode 100644 index 00000000..1790b904 --- /dev/null +++ b/examples/material_buttons_demo/web/index.html @@ -0,0 +1,15 @@ + + + + + + + + Buttons Demo + + + + + + + \ No newline at end of file diff --git a/examples/material_demo/.gitignore b/examples/material_demo/.gitignore new file mode 100644 index 00000000..1776e0ce --- /dev/null +++ b/examples/material_demo/.gitignore @@ -0,0 +1,56 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# VS Code +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/coverage/ + +# FlutterJS Generated Artifacts - โœ… NEW +build/ +.dev/ +dist/ +node_modules/ +flutterjs.config.js +package.json +package-lock.json +public/index.html + +# Generated JS files in source (if any) +src/**/*.js +!src/**/*.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/examples/material_demo/.metadata b/examples/material_demo/.metadata new file mode 100644 index 00000000..43ca89cf --- /dev/null +++ b/examples/material_demo/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "71164f3d8d907c8fe7a884cec0e8f73be288572c" + channel: "master" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + base_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + - platform: android + create_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + base_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + - platform: ios + create_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + base_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + - platform: linux + create_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + base_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + - platform: macos + create_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + base_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + - platform: web + create_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + base_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + - platform: windows + create_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + base_revision: 71164f3d8d907c8fe7a884cec0e8f73be288572c + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/examples/material_demo/README.md b/examples/material_demo/README.md new file mode 100644 index 00000000..9498e65d --- /dev/null +++ b/examples/material_demo/README.md @@ -0,0 +1,16 @@ +# counter + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/examples/material_demo/analysis_options.yaml b/examples/material_demo/analysis_options.yaml new file mode 100644 index 00000000..0d290213 --- /dev/null +++ b/examples/material_demo/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/examples/material_demo/lib/main.dart b/examples/material_demo/lib/main.dart new file mode 100644 index 00000000..d3f86c26 --- /dev/null +++ b/examples/material_demo/lib/main.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const MaterialDemoApp()); +} + +class MaterialDemoApp extends StatelessWidget { + const MaterialDemoApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'FlutterJS Material Demo', + theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: true), + home: const DemoPage(), + ); + } +} + +class DemoPage extends StatefulWidget { + const DemoPage({super.key}); + + @override + State createState() => _DemoPageState(); +} + +class _DemoPageState extends State { + bool _isChecked = false; + bool _isSwitched = false; + int _radioValue = 1; + final TextEditingController _textController = TextEditingController(); + final GlobalKey _formKey = GlobalKey(); + + void _showDialog(BuildContext context) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Dialog Title'), + content: const Text('This is a sample dialog content.'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('CANCEL'), + ), + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Material Components'), + actions: [IconButton(icon: const Icon(Icons.info), onPressed: () {})], + ), + drawer: Drawer( + child: ListView( + children: const [ + DrawerHeader(child: Text('Drawer Header')), + ListTile(title: Text('Item 1')), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('FAB Pressed!'))); + }, + child: const Icon(Icons.add), + ), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Selection Controls', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + CheckboxListTile( + title: const Text('Checkbox Option'), + value: _isChecked, + onChanged: (val) => setState(() => _isChecked = val == true), + ), + SwitchListTile( + title: const Text('Switch Option'), + value: _isSwitched, + onChanged: (val) => setState(() => _isSwitched = val), + ), + RadioListTile( + title: const Text('Radio Option 1'), + value: 1, + groupValue: _radioValue, + onChanged: (val) => setState(() => _radioValue = val!), + ), + RadioListTile( + title: const Text('Radio Option 2'), + value: 2, + groupValue: _radioValue, + onChanged: (val) => setState(() => _radioValue = val!), + ), + + const Divider(height: 32), + + const Text( + 'Inputs & Forms', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + TextField( + controller: _textController, + decoration: const InputDecoration( + labelText: 'TextField', + border: OutlineInputBorder(), + ), + ), + const SizedBox(height: 16), + Form( + key: _formKey, + child: TextFormField( + decoration: const InputDecoration( + labelText: 'TextFormField (Required)', + border: OutlineInputBorder(), + ), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter some text'; + } + return null; + }, + ), + ), + const SizedBox(height: 10), + ElevatedButton( + onPressed: () { + print('Form Key: ${_formKey}'); + print('Current State: ${_formKey.currentState}'); + if (_formKey.currentState != null) { + if (_formKey.currentState!.validate()) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Form Validated!')), + ); + } + } else { + print('Form State is NULL'); + } + }, + child: const Text('Validate Form'), + ), + + const Divider(height: 32), + + const Text( + 'Progress Indicators', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + const LinearProgressIndicator(), + const SizedBox(height: 16), + const Center(child: CircularProgressIndicator()), + + const Divider(height: 32), + + const Text( + 'Dialogs', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + ElevatedButton( + onPressed: () => _showDialog(context), + child: const Text('Show Dialog'), + ), + ], + ), + ), + ), + ); + } +} diff --git a/examples/material_demo/pubspec.yaml b/examples/material_demo/pubspec.yaml new file mode 100644 index 00000000..14e07c2d --- /dev/null +++ b/examples/material_demo/pubspec.yaml @@ -0,0 +1,91 @@ +name: material_demo +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +resolution: workspace + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ^3.10.0-278.0.dev + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^6.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/examples/material_demo/web/favicon.png b/examples/material_demo/web/favicon.png new file mode 100644 index 00000000..8aaa46ac Binary files /dev/null and b/examples/material_demo/web/favicon.png differ diff --git a/examples/material_demo/web/icons/Icon-192.png b/examples/material_demo/web/icons/Icon-192.png new file mode 100644 index 00000000..b749bfef Binary files /dev/null and b/examples/material_demo/web/icons/Icon-192.png differ diff --git a/examples/material_demo/web/icons/Icon-512.png b/examples/material_demo/web/icons/Icon-512.png new file mode 100644 index 00000000..88cfd48d Binary files /dev/null and b/examples/material_demo/web/icons/Icon-512.png differ diff --git a/examples/material_demo/web/icons/Icon-maskable-192.png b/examples/material_demo/web/icons/Icon-maskable-192.png new file mode 100644 index 00000000..eb9b4d76 Binary files /dev/null and b/examples/material_demo/web/icons/Icon-maskable-192.png differ diff --git a/examples/material_demo/web/icons/Icon-maskable-512.png b/examples/material_demo/web/icons/Icon-maskable-512.png new file mode 100644 index 00000000..d69c5669 Binary files /dev/null and b/examples/material_demo/web/icons/Icon-maskable-512.png differ diff --git a/examples/material_demo/web/index.html b/examples/material_demo/web/index.html new file mode 100644 index 00000000..24a6d80f --- /dev/null +++ b/examples/material_demo/web/index.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + counter + + + + + + + + \ No newline at end of file diff --git a/examples/material_demo/web/manifest.json b/examples/material_demo/web/manifest.json new file mode 100644 index 00000000..cd67d74b --- /dev/null +++ b/examples/material_demo/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "counter", + "short_name": "counter", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/examples/material_display_demo/lib/main.dart b/examples/material_display_demo/lib/main.dart new file mode 100644 index 00000000..aeb3562d --- /dev/null +++ b/examples/material_display_demo/lib/main.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const DisplayDemoApp()); +} + +class DisplayDemoApp extends StatelessWidget { + const DisplayDemoApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Display Demo', + theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.purple), + home: const DisplayPage(), + ); + } +} + +class DisplayPage extends StatelessWidget { + const DisplayPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Display & Feedback')), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Chips', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + Wrap( + spacing: 8, + children: [ + const Chip(label: Text('Chip')), + ActionChip( + avatar: const Icon(Icons.favorite), + label: const Text('Action Chip'), + onPressed: () {}, + ), + const Chip( + avatar: CircleAvatar( + backgroundColor: Colors.blue, + child: Text('J'), + ), + label: Text('Avatar Chip'), + ), + ], + ), + const Divider(height: 30), + + const Text( + 'Cards', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + const Card( + child: SizedBox( + width: 300, + height: 100, + child: Center(child: Text('Elevated Card')), + ), + ), + const SizedBox(height: 10), + Card( + elevation: 0, + shape: RoundedRectangleBorder( + side: BorderSide(color: Theme.of(context).colorScheme.outline), + borderRadius: const BorderRadius.all(Radius.circular(12)), + ), + child: const SizedBox( + width: 300, + height: 100, + child: Center(child: Text('Outlined Card')), + ), + ), + const Divider(height: 30), + + const Text( + 'Badges', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + Row( + children: [ + Badge( + label: const Text('3'), + child: IconButton( + icon: const Icon(Icons.notifications), + onPressed: () {}, + ), + ), + const SizedBox(width: 20), + Badge( + child: IconButton( + icon: const Icon(Icons.email), + onPressed: () {}, + ), + ), + ], + ), + const Divider(height: 30), + + const Text( + 'Progress', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + const LinearProgressIndicator(), + const SizedBox(height: 20), + const Row( + children: [ + CircularProgressIndicator(), + SizedBox(width: 20), + CircularProgressIndicator(value: 0.5), + ], + ), + const Divider(height: 30), + + const Text( + 'Tooltips', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + Tooltip( + message: 'This is a tooltip', + child: ElevatedButton( + onPressed: () {}, + child: const Text('Hover Me'), + ), + ), + + const Divider(height: 30), + + ElevatedButton( + onPressed: () { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text('This is a SnackBar'), + action: SnackBarAction(label: 'UNDO', onPressed: () {}), + ), + ); + }, + child: const Text('Show SnackBar'), + ), + const SizedBox(height: 10), + ElevatedButton( + onPressed: () { + ScaffoldMessenger.of(context).showMaterialBanner( + const MaterialBanner( + content: Text('This is a Banner'), + actions: [ + TextButton(onPressed: null, child: Text('DISMISS')), + ], + ), + ); + }, + child: const Text('Show Banner (Mock)'), + ), + ], + ), + ), + ); + } +} diff --git a/examples/material_display_demo/pubspec.yaml b/examples/material_display_demo/pubspec.yaml new file mode 100644 index 00000000..86f6541a --- /dev/null +++ b/examples/material_display_demo/pubspec.yaml @@ -0,0 +1,15 @@ +name: material_display_demo +description: "Demo of Material Display Widgets" +publish_to: 'none' +version: 1.0.0+1 +environment: + sdk: ^3.10.0-278.0.dev +dependencies: + flutter: + sdk: flutter +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 +flutter: + uses-material-design: true diff --git a/examples/material_display_demo/web/index.html b/examples/material_display_demo/web/index.html new file mode 100644 index 00000000..24e311bc --- /dev/null +++ b/examples/material_display_demo/web/index.html @@ -0,0 +1,15 @@ + + + + + + + + Display Demo + + + + + + + \ No newline at end of file diff --git a/examples/material_inputs_demo/lib/main.dart b/examples/material_inputs_demo/lib/main.dart new file mode 100644 index 00000000..25d9a804 --- /dev/null +++ b/examples/material_inputs_demo/lib/main.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const InputsDemoApp()); +} + +class InputsDemoApp extends StatelessWidget { + const InputsDemoApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Inputs Demo', + theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.orange), + home: const InputsPage(), + ); + } +} + +class InputsPage extends StatefulWidget { + const InputsPage({super.key}); + + @override + State createState() => _InputsPageState(); +} + +class _InputsPageState extends State { + bool _isChecked = false; + bool _isSwitchOn = true; + double _sliderValue = 0.5; + int _radioVal = 0; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Inputs')), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + const TextField( + decoration: InputDecoration( + labelText: 'Standard TextField', + border: OutlineInputBorder(), + ), + ), + const SizedBox(height: 16), + const TextField( + obscureText: true, + decoration: InputDecoration( + labelText: 'Password', + border: UnderlineInputBorder(), + icon: Icon(Icons.lock), + ), + ), + const SizedBox(height: 16), + Row( + children: [ + Checkbox( + value: _isChecked, + onChanged: (v) => setState(() => _isChecked = v!), + ), + const Text('Checkbox'), + ], + ), + SwitchListTile( + title: const Text('Switch Tile'), + value: _isSwitchOn, + onChanged: (v) => setState(() => _isSwitchOn = v), + ), + const Divider(), + RadioListTile( + title: const Text('Option A'), + value: 0, + groupValue: _radioVal, + onChanged: (v) => setState(() => _radioVal = v!), + ), + RadioListTile( + title: const Text('Option B'), + value: 1, + groupValue: _radioVal, + onChanged: (v) => setState(() => _radioVal = v!), + ), + const Divider(), + const Text('Slider'), + Slider( + value: _sliderValue, + onChanged: (v) => setState(() => _sliderValue = v), + label: '$_sliderValue', + divisions: 10, + ), + const SizedBox(height: 20), + OutlinedButton( + onPressed: () async { + final TimeOfDay? time = await showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ); + if (time != null) { + print('picked time: $time'); + } + }, + child: const Text('Pick Time'), + ), + ], + ), + ), + ); + } +} diff --git a/examples/material_inputs_demo/pubspec.yaml b/examples/material_inputs_demo/pubspec.yaml new file mode 100644 index 00000000..5e1e51f8 --- /dev/null +++ b/examples/material_inputs_demo/pubspec.yaml @@ -0,0 +1,15 @@ +name: material_inputs_demo +description: "Demo of Material Inputs" +publish_to: 'none' +version: 1.0.0+1 +environment: + sdk: ^3.10.0-278.0.dev +dependencies: + flutter: + sdk: flutter +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 +flutter: + uses-material-design: true diff --git a/examples/material_inputs_demo/web/index.html b/examples/material_inputs_demo/web/index.html new file mode 100644 index 00000000..44c17823 --- /dev/null +++ b/examples/material_inputs_demo/web/index.html @@ -0,0 +1,15 @@ + + + + + + + + Inputs Demo + + + + + + + \ No newline at end of file diff --git a/examples/material_navigation_demo/lib/main.dart b/examples/material_navigation_demo/lib/main.dart new file mode 100644 index 00000000..b8860df4 --- /dev/null +++ b/examples/material_navigation_demo/lib/main.dart @@ -0,0 +1,120 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const NavigationDemoApp()); +} + +class NavigationDemoApp extends StatelessWidget { + const NavigationDemoApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Navigation Demo', + theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.green), + home: const NavigationHome(), + ); + } +} + +class NavigationHome extends StatefulWidget { + const NavigationHome({super.key}); + + @override + State createState() => _NavigationHomeState(); +} + +class _NavigationHomeState extends State { + int _screenIndex = 0; + + @override + Widget build(BuildContext context) { + // Responsive Navigation strategy + // Narrow < 600: NavigationBar (Bottom) + // Wide >= 600: NavigationRail (Left) + + // For manual testing we will just show NavigationBar example first + + return Scaffold( + appBar: AppBar(title: const Text('Navigation')), + drawer: NavigationDrawer( + children: const [ + DrawerHeader(child: Text('Drawer Header')), + NavigationDrawerDestination( + icon: Icon(Icons.home), + label: Text('Home'), + ), + NavigationDrawerDestination( + icon: Icon(Icons.settings), + label: Text('Settings'), + ), + ], + ), + body: Row( + children: [ + // Show Rail only if screen is wide (simulated) + // NavigationRail( + // destinations: const [ + // NavigationRailDestination(icon: Icon(Icons.home), label: Text('Home')), + // NavigationRailDestination(icon: Icon(Icons.star), label: Text('Favorites')), + // ], + // selectedIndex: _screenIndex, + // onDestinationSelected: (val) => setState(() => _screenIndex = val), + // ), + // Vertical Divider + Expanded( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('Selected Index: $_screenIndex'), + const SizedBox(height: 20), + const Text('Tabs Demo:'), + const SizedBox(height: 10), + const SizedBox( + height: 200, + child: DefaultTabController( + length: 3, + child: Column( + children: [ + TabBar( + tabs: [ + Tab(icon: Icon(Icons.cloud), text: 'Cloud'), + Tab( + icon: Icon(Icons.beach_access), + text: 'Beach', + ), + Tab(icon: Icon(Icons.sunny), text: 'Sunny'), + ], + ), + Expanded( + child: TabBarView( + children: [ + Center(child: Text('Cloudy')), + Center(child: Text('Rainy')), + Center(child: Text('Sunny')), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ], + ), + bottomNavigationBar: NavigationBar( + selectedIndex: _screenIndex, + onDestinationSelected: (val) => setState(() => _screenIndex = val), + destinations: const [ + NavigationDestination(icon: Icon(Icons.home), label: 'Home'), + NavigationDestination(icon: Icon(Icons.explore), label: 'Explore'), + NavigationDestination(icon: Icon(Icons.person), label: 'Profile'), + ], + ), + ); + } +} diff --git a/examples/material_navigation_demo/pubspec.yaml b/examples/material_navigation_demo/pubspec.yaml new file mode 100644 index 00000000..6f439a41 --- /dev/null +++ b/examples/material_navigation_demo/pubspec.yaml @@ -0,0 +1,15 @@ +name: material_navigation_demo +description: "Demo of Material Navigation" +publish_to: 'none' +version: 1.0.0+1 +environment: + sdk: ^3.10.0-278.0.dev +dependencies: + flutter: + sdk: flutter +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 +flutter: + uses-material-design: true diff --git a/examples/material_navigation_demo/web/index.html b/examples/material_navigation_demo/web/index.html new file mode 100644 index 00000000..282c9a8e --- /dev/null +++ b/examples/material_navigation_demo/web/index.html @@ -0,0 +1,15 @@ + + + + + + + + Navigation Demo + + + + + + + \ No newline at end of file diff --git a/examples/material_structure_demo/lib/main.dart b/examples/material_structure_demo/lib/main.dart new file mode 100644 index 00000000..742212bb --- /dev/null +++ b/examples/material_structure_demo/lib/main.dart @@ -0,0 +1,140 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const StructureDemoApp()); +} + +class StructureDemoApp extends StatelessWidget { + const StructureDemoApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Structure Demo', + theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.indigo), + home: const StructurePage(), + ); + } +} + +class StructurePage extends StatefulWidget { + const StructurePage({super.key}); + + @override + State createState() => _StructurePageState(); +} + +class _StructurePageState extends State { + final List _expanded = [false, false]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Structure & Layout')), + body: SingleChildScrollView( + child: Column( + children: [ + const ListTile( + leading: Icon(Icons.info), + title: Text('Standard List Tile'), + subtitle: Text('Supporting text'), + trailing: Icon(Icons.chevron_right), + ), + const Divider(), + + ExpansionPanelList( + expansionCallback: (int index, bool isExpanded) { + setState(() { + _expanded[index] = + isExpanded; // API difference: isExpanded is new state in recent Flutter, check your impl + }); + }, + children: [ + ExpansionPanel( + headerBuilder: (c, e) => + const ListTile(title: Text('Panel 1')), + body: const Padding( + padding: EdgeInsets.all(16), + child: Text('Body 1'), + ), + isExpanded: _expanded[0], + ), + ExpansionPanel( + headerBuilder: (c, e) => + const ListTile(title: Text('Panel 2')), + body: const Padding( + padding: EdgeInsets.all(16), + child: Text('Body 2'), + ), + isExpanded: _expanded[1], + ), + ], + ), + const Divider(height: 30), + + const Text( + 'DataTable', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + DataTable( + columns: const [ + DataColumn(label: Text('Name')), + DataColumn(label: Text('Role')), + ], + rows: const [ + DataRow( + cells: [DataCell(Text('Alice')), DataCell(Text('Engineer'))], + ), + DataRow( + cells: [DataCell(Text('Bob')), DataCell(Text('Designer'))], + ), + ], + ), + const Divider(height: 30), + + GridView.count( + shrinkWrap: true, // For demo inside ScrollView + physics: const NeverScrollableScrollPhysics(), + crossAxisCount: 2, + children: [ + GridTile( + header: const GridTileBar( + title: Text('Header'), + backgroundColor: Colors.black45, + ), + footer: const GridTileBar( + title: Text('Footer'), + backgroundColor: Colors.black45, + ), + child: Container(color: Colors.amber, height: 100), + ), + Container(color: Colors.cyan, height: 100), + ], + ), + + const SizedBox(height: 20), + ElevatedButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (c) => Container( + height: 200, + color: Colors.white, + child: Center( + child: ElevatedButton( + onPressed: () => Navigator.pop(c), + child: const Text('Close BottomSheet'), + ), + ), + ), + ); + }, + child: const Text('Show BottomSheet'), + ), + const SizedBox(height: 20), + ], + ), + ), + ); + } +} diff --git a/examples/material_structure_demo/pubspec.yaml b/examples/material_structure_demo/pubspec.yaml new file mode 100644 index 00000000..7eac2519 --- /dev/null +++ b/examples/material_structure_demo/pubspec.yaml @@ -0,0 +1,15 @@ +name: material_structure_demo +description: "Demo of Material Structure Widgets" +publish_to: 'none' +version: 1.0.0+1 +environment: + sdk: ^3.10.0-278.0.dev +dependencies: + flutter: + sdk: flutter +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 +flutter: + uses-material-design: true diff --git a/examples/material_structure_demo/web/index.html b/examples/material_structure_demo/web/index.html new file mode 100644 index 00000000..b65e811e --- /dev/null +++ b/examples/material_structure_demo/web/index.html @@ -0,0 +1,15 @@ + + + + + + + + Structure Demo + + + + + + + \ No newline at end of file diff --git a/examples/multi_file_test/.gitignore b/examples/multi_file_test/.gitignore new file mode 100644 index 00000000..1776e0ce --- /dev/null +++ b/examples/multi_file_test/.gitignore @@ -0,0 +1,56 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# VS Code +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/coverage/ + +# FlutterJS Generated Artifacts - โœ… NEW +build/ +.dev/ +dist/ +node_modules/ +flutterjs.config.js +package.json +package-lock.json +public/index.html + +# Generated JS files in source (if any) +src/**/*.js +!src/**/*.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/examples/multi_file_test/.metadata b/examples/multi_file_test/.metadata new file mode 100644 index 00000000..1f2b3cb9 --- /dev/null +++ b/examples/multi_file_test/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "e74c5954502f51a5cb2089320767dfab8f611168" + channel: "master" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: e74c5954502f51a5cb2089320767dfab8f611168 + base_revision: e74c5954502f51a5cb2089320767dfab8f611168 + - platform: android + create_revision: e74c5954502f51a5cb2089320767dfab8f611168 + base_revision: e74c5954502f51a5cb2089320767dfab8f611168 + - platform: ios + create_revision: e74c5954502f51a5cb2089320767dfab8f611168 + base_revision: e74c5954502f51a5cb2089320767dfab8f611168 + - platform: linux + create_revision: e74c5954502f51a5cb2089320767dfab8f611168 + base_revision: e74c5954502f51a5cb2089320767dfab8f611168 + - platform: macos + create_revision: e74c5954502f51a5cb2089320767dfab8f611168 + base_revision: e74c5954502f51a5cb2089320767dfab8f611168 + - platform: web + create_revision: e74c5954502f51a5cb2089320767dfab8f611168 + base_revision: e74c5954502f51a5cb2089320767dfab8f611168 + - platform: windows + create_revision: e74c5954502f51a5cb2089320767dfab8f611168 + base_revision: e74c5954502f51a5cb2089320767dfab8f611168 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/examples/multi_file_test/README.md b/examples/multi_file_test/README.md new file mode 100644 index 00000000..296a9cc9 --- /dev/null +++ b/examples/multi_file_test/README.md @@ -0,0 +1,17 @@ +# multi_file_test + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter) +- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/examples/multi_file_test/analysis_options.yaml b/examples/multi_file_test/analysis_options.yaml new file mode 100644 index 00000000..0d290213 --- /dev/null +++ b/examples/multi_file_test/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/examples/multi_file_test/lib/main.dart b/examples/multi_file_test/lib/main.dart index 868fd728..a98e2d1d 100644 --- a/examples/multi_file_test/lib/main.dart +++ b/examples/multi_file_test/lib/main.dart @@ -30,7 +30,7 @@ class MyApp extends StatelessWidget { color: Colors.grey.shade100, child: Column( children: [ - UtilsWidget(), // Usage ensures import is kept + UtilsWidget(), // Usage ensures import is kept Expanded( child: ListView.builder( itemCount: users.length, diff --git a/examples/multi_file_test/lib/widgets/user_profile_card.dart b/examples/multi_file_test/lib/widgets/user_profile_card.dart index fcd87b3c..0ea21e31 100644 --- a/examples/multi_file_test/lib/widgets/user_profile_card.dart +++ b/examples/multi_file_test/lib/widgets/user_profile_card.dart @@ -15,14 +15,17 @@ class _UserProfileCardState extends State { bool _isFollowing = false; void _toggleFollow() { + print('Callback: _toggleFollow called. IsFollowing BEFORE: $_isFollowing'); setState(() { _isFollowing = !_isFollowing; + print('Callback: Inside setState. IsFollowing NOW: $_isFollowing'); }); - print('Follow status for ${widget.user.name}: $_isFollowing'); + // print('Follow status for ${widget.user.name}: $_isFollowing'); } @override Widget build(BuildContext context) { + print('Build: UserProfileCard build. IsFollowing: $_isFollowing'); return Container( margin: const EdgeInsets.all(10), padding: const EdgeInsets.all(16), diff --git a/examples/multi_file_test/pubspec.yaml b/examples/multi_file_test/pubspec.yaml index b26f95e5..d6d5c950 100644 --- a/examples/multi_file_test/pubspec.yaml +++ b/examples/multi_file_test/pubspec.yaml @@ -33,9 +33,9 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 - provider: - http: + # cupertino_icons: ^1.0.8 + # provider: + # http: dev_dependencies: flutter_test: diff --git a/examples/multi_file_test/web/favicon.png b/examples/multi_file_test/web/favicon.png new file mode 100644 index 00000000..8aaa46ac Binary files /dev/null and b/examples/multi_file_test/web/favicon.png differ diff --git a/examples/multi_file_test/web/icons/Icon-192.png b/examples/multi_file_test/web/icons/Icon-192.png new file mode 100644 index 00000000..b749bfef Binary files /dev/null and b/examples/multi_file_test/web/icons/Icon-192.png differ diff --git a/examples/multi_file_test/web/icons/Icon-512.png b/examples/multi_file_test/web/icons/Icon-512.png new file mode 100644 index 00000000..88cfd48d Binary files /dev/null and b/examples/multi_file_test/web/icons/Icon-512.png differ diff --git a/examples/multi_file_test/web/icons/Icon-maskable-192.png b/examples/multi_file_test/web/icons/Icon-maskable-192.png new file mode 100644 index 00000000..eb9b4d76 Binary files /dev/null and b/examples/multi_file_test/web/icons/Icon-maskable-192.png differ diff --git a/examples/multi_file_test/web/icons/Icon-maskable-512.png b/examples/multi_file_test/web/icons/Icon-maskable-512.png new file mode 100644 index 00000000..d69c5669 Binary files /dev/null and b/examples/multi_file_test/web/icons/Icon-maskable-512.png differ diff --git a/examples/multi_file_test/web/index.html b/examples/multi_file_test/web/index.html index ac626721..1e3dfe51 100644 --- a/examples/multi_file_test/web/index.html +++ b/examples/multi_file_test/web/index.html @@ -1,10 +1,46 @@ + + + - Multi File Test - + + + + + + + + + + + + + multi_file_test + + + diff --git a/examples/multi_file_test/web/manifest.json b/examples/multi_file_test/web/manifest.json new file mode 100644 index 00000000..fd41efd1 --- /dev/null +++ b/examples/multi_file_test/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "multi_file_test", + "short_name": "multi_file_test", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/examples/routing_app/.gitignore b/examples/routing_app/.gitignore index 53158823..1776e0ce 100644 --- a/examples/routing_app/.gitignore +++ b/examples/routing_app/.gitignore @@ -1,25 +1,56 @@ -# Dependencies -node_modules/ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ -# Build outputs -dist/ +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# VS Code +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/coverage/ + +# FlutterJS Generated Artifacts - โœ… NEW +build/ .dev/ -.debug/ +dist/ +node_modules/ +flutterjs.config.js +package.json +package-lock.json +public/index.html -# Generated files -.flutter_js/ -.cache/ +# Generated JS files in source (if any) +src/**/*.js +!src/**/*.dart -# OS files -.DS_Store -Thumbs.db +# Symbolication related +app.*.symbols -# IDE -.vscode/ -.idea/ -*.swp -*.swo +# Obfuscation related +app.*.map.json -# Logs -*.log -npm-debug.log* +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/examples/routing_app/debug_main.txt b/examples/routing_app/debug_main.txt new file mode 100644 index 00000000..ddc96949 --- /dev/null +++ b/examples/routing_app/debug_main.txt @@ -0,0 +1,4 @@ +DEBUG: BIN MAIN START +DEBUG: Parsed args. Creating runner... +DEBUG: Runner created +DEBUG: Calling runner.run(args)... diff --git a/examples/routing_app/debug_output.txt b/examples/routing_app/debug_output.txt deleted file mode 100644 index 4ebf2837..00000000 Binary files a/examples/routing_app/debug_output.txt and /dev/null differ diff --git a/examples/routing_app/debug_runcheck.txt b/examples/routing_app/debug_runcheck.txt new file mode 100644 index 00000000..20d26d71 --- /dev/null +++ b/examples/routing_app/debug_runcheck.txt @@ -0,0 +1,3 @@ +DEBUG: RunCommand.run START +DEBUG: RunCommand parsed config +DEBUG: RunCommand starting setup_phase diff --git a/examples/routing_app/lib/main.dart b/examples/routing_app/lib/main.dart index 2292c9d3..9a5baf7a 100644 --- a/examples/routing_app/lib/main.dart +++ b/examples/routing_app/lib/main.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; - void main() { runApp(const RoutingApp()); } @@ -26,6 +25,7 @@ class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { + return Scaffold( backgroundColor: Colors.blue, diff --git a/examples/routing_app/package.json b/examples/routing_app/package.json deleted file mode 100644 index 492c1a91..00000000 --- a/examples/routing_app/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "routing_app", - "version": "1.0.0", - "private": true, - "scripts": { - "dev": "flutterjs dev", - "build": "flutterjs build" - }, - "dependencies": { - "@flutterjs/material": "file:../../packages/flutterjs_engine/package/material", - "@flutterjs/runtime": "file:../../packages/flutterjs_engine/src/runtime" - }, - "devDependencies": { - "flutterjs": "file:../../packages/flutterjs_engine" - } -} \ No newline at end of file diff --git a/examples/routing_app/pubspec.yaml b/examples/routing_app/pubspec.yaml index b9562f7f..08be6be8 100644 --- a/examples/routing_app/pubspec.yaml +++ b/examples/routing_app/pubspec.yaml @@ -19,9 +19,9 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 - provider: - http: + # cupertino_icons: ^1.0.8 + # provider: + # http: dev_dependencies: flutter_test: diff --git a/flutterjs b/flutterjs deleted file mode 100644 index 67f166f2..00000000 --- a/flutterjs +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -dart run bin/flutterjs.dart "$@" diff --git a/flutterjs.ps1 b/flutterjs.ps1 deleted file mode 100644 index 4197f663..00000000 --- a/flutterjs.ps1 +++ /dev/null @@ -1,2 +0,0 @@ -$args = $MyInvocation.BoundParameters.Values + $args -dart run bin/flutterjs.dart @args diff --git a/packages/flutterjs_analyzer/.gitignore b/packages/dart_analyzer/.gitignore similarity index 100% rename from packages/flutterjs_analyzer/.gitignore rename to packages/dart_analyzer/.gitignore diff --git a/packages/flutterjs_analyzer/CHANGELOG.md b/packages/dart_analyzer/CHANGELOG.md similarity index 100% rename from packages/flutterjs_analyzer/CHANGELOG.md rename to packages/dart_analyzer/CHANGELOG.md diff --git a/packages/flutterjs_analyzer/README.md b/packages/dart_analyzer/README.md similarity index 100% rename from packages/flutterjs_analyzer/README.md rename to packages/dart_analyzer/README.md diff --git a/packages/flutterjs_analyzer/analysis_options.yaml b/packages/dart_analyzer/analysis_options.yaml similarity index 100% rename from packages/flutterjs_analyzer/analysis_options.yaml rename to packages/dart_analyzer/analysis_options.yaml diff --git a/packages/flutterjs_analyzer/docs/README.md b/packages/dart_analyzer/docs/README.md similarity index 100% rename from packages/flutterjs_analyzer/docs/README.md rename to packages/dart_analyzer/docs/README.md diff --git a/packages/flutterjs_analyzer/docs/analying_project.md b/packages/dart_analyzer/docs/analying_project.md similarity index 100% rename from packages/flutterjs_analyzer/docs/analying_project.md rename to packages/dart_analyzer/docs/analying_project.md diff --git a/packages/flutterjs_analyzer/docs/dependency_graph.md b/packages/dart_analyzer/docs/dependency_graph.md similarity index 100% rename from packages/flutterjs_analyzer/docs/dependency_graph.md rename to packages/dart_analyzer/docs/dependency_graph.md diff --git a/packages/flutterjs_analyzer/docs/dependency_resolver.md b/packages/dart_analyzer/docs/dependency_resolver.md similarity index 100% rename from packages/flutterjs_analyzer/docs/dependency_resolver.md rename to packages/dart_analyzer/docs/dependency_resolver.md diff --git a/packages/flutterjs_analyzer/docs/flutter_app_ir.md b/packages/dart_analyzer/docs/flutter_app_ir.md similarity index 100% rename from packages/flutterjs_analyzer/docs/flutter_app_ir.md rename to packages/dart_analyzer/docs/flutter_app_ir.md diff --git a/packages/flutterjs_analyzer/lib/flutterjs_analyzer.dart b/packages/dart_analyzer/lib/dart_analyzer.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/flutterjs_analyzer.dart rename to packages/dart_analyzer/lib/dart_analyzer.dart diff --git a/packages/flutterjs_analyzer/lib/src/TypeDeclarationVisitor.dart b/packages/dart_analyzer/lib/src/TypeDeclarationVisitor.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/TypeDeclarationVisitor.dart rename to packages/dart_analyzer/lib/src/TypeDeclarationVisitor.dart diff --git a/packages/flutterjs_analyzer/lib/src/analying_project.dart b/packages/dart_analyzer/lib/src/analying_project.dart similarity index 98% rename from packages/flutterjs_analyzer/lib/src/analying_project.dart rename to packages/dart_analyzer/lib/src/analying_project.dart index 52f1a0ad..cc9c9654 100644 --- a/packages/flutterjs_analyzer/lib/src/analying_project.dart +++ b/packages/dart_analyzer/lib/src/analying_project.dart @@ -16,7 +16,7 @@ import 'dependency_resolver.dart'; import 'type_registry.dart'; import 'dart:async'; import 'package:analyzer/dart/ast/ast.dart'; -import 'package:flutterjs_dev_tools/dev_tools.dart'; // ADD THIS +import 'package:flutterjs_dev_tools/dev_tools.dart'; /// Advanced multi-pass project analyzer class ProjectAnalyzer { @@ -69,6 +69,7 @@ class ProjectAnalyzer { /// Initialize the analyzer with dependency resolution Future initialize() async { + print('DEBUG: ProjectAnalyzer.initialize START'); return await debugger.observe('analyzer_initialization', () async { debugger.log( DebugLevel.info, @@ -77,14 +78,17 @@ class ProjectAnalyzer { ); try { + print('DEBUG: ProjectAnalyzer.initialize: validating structure'); // Validate project structure await _validateProjectStructure(); + print('DEBUG: ProjectAnalyzer.initialize: initializing output dirs'); // Initialize build and output directories if (generateOutputFiles) { await _initializeOutputDirectories(); } + print('DEBUG: ProjectAnalyzer.initialize: creating context collection'); // Initialize analysis context final libPath = path.normalize( path.absolute(path.join(projectPath, 'lib')), @@ -99,6 +103,7 @@ class ProjectAnalyzer { category: 'analyzer', ); + print('DEBUG: ProjectAnalyzer.initialize: creating resolver'); // Initialize components _dependencyResolver = DependencyResolver( projectPath, @@ -106,12 +111,14 @@ class ProjectAnalyzer { ); _typeRegistry = TypeRegistry(); + print('DEBUG: ProjectAnalyzer.initialize DONE'); debugger.log( DebugLevel.info, 'Initialization complete', category: 'analyzer', ); } catch (e, stackTrace) { + print('DEBUG: ProjectAnalyzer.initialize ERROR: $e'); debugger.log( DebugLevel.error, 'Failed to initialize analyzer: $e\n$stackTrace', diff --git a/packages/flutterjs_analyzer/lib/src/analysis_output_generator.dart b/packages/dart_analyzer/lib/src/analysis_output_generator.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/analysis_output_generator.dart rename to packages/dart_analyzer/lib/src/analysis_output_generator.dart diff --git a/packages/flutterjs_analyzer/lib/src/analyze_flutter_app.dart b/packages/dart_analyzer/lib/src/analyze_flutter_app.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/analyze_flutter_app.dart rename to packages/dart_analyzer/lib/src/analyze_flutter_app.dart diff --git a/packages/flutterjs_analyzer/lib/src/dependency_graph.dart b/packages/dart_analyzer/lib/src/dependency_graph.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/dependency_graph.dart rename to packages/dart_analyzer/lib/src/dependency_graph.dart diff --git a/packages/flutterjs_analyzer/lib/src/dependency_resolver.dart b/packages/dart_analyzer/lib/src/dependency_resolver.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/dependency_resolver.dart rename to packages/dart_analyzer/lib/src/dependency_resolver.dart diff --git a/packages/flutterjs_analyzer/lib/src/incremental_cache.dart b/packages/dart_analyzer/lib/src/incremental_cache.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/incremental_cache.dart rename to packages/dart_analyzer/lib/src/incremental_cache.dart diff --git a/packages/flutterjs_analyzer/lib/src/ir_linker.dart b/packages/dart_analyzer/lib/src/ir_linker.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/ir_linker.dart rename to packages/dart_analyzer/lib/src/ir_linker.dart diff --git a/packages/flutterjs_analyzer/lib/src/model/analyzer_model.dart b/packages/dart_analyzer/lib/src/model/analyzer_model.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/model/analyzer_model.dart rename to packages/dart_analyzer/lib/src/model/analyzer_model.dart diff --git a/packages/flutterjs_analyzer/lib/src/model/core.dart b/packages/dart_analyzer/lib/src/model/core.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/model/core.dart rename to packages/dart_analyzer/lib/src/model/core.dart diff --git a/packages/flutterjs_analyzer/lib/src/model/other.dart b/packages/dart_analyzer/lib/src/model/other.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/model/other.dart rename to packages/dart_analyzer/lib/src/model/other.dart diff --git a/packages/flutterjs_analyzer/lib/src/model/state.dart b/packages/dart_analyzer/lib/src/model/state.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/model/state.dart rename to packages/dart_analyzer/lib/src/model/state.dart diff --git a/packages/flutterjs_analyzer/lib/src/model/widget.dart b/packages/dart_analyzer/lib/src/model/widget.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/model/widget.dart rename to packages/dart_analyzer/lib/src/model/widget.dart diff --git a/packages/flutterjs_analyzer/lib/src/type_registry.dart b/packages/dart_analyzer/lib/src/type_registry.dart similarity index 100% rename from packages/flutterjs_analyzer/lib/src/type_registry.dart rename to packages/dart_analyzer/lib/src/type_registry.dart diff --git a/packages/dart_analyzer/pubspec.yaml b/packages/dart_analyzer/pubspec.yaml new file mode 100644 index 00000000..9c7cad66 --- /dev/null +++ b/packages/dart_analyzer/pubspec.yaml @@ -0,0 +1,20 @@ +name: dart_analyzer +description: A sample command-line application. +version: 1.0.0 +resolution: workspace +# repository: https://github.com/my_org/my_repo + +environment: + sdk: ^3.10.0-278.0.dev + +# Add regular dependencies here. +dependencies: + path: ^1.9.0 + analyzer: + flutterjs_dev_tools: any + + + +dev_dependencies: + lints: ^6.0.0 + test: ^1.25.6 diff --git a/packages/flutterjs_analyzer/test/flutterjs_analyzer_test.dart b/packages/dart_analyzer/test/flutterjs_analyzer_test.dart similarity index 100% rename from packages/flutterjs_analyzer/test/flutterjs_analyzer_test.dart rename to packages/dart_analyzer/test/flutterjs_analyzer_test.dart diff --git a/packages/flutterjs_engine/src/analyzer/build.js b/packages/flutterjs_analyzer/flutterjs_analyzer/build.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/build.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/build.js diff --git a/packages/flutterjs_engine/src/analyzer/dist/analyzer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/analyzer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/analyzer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/analyzer.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/analyzer.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/analyzer.js.map new file mode 100644 index 00000000..ddec0623 --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/analyzer.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/analyzer.js"], + "sourcesContent": ["/**\r\n * FlutterJS Analyzer - Main Orchestrator (FIXED Logger Integration)\r\n * Properly integrates centralized logging system\r\n */\r\n\r\nimport fs from 'fs';\r\nimport { Lexer } from './lexer.js';\r\nimport { Parser } from './flutterjs_parser.js';\r\nimport { WidgetAnalyzer } from './flutterjs_widget_analyzer.js';\r\nimport { StateAnalyzer } from './state_analyzer_implementation.js';\r\nimport { ContextAnalyzer } from './context_analyzer.js';\r\nimport { SSRAnalyzer } from './ssr_analyzer.js';\r\nimport { ReportGenerator } from './flutterjs_report_generator.js';\r\nimport { ImportResolver } from './flutter_import_resolver.js';\r\nimport { resolverConfig } from './flutter_resolver_config.js';\r\nimport { initLogger, getLogger } from './flutterjs_logger.js';\r\n\r\n// ============================================================================\r\n// MAIN ANALYZER CLASS\r\n// ============================================================================\r\n\r\nclass Analyzer {\r\n constructor(options = {}) {\r\n this.options = {\r\n sourceFile: null,\r\n sourceCode: null,\r\n outputFormat: 'json',\r\n outputFile: null,\r\n verbose: true,\r\n strict: false,\r\n projectRoot: process.cwd(),\r\n includeMetrics: true,\r\n includeTree: true,\r\n includeValidation: true,\r\n includeSuggestions: true,\r\n includeContext: true,\r\n includeSsr: true,\r\n includeImports: true,\r\n ignoreUnresolvedImports: true,\r\n prettyPrint: true,\r\n debugLevel: 'info', // NEW: Add debug level option\r\n ...options,\r\n };\r\n\r\n // FIXED: Properly initialize logger\r\n this.logger = initLogger({\r\n level: this.options.debugLevel,\r\n writeToFile: true,\r\n writeToConsole: false,\r\n debugDir: '.debug',\r\n });\r\n\r\n const loggerInstance = this.logger.createComponentLogger('Analyzer');\r\n this.log = loggerInstance; // Store logger instance\r\n\r\n // Initialize import resolver\r\n this.importResolver = new ImportResolver({\r\n projectRoot: this.options.projectRoot,\r\n ignoreUnresolved: this.options.ignoreUnresolvedImports,\r\n ...resolverConfig,\r\n });\r\n\r\n this.results = {\r\n source: null,\r\n tokens: null,\r\n ast: null,\r\n widgets: null,\r\n importResolution: null,\r\n state: null,\r\n context: null,\r\n ssr: null,\r\n report: null,\r\n };\r\n\r\n this.errors = [];\r\n this.timings = {};\r\n }\r\n\r\n /**\r\n * Main entry point - run full analysis pipeline\r\n */\r\n async analyze() {\r\n const logger = this.log;\r\n\r\n logger.startSession('FullAnalyzerPipeline');\r\n\r\n try {\r\n logger.info('\\n' + '='.repeat(80));\r\n logger.info('\uD83D\uDE80 FlutterJS ANALYZER - FULL PIPELINE');\r\n logger.info('='.repeat(80));\r\n\r\n // Step 1: Load source code\r\n logger.startSession('LoadSource');\r\n logger.info('STEP 1: Loading source code...');\r\n await this.loadSource();\r\n logger.success('Source loaded');\r\n logger.endSession('LoadSource');\r\n\r\n // Step 2: Lexing\r\n logger.startSession('Lexing');\r\n logger.info('STEP 2: Tokenizing (Lexing)...');\r\n this.lex();\r\n logger.trace('Tokens generated', this.results.tokens.length);\r\n logger.success('Lexing complete');\r\n logger.endSession('Lexing');\r\n\r\n // Step 3: Parsing\r\n logger.startSession('Parsing');\r\n logger.info('STEP 3: Building AST (Parsing)...');\r\n this.parse();\r\n logger.trace('Top-level items', this.results.ast.body.length);\r\n logger.success('Parsing complete');\r\n logger.endSession('Parsing');\r\n\r\n // Step 4: Widget Analysis (Phase 1)\r\n logger.startSession('WidgetAnalysis');\r\n logger.info('STEP 4: Widget Analysis (Phase 1)...');\r\n this.analyzeWidgets();\r\n logger.trace('Widgets detected', this.results.widgets.widgets.length);\r\n logger.success('Widget analysis complete');\r\n logger.endSession('WidgetAnalysis');\r\n\r\n // Step 5: Import Resolution\r\n if (this.options.includeImports) {\r\n logger.startSession('ImportResolution');\r\n logger.info('STEP 5: Resolving Imports...');\r\n this.analyzeImports();\r\n const summary = this.results.importResolution?.summary;\r\n logger.trace('Imports resolved', summary?.resolved || 0);\r\n logger.trace('Imports unresolved', summary?.unresolved || 0);\r\n logger.success('Import resolution complete');\r\n logger.endSession('ImportResolution');\r\n }\r\n\r\n // Step 6: State Analysis (Phase 2)\r\n logger.startSession('StateAnalysis');\r\n logger.info('STEP 6: State Analysis (Phase 2)...');\r\n this.analyzeState();\r\n logger.trace('State classes analyzed', this.results.state.stateClasses.length);\r\n logger.success('State analysis complete');\r\n logger.endSession('StateAnalysis');\r\n\r\n // Step 7: Context Analysis (Phase 3)\r\n if (this.options.includeContext) {\r\n logger.startSession('ContextAnalysis');\r\n logger.info('STEP 7: Context Analysis (Phase 3)...');\r\n this.analyzeContext();\r\n logger.trace('Inherited widgets detected', this.results.context.inheritedWidgets?.length || 0);\r\n logger.success('Context analysis complete');\r\n logger.endSession('ContextAnalysis');\r\n }\r\n\r\n // Step 8: SSR Analysis (Phase 3)\r\n if (this.options.includeSsr) {\r\n logger.startSession('SSRAnalysis');\r\n logger.info('STEP 8: SSR Compatibility Analysis (Phase 3)...');\r\n this.analyzeSsr();\r\n logger.trace('SSR Compatibility Score', this.results.ssr.ssrCompatibilityScore);\r\n logger.success('SSR analysis complete');\r\n logger.endSession('SSRAnalysis');\r\n }\r\n\r\n // Step 9: Report Generation\r\n logger.startSession('ReportGeneration');\r\n logger.info('STEP 9: Generating Report...');\r\n this.generateReport();\r\n logger.success('Report generated');\r\n logger.endSession('ReportGeneration');\r\n\r\n // Step 10: Output\r\n logger.startSession('Output');\r\n logger.info('STEP 10: Output...');\r\n this.output();\r\n logger.success('Output complete');\r\n logger.endSession('Output');\r\n\r\n logger.info('='.repeat(80));\r\n logger.success('\u2705 ANALYSIS COMPLETE');\r\n logger.info('='.repeat(80) + '\\n');\r\n\r\n // Save logs to files\r\n this.logger.saveLogs();\r\n\r\n return this.getResults();\r\n } catch (error) {\r\n logger.error('ANALYSIS FAILED');\r\n logger.failure('Analysis pipeline', error.message);\r\n logger.endSession('FullAnalyzerPipeline');\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Step 5: Resolve all imports\r\n */\r\n // In analyzer.js analyzeImports()\r\n analyzeImports() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n try {\r\n if (!this.results.source) {\r\n logger.warn('No source code found, skipping import analysis');\r\n return;\r\n }\r\n\r\n logger.info('Processing imports from AST (parsed in Step 3)...');\r\n\r\n // \u2705 Use widget analyzer's already-extracted imports\r\n const parsedImports = this.results.widgets?.imports || [];\r\n\r\n if (logger) {\r\n logger.info(`Found ${parsedImports.length} import statements`);\r\n parsedImports.forEach((imp, idx) => {\r\n logger.debug(` \uD83D\uDCCD ${imp.source} \u2192 [${imp.items.join(', ')}]`);\r\n });\r\n }\r\n\r\n // \u2705 Now use ImportResolver only for RESOLUTION\r\n // (finding where modules actually are)\r\n const resolution = this.importResolver.resolveImports(parsedImports);\r\n\r\n this.results.importResolution = {\r\n imports: resolution.imports,\r\n summary: resolution.summary,\r\n parsed: parsedImports, // From AST parsing\r\n };\r\n\r\n // Log statistics\r\n logger.info(`Resolved: ${resolution.summary.resolved}`);\r\n logger.info(`Unresolved: ${resolution.summary.unresolved}`);\r\n logger.debug(`Framework packages: ${resolution.summary.bySource.framework}`);\r\n logger.debug(`Local imports: ${resolution.summary.bySource.local}`);\r\n\r\n // Check for errors\r\n if (!this.options.ignoreUnresolvedImports &&\r\n resolution.imports.errors.length > 0) {\r\n throw new Error(\r\n `${resolution.imports.errors.length} imports could not be resolved`\r\n );\r\n }\r\n } catch (error) {\r\n logger.error(`Import resolution failed: ${error.message}`);\r\n throw new Error(`Import resolution failed: ${error.message}`);\r\n }\r\n\r\n this.timings.analyzeImports = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 1: Load source code from file or use provided code\r\n */\r\n async loadSource() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n if (this.options.sourceCode) {\r\n this.results.source = this.options.sourceCode;\r\n logger.debug('Using provided source code');\r\n } else if (this.options.sourceFile) {\r\n try {\r\n this.results.source = fs.readFileSync(this.options.sourceFile, 'utf-8');\r\n logger.debug(`Loaded from file: ${this.options.sourceFile}`);\r\n logger.trace('Source file size', this.results.source.length);\r\n } catch (error) {\r\n logger.error(`Cannot read file \"${this.options.sourceFile}\"`);\r\n throw new Error(`Cannot read file \"${this.options.sourceFile}\": ${error.message}`);\r\n }\r\n } else {\r\n logger.error('No source code or source file provided');\r\n throw new Error('No source code or source file provided');\r\n }\r\n\r\n this.timings.loadSource = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 2: Lex source code into tokens\r\n */\r\n lex() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n try {\r\n const lexer = new Lexer(this.results.source);\r\n this.results.tokens = lexer.tokenize();\r\n\r\n if (lexer.getErrors().length > 0) {\r\n logger.warn(`Lexer produced ${lexer.getErrors().length} warnings`);\r\n lexer.getErrors().forEach((err) => {\r\n logger.debug(`Lexer: ${err.message}`);\r\n });\r\n }\r\n } catch (error) {\r\n logger.error(`Lexing failed: ${error.message}`);\r\n throw new Error(`Lexing failed: ${error.message}`);\r\n }\r\n\r\n this.timings.lex = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 3: Parse tokens into AST\r\n */\r\n parse() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n try {\r\n const parser = new Parser(this.results.tokens);\r\n this.results.ast = parser.parse();\r\n\r\n if (parser.getErrors().length > 0) {\r\n logger.warn(`Parser produced ${parser.getErrors().length} errors`);\r\n parser.getErrors().forEach((err) => {\r\n logger.debug(`Parser: ${err.message}`);\r\n });\r\n\r\n if (this.options.strict) {\r\n throw new Error(`${parser.getErrors().length} parser errors found`);\r\n }\r\n }\r\n } catch (error) {\r\n logger.error(`Parsing failed: ${error.message}`);\r\n throw new Error(`Parsing failed: ${error.message}`);\r\n }\r\n\r\n this.timings.parse = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 4: Analyze widgets (Phase 1)\r\n */\r\n analyzeWidgets() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n try {\r\n const analyzer = new WidgetAnalyzer(this.results.ast);\r\n this.results.widgets = analyzer.analyze();\r\n\r\n if (this.results.widgets.errors.length > 0) {\r\n logger.warn(`Widget analysis produced ${this.results.widgets.errors.length} errors`);\r\n this.results.widgets.errors.forEach((err) => {\r\n logger.debug(`Widget: ${err.message}`);\r\n });\r\n }\r\n } catch (error) {\r\n logger.error(`Widget analysis failed: ${error.message}`);\r\n throw new Error(`Widget analysis failed: ${error.message}`);\r\n }\r\n\r\n this.timings.analyzeWidgets = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 6: Analyze state (Phase 2)\r\n */\r\n analyzeState() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n try {\r\n const analyzer = new StateAnalyzer(\r\n this.results.ast,\r\n this.results.widgets.widgets,\r\n { strict: this.options.strict }\r\n );\r\n this.results.state = analyzer.analyze();\r\n\r\n if (this.results.state.errors.length > 0) {\r\n logger.warn(`State analysis produced ${this.results.state.errors.length} errors`);\r\n this.results.state.errors.forEach((err) => {\r\n logger.debug(`State: ${err.message}`);\r\n });\r\n }\r\n } catch (error) {\r\n logger.error(`State analysis failed: ${error.message}`);\r\n throw new Error(`State analysis failed: ${error.message}`);\r\n }\r\n\r\n this.timings.analyzeState = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 7: Analyze context (Phase 3)\r\n */\r\n analyzeContext() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n try {\r\n const analyzer = new ContextAnalyzer(\r\n this.results.ast,\r\n this.results.widgets.widgets,\r\n { strict: this.options.strict }\r\n );\r\n this.results.context = analyzer.analyze();\r\n\r\n if (this.results.context.errors && this.results.context.errors.length > 0) {\r\n logger.warn(`Context analysis produced ${this.results.context.errors.length} errors`);\r\n this.results.context.errors.forEach((err) => {\r\n logger.debug(`Context: ${err.message}`);\r\n });\r\n }\r\n } catch (error) {\r\n logger.error(`Context analysis failed: ${error.message}`);\r\n throw new Error(`Context analysis failed: ${error.message}`);\r\n }\r\n\r\n this.timings.analyzeContext = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 8: Analyze SSR compatibility (Phase 3)\r\n */\r\n analyzeSsr() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n try {\r\n const analyzer = new SSRAnalyzer(\r\n this.results.context,\r\n this.results.state,\r\n { strict: this.options.strict }\r\n );\r\n this.results.ssr = analyzer.analyze();\r\n\r\n if (this.results.ssr.errors && this.results.ssr.errors.length > 0) {\r\n logger.warn(`SSR analysis produced ${this.results.ssr.errors.length} errors`);\r\n this.results.ssr.errors.forEach((err) => {\r\n logger.debug(`SSR: ${err.message}`);\r\n });\r\n }\r\n } catch (error) {\r\n logger.error(`SSR analysis failed: ${error.message}`);\r\n throw new Error(`SSR analysis failed: ${error.message}`);\r\n }\r\n\r\n this.timings.analyzeSsr = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 9: Generate report\r\n */\r\n generateReport() {\r\n const start = Date.now();\r\n const logger = this.log;\r\n\r\n try {\r\n const generator = new ReportGenerator(\r\n this.results.widgets,\r\n this.results.state,\r\n this.results.context,\r\n this.results.ssr,\r\n {\r\n format: this.options.outputFormat,\r\n includeMetrics: this.options.includeMetrics,\r\n includeTree: this.options.includeTree,\r\n includeValidation: this.options.includeValidation,\r\n includeSuggestions: this.options.includeSuggestions,\r\n includeContext: this.options.includeContext,\r\n includeSsr: this.options.includeSsr,\r\n prettyPrint: this.options.prettyPrint,\r\n }\r\n );\r\n\r\n this.results.report = generator.generate();\r\n } catch (error) {\r\n logger.error(`Report generation failed: ${error.message}`);\r\n throw new Error(`Report generation failed: ${error.message}`);\r\n }\r\n\r\n this.timings.generateReport = Date.now() - start;\r\n }\r\n\r\n /**\r\n * Step 10: Output report (console or file)\r\n */\r\n output() {\r\n const logger = this.log;\r\n\r\n if (this.options.outputFile) {\r\n try {\r\n fs.writeFileSync(this.options.outputFile, this.results.report, 'utf-8');\r\n logger.success(`Report saved to: ${this.options.outputFile}`);\r\n } catch (error) {\r\n logger.error(`Cannot write to file \"${this.options.outputFile}\"`);\r\n throw new Error(`Cannot write to file \"${this.options.outputFile}\": ${error.message}`);\r\n }\r\n } else {\r\n // Only print report to console if not verbose logging\r\n if (this.options.outputFormat !== 'console') {\r\n console.log(this.results.report);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get analysis results - FIXED: Include logger info\r\n */\r\n /**\r\n * FIXED: getResults() method in analyzer.js\r\n * Now uses importResolution.parsed instead of widgets.imports\r\n */\r\n\r\n getResults() {\r\n // Extract widget arrays by type\r\n const allWidgets = this.results.widgets?.widgets || [];\r\n const statelessWidgets = allWidgets.filter((w) => w.type === 'stateless');\r\n const statefulWidgets = allWidgets.filter((w) => w.type === 'stateful');\r\n const stateWidgets = allWidgets.filter((w) => w.type === 'state');\r\n\r\n // Extract widget names as arrays\r\n const statelessNames = statelessWidgets.map((w) => w.name);\r\n const statefulNames = statefulWidgets.map((w) => w.name);\r\n\r\n // Build state classes mapping: StatefulWidget -> State class\r\n const stateClasses = {};\r\n stateWidgets.forEach((stateWidget) => {\r\n // Convention: _MyHomePageState -> MyHomePage\r\n const widgetName = stateWidget.name.replace(/^_/, '').replace(/State$/, '');\r\n const stateFields = stateWidget.fields || [];\r\n stateClasses[stateWidget.name] = stateFields.map((f) => f.name);\r\n });\r\n\r\n // Also map by StatefulWidget name if we have linking info\r\n statefulWidgets.forEach((statefulWidget) => {\r\n const expectedStateName = `_${statefulWidget.name}State`;\r\n if (stateClasses[expectedStateName]) {\r\n // Create mapping for easy lookup\r\n stateClasses[statefulWidget.name] = stateClasses[expectedStateName];\r\n }\r\n });\r\n\r\n // \u2705 FIXED: Get imports from importResolution.parsed (multi-line support)\r\n // This now correctly parses ALL imports (single & multi-line)\r\n const parsedImports = this.results.importResolution?.parsed || [];\r\n\r\n // Build imports object: { source: [items] }\r\n const importsObj = {};\r\n parsedImports.forEach(imp => {\r\n importsObj[imp.source] = imp.items;\r\n });\r\n\r\n return {\r\n source: {\r\n length: this.results.source?.length || 0,\r\n file: this.options.sourceFile,\r\n },\r\n tokens: {\r\n count: this.results.tokens?.length || 0,\r\n },\r\n ast: {\r\n items: this.results.ast?.body?.length || 0,\r\n },\r\n // FIXED: Return actual widget names and full widget objects\r\n widgets: {\r\n // Arrays of widget names for easy access\r\n stateless: statelessNames,\r\n stateful: statefulNames,\r\n count: allWidgets.length,\r\n\r\n // Full widget objects for detailed analysis\r\n all: allWidgets,\r\n\r\n // State class mappings\r\n stateClasses: stateClasses,\r\n\r\n // Metadata\r\n total: {\r\n stateless: statelessWidgets.length,\r\n stateful: statefulWidgets.length,\r\n state: stateWidgets.length,\r\n },\r\n },\r\n\r\n // \u2705 FIXED: Return ALL imports from source parsing (not just widgets.imports)\r\n // Now includes both single-line and multi-line imports\r\n imports: this.options.includeImports ? importsObj : null,\r\n\r\n // \u2705 FIXED: Return full import resolution details\r\n importResolution: this.options.includeImports ? {\r\n parsed: parsedImports,\r\n summary: this.results.importResolution?.summary || {\r\n total: parsedImports.length,\r\n resolved: this.results.importResolution?.summary?.resolved || 0,\r\n unresolved: this.results.importResolution?.summary?.unresolved || 0,\r\n errors: this.results.importResolution?.summary?.errors || 0,\r\n resolutionRate: this.results.importResolution?.summary?.resolutionRate || 'N/A',\r\n bySource: this.results.importResolution?.summary?.bySource || {\r\n framework: 0,\r\n local: 0,\r\n cache: 0,\r\n },\r\n },\r\n } : null,\r\n\r\n state: {\r\n stateClasses: this.results.state?.stateClasses?.length || 0,\r\n stateFields: this.results.state?.stateFields?.length || 0,\r\n setStateCalls: this.results.state?.setStateCalls?.length || 0,\r\n lifecycleMethods: this.results.state?.lifecycleMethods?.length || 0,\r\n eventHandlers: this.results.state?.eventHandlers?.length || 0,\r\n validationIssues: this.results.state?.validationResults?.length || 0,\r\n },\r\n\r\n context: this.options.includeContext\r\n ? {\r\n inheritedWidgets: this.results.context?.inheritedWidgets?.length || 0,\r\n changeNotifiers: this.results.context?.changeNotifiers?.length || 0,\r\n providers: this.results.context?.providers?.length || 0,\r\n contextAccessPoints: this.results.context?.contextAccessPoints?.length || 0,\r\n }\r\n : null,\r\n\r\n ssr: this.options.includeSsr\r\n ? {\r\n compatibility: this.results.ssr?.overallCompatibility || 'unknown',\r\n compatibilityScore: this.results.ssr?.ssrCompatibilityScore || 0,\r\n safePatterns: this.results.ssr?.ssrSafePatterns?.length || 0,\r\n unsafePatterns: this.results.ssr?.ssrUnsafePatterns?.length || 0,\r\n hydrationNeeded: this.results.ssr?.hydrationCount || 0,\r\n migrationSteps: this.results.ssr?.ssrMigrationPath?.length || 0,\r\n estimatedEffort: this.results.ssr?.estimatedEffort || 'unknown',\r\n }\r\n : null,\r\n\r\n timings: this.timings,\r\n report: this.results.report,\r\n logger: this.logger.getReport(),\r\n debugFiles: this.logger.readDebugFiles(),\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// STATIC HELPER METHODS\r\n// ============================================================================\r\n\r\nasync function analyzeCode(sourceCode, options = {}) {\r\n const analyzer = new Analyzer({\r\n sourceCode,\r\n ...options,\r\n });\r\n\r\n return analyzer.analyze();\r\n}\r\n\r\nasync function analyzeFile(sourceFile, options = {}) {\r\n const analyzer = new Analyzer({\r\n sourceFile,\r\n ...options,\r\n });\r\n\r\n return analyzer.analyze();\r\n}\r\n\r\nasync function analyzeAndSave(sourceFile, outputFile, options = {}) {\r\n const analyzer = new Analyzer({\r\n sourceFile,\r\n outputFile,\r\n ...options,\r\n });\r\n\r\n return analyzer.analyze();\r\n}\r\n\r\n// ============================================================================\r\n// CLI INTERFACE\r\n// ============================================================================\r\n\r\nasync function runCLI() {\r\n const args = process.argv.slice(2);\r\n\r\n if (args.length === 0) {\r\n printUsage();\r\n process.exit(0);\r\n }\r\n\r\n const sourceFile = args[0];\r\n let outputFile = null;\r\n let outputFormat = 'json';\r\n let verbose = true;\r\n let includeImports = true;\r\n let includeContext = true;\r\n let includeSsr = true;\r\n let debugLevel = 'info';\r\n\r\n for (let i = 1; i < args.length; i++) {\r\n const arg = args[i];\r\n\r\n if (arg === '-o' || arg === '--output') {\r\n outputFile = args[++i];\r\n } else if (arg === '-f' || arg === '--format') {\r\n outputFormat = args[++i];\r\n } else if (arg === '-q' || arg === '--quiet') {\r\n verbose = false;\r\n } else if (arg === '--debug') {\r\n debugLevel = args[++i] || 'debug';\r\n } else if (arg === '--no-imports') {\r\n includeImports = false;\r\n } else if (arg === '--no-context') {\r\n includeContext = false;\r\n } else if (arg === '--no-ssr') {\r\n includeSsr = false;\r\n } else if (arg === '--phase1') {\r\n includeImports = false;\r\n includeContext = false;\r\n includeSsr = false;\r\n } else if (arg === '-h' || arg === '--help') {\r\n printUsage();\r\n process.exit(0);\r\n }\r\n }\r\n\r\n if (!['json', 'markdown', 'console'].includes(outputFormat)) {\r\n console.error(`Invalid format: ${outputFormat}`);\r\n process.exit(1);\r\n }\r\n\r\n try {\r\n const analyzer = new Analyzer({\r\n sourceFile,\r\n outputFile,\r\n outputFormat,\r\n verbose,\r\n includeImports,\r\n includeContext,\r\n includeSsr,\r\n debugLevel,\r\n });\r\n\r\n const results = await analyzer.analyze();\r\n\r\n // Show debug info location\r\n if (debugLevel !== 'info') {\r\n console.log('\\n\uD83D\uDCCA Debug logs saved to: .debug/');\r\n console.log(' View with: node debug_viewer.js\\n');\r\n }\r\n\r\n process.exit(0);\r\n } catch (error) {\r\n console.error(`\\n\u274C Error: ${error.message}\\n`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction printUsage() {\r\n console.log(`\r\nFlutterJS Analyzer (Phase 1 + Import Resolution + Phase 2 + 3)\r\n\r\nUsage:\r\n node analyzer.js [options]\r\n\r\nOptions:\r\n -o, --output Output file (default: print to console)\r\n -f, --format Output format: json, markdown, console (default: json)\r\n -q, --quiet Suppress verbose output\r\n --debug Enable debug logging: trace, debug, info (default: info)\r\n --no-imports Skip import resolution\r\n --no-context Skip Phase 3 context analysis\r\n --no-ssr Skip Phase 3 SSR analysis\r\n --phase1 Only Phase 1 (widgets + imports)\r\n -h, --help Show this help message\r\n\r\nExamples:\r\n node analyzer.js test.fjs\r\n node analyzer.js test.fjs -o report.json\r\n node analyzer.js test.fjs --debug trace\r\n node analyzer.js test.fjs -f markdown\r\n node analyzer.js test.fjs --phase1\r\n`);\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n Analyzer,\r\n analyzeCode,\r\n analyzeFile,\r\n analyzeAndSave,\r\n runCLI,\r\n};\r\n\r\n// ============================================================================\r\n// CLI EXECUTION\r\n// ============================================================================\r\n\r\nif (import.meta.url === `file://${process.argv[1]}`) {\r\n runCLI();\r\n}"], + "mappings": "AAKA,OAAOA,MAAQ,KACf,OAAS,SAAAC,MAAa,aACtB,OAAS,UAAAC,MAAc,wBACvB,OAAS,kBAAAC,MAAsB,iCAC/B,OAAS,iBAAAC,MAAqB,qCAC9B,OAAS,mBAAAC,MAAuB,wBAChC,OAAS,eAAAC,MAAmB,oBAC5B,OAAS,mBAAAC,MAAuB,kCAChC,OAAS,kBAAAC,MAAsB,+BAC/B,OAAS,kBAAAC,MAAsB,+BAC/B,OAAS,cAAAC,MAA6B,wBAMtC,MAAMC,CAAS,CACb,YAAYC,EAAU,CAAC,EAAG,CACxB,KAAK,QAAU,CACb,WAAY,KACZ,WAAY,KACZ,aAAc,OACd,WAAY,KACZ,QAAS,GACT,OAAQ,GACR,YAAa,QAAQ,IAAI,EACzB,eAAgB,GAChB,YAAa,GACb,kBAAmB,GACnB,mBAAoB,GACpB,eAAgB,GAChB,WAAY,GACZ,eAAgB,GAChB,wBAAyB,GACzB,YAAa,GACb,WAAY,OACZ,GAAGA,CACL,EAGA,KAAK,OAASF,EAAW,CACvB,MAAO,KAAK,QAAQ,WACpB,YAAa,GACb,eAAgB,GAChB,SAAU,QACZ,CAAC,EAED,MAAMG,EAAiB,KAAK,OAAO,sBAAsB,UAAU,EACnE,KAAK,IAAMA,EAGX,KAAK,eAAiB,IAAIL,EAAe,CACvC,YAAa,KAAK,QAAQ,YAC1B,iBAAkB,KAAK,QAAQ,wBAC/B,GAAGC,CACL,CAAC,EAED,KAAK,QAAU,CACb,OAAQ,KACR,OAAQ,KACR,IAAK,KACL,QAAS,KACT,iBAAkB,KAClB,MAAO,KACP,QAAS,KACT,IAAK,KACL,OAAQ,IACV,EAEA,KAAK,OAAS,CAAC,EACf,KAAK,QAAU,CAAC,CAClB,CAKA,MAAM,SAAU,CACd,MAAMK,EAAS,KAAK,IAEpBA,EAAO,aAAa,sBAAsB,EAE1C,GAAI,CAqCF,GApCAA,EAAO,KAAK;AAAA,EAAO,IAAI,OAAO,EAAE,CAAC,EACjCA,EAAO,KAAK,8CAAuC,EACnDA,EAAO,KAAK,IAAI,OAAO,EAAE,CAAC,EAG1BA,EAAO,aAAa,YAAY,EAChCA,EAAO,KAAK,gCAAgC,EAC5C,MAAM,KAAK,WAAW,EACtBA,EAAO,QAAQ,eAAe,EAC9BA,EAAO,WAAW,YAAY,EAG9BA,EAAO,aAAa,QAAQ,EAC5BA,EAAO,KAAK,gCAAgC,EAC5C,KAAK,IAAI,EACTA,EAAO,MAAM,mBAAoB,KAAK,QAAQ,OAAO,MAAM,EAC3DA,EAAO,QAAQ,iBAAiB,EAChCA,EAAO,WAAW,QAAQ,EAG1BA,EAAO,aAAa,SAAS,EAC7BA,EAAO,KAAK,mCAAmC,EAC/C,KAAK,MAAM,EACXA,EAAO,MAAM,kBAAmB,KAAK,QAAQ,IAAI,KAAK,MAAM,EAC5DA,EAAO,QAAQ,kBAAkB,EACjCA,EAAO,WAAW,SAAS,EAG3BA,EAAO,aAAa,gBAAgB,EACpCA,EAAO,KAAK,sCAAsC,EAClD,KAAK,eAAe,EACpBA,EAAO,MAAM,mBAAoB,KAAK,QAAQ,QAAQ,QAAQ,MAAM,EACpEA,EAAO,QAAQ,0BAA0B,EACzCA,EAAO,WAAW,gBAAgB,EAG9B,KAAK,QAAQ,eAAgB,CAC/BA,EAAO,aAAa,kBAAkB,EACtCA,EAAO,KAAK,8BAA8B,EAC1C,KAAK,eAAe,EACpB,MAAMC,EAAU,KAAK,QAAQ,kBAAkB,QAC/CD,EAAO,MAAM,mBAAoBC,GAAS,UAAY,CAAC,EACvDD,EAAO,MAAM,qBAAsBC,GAAS,YAAc,CAAC,EAC3DD,EAAO,QAAQ,4BAA4B,EAC3CA,EAAO,WAAW,kBAAkB,CACtC,CAGA,OAAAA,EAAO,aAAa,eAAe,EACnCA,EAAO,KAAK,qCAAqC,EACjD,KAAK,aAAa,EAClBA,EAAO,MAAM,yBAA0B,KAAK,QAAQ,MAAM,aAAa,MAAM,EAC7EA,EAAO,QAAQ,yBAAyB,EACxCA,EAAO,WAAW,eAAe,EAG7B,KAAK,QAAQ,iBACfA,EAAO,aAAa,iBAAiB,EACrCA,EAAO,KAAK,uCAAuC,EACnD,KAAK,eAAe,EACpBA,EAAO,MAAM,6BAA8B,KAAK,QAAQ,QAAQ,kBAAkB,QAAU,CAAC,EAC7FA,EAAO,QAAQ,2BAA2B,EAC1CA,EAAO,WAAW,iBAAiB,GAIjC,KAAK,QAAQ,aACfA,EAAO,aAAa,aAAa,EACjCA,EAAO,KAAK,iDAAiD,EAC7D,KAAK,WAAW,EAChBA,EAAO,MAAM,0BAA2B,KAAK,QAAQ,IAAI,qBAAqB,EAC9EA,EAAO,QAAQ,uBAAuB,EACtCA,EAAO,WAAW,aAAa,GAIjCA,EAAO,aAAa,kBAAkB,EACtCA,EAAO,KAAK,8BAA8B,EAC1C,KAAK,eAAe,EACpBA,EAAO,QAAQ,kBAAkB,EACjCA,EAAO,WAAW,kBAAkB,EAGpCA,EAAO,aAAa,QAAQ,EAC5BA,EAAO,KAAK,oBAAoB,EAChC,KAAK,OAAO,EACZA,EAAO,QAAQ,iBAAiB,EAChCA,EAAO,WAAW,QAAQ,EAE1BA,EAAO,KAAK,IAAI,OAAO,EAAE,CAAC,EAC1BA,EAAO,QAAQ,0BAAqB,EACpCA,EAAO,KAAK,IAAI,OAAO,EAAE,EAAI;AAAA,CAAI,EAGjC,KAAK,OAAO,SAAS,EAEd,KAAK,WAAW,CACzB,OAASE,EAAO,CACd,MAAAF,EAAO,MAAM,iBAAiB,EAC9BA,EAAO,QAAQ,oBAAqBE,EAAM,OAAO,EACjDF,EAAO,WAAW,sBAAsB,EAClCE,CACR,CACF,CAMA,gBAAiB,CACf,MAAMC,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,CACF,GAAI,CAAC,KAAK,QAAQ,OAAQ,CACxBA,EAAO,KAAK,gDAAgD,EAC5D,MACF,CAEAA,EAAO,KAAK,mDAAmD,EAG/D,MAAMI,EAAgB,KAAK,QAAQ,SAAS,SAAW,CAAC,EAEpDJ,IACFA,EAAO,KAAK,SAASI,EAAc,MAAM,oBAAoB,EAC7DA,EAAc,QAAQ,CAACC,EAAKC,IAAQ,CAClCN,EAAO,MAAM,eAAQK,EAAI,MAAM,YAAOA,EAAI,MAAM,KAAK,IAAI,CAAC,GAAG,CAC/D,CAAC,GAKH,MAAME,EAAa,KAAK,eAAe,eAAeH,CAAa,EAenE,GAbA,KAAK,QAAQ,iBAAmB,CAC9B,QAASG,EAAW,QACpB,QAASA,EAAW,QACpB,OAAQH,CACV,EAGAJ,EAAO,KAAK,aAAaO,EAAW,QAAQ,QAAQ,EAAE,EACtDP,EAAO,KAAK,eAAeO,EAAW,QAAQ,UAAU,EAAE,EAC1DP,EAAO,MAAM,uBAAuBO,EAAW,QAAQ,SAAS,SAAS,EAAE,EAC3EP,EAAO,MAAM,kBAAkBO,EAAW,QAAQ,SAAS,KAAK,EAAE,EAG9D,CAAC,KAAK,QAAQ,yBAChBA,EAAW,QAAQ,OAAO,OAAS,EACnC,MAAM,IAAI,MACR,GAAGA,EAAW,QAAQ,OAAO,MAAM,gCACrC,CAEJ,OAASL,EAAO,CACd,MAAAF,EAAO,MAAM,6BAA6BE,EAAM,OAAO,EAAE,EACnD,IAAI,MAAM,6BAA6BA,EAAM,OAAO,EAAE,CAC9D,CAEA,KAAK,QAAQ,eAAiB,KAAK,IAAI,EAAIC,CAC7C,CAKA,MAAM,YAAa,CACjB,MAAMA,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,KAAK,QAAQ,WACf,KAAK,QAAQ,OAAS,KAAK,QAAQ,WACnCA,EAAO,MAAM,4BAA4B,UAChC,KAAK,QAAQ,WACtB,GAAI,CACF,KAAK,QAAQ,OAASd,EAAG,aAAa,KAAK,QAAQ,WAAY,OAAO,EACtEc,EAAO,MAAM,qBAAqB,KAAK,QAAQ,UAAU,EAAE,EAC3DA,EAAO,MAAM,mBAAoB,KAAK,QAAQ,OAAO,MAAM,CAC7D,OAASE,EAAO,CACd,MAAAF,EAAO,MAAM,qBAAqB,KAAK,QAAQ,UAAU,GAAG,EACtD,IAAI,MAAM,qBAAqB,KAAK,QAAQ,UAAU,MAAME,EAAM,OAAO,EAAE,CACnF,KAEA,OAAAF,EAAO,MAAM,wCAAwC,EAC/C,IAAI,MAAM,wCAAwC,EAG1D,KAAK,QAAQ,WAAa,KAAK,IAAI,EAAIG,CACzC,CAKA,KAAM,CACJ,MAAMA,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,CACF,MAAMQ,EAAQ,IAAIrB,EAAM,KAAK,QAAQ,MAAM,EAC3C,KAAK,QAAQ,OAASqB,EAAM,SAAS,EAEjCA,EAAM,UAAU,EAAE,OAAS,IAC7BR,EAAO,KAAK,kBAAkBQ,EAAM,UAAU,EAAE,MAAM,WAAW,EACjEA,EAAM,UAAU,EAAE,QAASC,GAAQ,CACjCT,EAAO,MAAM,UAAUS,EAAI,OAAO,EAAE,CACtC,CAAC,EAEL,OAASP,EAAO,CACd,MAAAF,EAAO,MAAM,kBAAkBE,EAAM,OAAO,EAAE,EACxC,IAAI,MAAM,kBAAkBA,EAAM,OAAO,EAAE,CACnD,CAEA,KAAK,QAAQ,IAAM,KAAK,IAAI,EAAIC,CAClC,CAKA,OAAQ,CACN,MAAMA,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,CACF,MAAMU,EAAS,IAAItB,EAAO,KAAK,QAAQ,MAAM,EAG7C,GAFA,KAAK,QAAQ,IAAMsB,EAAO,MAAM,EAE5BA,EAAO,UAAU,EAAE,OAAS,IAC9BV,EAAO,KAAK,mBAAmBU,EAAO,UAAU,EAAE,MAAM,SAAS,EACjEA,EAAO,UAAU,EAAE,QAASD,GAAQ,CAClCT,EAAO,MAAM,WAAWS,EAAI,OAAO,EAAE,CACvC,CAAC,EAEG,KAAK,QAAQ,QACf,MAAM,IAAI,MAAM,GAAGC,EAAO,UAAU,EAAE,MAAM,sBAAsB,CAGxE,OAASR,EAAO,CACd,MAAAF,EAAO,MAAM,mBAAmBE,EAAM,OAAO,EAAE,EACzC,IAAI,MAAM,mBAAmBA,EAAM,OAAO,EAAE,CACpD,CAEA,KAAK,QAAQ,MAAQ,KAAK,IAAI,EAAIC,CACpC,CAKA,gBAAiB,CACf,MAAMA,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,CACF,MAAMW,EAAW,IAAItB,EAAe,KAAK,QAAQ,GAAG,EACpD,KAAK,QAAQ,QAAUsB,EAAS,QAAQ,EAEpC,KAAK,QAAQ,QAAQ,OAAO,OAAS,IACvCX,EAAO,KAAK,4BAA4B,KAAK,QAAQ,QAAQ,OAAO,MAAM,SAAS,EACnF,KAAK,QAAQ,QAAQ,OAAO,QAASS,GAAQ,CAC3CT,EAAO,MAAM,WAAWS,EAAI,OAAO,EAAE,CACvC,CAAC,EAEL,OAASP,EAAO,CACd,MAAAF,EAAO,MAAM,2BAA2BE,EAAM,OAAO,EAAE,EACjD,IAAI,MAAM,2BAA2BA,EAAM,OAAO,EAAE,CAC5D,CAEA,KAAK,QAAQ,eAAiB,KAAK,IAAI,EAAIC,CAC7C,CAKA,cAAe,CACb,MAAMA,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,CACF,MAAMW,EAAW,IAAIrB,EACnB,KAAK,QAAQ,IACb,KAAK,QAAQ,QAAQ,QACrB,CAAE,OAAQ,KAAK,QAAQ,MAAO,CAChC,EACA,KAAK,QAAQ,MAAQqB,EAAS,QAAQ,EAElC,KAAK,QAAQ,MAAM,OAAO,OAAS,IACrCX,EAAO,KAAK,2BAA2B,KAAK,QAAQ,MAAM,OAAO,MAAM,SAAS,EAChF,KAAK,QAAQ,MAAM,OAAO,QAASS,GAAQ,CACzCT,EAAO,MAAM,UAAUS,EAAI,OAAO,EAAE,CACtC,CAAC,EAEL,OAASP,EAAO,CACd,MAAAF,EAAO,MAAM,0BAA0BE,EAAM,OAAO,EAAE,EAChD,IAAI,MAAM,0BAA0BA,EAAM,OAAO,EAAE,CAC3D,CAEA,KAAK,QAAQ,aAAe,KAAK,IAAI,EAAIC,CAC3C,CAKA,gBAAiB,CACf,MAAMA,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,CACF,MAAMW,EAAW,IAAIpB,EACnB,KAAK,QAAQ,IACb,KAAK,QAAQ,QAAQ,QACrB,CAAE,OAAQ,KAAK,QAAQ,MAAO,CAChC,EACA,KAAK,QAAQ,QAAUoB,EAAS,QAAQ,EAEpC,KAAK,QAAQ,QAAQ,QAAU,KAAK,QAAQ,QAAQ,OAAO,OAAS,IACtEX,EAAO,KAAK,6BAA6B,KAAK,QAAQ,QAAQ,OAAO,MAAM,SAAS,EACpF,KAAK,QAAQ,QAAQ,OAAO,QAASS,GAAQ,CAC3CT,EAAO,MAAM,YAAYS,EAAI,OAAO,EAAE,CACxC,CAAC,EAEL,OAASP,EAAO,CACd,MAAAF,EAAO,MAAM,4BAA4BE,EAAM,OAAO,EAAE,EAClD,IAAI,MAAM,4BAA4BA,EAAM,OAAO,EAAE,CAC7D,CAEA,KAAK,QAAQ,eAAiB,KAAK,IAAI,EAAIC,CAC7C,CAKA,YAAa,CACX,MAAMA,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,CACF,MAAMW,EAAW,IAAInB,EACnB,KAAK,QAAQ,QACb,KAAK,QAAQ,MACb,CAAE,OAAQ,KAAK,QAAQ,MAAO,CAChC,EACA,KAAK,QAAQ,IAAMmB,EAAS,QAAQ,EAEhC,KAAK,QAAQ,IAAI,QAAU,KAAK,QAAQ,IAAI,OAAO,OAAS,IAC9DX,EAAO,KAAK,yBAAyB,KAAK,QAAQ,IAAI,OAAO,MAAM,SAAS,EAC5E,KAAK,QAAQ,IAAI,OAAO,QAASS,GAAQ,CACvCT,EAAO,MAAM,QAAQS,EAAI,OAAO,EAAE,CACpC,CAAC,EAEL,OAASP,EAAO,CACd,MAAAF,EAAO,MAAM,wBAAwBE,EAAM,OAAO,EAAE,EAC9C,IAAI,MAAM,wBAAwBA,EAAM,OAAO,EAAE,CACzD,CAEA,KAAK,QAAQ,WAAa,KAAK,IAAI,EAAIC,CACzC,CAKA,gBAAiB,CACf,MAAMA,EAAQ,KAAK,IAAI,EACjBH,EAAS,KAAK,IAEpB,GAAI,CACF,MAAMY,EAAY,IAAInB,EACpB,KAAK,QAAQ,QACb,KAAK,QAAQ,MACb,KAAK,QAAQ,QACb,KAAK,QAAQ,IACb,CACE,OAAQ,KAAK,QAAQ,aACrB,eAAgB,KAAK,QAAQ,eAC7B,YAAa,KAAK,QAAQ,YAC1B,kBAAmB,KAAK,QAAQ,kBAChC,mBAAoB,KAAK,QAAQ,mBACjC,eAAgB,KAAK,QAAQ,eAC7B,WAAY,KAAK,QAAQ,WACzB,YAAa,KAAK,QAAQ,WAC5B,CACF,EAEA,KAAK,QAAQ,OAASmB,EAAU,SAAS,CAC3C,OAASV,EAAO,CACd,MAAAF,EAAO,MAAM,6BAA6BE,EAAM,OAAO,EAAE,EACnD,IAAI,MAAM,6BAA6BA,EAAM,OAAO,EAAE,CAC9D,CAEA,KAAK,QAAQ,eAAiB,KAAK,IAAI,EAAIC,CAC7C,CAKA,QAAS,CACP,MAAMH,EAAS,KAAK,IAEpB,GAAI,KAAK,QAAQ,WACf,GAAI,CACFd,EAAG,cAAc,KAAK,QAAQ,WAAY,KAAK,QAAQ,OAAQ,OAAO,EACtEc,EAAO,QAAQ,oBAAoB,KAAK,QAAQ,UAAU,EAAE,CAC9D,OAASE,EAAO,CACd,MAAAF,EAAO,MAAM,yBAAyB,KAAK,QAAQ,UAAU,GAAG,EAC1D,IAAI,MAAM,yBAAyB,KAAK,QAAQ,UAAU,MAAME,EAAM,OAAO,EAAE,CACvF,MAGI,KAAK,QAAQ,eAAiB,WAChC,QAAQ,IAAI,KAAK,QAAQ,MAAM,CAGrC,CAUA,YAAa,CAEX,MAAMW,EAAa,KAAK,QAAQ,SAAS,SAAW,CAAC,EAC/CC,EAAmBD,EAAW,OAAQE,GAAMA,EAAE,OAAS,WAAW,EAClEC,EAAkBH,EAAW,OAAQE,GAAMA,EAAE,OAAS,UAAU,EAChEE,EAAeJ,EAAW,OAAQE,GAAMA,EAAE,OAAS,OAAO,EAG1DG,EAAiBJ,EAAiB,IAAKC,GAAMA,EAAE,IAAI,EACnDI,EAAgBH,EAAgB,IAAKD,GAAMA,EAAE,IAAI,EAGjDK,EAAe,CAAC,EACtBH,EAAa,QAASI,GAAgB,CAEpC,MAAMC,EAAaD,EAAY,KAAK,QAAQ,KAAM,EAAE,EAAE,QAAQ,SAAU,EAAE,EACpEE,EAAcF,EAAY,QAAU,CAAC,EAC3CD,EAAaC,EAAY,IAAI,EAAIE,EAAY,IAAKC,GAAMA,EAAE,IAAI,CAChE,CAAC,EAGDR,EAAgB,QAASS,GAAmB,CAC1C,MAAMC,EAAoB,IAAID,EAAe,IAAI,QAC7CL,EAAaM,CAAiB,IAEhCN,EAAaK,EAAe,IAAI,EAAIL,EAAaM,CAAiB,EAEtE,CAAC,EAID,MAAMtB,EAAgB,KAAK,QAAQ,kBAAkB,QAAU,CAAC,EAG1DuB,EAAa,CAAC,EACpB,OAAAvB,EAAc,QAAQC,GAAO,CAC3BsB,EAAWtB,EAAI,MAAM,EAAIA,EAAI,KAC/B,CAAC,EAEM,CACL,OAAQ,CACN,OAAQ,KAAK,QAAQ,QAAQ,QAAU,EACvC,KAAM,KAAK,QAAQ,UACrB,EACA,OAAQ,CACN,MAAO,KAAK,QAAQ,QAAQ,QAAU,CACxC,EACA,IAAK,CACH,MAAO,KAAK,QAAQ,KAAK,MAAM,QAAU,CAC3C,EAEA,QAAS,CAEP,UAAWa,EACX,SAAUC,EACV,MAAON,EAAW,OAGlB,IAAKA,EAGL,aAAcO,EAGd,MAAO,CACL,UAAWN,EAAiB,OAC5B,SAAUE,EAAgB,OAC1B,MAAOC,EAAa,MACtB,CACF,EAIA,QAAS,KAAK,QAAQ,eAAiBU,EAAa,KAGpD,iBAAkB,KAAK,QAAQ,eAAiB,CAC9C,OAAQvB,EACR,QAAS,KAAK,QAAQ,kBAAkB,SAAW,CACjD,MAAOA,EAAc,OACrB,SAAU,KAAK,QAAQ,kBAAkB,SAAS,UAAY,EAC9D,WAAY,KAAK,QAAQ,kBAAkB,SAAS,YAAc,EAClE,OAAQ,KAAK,QAAQ,kBAAkB,SAAS,QAAU,EAC1D,eAAgB,KAAK,QAAQ,kBAAkB,SAAS,gBAAkB,MAC1E,SAAU,KAAK,QAAQ,kBAAkB,SAAS,UAAY,CAC5D,UAAW,EACX,MAAO,EACP,MAAO,CACT,CACF,CACF,EAAI,KAEJ,MAAO,CACL,aAAc,KAAK,QAAQ,OAAO,cAAc,QAAU,EAC1D,YAAa,KAAK,QAAQ,OAAO,aAAa,QAAU,EACxD,cAAe,KAAK,QAAQ,OAAO,eAAe,QAAU,EAC5D,iBAAkB,KAAK,QAAQ,OAAO,kBAAkB,QAAU,EAClE,cAAe,KAAK,QAAQ,OAAO,eAAe,QAAU,EAC5D,iBAAkB,KAAK,QAAQ,OAAO,mBAAmB,QAAU,CACrE,EAEA,QAAS,KAAK,QAAQ,eAClB,CACA,iBAAkB,KAAK,QAAQ,SAAS,kBAAkB,QAAU,EACpE,gBAAiB,KAAK,QAAQ,SAAS,iBAAiB,QAAU,EAClE,UAAW,KAAK,QAAQ,SAAS,WAAW,QAAU,EACtD,oBAAqB,KAAK,QAAQ,SAAS,qBAAqB,QAAU,CAC5E,EACE,KAEJ,IAAK,KAAK,QAAQ,WACd,CACA,cAAe,KAAK,QAAQ,KAAK,sBAAwB,UACzD,mBAAoB,KAAK,QAAQ,KAAK,uBAAyB,EAC/D,aAAc,KAAK,QAAQ,KAAK,iBAAiB,QAAU,EAC3D,eAAgB,KAAK,QAAQ,KAAK,mBAAmB,QAAU,EAC/D,gBAAiB,KAAK,QAAQ,KAAK,gBAAkB,EACrD,eAAgB,KAAK,QAAQ,KAAK,kBAAkB,QAAU,EAC9D,gBAAiB,KAAK,QAAQ,KAAK,iBAAmB,SACxD,EACE,KAEJ,QAAS,KAAK,QACd,OAAQ,KAAK,QAAQ,OACrB,OAAQ,KAAK,OAAO,UAAU,EAC9B,WAAY,KAAK,OAAO,eAAe,CACzC,CACF,CACF,CAMA,eAAewB,EAAYC,EAAY/B,EAAU,CAAC,EAAG,CAMnD,OALiB,IAAID,EAAS,CAC5B,WAAAgC,EACA,GAAG/B,CACL,CAAC,EAEe,QAAQ,CAC1B,CAEA,eAAegC,EAAYC,EAAYjC,EAAU,CAAC,EAAG,CAMnD,OALiB,IAAID,EAAS,CAC5B,WAAAkC,EACA,GAAGjC,CACL,CAAC,EAEe,QAAQ,CAC1B,CAEA,eAAekC,EAAeD,EAAYE,EAAYnC,EAAU,CAAC,EAAG,CAOlE,OANiB,IAAID,EAAS,CAC5B,WAAAkC,EACA,WAAAE,EACA,GAAGnC,CACL,CAAC,EAEe,QAAQ,CAC1B,CAMA,eAAeoC,GAAS,CACtB,MAAMC,EAAO,QAAQ,KAAK,MAAM,CAAC,EAE7BA,EAAK,SAAW,IAClBC,EAAW,EACX,QAAQ,KAAK,CAAC,GAGhB,MAAML,EAAaI,EAAK,CAAC,EACzB,IAAIF,EAAa,KACbI,EAAe,OACfC,EAAU,GACVC,EAAiB,GACjBC,EAAiB,GACjBC,EAAa,GACbC,EAAa,OAEjB,QAASC,EAAI,EAAGA,EAAIR,EAAK,OAAQQ,IAAK,CACpC,MAAMC,EAAMT,EAAKQ,CAAC,EAEdC,IAAQ,MAAQA,IAAQ,WAC1BX,EAAaE,EAAK,EAAEQ,CAAC,EACZC,IAAQ,MAAQA,IAAQ,WACjCP,EAAeF,EAAK,EAAEQ,CAAC,EACdC,IAAQ,MAAQA,IAAQ,UACjCN,EAAU,GACDM,IAAQ,UACjBF,EAAaP,EAAK,EAAEQ,CAAC,GAAK,QACjBC,IAAQ,eACjBL,EAAiB,GACRK,IAAQ,eACjBJ,EAAiB,GACRI,IAAQ,WACjBH,EAAa,GACJG,IAAQ,YACjBL,EAAiB,GACjBC,EAAiB,GACjBC,EAAa,KACJG,IAAQ,MAAQA,IAAQ,YACjCR,EAAW,EACX,QAAQ,KAAK,CAAC,EAElB,CAEK,CAAC,OAAQ,WAAY,SAAS,EAAE,SAASC,CAAY,IACxD,QAAQ,MAAM,mBAAmBA,CAAY,EAAE,EAC/C,QAAQ,KAAK,CAAC,GAGhB,GAAI,CAYF,MAAMQ,EAAU,MAXC,IAAIhD,EAAS,CAC5B,WAAAkC,EACA,WAAAE,EACA,aAAAI,EACA,QAAAC,EACA,eAAAC,EACA,eAAAC,EACA,WAAAC,EACA,WAAAC,CACF,CAAC,EAE8B,QAAQ,EAGnCA,IAAe,SACjB,QAAQ,IAAI;AAAA,uCAAmC,EAC/C,QAAQ,IAAI;AAAA,CAAsC,GAGpD,QAAQ,KAAK,CAAC,CAChB,OAASxC,EAAO,CACd,QAAQ,MAAM;AAAA,gBAAcA,EAAM,OAAO;AAAA,CAAI,EAC7C,QAAQ,KAAK,CAAC,CAChB,CACF,CAEA,SAASkC,GAAa,CACpB,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAuBb,CACD,CAkBI,YAAY,MAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,IAC/CF,EAAO", + "names": ["fs", "Lexer", "Parser", "WidgetAnalyzer", "StateAnalyzer", "ContextAnalyzer", "SSRAnalyzer", "ReportGenerator", "ImportResolver", "resolverConfig", "initLogger", "Analyzer", "options", "loggerInstance", "logger", "summary", "error", "start", "parsedImports", "imp", "idx", "resolution", "lexer", "err", "parser", "analyzer", "generator", "allWidgets", "statelessWidgets", "w", "statefulWidgets", "stateWidgets", "statelessNames", "statefulNames", "stateClasses", "stateWidget", "widgetName", "stateFields", "f", "statefulWidget", "expectedStateName", "importsObj", "analyzeCode", "sourceCode", "analyzeFile", "sourceFile", "analyzeAndSave", "outputFile", "runCLI", "args", "printUsage", "outputFormat", "verbose", "includeImports", "includeContext", "includeSsr", "debugLevel", "i", "arg", "results"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/context_analyzer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/context_analyzer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer.js.map new file mode 100644 index 00000000..4b88c7dd --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/context_analyzer.js"], + "sourcesContent": ["/**\r\n * FlutterJS Context Analyzer - Phase 3\r\n * Detects InheritedWidget, Provider, BuildContext usage patterns\r\n * Analyzes context flow and SSR compatibility\r\n * \r\n * Phase 3 focuses on: Context detection, Provider patterns, SSR analysis\r\n * Does NOT implement actual context providers (that's Phase 4+)\r\n */\r\nimport { getLogger } from './flutterjs_logger.js';\r\n\r\nimport { InheritedWidgetMetadata,\r\n ChangeNotifierAnalysis,\r\n ProviderAnalysis,\r\n ContextUsagePattern, } from './context_analyzer_data.js';\r\nclass ContextAnalyzer {\r\n constructor(ast, widgets = [], options = {}) {\r\n this.ast = ast;\r\n this.widgets = widgets;\r\n this.logger = getLogger().createComponentLogger('ContextAnalyzer');\r\n this.options = {\r\n strict: false,\r\n ...options,\r\n };\r\n\r\n // Results storage\r\n this.inheritedWidgets = new Map(); // name -> InheritedWidgetMetadata\r\n this.changeNotifiers = new Map(); // name -> ChangeNotifierAnalysis\r\n this.providers = new Map(); // type -> ProviderAnalysis\r\n this.contextAccessPoints = []; // All places context is used\r\n this.inheritedWidgetGraph = {}; // Inheritance relationships\r\n this.providerGraph = {}; // Provider relationships\r\n this.errors = [];\r\n }\r\n\r\n /**\r\n * Main entry point - analyze context patterns\r\n */\r\n analyze() {\r\n this.logger.startSession('ContextAnalysis');\r\n this.logger.trace('[ContextAnalyzer] Starting analysis...\\n');\r\n this.logger.startSession('WidgetAnalyzer');\r\n this.logger.trace('[ContextAnalyzer] Starting analysis...\\n');\r\n\r\n try {\r\n // Phase 1: Detect InheritedWidget classes\r\n this.detectInheritedWidgets();\r\n this.logger.trace(`[ContextAnalyzer] Found ${this.inheritedWidgets.size} InheritedWidgets\\n`);\r\n\r\n // Phase 2: Detect ChangeNotifier classes\r\n this.detectChangeNotifiers();\r\n this.logger.trace(`[ContextAnalyzer] Found ${this.changeNotifiers.size} ChangeNotifiers\\n`);\r\n\r\n // Phase 3: Detect Provider patterns\r\n this.detectProviders();\r\n this.logger.trace(`[ContextAnalyzer] Found ${this.providers.size} Providers\\n`);\r\n\r\n // Phase 4: Find context access points\r\n this.findContextAccessPoints();\r\n this.logger.trace(`[ContextAnalyzer] Found ${this.contextAccessPoints.length} context usage points\\n`);\r\n\r\n // Phase 5: Build graphs\r\n this.buildInheritedWidgetGraph();\r\n this.buildProviderGraph();\r\n this.logger.trace('[ContextAnalyzer] Built dependency graphs\\n');\r\n\r\n return this.getResults();\r\n } catch (error) {\r\n this.errors.push(error);\r\n console.error('[ContextAnalyzer] Error:', error.message);\r\n return this.getResults();\r\n }\r\n }\r\n\r\n /**\r\n * Phase 1: Detect InheritedWidget classes\r\n * \r\n * Looks for:\r\n * - class MyProvider extends InheritedWidget\r\n * - Properties: data, child\r\n * - Methods: of(), updateShouldNotify()\r\n */\r\n detectInheritedWidgets() {\r\n if (!this.ast || !this.ast.body) return;\r\n\r\n this.ast.body.forEach((node) => {\r\n if (node.type !== 'ClassDeclaration') return;\r\n\r\n const className = node.id?.name;\r\n const superClass = node.superClass?.name;\r\n\r\n // Check if extends InheritedWidget\r\n if (!superClass || !superClass.includes('InheritedWidget')) return;\r\n\r\n this.logger.trace(`[ContextAnalyzer.detectInheritedWidgets] Found: ${className}`);\r\n\r\n const metadata = new InheritedWidgetMetadata(\r\n className,\r\n node.location,\r\n superClass\r\n );\r\n\r\n // Extract properties\r\n if (node.body?.fields) {\r\n node.body.fields.forEach((field) => {\r\n const fieldName = field.key?.name;\r\n metadata.properties.push({\r\n name: fieldName,\r\n type: this.inferType(field.initialValue),\r\n required: !this.hasDefaultValue(field),\r\n });\r\n });\r\n }\r\n\r\n // Extract static accessors (of() method)\r\n if (node.body?.methods) {\r\n node.body.methods.forEach((method) => {\r\n const methodName = method.key?.name;\r\n\r\n // Check for static accessor pattern\r\n if (methodName === 'of' && this.isStaticAccessor(method)) {\r\n metadata.staticAccessors.push({\r\n name: methodName,\r\n signature: `static ${methodName}(BuildContext context)`,\r\n usesInheritedWidgetLookup: this.checksInheritedWidgetLookup(method),\r\n location: method.location,\r\n });\r\n }\r\n\r\n // Check for updateShouldNotify\r\n if (methodName === 'updateShouldNotify') {\r\n metadata.updateShouldNotifyImplemented = true;\r\n }\r\n });\r\n }\r\n\r\n this.inheritedWidgets.set(className, metadata);\r\n });\r\n }\r\n\r\n /**\r\n * Check if method is static (phase 3 simplified - assumes 'of' is usually static)\r\n */\r\n isStaticAccessor(method) {\r\n // In a real implementation, check for @static decorator or static keyword\r\n return method.key?.name === 'of';\r\n }\r\n\r\n /**\r\n * Check if method body contains dependOnInheritedWidgetOfExactType call\r\n */\r\n checksInheritedWidgetLookup(method) {\r\n if (!method.body) return false;\r\n\r\n const code = JSON.stringify(method.body);\r\n return code.includes('dependOnInheritedWidgetOfExactType') ||\r\n code.includes('inheritedWidgetOfExactType');\r\n }\r\n\r\n /**\r\n * Phase 2: Detect ChangeNotifier classes\r\n * \r\n * Looks for:\r\n * - class MyNotifier extends ChangeNotifier\r\n * - Methods that call notifyListeners()\r\n * - Properties that get/set\r\n */\r\n detectChangeNotifiers() {\r\n if (!this.ast || !this.ast.body) return;\r\n\r\n this.ast.body.forEach((node) => {\r\n if (node.type !== 'ClassDeclaration') return;\r\n\r\n const className = node.id?.name;\r\n const superClass = node.superClass?.name;\r\n\r\n // Check if extends ChangeNotifier\r\n if (!superClass || superClass !== 'ChangeNotifier') return;\r\n\r\n this.logger.trace(`[ContextAnalyzer.detectChangeNotifiers] Found: ${className}`);\r\n\r\n const analysis = new ChangeNotifierAnalysis(\r\n className,\r\n node.location\r\n );\r\n\r\n // Extract properties\r\n if (node.body?.fields) {\r\n node.body.fields.forEach((field) => {\r\n const fieldName = field.key?.name;\r\n analysis.properties.push({\r\n name: fieldName,\r\n type: this.inferType(field.initialValue),\r\n initialValue: this.expressionToString(field.initialValue),\r\n });\r\n });\r\n }\r\n\r\n // Extract getters, methods, and notifyListeners calls\r\n if (node.body?.methods) {\r\n node.body.methods.forEach((method) => {\r\n const methodName = method.key?.name;\r\n\r\n // Check for getter pattern (get count => _count)\r\n if (methodName && !method.params?.length && method.body) {\r\n const isGetter = JSON.stringify(method).includes('return');\r\n if (isGetter) {\r\n analysis.getters.push({\r\n name: methodName,\r\n returnType: this.inferReturnType(method.body),\r\n location: method.location,\r\n });\r\n }\r\n }\r\n\r\n // Check for notifyListeners call\r\n const callsNotify = this.callsNotifyListeners(method.body);\r\n if (callsNotify || methodName === 'increment' || methodName === 'decrement') {\r\n const mutations = this.extractMutationsInMethod(method.body);\r\n analysis.methods.push({\r\n name: methodName,\r\n callsNotifyListeners: callsNotify,\r\n location: method.location,\r\n mutations: mutations,\r\n });\r\n }\r\n });\r\n }\r\n\r\n this.changeNotifiers.set(className, analysis);\r\n });\r\n }\r\n\r\n /**\r\n * Check if method calls notifyListeners()\r\n */\r\n callsNotifyListeners(body) {\r\n if (!body) return false;\r\n const code = JSON.stringify(body);\r\n return code.includes('notifyListeners');\r\n }\r\n\r\n /**\r\n * Extract field mutations in method (this._field = x, this._field++, etc.)\r\n */\r\n extractMutationsInMethod(body) {\r\n const mutations = [];\r\n if (!body) return mutations;\r\n\r\n const code = JSON.stringify(body);\r\n \r\n // Simple pattern matching for mutations\r\n const patterns = [\r\n /this\\._(\\w+)\\s*[=+\\-*]/g, // this._field = or +=, -=, etc.\r\n /this\\.(\\w+)\\s*[=+\\-*]/g, // this.field = or +=, -=, etc.\r\n ];\r\n\r\n patterns.forEach((pattern) => {\r\n let match;\r\n while ((match = pattern.exec(code)) !== null) {\r\n mutations.push(match[1]);\r\n }\r\n });\r\n\r\n return [...new Set(mutations)]; // Remove duplicates\r\n }\r\n\r\n /**\r\n * Phase 3: Detect Provider patterns\r\n * \r\n * Looks for:\r\n * - Provider(create: ..., child: ...)\r\n * - Detects consumer patterns: context.watch(), context.read()\r\n */\r\n detectProviders() {\r\n if (!this.ast || !this.ast.body) return;\r\n\r\n this.ast.body.forEach((node) => {\r\n if (node.type === 'ClassDeclaration') {\r\n // Check if class contains Provider creation in build()\r\n const buildMethod = node.body?.methods?.find((m) => m.key?.name === 'build');\r\n if (buildMethod) {\r\n this.findProvidersInMethod(buildMethod, node);\r\n }\r\n }\r\n\r\n // Also check in function bodies\r\n if (node.type === 'FunctionDeclaration') {\r\n this.findProvidersInMethod(node, null);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Find Provider instantiations in a method\r\n */\r\n findProvidersInMethod(method, classNode) {\r\n if (!method.body) return;\r\n\r\n const body = method.body.type === 'BlockStatement' ? method.body.body : [method.body];\r\n\r\n body.forEach((stmt) => {\r\n this.findProvidersInStatement(stmt);\r\n });\r\n }\r\n\r\n /**\r\n * Recursively find Provider patterns in statements\r\n */\r\n findProvidersInStatement(stmt) {\r\n if (!stmt) return;\r\n\r\n if (stmt.type === 'ExpressionStatement' && stmt.expression) {\r\n this.findProvidersInExpression(stmt.expression);\r\n }\r\n\r\n if (stmt.type === 'ReturnStatement' && stmt.argument) {\r\n this.findProvidersInExpression(stmt.argument);\r\n }\r\n\r\n if (stmt.type === 'BlockStatement' && stmt.body) {\r\n stmt.body.forEach((s) => this.findProvidersInStatement(s));\r\n }\r\n }\r\n\r\n /**\r\n * Find Provider patterns in expressions\r\n * Looks for: new Provider(...)\r\n */\r\n findProvidersInExpression(expr) {\r\n if (!expr) return;\r\n\r\n // Check for NewExpression: new Provider(...)\r\n if (expr.type === 'NewExpression') {\r\n const calleeName = expr.callee?.name;\r\n\r\n if (calleeName === 'Provider' || calleeName?.startsWith('Provider')) {\r\n // Extract generic type: Provider\r\n const genericType = this.extractGenericType(expr);\r\n\r\n if (genericType) {\r\n this.logger.trace(`[ContextAnalyzer.detectProviders] Found Provider<${genericType}>`);\r\n\r\n const analysis = new ProviderAnalysis(\r\n `Provider<${genericType}>`,\r\n expr.location,\r\n genericType\r\n );\r\n\r\n // Extract create function\r\n if (expr.args) {\r\n expr.args.forEach((arg) => {\r\n if (arg.type === 'ObjectLiteral') {\r\n arg.properties?.forEach((prop) => {\r\n if (prop.key?.name === 'create') {\r\n analysis.createFunction = this.expressionToString(prop.value);\r\n }\r\n if (prop.key?.name === 'child') {\r\n // Child widget - may use this provider\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Identify access patterns (watch, read, select)\r\n this.identifyAccessPatterns(genericType, analysis);\r\n\r\n this.providers.set(`Provider<${genericType}>`, analysis);\r\n }\r\n }\r\n }\r\n\r\n // Check call expressions\r\n if (expr.type === 'CallExpression' && expr.args) {\r\n expr.args.forEach((arg) => {\r\n this.findProvidersInExpression(arg);\r\n });\r\n }\r\n\r\n // Check object literals\r\n if (expr.type === 'ObjectLiteral' && expr.properties) {\r\n expr.properties.forEach((prop) => {\r\n this.findProvidersInExpression(prop.value);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Extract generic type from Provider\r\n * In simplified version, returns T or null\r\n */\r\n extractGenericType(expr) {\r\n // In real implementation, parse the full generic syntax\r\n // For now, look for the callee name pattern\r\n const code = JSON.stringify(expr.callee);\r\n\r\n // Simple heuristic: if it mentions Provider and contains type info\r\n if (code.includes('Provider')) {\r\n // Try to find type in expression string representation\r\n const exprStr = this.expressionToString(expr.callee);\r\n const match = exprStr.match(/Provider<(\\w+)>/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Identify how this provider is consumed\r\n */\r\n identifyAccessPatterns(providerType, analysis) {\r\n if (!this.ast || !this.ast.body) return;\r\n\r\n // Search for context.watch(), context.read(), context.select()\r\n this.ast.body.forEach((node) => {\r\n if (node.type === 'ClassDeclaration') {\r\n const buildMethod = node.body?.methods?.find((m) => m.key?.name === 'build');\r\n if (buildMethod) {\r\n this.scanForAccessPatterns(buildMethod, providerType, analysis);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Scan method for watch/read/select patterns\r\n */\r\n scanForAccessPatterns(method, providerType, analysis) {\r\n if (!method.body) return;\r\n\r\n const code = JSON.stringify(method.body);\r\n\r\n // Check for access patterns\r\n if (code.includes('context.watch')) {\r\n analysis.accessPatterns.push('watch');\r\n }\r\n if (code.includes('context.read')) {\r\n analysis.accessPatterns.push('read');\r\n }\r\n if (code.includes('context.select')) {\r\n analysis.accessPatterns.push('select');\r\n }\r\n\r\n // Find consumer widgets\r\n if (code.includes('Consumer')) {\r\n analysis.accessPatterns.push('Consumer');\r\n }\r\n }\r\n\r\n /**\r\n * Phase 4: Find all context access points\r\n * \r\n * Maps:\r\n * - Which widgets use context\r\n * - How they access it (context.theme(), context.mediaQuery(), etc.)\r\n * - SSR compatibility\r\n */\r\n findContextAccessPoints() {\r\n if (!this.ast || !this.ast.body) return;\r\n\r\n this.ast.body.forEach((node) => {\r\n if (node.type !== 'ClassDeclaration') return;\r\n\r\n const className = node.id?.name;\r\n const buildMethod = node.body?.methods?.find((m) => m.key?.name === 'build');\r\n\r\n if (buildMethod) {\r\n const usagePoints = this.extractContextUsageInMethod(buildMethod, className);\r\n this.contextAccessPoints.push(...usagePoints);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Extract all context.X() calls in a method\r\n */\r\n extractContextUsageInMethod(method, className) {\r\n const usages = [];\r\n\r\n if (!method.body) return usages;\r\n\r\n const stmts = method.body.type === 'BlockStatement' ? method.body.body : [method.body];\r\n\r\n stmts.forEach((stmt) => {\r\n const foundUsages = this.findContextUsageInStatement(stmt, className);\r\n usages.push(...foundUsages);\r\n });\r\n\r\n return usages;\r\n }\r\n\r\n /**\r\n * Recursively find context usage patterns\r\n */\r\n findContextUsageInStatement(stmt, className) {\r\n const usages = [];\r\n\r\n if (!stmt) return usages;\r\n\r\n if (stmt.type === 'ExpressionStatement' && stmt.expression) {\r\n const stmtUsages = this.findContextUsageInExpression(stmt.expression, className);\r\n usages.push(...stmtUsages);\r\n }\r\n\r\n if (stmt.type === 'ReturnStatement' && stmt.argument) {\r\n const retUsages = this.findContextUsageInExpression(stmt.argument, className);\r\n usages.push(...retUsages);\r\n }\r\n\r\n if (stmt.type === 'BlockStatement' && stmt.body) {\r\n stmt.body.forEach((s) => {\r\n const blockUsages = this.findContextUsageInStatement(s, className);\r\n usages.push(...blockUsages);\r\n });\r\n }\r\n\r\n return usages;\r\n }\r\n\r\n /**\r\n * Find context usage in expressions\r\n * Looks for: Theme.of(context), context.watch(), context.read(), etc.\r\n */\r\n findContextUsageInExpression(expr, className) {\r\n const usages = [];\r\n\r\n if (!expr) return usages;\r\n\r\n const exprStr = JSON.stringify(expr);\r\n\r\n // Pattern 1: Theme.of(context)\r\n if (exprStr.includes('Theme.of') && exprStr.includes('context')) {\r\n usages.push(new ContextUsagePattern(\r\n 'Theme.of(context)',\r\n 'inherited-widget-lookup',\r\n expr.location,\r\n 'ThemeData',\r\n true,\r\n 'Pure value access, no subscription required'\r\n ));\r\n }\r\n\r\n // Pattern 2: context.theme()\r\n if (exprStr.includes('context.theme')) {\r\n usages.push(new ContextUsagePattern(\r\n 'context.theme()',\r\n 'context-service',\r\n expr.location,\r\n 'ThemeData',\r\n true,\r\n 'Service access during build'\r\n ));\r\n }\r\n\r\n // Pattern 3: context.watch()\r\n if (exprStr.includes('context.watch')) {\r\n usages.push(new ContextUsagePattern(\r\n 'context.watch()',\r\n 'provider-watch',\r\n expr.location,\r\n 'T',\r\n false,\r\n 'Requires reactive subscription - not SSR safe'\r\n ));\r\n }\r\n\r\n // Pattern 4: context.read()\r\n if (exprStr.includes('context.read')) {\r\n usages.push(new ContextUsagePattern(\r\n 'context.read()',\r\n 'provider-read',\r\n expr.location,\r\n 'T',\r\n true,\r\n 'Single read at render time - SSR safe'\r\n ));\r\n }\r\n\r\n // Pattern 5: context.mediaQuery()\r\n if (exprStr.includes('context.mediaQuery') || exprStr.includes('MediaQuery.of')) {\r\n usages.push(new ContextUsagePattern(\r\n 'context.mediaQuery()',\r\n 'context-service',\r\n expr.location,\r\n 'MediaQueryData',\r\n true,\r\n 'Read-only responsive info'\r\n ));\r\n }\r\n\r\n // Pattern 6: State mutations in handlers\r\n if (exprStr.includes('notifyListeners') || exprStr.includes('increment')) {\r\n usages.push(new ContextUsagePattern(\r\n 'notifyListeners()',\r\n 'global-state-mutation',\r\n expr.location,\r\n 'void',\r\n false,\r\n 'Mutations do not trigger re-render in SSR'\r\n ));\r\n }\r\n\r\n // Recursively search nested expressions\r\n if (expr.type === 'CallExpression' && expr.args) {\r\n expr.args.forEach((arg) => {\r\n const argUsages = this.findContextUsageInExpression(arg, className);\r\n usages.push(...argUsages);\r\n });\r\n }\r\n\r\n if (expr.type === 'ObjectLiteral' && expr.properties) {\r\n expr.properties.forEach((prop) => {\r\n const propUsages = this.findContextUsageInExpression(prop.value, className);\r\n usages.push(...propUsages);\r\n });\r\n }\r\n\r\n if (expr.type === 'MemberExpression') {\r\n const memberUsages = this.findContextUsageInExpression(expr.object, className);\r\n usages.push(...memberUsages);\r\n }\r\n\r\n return usages;\r\n }\r\n\r\n /**\r\n * Phase 5a: Build InheritedWidget graph\r\n * Maps provider -> consumer relationships\r\n */\r\n buildInheritedWidgetGraph() {\r\n this.inheritedWidgets.forEach((widget) => {\r\n this.inheritedWidgetGraph[widget.name] = {\r\n providedBy: this.findWhoProvides(widget.name),\r\n consumedBy: this.findWhoConsumes(widget.name),\r\n providedValue: widget.properties[0]?.type || 'unknown',\r\n flowPath: this.traceContextFlow(widget.name),\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Phase 5b: Build Provider graph\r\n * Maps provider -> consumer relationships\r\n */\r\n buildProviderGraph() {\r\n this.providers.forEach((provider) => {\r\n const key = provider.providerType;\r\n this.providerGraph[key] = {\r\n providedBy: this.findWhoCreatesProvider(provider.providerType),\r\n providedType: provider.valueType,\r\n consumedBy: this.findWhoConsumesProvider(provider.providerType),\r\n accessPatterns: provider.accessPatterns,\r\n flowPath: this.traceProviderFlow(provider.providerType),\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Find which widget provides this inherited widget\r\n */\r\n findWhoProvides(widgetName) {\r\n // Simplified: return widget name of class that instantiates it\r\n // In real implementation, search AST for instantiation\r\n return 'MyApp';\r\n }\r\n\r\n /**\r\n * Find which widgets consume this inherited widget\r\n */\r\n findWhoConsumes(widgetName) {\r\n const consumers = [];\r\n // Search for calls to widgetName.of()\r\n this.contextAccessPoints.forEach((usage) => {\r\n if (usage.pattern.includes(widgetName)) {\r\n consumers.push(usage.dependent);\r\n }\r\n });\r\n return consumers;\r\n }\r\n\r\n /**\r\n * Find where this inherited widget's context flows\r\n */\r\n traceContextFlow(widgetName) {\r\n // Simplified path tracing\r\n return `${this.findWhoProvides(widgetName)} -> ${widgetName} -> ${this.findWhoConsumes(widgetName).join(', ')}`;\r\n }\r\n\r\n /**\r\n * Find who creates this provider\r\n */\r\n findWhoCreatesProvider(providerType) {\r\n // Simplified: return app root\r\n return 'MyApp';\r\n }\r\n\r\n /**\r\n * Find who consumes this provider\r\n */\r\n findWhoConsumesProvider(providerType) {\r\n const consumers = [];\r\n this.contextAccessPoints.forEach((usage) => {\r\n if (usage.pattern.includes('watch') || usage.pattern.includes('read')) {\r\n consumers.push(usage.dependent);\r\n }\r\n });\r\n return consumers;\r\n }\r\n\r\n /**\r\n * Find provider flow path through widget tree\r\n */\r\n traceProviderFlow(providerType) {\r\n return `MyApp -> Provider -> MaterialApp -> [consumers]`;\r\n }\r\n\r\n /**\r\n * Helper: Infer type from expression\r\n */\r\n inferType(expr) {\r\n if (!expr) return 'any';\r\n if (expr.type === 'Literal') {\r\n const val = expr.value;\r\n if (typeof val === 'string') return 'string';\r\n if (typeof val === 'number') return 'number';\r\n if (typeof val === 'boolean') return 'boolean';\r\n }\r\n return 'any';\r\n }\r\n\r\n /**\r\n * Helper: Infer return type from method body\r\n */\r\n inferReturnType(body) {\r\n // Simplified\r\n return 'any';\r\n }\r\n\r\n /**\r\n * Helper: Check if field has default value\r\n */\r\n hasDefaultValue(field) {\r\n return field.initialValue !== null && field.initialValue !== undefined;\r\n }\r\n\r\n /**\r\n * Helper: Convert expression to string\r\n */\r\n expressionToString(expr) {\r\n if (!expr) return 'null';\r\n if (expr.type === 'Identifier') return expr.name;\r\n if (expr.type === 'Literal') return String(expr.value);\r\n return JSON.stringify(expr).substring(0, 50);\r\n }\r\n\r\n /**\r\n * Get analysis results\r\n */\r\n getResults() {\r\n return {\r\n inheritedWidgets: Array.from(this.inheritedWidgets.values()),\r\n changeNotifiers: Array.from(this.changeNotifiers.values()),\r\n providers: Array.from(this.providers.values()),\r\n contextAccessPoints: this.contextAccessPoints,\r\n inheritedWidgetGraph: this.inheritedWidgetGraph,\r\n providerGraph: this.providerGraph,\r\n errors: this.errors,\r\n };\r\n }\r\n}\r\n\r\nexport { ContextAnalyzer };\r\n"], + "mappings": "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", + "names": ["getLogger", "InheritedWidgetMetadata", "ChangeNotifierAnalysis", "ProviderAnalysis", "ContextUsagePattern", "ContextAnalyzer", "ast", "widgets", "options", "error", "node", "className", "superClass", "metadata", "field", "fieldName", "method", "methodName", "code", "analysis", "callsNotify", "mutations", "body", "pattern", "match", "buildMethod", "m", "classNode", "stmt", "s", "expr", "calleeName", "genericType", "arg", "prop", "providerType", "usagePoints", "usages", "foundUsages", "stmtUsages", "retUsages", "blockUsages", "exprStr", "argUsages", "propUsages", "memberUsages", "widget", "provider", "key", "widgetName", "consumers", "usage", "val"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/context_analyzer_data.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer_data.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/context_analyzer_data.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer_data.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer_data.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer_data.js.map new file mode 100644 index 00000000..770d17e3 --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/context_analyzer_data.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/context_analyzer_data.js"], + "sourcesContent": ["/**\r\n * FlutterJS Context Analyzer - Data Classes\r\n * Phase 3 Implementation\r\n * \r\n * Represents context-related concepts:\r\n * - InheritedWidget classes and their properties\r\n * - ChangeNotifier implementations\r\n * - Provider patterns\r\n * - Context usage and dependencies\r\n * - SSR compatibility information\r\n */\r\n\r\n// ============================================================================\r\n// INHERITED WIDGET METADATA\r\n// ============================================================================\r\n\r\n/**\r\n * Metadata about an InheritedWidget class\r\n * \r\n * Represents:\r\n * class ThemeProvider extends InheritedWidget {\r\n * final ThemeData theme;\r\n * final Widget child;\r\n * \r\n * static ThemeData of(BuildContext context) {\r\n * return context.dependOnInheritedWidgetOfExactType()?.theme;\r\n * }\r\n * \r\n * @override\r\n * bool updateShouldNotify(ThemeProvider oldWidget) {\r\n * return theme != oldWidget.theme;\r\n * }\r\n * }\r\n */\r\nclass InheritedWidgetMetadata {\r\n constructor(name, location, superClass = 'InheritedWidget') {\r\n // Identity\r\n this.name = name;\r\n this.location = location;\r\n this.superClass = superClass;\r\n\r\n // Structure\r\n this.properties = []; // Required/provided properties\r\n this.staticAccessors = []; // of() methods, from() factory methods\r\n this.methods = []; // Other methods\r\n\r\n // Implementation details\r\n this.updateShouldNotifyImplemented = false;\r\n this.hasChildProperty = false;\r\n\r\n // Usage tracking\r\n this.usageCount = 0;\r\n this.usedIn = []; // Widget names that use this provider\r\n this.providedByWidgets = []; // Widget names that instantiate this\r\n }\r\n\r\n /**\r\n * Add a property to this inherited widget\r\n * Example: theme (ThemeData), child (Widget)\r\n */\r\n addProperty(name, type, required = false) {\r\n this.properties.push({\r\n name,\r\n type,\r\n required,\r\n description: null,\r\n });\r\n\r\n if (name === 'child') {\r\n this.hasChildProperty = true;\r\n }\r\n }\r\n\r\n /**\r\n * Add a static accessor method\r\n * Example: static ThemeData of(BuildContext context)\r\n */\r\n addStaticAccessor(name, signature, location, usesInheritedWidgetLookup = true) {\r\n this.staticAccessors.push({\r\n name,\r\n signature,\r\n usesInheritedWidgetLookup,\r\n location,\r\n });\r\n }\r\n\r\n /**\r\n * Record that a widget uses this provider\r\n */\r\n recordUsage(widgetName) {\r\n if (!this.usedIn.includes(widgetName)) {\r\n this.usedIn.push(widgetName);\r\n this.usageCount++;\r\n }\r\n }\r\n\r\n /**\r\n * Record that a widget provides (instantiates) this provider\r\n */\r\n recordProvider(widgetName) {\r\n if (!this.providedByWidgets.includes(widgetName)) {\r\n this.providedByWidgets.push(widgetName);\r\n }\r\n }\r\n\r\n /**\r\n * Validate the InheritedWidget pattern\r\n */\r\n validate() {\r\n const issues = [];\r\n\r\n // Should have child property\r\n if (!this.hasChildProperty) {\r\n issues.push({\r\n type: 'missing-child-property',\r\n severity: 'warning',\r\n message: `InheritedWidget \"${this.name}\" should have a 'child' property`,\r\n });\r\n }\r\n\r\n // Should have static of() accessor\r\n if (this.staticAccessors.length === 0) {\r\n issues.push({\r\n type: 'missing-static-accessor',\r\n severity: 'warning',\r\n message: `InheritedWidget \"${this.name}\" should have a static of() method`,\r\n });\r\n }\r\n\r\n // Should implement updateShouldNotify\r\n if (!this.updateShouldNotifyImplemented) {\r\n issues.push({\r\n type: 'missing-update-notification',\r\n severity: 'error',\r\n message: `InheritedWidget \"${this.name}\" must implement updateShouldNotify()`,\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * Get summary of this InheritedWidget\r\n */\r\n summary() {\r\n return {\r\n name: this.name,\r\n superClass: this.superClass,\r\n properties: this.properties.length,\r\n staticAccessors: this.staticAccessors.length,\r\n usageCount: this.usageCount,\r\n usedIn: this.usedIn,\r\n providedBy: this.providedByWidgets,\r\n isValid: this.updateShouldNotifyImplemented,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// CHANGE NOTIFIER ANALYSIS\r\n// ============================================================================\r\n\r\n/**\r\n * Analysis of a ChangeNotifier class\r\n * \r\n * Represents:\r\n * class CounterNotifier extends ChangeNotifier {\r\n * int _count = 0;\r\n * \r\n * int get count => _count;\r\n * \r\n * void increment() {\r\n * _count++;\r\n * notifyListeners();\r\n * }\r\n * }\r\n */\r\nclass ChangeNotifierAnalysis {\r\n constructor(name, location) {\r\n // Identity\r\n this.name = name;\r\n this.location = location;\r\n this.type = 'ChangeNotifier';\r\n\r\n // Structure\r\n this.properties = []; // _count, _isLoading, etc.\r\n this.getters = []; // get count => _count\r\n this.methods = []; // increment(), decrement(), etc.\r\n this.setters = []; // set property(value) => ...\r\n\r\n // Usage tracking\r\n this.isUsedWithProvider = false; // Is this used with Provider?\r\n this.providedType = null; // The Provider type\r\n this.consumers = []; // Widgets that consume this notifier\r\n this.subscriptions = []; // Where it's subscribed to\r\n }\r\n\r\n /**\r\n * Add a property to this notifier\r\n */\r\n addProperty(name, type, initialValue = null) {\r\n this.properties.push({\r\n name,\r\n type,\r\n initialValue,\r\n mutable: true,\r\n });\r\n }\r\n\r\n /**\r\n * Add a getter method\r\n * Example: get count => _count\r\n */\r\n addGetter(name, returnType, location) {\r\n this.getters.push({\r\n name,\r\n returnType,\r\n location,\r\n isComputed: false,\r\n });\r\n }\r\n\r\n /**\r\n * Add a method that mutates state\r\n */\r\n addMethod(name, location, callsNotify = false, mutations = []) {\r\n this.methods.push({\r\n name,\r\n location,\r\n callsNotifyListeners: callsNotify,\r\n mutatesFields: mutations,\r\n isAsync: false,\r\n parameters: [],\r\n });\r\n }\r\n\r\n /**\r\n * Record that a widget consumes this notifier\r\n */\r\n recordConsumer(widgetName, accessPattern = 'watch') {\r\n if (!this.consumers.includes(widgetName)) {\r\n this.consumers.push(widgetName);\r\n }\r\n\r\n this.subscriptions.push({\r\n consumer: widgetName,\r\n accessPattern, // 'watch', 'read', 'select'\r\n timestamp: new Date(),\r\n });\r\n }\r\n\r\n /**\r\n * Check if this notifier is properly implemented\r\n */\r\n validate() {\r\n const issues = [];\r\n\r\n // Should have at least one method that calls notifyListeners\r\n const hasNotifyCall = this.methods.some((m) => m.callsNotifyListeners);\r\n if (!hasNotifyCall && this.methods.length > 0) {\r\n issues.push({\r\n type: 'missing-notify-listeners',\r\n severity: 'warning',\r\n message: `ChangeNotifier \"${this.name}\" has methods but none call notifyListeners()`,\r\n });\r\n }\r\n\r\n // Methods that mutate should call notifyListeners\r\n this.methods.forEach((method) => {\r\n if (method.mutatesFields.length > 0 && !method.callsNotifyListeners) {\r\n issues.push({\r\n type: 'mutation-without-notification',\r\n severity: 'warning',\r\n message: `Method \"${method.name}\" mutates state but doesn't call notifyListeners()`,\r\n });\r\n }\r\n });\r\n\r\n // Should have getters for public access\r\n if (this.properties.length > 0 && this.getters.length === 0) {\r\n issues.push({\r\n type: 'missing-getters',\r\n severity: 'info',\r\n message: `ChangeNotifier \"${this.name}\" has properties but no getters. Consider adding getters for encapsulation.`,\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n name: this.name,\r\n properties: this.properties.length,\r\n getters: this.getters.length,\r\n methods: this.methods.length,\r\n consumers: this.consumers.length,\r\n consumedBy: this.consumers,\r\n isValid: this.methods.some((m) => m.callsNotifyListeners),\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// PROVIDER ANALYSIS\r\n// ============================================================================\r\n\r\n/**\r\n * Analysis of a Provider pattern\r\n * \r\n * Represents:\r\n * Provider(\r\n * create: (context) => CounterNotifier(),\r\n * child: MaterialApp(...)\r\n * )\r\n */\r\nclass ProviderAnalysis {\r\n constructor(providerType, location, valueType) {\r\n // Identity\r\n this.providerType = providerType; // 'Provider'\r\n this.location = location;\r\n this.valueType = valueType; // 'CounterNotifier'\r\n\r\n // Configuration\r\n this.createFunction = null; // (context) => CounterNotifier()\r\n this.lazy = true; // Is it lazy-initialized?\r\n this.dispose = null; // Cleanup function\r\n this.child = null; // Child widget\r\n\r\n // Usage tracking\r\n this.consumers = []; // Widgets that consume\r\n this.accessPatterns = []; // 'watch', 'read', 'select'\r\n this.flowPath = null; // Provider \u2192 ... \u2192 Consumer\r\n }\r\n\r\n /**\r\n * Set the create function\r\n */\r\n setCreateFunction(func) {\r\n this.createFunction = func;\r\n }\r\n\r\n /**\r\n * Set the dispose function\r\n */\r\n setDispose(func) {\r\n this.dispose = func;\r\n }\r\n\r\n /**\r\n * Record a consumer widget\r\n */\r\n addConsumer(widgetName) {\r\n if (!this.consumers.includes(widgetName)) {\r\n this.consumers.push(widgetName);\r\n }\r\n }\r\n\r\n /**\r\n * Record an access pattern\r\n */\r\n addAccessPattern(pattern) {\r\n // pattern: 'watch', 'read', 'select'\r\n if (!this.accessPatterns.includes(pattern)) {\r\n this.accessPatterns.push(pattern);\r\n }\r\n }\r\n\r\n /**\r\n * Validate the provider configuration\r\n */\r\n validate() {\r\n const issues = [];\r\n\r\n // Should have a create function\r\n if (!this.createFunction) {\r\n issues.push({\r\n type: 'missing-create',\r\n severity: 'error',\r\n message: `Provider<${this.valueType}> must have a create function`,\r\n });\r\n }\r\n\r\n // Should have at least one consumer\r\n if (this.consumers.length === 0) {\r\n issues.push({\r\n type: 'unused-provider',\r\n severity: 'info',\r\n message: `Provider<${this.valueType}> is defined but not consumed by any widget`,\r\n });\r\n }\r\n\r\n // Check for access pattern consistency\r\n if (this.accessPatterns.includes('watch') && !this.accessPatterns.includes('read')) {\r\n // watch should probably have read as fallback\r\n issues.push({\r\n type: 'watch-without-read',\r\n severity: 'info',\r\n message: `Provider uses context.watch() but not context.read(). Consider both patterns.`,\r\n });\r\n }\r\n\r\n return issues;\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n type: this.providerType,\r\n valueType: this.valueType,\r\n consumers: this.consumers.length,\r\n consumedBy: this.consumers,\r\n accessPatterns: this.accessPatterns,\r\n hasCreateFunction: !!this.createFunction,\r\n hasDisposeFunction: !!this.dispose,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// CONTEXT DEPENDENCY\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a widget and its context dependencies\r\n */\r\nclass ContextDependency {\r\n constructor(dependent, method = 'build') {\r\n this.dependent = dependent; // Widget name\r\n this.method = method; // 'build', 'initState', etc.\r\n this.contextUsage = []; // Array of ContextUsagePattern\r\n this.location = null;\r\n }\r\n\r\n /**\r\n * Add a context usage pattern\r\n */\r\n addUsage(pattern) {\r\n if (pattern instanceof ContextUsagePattern) {\r\n this.contextUsage.push(pattern);\r\n }\r\n }\r\n\r\n /**\r\n * Get all SSR-safe usages\r\n */\r\n getSsrSafeUsages() {\r\n return this.contextUsage.filter((u) => u.ssrSafe);\r\n }\r\n\r\n /**\r\n * Get all SSR-unsafe usages\r\n */\r\n getSsrUnsafeUsages() {\r\n return this.contextUsage.filter((u) => !u.ssrSafe);\r\n }\r\n\r\n /**\r\n * Check if widget can be rendered on server\r\n */\r\n isSsrCompatible() {\r\n return this.getSsrUnsafeUsages().length === 0;\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n dependent: this.dependent,\r\n method: this.method,\r\n totalUsages: this.contextUsage.length,\r\n ssrSafeUsages: this.getSsrSafeUsages().length,\r\n ssrUnsafeUsages: this.getSsrUnsafeUsages().length,\r\n isSsrCompatible: this.isSsrCompatible(),\r\n usagePatterns: this.contextUsage.map((u) => u.pattern),\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// CONTEXT USAGE PATTERN\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a single context usage pattern in code\r\n * \r\n * Examples:\r\n * - Theme.of(context)\r\n * - context.watch()\r\n * - context.read()\r\n * - context.mediaQuery()\r\n */\r\nclass ContextUsagePattern {\r\n constructor(pattern, type, location, returns = 'T', ssrSafe = true, reason = '') {\r\n // Pattern identification\r\n this.pattern = pattern; // 'Theme.of(context)', 'context.watch()'\r\n this.type = type; // 'inherited-widget-lookup', 'provider-watch', etc.\r\n this.location = location; // { line, column }\r\n\r\n // What it returns\r\n this.returns = returns; // Return type\r\n\r\n // SSR compatibility\r\n this.ssrSafe = ssrSafe;\r\n this.reason = reason; // Why safe/unsafe for SSR\r\n\r\n // Metadata\r\n this.depth = 0; // Nesting depth in widget tree\r\n this.frequency = 1; // How often called\r\n }\r\n\r\n /**\r\n * Explain why this pattern is or isn't SSR safe\r\n */\r\n explain() {\r\n if (this.ssrSafe) {\r\n return `\u2713 SSR Safe: ${this.reason}`;\r\n } else {\r\n return `\u2717 SSR Unsafe: ${this.reason}`;\r\n }\r\n }\r\n\r\n /**\r\n * Get migration advice for SSR\r\n */\r\n getMigrationAdvice() {\r\n if (this.ssrSafe) return null;\r\n\r\n const advice = {\r\n 'provider-watch': 'Replace with context.read() for initial SSR render, use watch() in didChangeDependencies() on client',\r\n 'global-state-mutation': 'Move mutations to client-only code, wrap in if (!kIsWeb) or similar server check',\r\n 'event-handler': 'Event handlers don\\'t exist during SSR, only attach after hydration on client',\r\n };\r\n\r\n return advice[this.type] || null;\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n pattern: this.pattern,\r\n type: this.type,\r\n returns: this.returns,\r\n ssrSafe: this.ssrSafe,\r\n reason: this.reason,\r\n advice: this.getMigrationAdvice(),\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// HYDRATION REQUIREMENT\r\n// ============================================================================\r\n\r\n/**\r\n * Represents something that needs to be re-initialized on the client\r\n * after server-side rendering\r\n */\r\nclass HydrationRequirement {\r\n constructor(dependency, reason, order = 0) {\r\n this.dependency = dependency; // What needs hydration (e.g., 'CounterNotifier')\r\n this.reason = reason; // Why it needs hydration\r\n this.order = order; // Execution order (lower = earlier)\r\n this.requiredProviders = []; // Providers needed before this hydrates\r\n this.requiredState = []; // State needed for this to work\r\n }\r\n\r\n /**\r\n * Add a required provider\r\n */\r\n requiresProvider(providerType) {\r\n if (!this.requiredProviders.includes(providerType)) {\r\n this.requiredProviders.push(providerType);\r\n }\r\n }\r\n\r\n /**\r\n * Add required state\r\n */\r\n requiresState(stateProperty) {\r\n if (!this.requiredState.includes(stateProperty)) {\r\n this.requiredState.push(stateProperty);\r\n }\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n dependency: this.dependency,\r\n reason: this.reason,\r\n order: this.order,\r\n requiredProviders: this.requiredProviders,\r\n requiredState: this.requiredState,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// LAZY LOADING OPPORTUNITY\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a widget or notifier that could be lazy-loaded\r\n */\r\nclass LazyLoadOpportunity {\r\n constructor(target, reason, estimatedSize = 'unknown', type = 'widget') {\r\n this.target = target; // Widget or ChangeNotifier name\r\n this.reason = reason; // Why lazy load it\r\n this.estimatedSize = estimatedSize; // Bundle size if lazy loaded\r\n this.type = type; // 'widget' or 'notifier'\r\n this.recommendation = null; // How to lazy load\r\n this.priority = 'medium'; // 'high', 'medium', 'low'\r\n }\r\n\r\n /**\r\n * Set the recommendation\r\n */\r\n setRecommendation(recommendation) {\r\n this.recommendation = recommendation;\r\n }\r\n\r\n /**\r\n * Set priority based on size\r\n */\r\n calculatePriority(sizeKb) {\r\n if (sizeKb > 50) {\r\n this.priority = 'high';\r\n } else if (sizeKb > 20) {\r\n this.priority = 'medium';\r\n } else {\r\n this.priority = 'low';\r\n }\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n target: this.target,\r\n type: this.type,\r\n reason: this.reason,\r\n estimatedSize: this.estimatedSize,\r\n priority: this.priority,\r\n recommendation: this.recommendation,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// CONTEXT REQUIREMENTS SUMMARY\r\n// ============================================================================\r\n\r\n/**\r\n * Summary of all context requirements for the app\r\n */\r\nclass ContextRequirementsSummary {\r\n constructor() {\r\n this.requiresThemeProvider = false;\r\n this.requiresMediaQuery = false;\r\n this.requiresNavigator = false;\r\n this.requiresChangeNotifierProvider = false;\r\n this.customInheritedWidgets = []; // Custom providers defined\r\n this.requiredProviders = []; // Provider patterns used\r\n this.hydrationRequired = false;\r\n this.hydrationDependencies = []; // What needs hydration\r\n\r\n this.ssrCompatibility = 'unknown'; // 'full', 'partial', 'none'\r\n this.ssrIssues = []; // What breaks SSR\r\n this.ssrMigrationPath = []; // Steps to fix SSR\r\n }\r\n\r\n /**\r\n * Add a custom inherited widget\r\n */\r\n addCustomInheritedWidget(name) {\r\n if (!this.customInheritedWidgets.includes(name)) {\r\n this.customInheritedWidgets.push(name);\r\n }\r\n }\r\n\r\n /**\r\n * Add a required provider\r\n */\r\n addRequiredProvider(type) {\r\n if (!this.requiredProviders.includes(type)) {\r\n this.requiredProviders.push(type);\r\n }\r\n }\r\n\r\n /**\r\n * Add a hydration dependency\r\n */\r\n addHydrationDependency(dep) {\r\n if (dep instanceof HydrationRequirement) {\r\n this.hydrationDependencies.push(dep);\r\n this.hydrationRequired = true;\r\n }\r\n }\r\n\r\n /**\r\n * Calculate SSR compatibility\r\n */\r\n calculateSsrCompatibility() {\r\n if (this.ssrIssues.length === 0) {\r\n this.ssrCompatibility = 'full';\r\n } else if (this.ssrIssues.length <= 3) {\r\n this.ssrCompatibility = 'partial';\r\n } else {\r\n this.ssrCompatibility = 'none';\r\n }\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n requiresThemeProvider: this.requiresThemeProvider,\r\n requiresMediaQuery: this.requiresMediaQuery,\r\n requiresNavigator: this.requiresNavigator,\r\n requiresChangeNotifierProvider: this.requiresChangeNotifierProvider,\r\n customInheritedWidgets: this.customInheritedWidgets,\r\n requiredProviders: this.requiredProviders,\r\n hydrationRequired: this.hydrationRequired,\r\n hydrationCount: this.hydrationDependencies.length,\r\n ssrCompatibility: this.ssrCompatibility,\r\n ssrIssueCount: this.ssrIssues.length,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n InheritedWidgetMetadata,\r\n ChangeNotifierAnalysis,\r\n ProviderAnalysis,\r\n ContextDependency,\r\n ContextUsagePattern,\r\n HydrationRequirement,\r\n LazyLoadOpportunity,\r\n ContextRequirementsSummary,\r\n};\r\n"], + "mappings": "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", + "names": ["InheritedWidgetMetadata", "name", "location", "superClass", "type", "required", "signature", "usesInheritedWidgetLookup", "widgetName", "issues", "ChangeNotifierAnalysis", "initialValue", "returnType", "callsNotify", "mutations", "accessPattern", "m", "method", "ProviderAnalysis", "providerType", "valueType", "func", "pattern", "ContextDependency", "dependent", "ContextUsagePattern", "u", "returns", "ssrSafe", "reason", "HydrationRequirement", "dependency", "order", "stateProperty", "LazyLoadOpportunity", "target", "estimatedSize", "recommendation", "sizeKb", "ContextRequirementsSummary", "dep"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/flutter_import_resolver.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_import_resolver.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/flutter_import_resolver.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_import_resolver.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_import_resolver.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_import_resolver.js.map new file mode 100644 index 00000000..29e3b21f --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_import_resolver.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/flutter_import_resolver.js"], + "sourcesContent": ["/**\r\n * Advanced Import Resolver for Flutter.js Framework\r\n * \u2705 FIXED: Now handles multi-line imports correctly\r\n * \r\n * Resolution Chain:\r\n * 1. Parse imports from source code (single & multi-line)\r\n * 2. Check framework package mappings (@flutterjs/*, @package:)\r\n * 3. Check local project code (./src, ./lib, etc.)\r\n * 4. Check package cache (future: npm_modules, pub_cache, etc.)\r\n * 5. Return error if not found\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\n\r\nclass ImportResolver {\r\n constructor(options = {}) {\r\n this.options = {\r\n projectRoot: process.cwd(),\r\n frameworkType: 'flutter-js',\r\n ignoreUnresolved: false,\r\n cacheEnabled: false,\r\n ...options,\r\n };\r\n\r\n this.frameworkPackages = {\r\n \"@flutterjs/runtime\": \"file:../../../../../src/runtime\",\r\n \"@flutterjs/vdom\": \"file:../../../../../src/vdom\",\r\n \"@flutterjs/analyzer\": \"file:../../../../analyzer\",\r\n \"@flutterjs/material\": \"file:../../../../../package/material\",\r\n \"@flutterjs/cupertino\": \"file:../../../../../package/cupertino\",\r\n \"@flutterjs/foundation\": \"file:../../../../../package/foundation\",\r\n };\r\n\r\n this.customPackageMappings = {};\r\n this.resolvedCache = new Map();\r\n this.unresolvedCache = new Map();\r\n\r\n this.localSearchPaths = [\r\n 'src',\r\n 'lib',\r\n 'packages',\r\n 'modules',\r\n '.',\r\n ];\r\n\r\n this.results = {\r\n resolved: [],\r\n unresolved: [],\r\n errors: [],\r\n };\r\n }\r\n\r\n /**\r\n * \u2705 FINAL FIX: Parse imports directly from source code\r\n * Handles both single-line and multi-line imports\r\n */\r\n parseImportsFromSource(sourceCode, logger = null) {\r\n const imports = [];\r\n\r\n if (logger) {\r\n logger.info('[ImportResolver] Starting import parsing...');\r\n logger.debug(`[ImportResolver] Source code length: ${sourceCode.length} characters`);\r\n }\r\n\r\n // Regex: import ... from 'path'\r\n // [\\s\\S]*? matches ANYTHING including newlines (non-greedy)\r\n const importRegex = /import\\s+([\\s\\S]*?)\\s+from\\s+['\"`]([^'\"`]+)['\"`]/g;\r\n\r\n let match;\r\n let matchCount = 0;\r\n\r\n while ((match = importRegex.exec(sourceCode)) !== null) {\r\n matchCount++;\r\n const importClause = match[1];\r\n const modulePath = match[2];\r\n\r\n if (logger) {\r\n logger.debug(`[ImportResolver] Match #${matchCount} found`);\r\n logger.debug(` Module path: '${modulePath}'`);\r\n logger.trace(` Raw clause length: ${importClause.length} chars`);\r\n }\r\n\r\n // Parse the clause (parsing handles cleaning internally)\r\n const parsed = this.parseImportClause(importClause, modulePath, logger);\r\n\r\n if (parsed) {\r\n if (logger) {\r\n logger.debug(` \u2713 Successfully parsed`);\r\n logger.debug(` Items: ${parsed.items.join(', ')}`);\r\n }\r\n imports.push(parsed);\r\n } else {\r\n if (logger) {\r\n logger.warn(` \u2717 Parse returned null - clause: ${importClause.substring(0, 100)}`);\r\n }\r\n }\r\n }\r\n\r\n if (logger) {\r\n logger.info(`[ImportResolver] FINAL RESULT: Found ${matchCount} imports, parsed ${imports.length}`);\r\n if (imports.length === 0 && matchCount === 0) {\r\n logger.warn('[ImportResolver] \u26A0\uFE0F NO IMPORTS FOUND - Check regex or source code!');\r\n logger.warn(`[ImportResolver] Source starts with: ${sourceCode.substring(0, 200)}`);\r\n }\r\n imports.forEach((imp, idx) => {\r\n logger.info(`[ImportResolver] [${idx}] ${imp.source} \u2192 [${imp.items.join(', ')}]`);\r\n });\r\n }\r\n\r\n return imports;\r\n }\r\n\r\n /**\r\n * \u2705 FIXED: Parse individual import clause\r\n * Handles: { x, y, z }, defaultExport, * as namespace, etc.\r\n * \r\n * KEY FIX: Clean the clause COMPLETELY FIRST, then detect type\r\n */\r\n parseImportClause(clause, modulePath, logger = null) {\r\n if (!clause || typeof clause !== 'string') {\r\n return null;\r\n }\r\n\r\n // \u2705 CRITICAL FIX #1: Clean AGGRESSIVELY FIRST\r\n // This removes ALL noise (comments, newlines, extra spaces)\r\n let cleaned = clause\r\n .replace(/\\/\\/.*$/gm, '') // Remove line comments\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Remove block comments\r\n .replace(/\\n/g, ' ') // Replace newlines with spaces\r\n .replace(/\\t/g, ' ') // Replace tabs with spaces\r\n .replace(/\\s+/g, ' ') // Collapse multiple spaces to one\r\n .trim(); // Trim leading/trailing\r\n\r\n if (logger) {\r\n logger.trace(`[ImportResolver] Original: ${clause.substring(0, 100).replace(/\\n/g, '\\\\n')}`);\r\n logger.trace(`[ImportResolver] Cleaned: \"${cleaned}\"`);\r\n }\r\n\r\n const result = {\r\n source: modulePath,\r\n items: [],\r\n default: null,\r\n namespace: null,\r\n raw: clause,\r\n };\r\n\r\n // \u2705 Case 1: Namespace import: import * as name\r\n const namespaceMatch = cleaned.match(/^\\*\\s+as\\s+(\\w+)$/);\r\n if (namespaceMatch) {\r\n result.namespace = namespaceMatch[1];\r\n result.items.push(namespaceMatch[1]);\r\n if (logger) logger.trace(`[ImportResolver] \u2192 Namespace import: ${namespaceMatch[1]}`);\r\n return result;\r\n }\r\n\r\n // \u2705 Case 2: Named imports with braces: { x, y, z }\r\n const namedMatch = cleaned.match(/\\{(.+?)\\}/);\r\n if (namedMatch) {\r\n if (logger) logger.trace(`[ImportResolver] \u2192 Found braces, extracting named imports`);\r\n \r\n const itemsString = namedMatch[1];\r\n this.extractNamedItems(itemsString, result, logger);\r\n \r\n if (result.items.length > 0) {\r\n return result;\r\n }\r\n }\r\n\r\n // \u2705 Case 3: NO BRACES - but might be comma-separated list\r\n // This happens when clause is just: \"Widget, State, StatefulWidget, ...\"\r\n // (the braces were stripped by the regex that captured this clause)\r\n if (!cleaned.includes('{') && cleaned.includes(',')) {\r\n if (logger) logger.trace(`[ImportResolver] \u2192 No braces but has commas, treating as named imports`);\r\n \r\n this.extractNamedItems(cleaned, result, logger);\r\n \r\n if (result.items.length > 0) {\r\n return result;\r\n }\r\n }\r\n\r\n // \u2705 Case 4: Default import (no braces, no commas, single identifier)\r\n if (!cleaned.includes('{') && !cleaned.includes(',') && cleaned.length > 0) {\r\n // Verify it's a valid identifier\r\n if (/^[\\w$]+$/.test(cleaned)) {\r\n result.default = cleaned;\r\n result.items.push(cleaned);\r\n if (logger) logger.trace(`[ImportResolver] \u2192 Default import: ${cleaned}`);\r\n return result;\r\n }\r\n }\r\n\r\n // \u2705 Case 5: Combined default + named: import defaultExport, { x, y }\r\n if (cleaned.includes('{') && cleaned.includes(',')) {\r\n const beforeBrace = cleaned.split('{')[0].trim();\r\n if (beforeBrace && beforeBrace !== ',' && /^[\\w$]+$/.test(beforeBrace)) {\r\n result.default = beforeBrace;\r\n // Also parse the named imports\r\n const namedMatch2 = cleaned.match(/\\{(.+?)\\}/);\r\n if (namedMatch2) {\r\n this.extractNamedItems(namedMatch2[1], result, logger);\r\n }\r\n return result.items.length > 0 ? result : null;\r\n }\r\n }\r\n\r\n // \u2705 Debug: Nothing matched\r\n if (logger) {\r\n logger.warn(`[ImportResolver] \u26A0\uFE0F No valid import pattern detected`);\r\n logger.debug(`[ImportResolver] Cleaned was: \"${cleaned}\"`);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * \u2705 NEW: Extract named items from a comma-separated string\r\n * Handles: \"x, y, z\" and \"x as y, z as w\" patterns\r\n */\r\n extractNamedItems(itemsString, result, logger = null) {\r\n const items = itemsString.split(',');\r\n \r\n if (logger) {\r\n logger.trace(`[ImportResolver] Found ${items.length} comma-separated items`);\r\n }\r\n\r\n items.forEach((item) => {\r\n const trimmed = item.trim();\r\n \r\n // Skip empty items\r\n if (!trimmed || trimmed.length === 0) return;\r\n \r\n // Skip if it looks like a comment left over\r\n if (trimmed.startsWith('//') || trimmed.startsWith('*')) return;\r\n\r\n // Handle \"x as y\" syntax - take the alias (the part after 'as')\r\n const asMatch = trimmed.match(/^(\\w+)\\s+as\\s+(\\w+)$/);\r\n let importName;\r\n \r\n if (asMatch) {\r\n // \"x as y\" \u2192 use \"y\"\r\n importName = asMatch[2];\r\n if (logger) logger.trace(`[ImportResolver] \"${asMatch[1]} as ${asMatch[2]}\" \u2192 ${importName}`);\r\n } else {\r\n // Simple identifier\r\n importName = trimmed;\r\n if (logger) logger.trace(`[ImportResolver] \"${trimmed}\"`);\r\n }\r\n\r\n // Validate it's a proper identifier\r\n if (/^[\\w$]+$/.test(importName) && !result.items.includes(importName)) {\r\n result.items.push(importName);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Resolve imports from source code directly\r\n * \u2705 NEW METHOD: Accepts sourceCode and parses multi-line imports automatically\r\n */\r\n resolveFromSource(sourceCode, logger = null) {\r\n // Parse imports from source\r\n const parsedImports = this.parseImportsFromSource(sourceCode, logger);\r\n\r\n if (logger) {\r\n logger.info(`[ImportResolver] Parsed ${parsedImports.length} import statements`);\r\n parsedImports.forEach((imp, idx) => {\r\n logger.debug(`[ImportResolver] [${idx}] ${imp.source} \u2192 [${imp.items.join(', ')}]`);\r\n });\r\n }\r\n\r\n // Group by source\r\n const groupedBySource = {};\r\n parsedImports.forEach(imp => {\r\n if (!groupedBySource[imp.source]) {\r\n groupedBySource[imp.source] = [];\r\n }\r\n groupedBySource[imp.source] = groupedBySource[imp.source].concat(imp.items);\r\n });\r\n\r\n // \u2705 Reset results before resolving\r\n this.results = {\r\n resolved: [],\r\n unresolved: [],\r\n errors: [],\r\n };\r\n\r\n // Resolve each unique source\r\n Object.entries(groupedBySource).forEach(([source, items]) => {\r\n this.resolve(source, items);\r\n });\r\n\r\n return {\r\n imports: this.results,\r\n summary: this.getSummary(),\r\n parsed: parsedImports,\r\n };\r\n }\r\n\r\n /**\r\n * Main resolution entry point\r\n * Tries multiple fallback locations\r\n */\r\n resolve(importPath, importedItems = [], options = {}) {\r\n // Check cache first\r\n const cacheKey = `${importPath}:${JSON.stringify(importedItems)}`;\r\n if (this.resolvedCache.has(cacheKey)) {\r\n return this.resolvedCache.get(cacheKey);\r\n }\r\n if (this.unresolvedCache.has(cacheKey)) {\r\n return this.unresolvedCache.get(cacheKey);\r\n }\r\n\r\n const result = {\r\n original: importPath,\r\n items: importedItems,\r\n resolved: null,\r\n actualPath: null,\r\n type: null,\r\n source: null,\r\n isValid: false,\r\n reason: null,\r\n fallbacks: [],\r\n };\r\n\r\n // STEP 1: Check if it's a framework package\r\n if (this.isFrameworkPackage(importPath)) {\r\n const stepResult = this.resolveFrameworkPackage(importPath, importedItems);\r\n if (stepResult.isValid) {\r\n result.resolved = stepResult.resolved;\r\n result.actualPath = stepResult.actualPath;\r\n result.type = 'framework';\r\n result.source = 'framework';\r\n result.isValid = true;\r\n result.reason = 'Resolved from framework mappings';\r\n this.resolvedCache.set(cacheKey, result);\r\n this.results.resolved.push(result);\r\n return result;\r\n }\r\n result.fallbacks.push({\r\n step: 1,\r\n tried: 'framework-package',\r\n found: false,\r\n reason: stepResult.reason,\r\n });\r\n }\r\n\r\n // STEP 2: Check local project code\r\n if (!this.isScopedPackage(importPath)) {\r\n const stepResult = this.resolveLocalImport(importPath, importedItems);\r\n if (stepResult.isValid) {\r\n result.resolved = stepResult.resolved;\r\n result.actualPath = stepResult.actualPath;\r\n result.type = 'local';\r\n result.source = 'local';\r\n result.isValid = true;\r\n result.reason = `Found in local project at ${stepResult.actualPath}`;\r\n this.resolvedCache.set(cacheKey, result);\r\n this.results.resolved.push(result);\r\n return result;\r\n }\r\n result.fallbacks.push({\r\n step: 2,\r\n tried: 'local-code',\r\n locations: stepResult.searchedLocations,\r\n found: false,\r\n reason: stepResult.reason,\r\n });\r\n }\r\n\r\n // STEP 3: Check package cache\r\n if (this.options.cacheEnabled) {\r\n const stepResult = this.resolveFromCache(importPath, importedItems);\r\n if (stepResult.isValid) {\r\n result.resolved = stepResult.resolved;\r\n result.actualPath = stepResult.actualPath;\r\n result.type = 'cache';\r\n result.source = 'cache';\r\n result.isValid = true;\r\n result.reason = `Found in package cache at ${stepResult.actualPath}`;\r\n this.resolvedCache.set(cacheKey, result);\r\n this.results.resolved.push(result);\r\n return result;\r\n }\r\n result.fallbacks.push({\r\n step: 3,\r\n tried: 'package-cache',\r\n found: false,\r\n reason: stepResult.reason,\r\n });\r\n }\r\n\r\n // STEP 4: Not found\r\n result.isValid = false;\r\n result.source = 'error';\r\n result.reason = this.generateErrorMessage(importPath, result.fallbacks);\r\n\r\n if (!this.options.ignoreUnresolved) {\r\n this.results.errors.push(result);\r\n }\r\n this.unresolvedCache.set(cacheKey, result);\r\n this.results.unresolved.push(result);\r\n\r\n return result;\r\n }\r\n\r\n isFrameworkPackage(importPath) {\r\n return importPath.startsWith('@flutterjs/') ||\r\n importPath.startsWith('@package:');\r\n }\r\n\r\n isScopedPackage(importPath) {\r\n return importPath.startsWith('@');\r\n }\r\n\r\n resolveFrameworkPackage(importPath, importedItems) {\r\n if (this.frameworkPackages[importPath]) {\r\n return {\r\n isValid: true,\r\n resolved: this.frameworkPackages[importPath],\r\n actualPath: this.frameworkPackages[importPath],\r\n reason: 'Found in framework package mappings',\r\n };\r\n }\r\n\r\n if (this.customPackageMappings[importPath]) {\r\n return {\r\n isValid: true,\r\n resolved: this.customPackageMappings[importPath],\r\n actualPath: this.customPackageMappings[importPath],\r\n reason: 'Found in custom package mappings',\r\n };\r\n }\r\n\r\n return {\r\n isValid: false,\r\n reason: `Framework package \"${importPath}\" not found in mappings`,\r\n };\r\n }\r\n\r\n resolveLocalImport(importPath, importedItems) {\r\n const searchedLocations = [];\r\n\r\n if (importPath.startsWith('./') || importPath.startsWith('../')) {\r\n const fullPath = path.resolve(this.options.projectRoot, importPath);\r\n searchedLocations.push(fullPath);\r\n\r\n if (this.fileExists(fullPath)) {\r\n return {\r\n isValid: true,\r\n resolved: importPath,\r\n actualPath: fullPath,\r\n reason: 'Relative import found',\r\n };\r\n }\r\n\r\n if (this.fileExists(`${fullPath}.js`)) {\r\n return {\r\n isValid: true,\r\n resolved: importPath,\r\n actualPath: `${fullPath}.js`,\r\n reason: 'Relative import found (with .js)',\r\n };\r\n }\r\n\r\n return {\r\n isValid: false,\r\n searchedLocations,\r\n reason: `Relative import not found: ${importPath}`,\r\n };\r\n }\r\n\r\n for (const searchPath of this.localSearchPaths) {\r\n const fullPath = path.resolve(\r\n this.options.projectRoot,\r\n searchPath,\r\n importPath\r\n );\r\n searchedLocations.push(fullPath);\r\n\r\n const indexPath = path.join(fullPath, 'index.js');\r\n if (this.fileExists(indexPath)) {\r\n return {\r\n isValid: true,\r\n resolved: importPath,\r\n actualPath: indexPath,\r\n reason: `Found in ${searchPath}/${importPath}/index.js`,\r\n };\r\n }\r\n\r\n if (this.fileExists(`${fullPath}.js`)) {\r\n return {\r\n isValid: true,\r\n resolved: importPath,\r\n actualPath: `${fullPath}.js`,\r\n reason: `Found in ${searchPath}/${importPath}.js`,\r\n };\r\n }\r\n\r\n if (this.fileExists(`${fullPath}.fjs`)) {\r\n return {\r\n isValid: true,\r\n resolved: importPath,\r\n actualPath: `${fullPath}.fjs`,\r\n reason: `Found in ${searchPath}/${importPath}.fjs`,\r\n };\r\n }\r\n }\r\n\r\n return {\r\n isValid: false,\r\n searchedLocations,\r\n reason: `Local import not found in: ${this.localSearchPaths.join(', ')}`,\r\n };\r\n }\r\n\r\n resolveFromCache(importPath, importedItems) {\r\n return {\r\n isValid: false,\r\n reason: 'Package cache resolution not yet implemented',\r\n };\r\n }\r\n\r\n fileExists(filePath) {\r\n try {\r\n return fs.existsSync(filePath);\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n\r\n generateErrorMessage(importPath, fallbacks) {\r\n let message = `\u274C Import not found: \"${importPath}\"\\n\\nResolution chain:\\n`;\r\n\r\n fallbacks.forEach((step) => {\r\n message += ` ${step.step}. Checked ${step.tried}: NOT FOUND\\n`;\r\n\r\n if (step.locations) {\r\n message += ` Locations searched:\\n`;\r\n step.locations.forEach((loc) => {\r\n message += ` - ${loc}\\n`;\r\n });\r\n }\r\n\r\n if (step.reason) {\r\n message += ` (${step.reason})\\n`;\r\n }\r\n });\r\n\r\n message += `\\nSuggestions:\\n`;\r\n message += ` \u2022 Verify the import path is correct\\n`;\r\n message += ` \u2022 Check that the file exists in your project\\n`;\r\n message += ` \u2022 Add a custom package mapping if needed: addPackageMapping()\\n`;\r\n\r\n return message;\r\n }\r\n\r\n resolveImports(imports) {\r\n this.results = {\r\n resolved: [],\r\n unresolved: [],\r\n errors: [],\r\n };\r\n\r\n imports.forEach((imp) => {\r\n this.resolve(imp.source, imp.items);\r\n });\r\n\r\n return {\r\n imports: this.results,\r\n summary: this.getSummary(),\r\n };\r\n }\r\n\r\n addPackageMapping(packageName, actualPath) {\r\n if (packageName.startsWith('@flutterjs/') || packageName.startsWith('@package:')) {\r\n this.customPackageMappings[packageName] = actualPath;\r\n console.log(`\u2713 Added mapping: ${packageName} \u2192 ${actualPath}`);\r\n } else {\r\n console.warn(`\u26A0 Framework mappings should start with @flutterjs/ or @package:`);\r\n }\r\n }\r\n\r\n addPackageMappings(mappings) {\r\n Object.entries(mappings).forEach(([pkg, path]) => {\r\n this.addPackageMapping(pkg, path);\r\n });\r\n }\r\n\r\n getPackageMappings() {\r\n return {\r\n framework: this.frameworkPackages,\r\n custom: this.customPackageMappings,\r\n };\r\n }\r\n\r\n setLocalSearchPaths(paths) {\r\n this.localSearchPaths = paths;\r\n console.log(`\u2713 Set local search paths: ${paths.join(', ')}`);\r\n }\r\n\r\n getSummary() {\r\n const total = this.results.resolved.length + this.results.unresolved.length;\r\n const resolved = this.results.resolved.length;\r\n const unresolved = this.results.unresolved.length;\r\n\r\n return {\r\n total,\r\n resolved,\r\n unresolved,\r\n errors: this.results.errors.length,\r\n resolutionRate: total > 0 ? ((resolved / total) * 100).toFixed(2) + '%' : 'N/A',\r\n bySource: {\r\n framework: this.results.resolved.filter((r) => r.source === 'framework').length,\r\n local: this.results.resolved.filter((r) => r.source === 'local').length,\r\n cache: this.results.resolved.filter((r) => r.source === 'cache').length,\r\n },\r\n };\r\n }\r\n\r\n generateReport() {\r\n const summary = this.getSummary();\r\n\r\n let report = `\r\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\r\n\u2551 IMPORT RESOLUTION REPORT \u2551\r\n\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\r\n\r\n\uD83D\uDCCA Summary\r\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n Total Imports: ${summary.total}\r\n \u2713 Resolved: ${summary.resolved} (${summary.resolutionRate})\r\n \u2717 Unresolved: ${summary.unresolved}\r\n \u26A0 Errors: ${summary.errors}\r\n\r\n\uD83D\uDCCD Resolution Sources\r\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n Framework: ${summary.bySource.framework}\r\n Local Code: ${summary.bySource.local}\r\n Package Cache: ${summary.bySource.cache}\r\n\r\n${this.results.unresolved.length > 0 ? `\r\n\u26A0\uFE0F UNRESOLVED IMPORTS\r\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n${this.results.unresolved\r\n .map(\r\n (imp) =>\r\n ` \u2717 ${imp.original}\r\n Reason: ${imp.reason}`\r\n )\r\n .join('\\n')}\r\n` : ''}\r\n\r\n${this.results.errors.length > 0 ? `\r\n\uD83D\uDD34 ERRORS\r\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n${this.results.errors.map((err) => ` \u2022 ${err.reason}`).join('\\n')}\r\n` : ''}\r\n`;\r\n\r\n return report;\r\n }\r\n\r\n clearCache() {\r\n this.resolvedCache.clear();\r\n this.unresolvedCache.clear();\r\n console.log('\u2713 Resolution cache cleared');\r\n }\r\n}\r\n\r\nexport { ImportResolver };"], + "mappings": "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", + "names": ["fs", "path", "ImportResolver", "options", "sourceCode", "logger", "imports", "importRegex", "match", "matchCount", "importClause", "modulePath", "parsed", "imp", "idx", "clause", "cleaned", "result", "namespaceMatch", "namedMatch", "itemsString", "beforeBrace", "namedMatch2", "items", "item", "trimmed", "asMatch", "importName", "parsedImports", "groupedBySource", "source", "importPath", "importedItems", "cacheKey", "stepResult", "searchedLocations", "fullPath", "searchPath", "indexPath", "filePath", "fallbacks", "message", "step", "loc", "packageName", "actualPath", "mappings", "pkg", "paths", "total", "resolved", "unresolved", "r", "summary", "err"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/flutter_resolver_config.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_resolver_config.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/flutter_resolver_config.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_resolver_config.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_resolver_config.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_resolver_config.js.map new file mode 100644 index 00000000..b571d5ad --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutter_resolver_config.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/flutter_resolver_config.js"], + "sourcesContent": ["/**\r\n * Import Resolver Configuration\r\n * \r\n * Define your custom package mappings and resolver settings here\r\n */\r\n\r\nexport const resolverConfig = {\r\n frameworkType: 'flutterjs',\r\n ignoreUnresolved: false,\r\n cacheEnabled: false,\r\n\r\n // \u2705 CORRECTED: Specify exact locations for each package\r\n customPackageMappings: {\r\n // Under packages/flutterjs_engine/src/\r\n '@flutterjs/runtime': './flutterjs_engine/src/runtime',\r\n '@flutterjs/vdom': './flutterjs_engine/src/vdom',\r\n\r\n // Under packages/flutterjs_engine/package/\r\n '@flutterjs/material': './flutterjs_engine/package/material',\r\n '@flutterjs/http': './flutterjs_engine/package/http',\r\n\r\n // Add others as needed\r\n '@flutterjs/core': './flutterjs_engine/src/core',\r\n '@flutterjs/foundation': './flutterjs_engine/src/foundation',\r\n '@flutterjs/widgets': './flutterjs_engine/package/widgets',\r\n },\r\n\r\n // \u2705 CORRECTED: Search paths\r\n localSearchPaths: [\r\n 'packages/flutterjs_engine/src', // runtime, vdom\r\n 'packages/flutterjs_engine/package', // material, http\r\n 'src',\r\n 'lib',\r\n 'packages',\r\n 'modules',\r\n 'components',\r\n 'screens',\r\n 'widgets',\r\n '.',\r\n ],\r\n\r\n packageAliases: {\r\n 'flutter': '@flutterjs/material',\r\n 'material': '@flutterjs/material',\r\n 'http': '@flutterjs/http',\r\n },\r\n\r\n strict: {\r\n enforceNamingConventions: false,\r\n requireVersions: false,\r\n detectCircularImports: true,\r\n },\r\n};\r\n\r\n/**\r\n * Create and configure resolver\r\n */\r\nexport function createResolver(options = {}) {\r\n const { ImportResolver } = import('./flutter_import_resolver.js');\r\n\r\n const resolver = new ImportResolver({\r\n projectRoot: process.cwd(),\r\n ...resolverConfig,\r\n ...options,\r\n });\r\n\r\n // Add all custom mappings\r\n if (resolverConfig.customPackageMappings) {\r\n resolver.addPackageMappings(resolverConfig.customPackageMappings);\r\n }\r\n\r\n // Set local search paths\r\n if (resolverConfig.localSearchPaths) {\r\n resolver.setLocalSearchPaths(resolverConfig.localSearchPaths);\r\n }\r\n\r\n return resolver;\r\n}\r\n\r\n/**\r\n * Preset configurations for different project types\r\n */\r\nexport const presets = {\r\n // Simple web app\r\n web: {\r\n localSearchPaths: ['src', 'lib', 'components', '.'],\r\n customPackageMappings: {},\r\n },\r\n\r\n // Monorepo structure\r\n monorepo: {\r\n localSearchPaths: [\r\n 'packages/ui',\r\n 'packages/core',\r\n 'packages/models',\r\n 'packages/utils',\r\n 'src',\r\n '.',\r\n ],\r\n customPackageMappings: {\r\n '@package:ui': './packages/ui',\r\n '@package:core': './packages/core',\r\n '@package:models': './packages/models',\r\n '@package:utils': './packages/utils',\r\n },\r\n },\r\n\r\n // Flutter-style structure\r\n flutter: {\r\n localSearchPaths: [\r\n 'lib',\r\n 'lib/screens',\r\n 'lib/widgets',\r\n 'lib/models',\r\n 'lib/services',\r\n 'lib/utils',\r\n '.',\r\n ],\r\n customPackageMappings: {\r\n \"@flutterjs/runtime\": \"file:../../../../runtime\",\r\n \"@flutterjs/vdom\": \"file:../../../../vdom\",\r\n \"@flutterjs/analyzer\": \"file:../../../../analyzer\",\r\n '@flutterjs/material': 'file:../../../../../package/material',\r\n },\r\n },\r\n};\r\n"], + "mappings": "AAMO,MAAMA,EAAiB,CAC5B,cAAe,YACf,iBAAkB,GAClB,aAAc,GAGd,sBAAuB,CAErB,qBAAsB,iCACtB,kBAAmB,8BAGnB,sBAAuB,sCACvB,kBAAmB,kCAGnB,kBAAmB,8BACnB,wBAAyB,oCACzB,qBAAsB,oCACxB,EAGA,iBAAkB,CAChB,gCACA,oCACA,MACA,MACA,WACA,UACA,aACA,UACA,UACA,GACF,EAEA,eAAgB,CACd,QAAW,sBACX,SAAY,sBACZ,KAAQ,iBACV,EAEA,OAAQ,CACN,yBAA0B,GAC1B,gBAAiB,GACjB,sBAAuB,EACzB,CACF,EAKO,SAASC,EAAeC,EAAU,CAAC,EAAG,CAC3C,KAAM,CAAE,eAAAC,CAAe,EAAI,OAAO,8BAA8B,EAE1DC,EAAW,IAAID,EAAe,CAClC,YAAa,QAAQ,IAAI,EACzB,GAAGH,EACH,GAAGE,CACL,CAAC,EAGD,OAAIF,EAAe,uBACjBI,EAAS,mBAAmBJ,EAAe,qBAAqB,EAI9DA,EAAe,kBACjBI,EAAS,oBAAoBJ,EAAe,gBAAgB,EAGvDI,CACT,CAKO,MAAMC,EAAU,CAErB,IAAK,CACH,iBAAkB,CAAC,MAAO,MAAO,aAAc,GAAG,EAClD,sBAAuB,CAAC,CAC1B,EAGA,SAAU,CACR,iBAAkB,CAChB,cACA,gBACA,kBACA,iBACA,MACA,GACF,EACA,sBAAuB,CACrB,cAAe,gBACf,gBAAiB,kBACjB,kBAAmB,oBACnB,iBAAkB,kBACpB,CACF,EAGA,QAAS,CACP,iBAAkB,CAChB,MACA,cACA,cACA,aACA,eACA,YACA,GACF,EACA,sBAAuB,CACrB,qBAAsB,2BACtB,kBAAmB,wBACnB,sBAAuB,4BACvB,sBAAuB,sCACzB,CACF,CACF", + "names": ["resolverConfig", "createResolver", "options", "ImportResolver", "resolver", "presets"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/flutterjs_logger.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_logger.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/flutterjs_logger.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_logger.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_logger.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_logger.js.map new file mode 100644 index 00000000..fa1348ca --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_logger.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/flutterjs_logger.js"], + "sourcesContent": ["/**\r\n * FlutterJS Logger - Centralized Debug Output System\r\n * \r\n * Instead of console.log() everywhere, use this logger to:\r\n * - Write debug logs to a file (.debug folder)\r\n * - Maintain clean console output\r\n * - Enable/disable debug modes per component\r\n * - Group related logs together\r\n * - Support multiple log levels\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\n\r\nclass Logger {\r\n constructor(options = {}) {\r\n this.options = {\r\n debugDir: '.debug',\r\n enabled: true,\r\n level: 'info', // 'error', 'warn', 'info', 'debug', 'trace'\r\n writeToFile: true,\r\n writeToConsole: false, // Set to true only for critical errors\r\n includeTimestamp: true,\r\n includeStackTrace: false,\r\n maxFileSize: 10 * 1024 * 1024, // 10MB\r\n ...options,\r\n };\r\n\r\n this.logLevels = {\r\n 'error': 0,\r\n 'warn': 1,\r\n 'info': 2,\r\n 'debug': 3,\r\n 'trace': 4,\r\n };\r\n\r\n this.currentLevel = this.logLevels[this.options.level];\r\n this.logs = [];\r\n this.logSessions = {};\r\n this.indentLevel = 0;\r\n\r\n // Ensure debug directory exists\r\n if (this.options.writeToFile) {\r\n this.ensureDebugDir();\r\n }\r\n }\r\n\r\n /**\r\n * Ensure .debug directory exists\r\n */\r\n ensureDebugDir() {\r\n if (!fs.existsSync(this.options.debugDir)) {\r\n fs.mkdirSync(this.options.debugDir, { recursive: true });\r\n }\r\n }\r\n\r\n /**\r\n * Get file path for a specific component\r\n */\r\n getLogFilePath(component = 'general') {\r\n return path.join(this.options.debugDir, `${component}.log`);\r\n }\r\n\r\n /**\r\n * Check if log level should be written\r\n */\r\n shouldLog(level) {\r\n return this.logLevels[level] <= this.currentLevel;\r\n }\r\n\r\n /**\r\n * Format log entry\r\n */\r\n formatEntry(level, component, message, data = null) {\r\n const timestamp = this.options.includeTimestamp\r\n ? new Date().toISOString()\r\n : '';\r\n\r\n const indent = ' '.repeat(this.indentLevel);\r\n const levelStr = level.toUpperCase().padEnd(5);\r\n const componentStr = component.padEnd(20);\r\n\r\n let entry = `${timestamp} [${levelStr}] [${componentStr}] ${indent}${message}`;\r\n\r\n if (data) {\r\n entry += '\\n' + indent + JSON.stringify(data, null, 2);\r\n }\r\n\r\n return entry;\r\n }\r\n\r\n /**\r\n * Internal write method\r\n */\r\n write(level, component, message, data) {\r\n if (!this.shouldLog(level)) return;\r\n\r\n const entry = this.formatEntry(level, component, message, data);\r\n this.logs.push(entry);\r\n\r\n // Write to console if enabled (only for critical messages)\r\n if (this.options.writeToConsole && level === 'error') {\r\n console.error(`${component}: ${message}`, data || '');\r\n }\r\n\r\n // Write to file\r\n if (this.options.writeToFile) {\r\n this.writeToFile(component, entry);\r\n }\r\n }\r\n\r\n /**\r\n * Write entry to file\r\n */\r\n writeToFile(component, entry) {\r\n try {\r\n const filePath = this.getLogFilePath(component);\r\n fs.appendFileSync(filePath, entry + '\\n', 'utf-8');\r\n\r\n // Check file size and rotate if needed\r\n const stats = fs.statSync(filePath);\r\n if (stats.size > this.options.maxFileSize) {\r\n this.rotateLogFile(filePath);\r\n }\r\n } catch (error) {\r\n console.error(`Logger failed to write to ${component}: ${error.message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Rotate log file when it gets too large\r\n */\r\n rotateLogFile(filePath) {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const backupPath = filePath.replace('.log', `.${timestamp}.log`);\r\n fs.renameSync(filePath, backupPath);\r\n }\r\n\r\n // =========================================================================\r\n // PUBLIC API\r\n // =========================================================================\r\n\r\n /**\r\n * Start a named session (group of related logs)\r\n */\r\n startSession(name, component = 'general') {\r\n this.logSessions[name] = {\r\n component,\r\n startTime: Date.now(),\r\n startIndent: this.indentLevel,\r\n };\r\n this.indent();\r\n this.info(component, `\u25BA START SESSION: ${name}`);\r\n }\r\n\r\n /**\r\n * End a named session\r\n */\r\n endSession(name, component = 'general') {\r\n if (this.logSessions[name]) {\r\n const duration = Date.now() - this.logSessions[name].startTime;\r\n this.info(component, `\u25C4 END SESSION: ${name} (${duration}ms)`);\r\n this.unindent();\r\n delete this.logSessions[name];\r\n }\r\n }\r\n\r\n /**\r\n * Increase indent level\r\n */\r\n indent() {\r\n this.indentLevel++;\r\n }\r\n\r\n /**\r\n * Decrease indent level\r\n */\r\n unindent() {\r\n this.indentLevel = Math.max(0, this.indentLevel - 1);\r\n }\r\n\r\n /**\r\n * Error level\r\n */\r\n error(component, message, data) {\r\n this.write('error', component, message, data);\r\n }\r\n\r\n /**\r\n * Warning level\r\n */\r\n warn(component, message, data) {\r\n this.write('warn', component, message, data);\r\n }\r\n\r\n /**\r\n * Info level\r\n */\r\n info(component, message, data) {\r\n this.write('info', component, message, data);\r\n }\r\n\r\n /**\r\n * Debug level\r\n */\r\n debug(component, message, data) {\r\n this.write('debug', component, message, data);\r\n }\r\n\r\n /**\r\n * Trace level (most verbose)\r\n */\r\n trace(component, message, data) {\r\n this.write('trace', component, message, data);\r\n }\r\n\r\n /**\r\n * Log a method entry/exit pair\r\n */\r\n methodEntry(component, methodName, params = null) {\r\n this.indent();\r\n this.trace(component, `\u2192 ${methodName}()`, params);\r\n }\r\n\r\n /**\r\n * Log method exit\r\n */\r\n methodExit(component, methodName, result = null) {\r\n this.trace(component, `\u2190 ${methodName}()`, result);\r\n this.unindent();\r\n }\r\n\r\n /**\r\n * Log a successful step\r\n */\r\n success(component, message, data) {\r\n this.write('info', component, `\u2713 ${message}`, data);\r\n }\r\n\r\n /**\r\n * Log a failure\r\n */\r\n failure(component, message, error) {\r\n this.write('error', component, `\u2717 ${message}`, error);\r\n }\r\n\r\n /**\r\n * Log a step count (e.g., \"Found 5 widgets\")\r\n */\r\n count(component, label, count) {\r\n this.write('info', component, `${label}: ${count}`);\r\n }\r\n\r\n /**\r\n * Create a scoped logger for a specific component\r\n */\r\n createComponentLogger(componentName) {\r\n return {\r\n error: (msg, data) => this.error(componentName, msg, data),\r\n warn: (msg, data) => this.warn(componentName, msg, data),\r\n info: (msg, data) => this.info(componentName, msg, data),\r\n debug: (msg, data) => this.debug(componentName, msg, data),\r\n trace: (msg, data) => this.trace(componentName, msg, data),\r\n success: (msg, data) => this.success(componentName, msg, data),\r\n failure: (msg, err) => this.failure(componentName, msg, err),\r\n methodEntry: (method, params) => this.methodEntry(componentName, method, params),\r\n methodExit: (method, result) => this.methodExit(componentName, method, result),\r\n startSession: (name) => this.startSession(name, componentName),\r\n endSession: (name) => this.endSession(name, componentName),\r\n indent: () => this.indent(),\r\n unindent: () => this.unindent(),\r\n };\r\n }\r\n\r\n /**\r\n * Get all logs as a single string\r\n */\r\n getAllLogs() {\r\n return this.logs.join('\\n');\r\n }\r\n\r\n /**\r\n * Save all logs to files\r\n */\r\n saveLogs() {\r\n try {\r\n const allLogsPath = path.join(this.options.debugDir, '_all.log');\r\n fs.writeFileSync(allLogsPath, this.getAllLogs(), 'utf-8');\r\n return allLogsPath;\r\n } catch (error) {\r\n console.error('Failed to save logs:', error.message);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Clear debug directory\r\n */\r\n clearDebugDir() {\r\n try {\r\n if (fs.existsSync(this.options.debugDir)) {\r\n fs.rmSync(this.options.debugDir, { recursive: true, force: true });\r\n this.ensureDebugDir();\r\n }\r\n } catch (error) {\r\n console.error('Failed to clear debug directory:', error.message);\r\n }\r\n }\r\n\r\n /**\r\n * Read all debug files and return as object\r\n */\r\n readDebugFiles() {\r\n const files = {};\r\n try {\r\n const entries = fs.readdirSync(this.options.debugDir);\r\n entries.forEach((file) => {\r\n if (file.endsWith('.log')) {\r\n const filePath = path.join(this.options.debugDir, file);\r\n files[file] = fs.readFileSync(filePath, 'utf-8');\r\n }\r\n });\r\n } catch (error) {\r\n console.error('Failed to read debug files:', error.message);\r\n }\r\n return files;\r\n }\r\n\r\n /**\r\n * Get analysis report of logs (counts, errors, warnings, etc.)\r\n */\r\n getReport() {\r\n const report = {\r\n totalEntries: this.logs.length,\r\n errors: 0,\r\n warnings: 0,\r\n info: 0,\r\n debug: 0,\r\n trace: 0,\r\n sessions: Object.keys(this.logSessions).length,\r\n debugFiles: [],\r\n };\r\n\r\n this.logs.forEach((log) => {\r\n if (log.includes('[ERROR]')) report.errors++;\r\n else if (log.includes('[WARN]')) report.warnings++;\r\n else if (log.includes('[INFO]')) report.info++;\r\n else if (log.includes('[DEBUG]')) report.debug++;\r\n else if (log.includes('[TRACE]')) report.trace++;\r\n });\r\n\r\n try {\r\n report.debugFiles = fs.readdirSync(this.options.debugDir)\r\n .filter((f) => f.endsWith('.log'));\r\n } catch (error) {\r\n // Ignore\r\n }\r\n\r\n return report;\r\n }\r\n}\r\n\r\n/**\r\n * Global singleton logger instance\r\n */\r\nlet globalLogger = null;\r\n\r\nexport function initLogger(options = {}) {\r\n globalLogger = new Logger(options);\r\n return globalLogger;\r\n}\r\n\r\nexport function getLogger() {\r\n if (!globalLogger) {\r\n globalLogger = new Logger();\r\n }\r\n return globalLogger;\r\n}\r\n\r\nexport { Logger };\r\n"], + "mappings": "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", + "names": ["fs", "path", "Logger", "options", "component", "level", "message", "data", "timestamp", "indent", "levelStr", "componentStr", "entry", "filePath", "error", "backupPath", "name", "duration", "methodName", "params", "result", "label", "count", "componentName", "msg", "err", "method", "allLogsPath", "files", "file", "report", "log", "f", "globalLogger", "initLogger", "getLogger"] +} diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_parser.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_parser.js new file mode 100644 index 00000000..bd43f189 --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_parser.js @@ -0,0 +1,11 @@ +import{TokenType as n}from"./lexer.js";import{getLogger as x}from"./flutterjs_logger.js";class l{constructor(e,t){this.type=e,this.location=t}}class T extends l{constructor(e=[],t=null){super("Program",t),this.body=e}}class C extends l{constructor(e=[],t=null,s=null){super("ImportDeclaration",s),this.specifiers=e,this.source=t}}class k extends l{constructor(e=null,t=null,s=null){super("ImportSpecifier",s),this.imported=e,this.local=t}}class N extends l{constructor(e=null,t=null,s=null,i=null){super("ClassDeclaration",i),this.id=e,this.superClass=t,this.body=s}}class O extends l{constructor(e=[],t=[],s=null){super("ClassBody",s),this.fields=e,this.methods=t}}class $ extends l{constructor(e=null,t=null,s=null){super("FieldDeclaration",s),this.key=e,this.initialValue=t}}class A extends l{constructor(e=null,t=[],s=null,i=null){super("MethodDeclaration",i),this.key=e,this.params=t,this.body=s}}class E extends l{constructor(e=null,t=!1,s=null,i=null){super("Parameter",i),this.name=e,this.optional=t,this.defaultValue=s}}class D extends l{constructor(e=null,t=[],s=null,i=!1,r=null){super("FunctionDeclaration",r),this.id=e,this.params=t,this.body=s,this.isAsync=i}}class R extends l{constructor(e=[],t=null){super("BlockStatement",t),this.body=e}}class U extends l{constructor(e=null,t=null){super("ReturnStatement",t),this.argument=e}}class w extends l{constructor(e=null,t=null){super("ExpressionStatement",t),this.expression=e}}class o extends l{constructor(e="",t=null){super("Identifier",t),this.name=e}}class h extends l{constructor(e=null,t="",s="string",i=null){super("Literal",i),this.value=e,this.raw=t,this.literalType=s}}class b extends l{constructor(e=null,t=[],s=null){super("CallExpression",s),this.callee=e,this.args=t}}class P extends l{constructor(e=null,t=[],s=null){super("NewExpression",s),this.callee=e,this.args=t,this.isConst=!1}}class F extends l{constructor(e=[],t=null){super("ObjectLiteral",t),this.properties=e}}class S extends l{constructor(e=null,t=null,s=null){super("Property",s),this.key=e,this.value=t,this.shorthand=!1}}class g extends l{constructor(e=[],t=null,s=null){super("ArrowFunctionExpression",s),this.params=e,this.body=t}}class I extends l{constructor(e=null,t=null,s=!1,i=null){super("MemberExpression",i),this.object=e,this.property=t,this.computed=s}}class L{constructor(e=[],t={}){this.tokens=e,this.current=0,this.errors=[],this.options={strict:!1,...t},this.callStack=[],this.debugMode=!0}parse(){const e=[];for(;!this.isAtEnd();)try{const t=this.parseTopLevel();t&&t.type==="ImportDeclaration"&&console.log("DEBUG - ImportDeclaration:",JSON.stringify(t,null,2)),t&&e.push(t)}catch(t){this.errors.push(t),this.synchronize()}return new T(e)}skipComments(){for(;!this.isAtEnd()&&this.check(n.COMMENT);)this.advance()}isComment(){return this.isAtEnd()?!1:this.peek().type===n.COMMENT}parseTopLevel(){if(this.skipComments(),this.isAtEnd())return null;if(this.isKeyword("import"))return this.advance(),this.parseImportDeclaration();if(this.isKeyword("class"))return this.advance(),this.parseClassDeclaration();if(this.isKeyword("function"))return this.advance(),this.parseFunctionDeclaration();const e=this.parseExpression();return this.consumeStatementEnd(),new w(e,this.getLocation())}isKeyword(e){if(this.isAtEnd())return!1;const t=this.peek();return t.type===n.KEYWORD&&t.value===e}isPunctuation(e){if(this.isAtEnd())return!1;const t=this.peek();return t.type===n.PUNCTUATION&&t.value===e}isOperator(e){if(this.isAtEnd())return!1;const t=this.peek();return t.type===n.OPERATOR&&t.value===e}parseImportDeclaration(){const e=x().createComponentLogger("Parser.parseImportDeclaration");e.startSession("parseImportDeclaration");const t=this.getLocation(),s=[];if(e.trace(` Starting import parse at token: ${this.peek().value}`),this.isPunctuation("{")){for(e.trace(" Found opening brace, parsing named imports..."),this.advance(),this.skipComments();!this.isPunctuation("}")&&!this.isAtEnd();){if(this.skipComments(),this.isPunctuation("}")){e.trace(" Found closing brace, exiting loop");break}if(!this.check(n.IDENTIFIER)){e.warn(` Expected identifier but got: ${this.peek().value}`),this.advance();continue}const a=this.consume(n.IDENTIFIER,"Expected identifier").value,u=new o(a);e.trace(` Imported: ${a}`);let p=u;if(this.skipComments(),this.isKeyword("as")){e.trace(" Found 'as' keyword"),this.advance(),this.skipComments();const m=this.consume(n.IDENTIFIER,"Expected identifier after as").value;p=new o(m),e.trace(` Local name: ${m}`)}if(s.push(new k(u,p)),this.skipComments(),this.isPunctuation(",")){e.trace(" Found comma, continuing..."),this.advance(),this.skipComments();continue}else{e.trace(" No comma, expected closing brace next");break}}e.trace(` Parsed ${s.length} named imports`),this.consume(n.PUNCTUATION,"Expected }")}else if(this.check(n.IDENTIFIER)&&this.peekAhead(1).value!=="from"){e.trace(" Found identifier without opening brace, parsing default import...");const a=this.consume(n.IDENTIFIER,"Expected identifier").value,u=new o(a),p=new o(a);if(s.push(new k(u,p)),e.trace(` Default import: ${a}`),this.skipComments(),this.isPunctuation(",")&&(e.trace(" Found comma after default import, checking for named imports..."),this.advance(),this.skipComments(),this.isPunctuation("{"))){for(e.trace(" Found opening brace, parsing additional named imports..."),this.advance(),this.skipComments();!this.isPunctuation("}")&&!this.isAtEnd()&&(this.skipComments(),!this.isPunctuation("}"));){if(!this.check(n.IDENTIFIER)){this.advance();continue}const m=this.consume(n.IDENTIFIER,"Expected identifier").value,d=new o(m);let v=d;if(this.skipComments(),this.isKeyword("as")){this.advance(),this.skipComments();const y=this.consume(n.IDENTIFIER,"Expected identifier after as").value;v=new o(y)}if(s.push(new k(d,v)),this.skipComments(),this.isPunctuation(",")){this.advance(),this.skipComments();continue}else break}this.consume(n.PUNCTUATION,"Expected }")}}this.skipComments(),this.consume(n.KEYWORD,"Expected from"),this.skipComments();const i=this.consume(n.STRING,"Expected module path string"),r=new h(i.value,i.value,"string");return e.trace(` Module path: ${r.value}`),e.trace(` Total specifiers: ${s.length}`),this.consumeStatementEnd(),e.trace(`[parseImportDeclaration] SUCCESS +`),new C(s,r,t)}peekAhead(e=1){const t=this.current+e;return t>=this.tokens.length?this.tokens[this.tokens.length-1]:this.tokens[t]}parseClassDeclaration(){const e=x().createComponentLogger("Parser.parseClassDeclaration");e.startSession("parseClassDeclaration"),e.trace(` Current token: ${this.peek().value} (${this.peek().type})`);const t=this.getLocation(),s=this.consume(n.IDENTIFIER,"Expected class name"),i=new o(s.value);e.trace(` Class name: ${i.name}`);let r=null;if(this.isKeyword("extends")){this.advance();const d=this.consume(n.IDENTIFIER,"Expected superclass name").value;r=new o(d),e.trace(` Extends: ${r.name}`),this.isOperator("<")&&(this.advance(),this.consume(n.IDENTIFIER,"Expected type name"),this.consume(n.OPERATOR,"Expected >"))}e.trace(" Looking for opening brace..."),e.trace(` Current token: ${this.peek().value} (${this.peek().type})`),this.consume(n.PUNCTUATION,"Expected {");const a=[],u=[];e.trace(" Parsing class body...");let p=0;for(;!this.isPunctuation("}")&&!this.isAtEnd()&&(this.skipComments(),!this.isPunctuation("}"));){if(e.trace(` [item ${p}] Current token: ${this.peek().value} (${this.peek().type})`),this.isPunctuation(";")){e.trace(" Skipping semicolon"),this.advance();continue}if(this.isKeyword("constructor")){e.trace(" Found constructor"),u.push(this.parseMethodDeclaration()),p++;continue}if(this.check(n.IDENTIFIER)){const d=this.current,y=this.peek().value;if(e.trace(` Found identifier: ${y}`),this.advance(),this.isOperator("=")){e.trace(" -> This is a FIELD (followed by =)"),this.current=d;try{a.push(this.parseFieldDeclaration()),e.trace(" Field parsed successfully"),p++;continue}catch(f){throw console.error(` ERROR parsing field: ${f.message}`),f}}if(this.isPunctuation("(")){e.trace(" -> This is a METHOD (followed by '(')"),this.current=d;try{u.push(this.parseMethodDeclaration()),e.trace(" Method parsed successfully"),p++;continue}catch(f){throw console.error(` ERROR parsing method: ${f.message}`),f}}e.trace(" -> Unknown pattern, skipping"),this.advance();continue}e.trace(` Skipping unknown token: ${this.peek().value}`),this.advance()}e.trace(` Class body parsing complete. Found ${a.length} fields, ${u.length} methods`),this.consume(n.PUNCTUATION,"Expected }");const m=new O(a,u);return e.trace(`[parseClassDeclaration] SUCCESS +`),new N(i,r,m,t)}parseMethodDeclaration(){const e=x().createComponentLogger("Parser.parseMethodDeclaration");e.startSession(" [parseMethodDeclaration] STARTING"),e.trace(` Current: ${this.peek().value}`);const t=this.getLocation();let s;this.isKeyword("constructor")?(s="constructor",this.advance()):s=this.consume(n.IDENTIFIER,"Expected method name").value,e.trace(` Method name: ${s}`);const i=new o(s);this.consume(n.PUNCTUATION,"Expected (");const r=this.parseParameterList();e.trace(` Parameters: ${r.length}`),this.consume(n.PUNCTUATION,"Expected )");let a=null;return this.isOperator("=>")?(e.trace(" Arrow function body"),this.advance(),a=this.parseExpression()):this.isPunctuation("{")&&(e.trace(" Block body"),this.advance(),a=this.parseBlock()),e.trace(" [parseMethodDeclaration] SUCCESS"),new A(i,r,a,t)}parseFieldDeclaration(){console.log(" [parseFieldDeclaration] STARTING"),console.log(` Current: ${this.peek().value}`);const e=this.getLocation(),t=this.consume(n.IDENTIFIER,"Expected field name").value,s=new o(t);console.log(` Field name: ${t}`);let i=null;if(this.isOperator("=")){console.log(" Found = operator, parsing initializer..."),this.advance();try{i=this.parseExpression(),console.log(` Initializer parsed: ${i.type}`)}catch(r){throw console.error(` ERROR parsing initializer: ${r.message}`),r}}return this.consumeStatementEnd(),console.log(" [parseFieldDeclaration] SUCCESS"),new $(s,i,e)}parseFunctionDeclaration(){const e=this.getLocation(),t=this.consume(n.IDENTIFIER,"Expected function name"),s=t.value?new o(t.value):null;this.consume(n.PUNCTUATION,"Expected (");const i=this.parseParameterList();this.consume(n.PUNCTUATION,"Expected )"),this.consume(n.PUNCTUATION,"Expected {");const r=this.parseBlock();return new D(s,i,r,!1,e)}parseParameterList(){const e=[];for(;!this.isPunctuation(")")&&!this.isAtEnd();){const t=this.getLocation();if(this.isPunctuation("{")){for(this.advance();!this.isPunctuation("}")&&!this.isAtEnd();){const s=this.consume(n.IDENTIFIER,"Expected param name").value;let i=null;if(this.isOperator("=")){this.advance();const r=this.peek();this.check(n.IDENTIFIER)?i=new o(this.advance().value):this.check(n.NUMBER)?i=new h(parseFloat(this.advance().value),"","number"):this.check(n.UNDEFINED)?(this.advance(),i=new h(void 0,"undefined","undefined")):this.check(n.NULL)?(this.advance(),i=new h(null,"null","null")):this.isKeyword("undefined")?(this.advance(),i=new h(void 0,"undefined","undefined")):this.isKeyword("null")&&(this.advance(),i=new h(null,"null","null"))}if(e.push(new E(new o(s),i!==null,i,t)),!this.isPunctuation(","))break;this.advance()}if(this.consume(n.PUNCTUATION,"Expected }"),this.isOperator("=")&&(this.advance(),this.isPunctuation("{"))){this.advance();let s=1;for(;s>0&&!this.isAtEnd();)this.isPunctuation("{")?s++:this.isPunctuation("}")&&s--,s>0&&this.advance();this.consume(n.PUNCTUATION,"Expected }")}}else if(this.check(n.IDENTIFIER)){const s=this.consume(n.IDENTIFIER,"Expected param name").value;let i=null;if(this.isOperator("=")){this.advance();const r=this.peek();this.check(n.IDENTIFIER)?i=new o(this.advance().value):this.check(n.NUMBER)?i=new h(parseFloat(this.advance().value),"","number"):this.check(n.UNDEFINED)?(this.advance(),i=new h(void 0,"undefined","undefined")):this.check(n.NULL)?(this.advance(),i=new h(null,"null","null")):this.isKeyword("undefined")?(this.advance(),i=new h(void 0,"undefined","undefined")):this.isKeyword("null")&&(this.advance(),i=new h(null,"null","null"))}e.push(new E(new o(s),i!==null,i,t))}else break;if(!this.isPunctuation(","))break;this.advance()}return e}parseBlock(){console.log(` +[parseBlock] STARTING at token: ${this.peek().value}`);const e=this.getLocation(),t=[];for(;!this.isPunctuation("}")&&!this.isAtEnd()&&(this.skipComments(),!this.isPunctuation("}"));)if(console.log(` [parseBlock] Current token: ${this.peek().value} (${this.peek().type})`),this.isKeyword("return")){console.log(" Found RETURN statement"),this.advance();let s=null;if(!this.isPunctuation(";")&&!this.isPunctuation("}")){console.log(" Parsing return argument...");try{s=this.parseExpression(),console.log(" Return argument parsed successfully")}catch(i){for(console.error(` \u274C ERROR parsing return argument: ${i.message}`),console.error(` Token was: ${this.peek().value}`);!this.isPunctuation(";")&&!this.isPunctuation("}")&&!this.isAtEnd();)this.advance()}}this.consumeStatementEnd(),t.push(new U(s,e))}else{console.log(" Parsing expression statement...");try{const s=this.parseExpression();console.log(` Expression parsed successfully: ${s.type}`),this.consumeStatementEnd(),t.push(new w(s,e))}catch(s){for(console.error(` \u274C ERROR parsing expression: ${s.message}`),console.error(` Token was: ${this.peek().value}`);!this.isPunctuation(";")&&!this.isPunctuation("}")&&!this.isAtEnd();)this.advance();this.isPunctuation(";")&&this.advance()}}return this.isPunctuation("}")&&this.advance(),console.log(`[parseBlock] SUCCESS - ${t.length} statements +`),new R(t,e)}parseExpression(){console.log(` [parseExpression] Current token: ${this.peek().value}`);try{const e=this.parseAssignment();return console.log(` [parseExpression] \u2713 Success, type: ${e.type}`),e}catch(e){throw console.error(` [parseExpression] \u2717 Failed: ${e.message}`),e}}parseAssignment(){let e=this.parseTernary();if(this.isOperator("=")){this.advance();const t=this.parseAssignment();return{type:"AssignmentExpression",left:e,right:t}}return e}parseTernary(){let e=this.parseLogicalOr();if(this.isOperator("?")){this.advance();const t=this.parseExpression();this.consume(n.OPERATOR,"Expected :");const s=this.parseExpression();return{type:"ConditionalExpression",test:e,consequent:t,alternate:s}}return e}parseLogicalOr(){let e=this.parseLogicalAnd();for(;this.isOperator("||");){this.advance();const t=this.parseLogicalAnd();e={type:"LogicalExpression",operator:"||",left:e,right:t}}return e}parseLogicalAnd(){let e=this.parseEquality();for(;this.isOperator("&&");){this.advance();const t=this.parseEquality();e={type:"LogicalExpression",operator:"&&",left:e,right:t}}return e}parseEquality(){let e=this.parseRelational();for(;this.isOperator("===")||this.isOperator("!==")||this.isOperator("==")||this.isOperator("!=");){const t=this.advance().value,s=this.parseRelational();e={type:"BinaryExpression",operator:t,left:e,right:s}}return e}parseRelational(){let e=this.parseAdditive();for(;this.isOperator("<")||this.isOperator(">")||this.isOperator("<=")||this.isOperator(">=");){const t=this.advance().value,s=this.parseAdditive();e={type:"BinaryExpression",operator:t,left:e,right:s}}return e}parseAdditive(){let e=this.parseMultiplicative();for(;this.isOperator("+")||this.isOperator("-");){const t=this.advance().value,s=this.parseMultiplicative();e={type:"BinaryExpression",operator:t,left:e,right:s}}return e}parseMultiplicative(){let e=this.parseUnary();for(;this.isOperator("*")||this.isOperator("/")||this.isOperator("%");){const t=this.advance().value,s=this.parseUnary();e={type:"BinaryExpression",operator:t,left:e,right:s}}return e}parseUnary(){if(console.log(` [parseUnary] Current: ${this.peek().value}`),this.isOperator("!")||this.isOperator("-")||this.isOperator("+")||this.isOperator("~")){const e=this.advance().value,t=this.parseUnary();return{type:"UnaryExpression",operator:e,argument:t}}return console.log(" [parseUnary] Calling parsePostfix"),this.parsePostfix()}parsePostfix(){console.log(" [parsePostfix] Starting, calling parseCall");let e=this.parseCall();for(console.log(` [parsePostfix] parseCall returned: ${e.type||e.name}`),console.log(` [parsePostfix] Next token: ${this.peek().value}`);;)if(this.isOperator("++")||this.isOperator("--"))e={type:"UpdateExpression",operator:this.advance().value,argument:e,prefix:!1};else if(this.isPunctuation(".")){console.log(" [parsePostfix] Found . member access"),this.advance();const t=new o(this.consume(n.IDENTIFIER,"Expected property").value);e=new I(e,t,!1),console.log(` [parsePostfix] Created MemberExpression: ${e.object.name}.${e.property.name}`)}else if(this.isPunctuation("[")){console.log(" [parsePostfix] Found [ computed access"),this.advance();const t=this.parseExpression();this.consume(n.PUNCTUATION,"Expected ]"),e=new I(e,t,!0)}else{console.log(` [parsePostfix] No more postfix ops, returning ${e.type}`);break}return e}parseCall(){console.log(" [parseCall] Starting, calling parsePrimary");let e=this.parsePrimary();for(console.log(` [parseCall] parsePrimary returned: ${e.type||e.name}`),console.log(` [parseCall] Next token: ${this.peek().value} (${this.peek().type})`);this.isPunctuation("(");){console.log(" [parseCall] Found (, parsing function call"),this.advance();const t=this.parseArguments();console.log(` [parseCall] Parsed ${t.length} arguments`),this.consume(n.PUNCTUATION,"Expected )"),e=new b(e,t),console.log(" [parseCall] Created CallExpression")}return console.log(` [parseCall] Returning: ${e.type}`),e}parsePrimary(){if(console.log(` [parsePrimary] Current: ${this.peek().value} (${this.peek().type})`),this.isKeyword("this"))return this.advance(),console.log(" [parsePrimary] \u2713 this keyword"),new o("this");if(this.check(n.STRING)){const e=this.advance();return console.log(` [parsePrimary] \u2713 string literal: ${e.value}`),new h(e.value,e.value,"string")}if(this.check(n.NUMBER)){const e=this.advance();return console.log(` [parsePrimary] \u2713 number literal: ${e.value}`),new h(parseFloat(e.value),e.value,"number")}if(this.check(n.BOOLEAN)){const e=this.advance();return console.log(` [parsePrimary] \u2713 boolean: ${e.value}`),new h(e.value==="true",e.value,"boolean")}if(this.check(n.NULL))return this.advance(),console.log(" [parsePrimary] \u2713 null"),new h(null,"null","null");if(this.check(n.UNDEFINED))return this.advance(),console.log(" [parsePrimary] \u2713 undefined"),new h(void 0,"undefined","undefined");if(this.isKeyword("null"))return this.advance(),console.log(" [parsePrimary] \u2713 null keyword"),new h(null,"null","null");if(this.isKeyword("undefined"))return this.advance(),console.log(" [parsePrimary] \u2713 undefined keyword"),new h(void 0,"undefined","undefined");if(this.isPunctuation("(")){console.log(" [parsePrimary] Found ( - checking for arrow function or grouped expr");const e=this.current;if(this.advance(),this.isPunctuation(")")){const s=this.current+1;if(s"){console.log(" [parsePrimary] \u2713 arrow function with no params: () => ..."),this.consume(n.PUNCTUATION,"Expected )"),this.consume(n.OPERATOR,"Expected =>");const i=this.parseExpression();return new g([],i)}}const t=this.parseExpression();if(this.consume(n.PUNCTUATION,"Expected )"),this.isOperator("=>")){console.log(" [parsePrimary] \u2713 arrow function: (x) => ..."),this.advance();const s=this.parseExpression();let i=[];return t.type==="Identifier"&&(i=[new E(t,!1,null)]),new g(i,s)}return console.log(" [parsePrimary] \u2713 grouped expression"),t}if(this.isPunctuation("{"))return console.log(" [parsePrimary] \u2713 object literal"),this.advance(),this.parseObjectLiteral();if(this.isPunctuation("[")){console.log(" [parsePrimary] \u2713 array literal"),this.advance();const e=[];for(;!this.isPunctuation("]")&&!this.isAtEnd()&&(e.push(this.parseExpression()),!!this.isPunctuation(","));)this.advance();return this.consume(n.PUNCTUATION,"Expected ]"),{type:"ArrayLiteral",elements:e}}if(this.isKeyword("new")){console.log(" [parsePrimary] \u2713 new expression"),this.advance();const e=new o(this.consume(n.IDENTIFIER,"Expected class name").value);this.consume(n.PUNCTUATION,"Expected (");const t=this.parseArguments();return this.consume(n.PUNCTUATION,"Expected )"),new P(e,t)}if(this.isKeyword("const")){const e=this.current;if(this.advance(),this.isKeyword("new")){console.log(" [parsePrimary] \u2713 const new expression"),this.advance();const t=new o(this.consume(n.IDENTIFIER,"Expected class name").value);this.consume(n.PUNCTUATION,"Expected (");const s=this.parseArguments();this.consume(n.PUNCTUATION,"Expected )");const i=new P(t,s);return i.isConst=!0,i}if(this.check(n.IDENTIFIER))return console.log(" [parsePrimary] \u2713 const implicit new expression (ignoring const)"),this.parsePrimary();if(this.isPunctuation("["))return console.log(" [parsePrimary] \u2713 const array literal"),this.parsePrimary();if(this.isPunctuation("{"))return console.log(" [parsePrimary] \u2713 const object literal"),this.parsePrimary();this.current=e}if(this.check(n.IDENTIFIER)){const e=this.advance(),t=new o(e.value);if(console.log(` [parsePrimary] \u2713 identifier: ${e.value}`),this.isOperator("=>")){console.log(" [parsePrimary] \u2713 arrow function: x => ..."),this.advance();const s=this.parseExpression();return new g([new E(t)],s)}return t}throw console.error(` [parsePrimary] \u274C FAILED - Cannot parse token: ${this.peek().value} (${this.peek().type})`),this.error("Expected expression")}enterMethod(e){this.callStack||(this.callStack=[]),this.callStack.push({method:e,line:this.peek().line,column:this.peek().column,token:this.peek().value})}parseObjectLiteral(){this.enterMethod("parseObjectLiteral");const e=[];try{for(;!this.isPunctuation("}")&&!this.isAtEnd();){if(this.isPunctuation(",")){this.advance();continue}let t=null,s=!1;if(this.isPunctuation("["))this.advance(),t=this.parseExpression(),this.consume(n.PUNCTUATION,"Expected ]");else if(this.check(n.IDENTIFIER)){const a=this.advance();t=new o(a.value),(this.isPunctuation(",")||this.isPunctuation("}"))&&(s=!0)}else if(this.check(n.STRING)){const a=this.advance();t=new h(a.value,a.value,"string")}else{this.advance();continue}let i=t;if(!s&&this.isPunctuation(":")){this.advance();try{i=this.parseTernary()}catch(a){for(a.parserError&&this.reportParserError(a.parserError),i=t;!this.isPunctuation(",")&&!this.isPunctuation("}")&&!this.isAtEnd();)this.advance()}}const r=new S(t,i);r.shorthand=s,e.push(r),this.isPunctuation(",")&&this.advance()}return this.isPunctuation("}")&&this.advance(),this.exitMethod("parseObjectLiteral"),new F(e)}catch(t){throw this.exitMethod("parseObjectLiteral"),t}}parseArguments(){const e=[];for(;!this.isPunctuation(")")&&!this.isAtEnd();){try{e.push(this.parseTernary())}catch{break}if(!this.isPunctuation(","))break;this.advance()}return e}check(e){return this.isAtEnd()?!1:this.peek().type===e}consume(e,t=""){if(this.check(e))return this.advance();throw this.error(t||`Expected ${e}`)}consumeStatementEnd(){this.skipComments(),this.isPunctuation(";")&&this.advance(),this.skipComments()}advance(){return this.isAtEnd()||this.current++,this.previous()}peek(){return this.tokens[this.current]}previous(){return this.tokens[this.current-1]}isAtEnd(){return this.peek().type===n.EOF}getLocation(){const e=this.peek();return{line:e.line,column:e.column}}error(e){const t=this.peek(),s=new Error(`Parse error at line ${t.line}, column ${t.column}: ${e}`);return s.parserError={message:`Parse error at line ${t.line}, column ${t.column}: ${e}`,line:t.line,column:t.column,token:{type:t.type,value:t.value},callStack:this.callStack?[...this.callStack]:[]},s}getContext(){const e=Math.max(0,this.current-5),t=Math.min(this.tokens.length,this.current+6);return{before:this.tokens.slice(e,this.current).map(s=>`${s.value}(${s.type})`).join(" "),current:`\u2192 ${this.peek().value}(${this.peek().type}) \u2190`,after:this.tokens.slice(this.current+1,t).map(s=>`${s.value}(${s.type})`).join(" ")}}exitMethod(e){this.callStack||(this.callStack=[]),this.callStack.length>0&&this.callStack[this.callStack.length-1].method===e&&this.callStack.pop()}getTokenContext(){const e=Math.max(0,this.current-5),t=Math.min(this.tokens.length,this.current+6),s=this.tokens.slice(e,this.current).map(r=>`${r.value}`).join(" "),i=this.tokens.slice(this.current+1,t).map(r=>`${r.value}`).join(" ");return{before:s,current:`\u2192 ${this.peek().value} \u2190`,after:i}}synchronize(){for(this.advance();!this.isAtEnd();){if(this.isPunctuation(";")){this.advance();return}if(this.isKeyword("class")||this.isKeyword("function")||this.isKeyword("import"))return;this.advance()}}getErrors(){return this.errors}reportError(e){this.errors.push(e),this.debugMode&&(console.error(` +\u274C PARSER ERROR DETECTED: +`),console.error(`Message: ${e.message} +`),console.error("\u{1F4CD} Token Context:"),console.error(` Before: ${e.context.before}`),console.error(` Current: ${e.context.current}`),console.error(` After: ${e.context.after} +`),console.error("\u{1F4DA} Call Stack (where error came from):"),e.callStack.length===0?console.error(` (top level) +`):(e.callStack.forEach((t,s)=>{const i=s===e.callStack.length-1?"\u2192":" ";console.error(` ${i} ${s+1}. ${t.method}()`),console.error(` at token: "${t.token}" (line ${t.line}, col ${t.column})`)}),console.error("")))}}export{l as ASTNode,g as ArrowFunctionExpression,R as BlockStatement,b as CallExpression,O as ClassBody,N as ClassDeclaration,w as ExpressionStatement,$ as FieldDeclaration,D as FunctionDeclaration,o as Identifier,C as ImportDeclaration,k as ImportSpecifier,h as Literal,I as MemberExpression,A as MethodDeclaration,P as NewExpression,F as ObjectLiteral,E as Parameter,L as Parser,T as Program,S as Property,U as ReturnStatement}; +//# sourceMappingURL=flutterjs_parser.js.map diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_parser.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_parser.js.map new file mode 100644 index 00000000..ac5dd38f --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_parser.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/flutterjs_parser.js"], + "sourcesContent": ["/**\r\n * FlutterJS Parser - Converts tokens to AST (FIXED VERSION)\r\n * Phase 1.2 MVP Implementation - Complete Fixes\r\n * \r\n * Final fix: parseParameterList handles UNDEFINED and NULL token types\r\n */\r\n\r\n\r\nimport { TokenType } from './lexer.js';\r\nimport { getLogger } from './flutterjs_logger.js';\r\n\r\n// ============================================================================\r\n// AST NODE CLASSES\r\n// ============================================================================\r\n\r\nclass ASTNode {\r\n constructor(type, location) {\r\n this.type = type;\r\n this.location = location;\r\n }\r\n}\r\n\r\nclass Program extends ASTNode {\r\n constructor(body = [], location = null) {\r\n super('Program', location);\r\n this.body = body;\r\n }\r\n}\r\n\r\nclass ImportDeclaration extends ASTNode {\r\n constructor(specifiers = [], source = null, location = null) {\r\n super('ImportDeclaration', location);\r\n this.specifiers = specifiers;\r\n this.source = source;\r\n }\r\n}\r\n\r\nclass ImportSpecifier extends ASTNode {\r\n constructor(imported = null, local = null, location = null) {\r\n super('ImportSpecifier', location);\r\n this.imported = imported;\r\n this.local = local;\r\n }\r\n}\r\n\r\nclass ClassDeclaration extends ASTNode {\r\n constructor(id = null, superClass = null, body = null, location = null) {\r\n super('ClassDeclaration', location);\r\n this.id = id;\r\n this.superClass = superClass;\r\n this.body = body;\r\n }\r\n}\r\n\r\nclass ClassBody extends ASTNode {\r\n constructor(fields = [], methods = [], location = null) {\r\n super('ClassBody', location);\r\n this.fields = fields;\r\n this.methods = methods;\r\n }\r\n}\r\n\r\nclass FieldDeclaration extends ASTNode {\r\n constructor(key = null, initialValue = null, location = null) {\r\n super('FieldDeclaration', location);\r\n this.key = key;\r\n this.initialValue = initialValue;\r\n }\r\n}\r\n\r\nclass MethodDeclaration extends ASTNode {\r\n constructor(key = null, params = [], body = null, location = null) {\r\n super('MethodDeclaration', location);\r\n this.key = key;\r\n this.params = params;\r\n this.body = body;\r\n }\r\n}\r\n\r\nclass Parameter extends ASTNode {\r\n constructor(name = null, optional = false, defaultValue = null, location = null) {\r\n super('Parameter', location);\r\n this.name = name;\r\n this.optional = optional;\r\n this.defaultValue = defaultValue;\r\n }\r\n}\r\n\r\nclass FunctionDeclaration extends ASTNode {\r\n constructor(id = null, params = [], body = null, isAsync = false, location = null) {\r\n super('FunctionDeclaration', location);\r\n this.id = id;\r\n this.params = params;\r\n this.body = body;\r\n this.isAsync = isAsync;\r\n }\r\n}\r\n\r\nclass BlockStatement extends ASTNode {\r\n constructor(body = [], location = null) {\r\n super('BlockStatement', location);\r\n this.body = body;\r\n }\r\n}\r\n\r\nclass ReturnStatement extends ASTNode {\r\n constructor(argument = null, location = null) {\r\n super('ReturnStatement', location);\r\n this.argument = argument;\r\n }\r\n}\r\n\r\nclass ExpressionStatement extends ASTNode {\r\n constructor(expression = null, location = null) {\r\n super('ExpressionStatement', location);\r\n this.expression = expression;\r\n }\r\n}\r\n\r\nclass Identifier extends ASTNode {\r\n constructor(name = '', location = null) {\r\n super('Identifier', location);\r\n this.name = name;\r\n }\r\n}\r\n\r\nclass Literal extends ASTNode {\r\n constructor(value = null, raw = '', type = 'string', location = null) {\r\n super('Literal', location);\r\n this.value = value;\r\n this.raw = raw;\r\n this.literalType = type;\r\n }\r\n}\r\n\r\nclass CallExpression extends ASTNode {\r\n constructor(callee = null, args = [], location = null) {\r\n super('CallExpression', location);\r\n this.callee = callee;\r\n this.args = args;\r\n }\r\n}\r\n\r\nclass NewExpression extends ASTNode {\r\n constructor(callee = null, args = [], location = null) {\r\n super('NewExpression', location);\r\n this.callee = callee;\r\n this.args = args;\r\n this.isConst = false;\r\n }\r\n}\r\n\r\nclass ObjectLiteral extends ASTNode {\r\n constructor(properties = [], location = null) {\r\n super('ObjectLiteral', location);\r\n this.properties = properties;\r\n }\r\n}\r\n\r\nclass Property extends ASTNode {\r\n constructor(key = null, value = null, location = null) {\r\n super('Property', location);\r\n this.key = key;\r\n this.value = value;\r\n this.shorthand = false;\r\n }\r\n}\r\n\r\nclass ArrowFunctionExpression extends ASTNode {\r\n constructor(params = [], body = null, location = null) {\r\n super('ArrowFunctionExpression', location);\r\n this.params = params;\r\n this.body = body;\r\n }\r\n}\r\n\r\nclass MemberExpression extends ASTNode {\r\n constructor(object = null, property = null, computed = false, location = null) {\r\n super('MemberExpression', location);\r\n this.object = object;\r\n this.property = property;\r\n this.computed = computed;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// PARSER CLASS\r\n// ============================================================================\r\n\r\nclass Parser {\r\n constructor(tokens = [], options = {}) {\r\n this.tokens = tokens;\r\n this.current = 0;\r\n this.errors = [];\r\n this.options = { strict: false, ...options };\r\n // NEW: Call stack tracking\r\n this.callStack = [];\r\n\r\n this.debugMode = true;\r\n }\r\n\r\n parse() {\r\n const body = [];\r\n\r\n while (!this.isAtEnd()) {\r\n try {\r\n const stmt = this.parseTopLevel();\r\n if (stmt && stmt.type === 'ImportDeclaration') {\r\n console.log('DEBUG - ImportDeclaration:', JSON.stringify(stmt, null, 2));\r\n }\r\n if (stmt) {\r\n body.push(stmt);\r\n }\r\n } catch (error) {\r\n this.errors.push(error);\r\n this.synchronize();\r\n }\r\n }\r\n\r\n return new Program(body);\r\n }\r\n\r\n /**\r\n * Skip any comment tokens\r\n * Comments should be transparent to the parser\r\n */\r\n skipComments() {\r\n while (!this.isAtEnd() && this.check(TokenType.COMMENT)) {\r\n this.advance();\r\n }\r\n }\r\n\r\n /**\r\n * Check if token is a comment\r\n */\r\n isComment() {\r\n if (this.isAtEnd()) return false;\r\n return this.peek().type === TokenType.COMMENT;\r\n }\r\n\r\n\r\n parseTopLevel() {\r\n this.skipComments(); // \u2190 ADD THIS LINE\r\n\r\n if (this.isAtEnd()) return null;\r\n\r\n if (this.isKeyword('import')) {\r\n this.advance();\r\n return this.parseImportDeclaration();\r\n }\r\n\r\n if (this.isKeyword('class')) {\r\n this.advance();\r\n return this.parseClassDeclaration();\r\n }\r\n\r\n if (this.isKeyword('function')) {\r\n this.advance();\r\n return this.parseFunctionDeclaration();\r\n }\r\n\r\n const expr = this.parseExpression();\r\n this.consumeStatementEnd();\r\n return new ExpressionStatement(expr, this.getLocation());\r\n }\r\n isKeyword(value) {\r\n if (this.isAtEnd()) return false;\r\n const token = this.peek();\r\n return token.type === TokenType.KEYWORD && token.value === value;\r\n }\r\n\r\n isPunctuation(value) {\r\n if (this.isAtEnd()) return false;\r\n const token = this.peek();\r\n return token.type === TokenType.PUNCTUATION && token.value === value;\r\n }\r\n\r\n isOperator(value) {\r\n if (this.isAtEnd()) return false;\r\n const token = this.peek();\r\n return token.type === TokenType.OPERATOR && token.value === value;\r\n }\r\n\r\n /**\r\n * FIXED: parseImportDeclaration() in flutterjs_parser.js\r\n * Handles multi-line imports with comments and proper spacing\r\n * \r\n * Replace the entire parseImportDeclaration() method with this version\r\n */\r\n\r\n parseImportDeclaration() {\r\n const logger = getLogger().createComponentLogger('Parser.parseImportDeclaration');\r\n logger.startSession('parseImportDeclaration');\r\n\r\n const startLocation = this.getLocation();\r\n const specifiers = [];\r\n\r\n logger.trace(` Starting import parse at token: ${this.peek().value}`);\r\n\r\n // Case 1: Named imports { x, y, z }\r\n if (this.isPunctuation('{')) {\r\n logger.trace(` Found opening brace, parsing named imports...`);\r\n this.advance();\r\n\r\n // \u2705 FIX #1: Skip comments right after opening brace\r\n this.skipComments();\r\n\r\n while (!this.isPunctuation('}') && !this.isAtEnd()) {\r\n // \u2705 FIX #2: Skip comments before checking for closing brace\r\n this.skipComments();\r\n\r\n // Check if we hit the closing brace (after skipping comments)\r\n if (this.isPunctuation('}')) {\r\n logger.trace(` Found closing brace, exiting loop`);\r\n break;\r\n }\r\n\r\n // Expect an identifier\r\n if (!this.check(TokenType.IDENTIFIER)) {\r\n logger.warn(` Expected identifier but got: ${this.peek().value}`);\r\n this.advance();\r\n continue;\r\n }\r\n\r\n // Get the imported name\r\n const importedName = this.consume(TokenType.IDENTIFIER, 'Expected identifier').value;\r\n const imported = new Identifier(importedName);\r\n logger.trace(` Imported: ${importedName}`);\r\n\r\n let local = imported; // Default: local name = imported name\r\n\r\n // \u2705 FIX #3: Skip comments before checking for 'as'\r\n this.skipComments();\r\n\r\n // Check for 'as' alias\r\n if (this.isKeyword('as')) {\r\n logger.trace(` Found 'as' keyword`);\r\n this.advance();\r\n\r\n // \u2705 FIX #4: Skip comments after 'as'\r\n this.skipComments();\r\n\r\n const localName = this.consume(TokenType.IDENTIFIER, 'Expected identifier after as').value;\r\n local = new Identifier(localName);\r\n logger.trace(` Local name: ${localName}`);\r\n }\r\n\r\n // Add specifier to list\r\n specifiers.push(new ImportSpecifier(imported, local));\r\n\r\n // \u2705 FIX #5: Skip comments before checking for comma\r\n this.skipComments();\r\n\r\n // Check for comma separator\r\n if (this.isPunctuation(',')) {\r\n logger.trace(` Found comma, continuing...`);\r\n this.advance();\r\n\r\n // \u2705 FIX #6: Skip comments after comma\r\n this.skipComments();\r\n\r\n // Continue to next item\r\n continue;\r\n } else {\r\n logger.trace(` No comma, expected closing brace next`);\r\n // No more items, should see closing brace\r\n break;\r\n }\r\n }\r\n\r\n logger.trace(` Parsed ${specifiers.length} named imports`);\r\n\r\n // Consume closing brace\r\n this.consume(TokenType.PUNCTUATION, 'Expected }');\r\n }\r\n\r\n // Case 2: Default import or default + named\r\n // import MyDefault from 'module'\r\n // import MyDefault, { x, y } from 'module'\r\n else if (this.check(TokenType.IDENTIFIER) && this.peekAhead(1).value !== 'from') {\r\n logger.trace(` Found identifier without opening brace, parsing default import...`);\r\n\r\n const defaultName = this.consume(TokenType.IDENTIFIER, 'Expected identifier').value;\r\n const imported = new Identifier(defaultName);\r\n const local = new Identifier(defaultName);\r\n specifiers.push(new ImportSpecifier(imported, local));\r\n\r\n logger.trace(` Default import: ${defaultName}`);\r\n\r\n // Check for comma and additional named imports\r\n this.skipComments();\r\n if (this.isPunctuation(',')) {\r\n logger.trace(` Found comma after default import, checking for named imports...`);\r\n this.advance();\r\n\r\n this.skipComments();\r\n if (this.isPunctuation('{')) {\r\n logger.trace(` Found opening brace, parsing additional named imports...`);\r\n this.advance();\r\n\r\n this.skipComments();\r\n while (!this.isPunctuation('}') && !this.isAtEnd()) {\r\n this.skipComments();\r\n\r\n if (this.isPunctuation('}')) break;\r\n\r\n if (!this.check(TokenType.IDENTIFIER)) {\r\n this.advance();\r\n continue;\r\n }\r\n\r\n const name = this.consume(TokenType.IDENTIFIER, 'Expected identifier').value;\r\n const imported2 = new Identifier(name);\r\n let local2 = imported2;\r\n\r\n this.skipComments();\r\n\r\n if (this.isKeyword('as')) {\r\n this.advance();\r\n this.skipComments();\r\n const localName = this.consume(TokenType.IDENTIFIER, 'Expected identifier after as').value;\r\n local2 = new Identifier(localName);\r\n }\r\n\r\n specifiers.push(new ImportSpecifier(imported2, local2));\r\n\r\n this.skipComments();\r\n\r\n if (this.isPunctuation(',')) {\r\n this.advance();\r\n this.skipComments();\r\n continue;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n this.consume(TokenType.PUNCTUATION, 'Expected }');\r\n }\r\n }\r\n }\r\n\r\n // \u2705 FIX #7: Skip comments before 'from'\r\n this.skipComments();\r\n\r\n // Consume 'from' keyword\r\n this.consume(TokenType.KEYWORD, 'Expected from');\r\n\r\n // \u2705 FIX #8: Skip comments before module path string\r\n this.skipComments();\r\n\r\n // Get the module/source path\r\n const modulePathToken = this.consume(TokenType.STRING, 'Expected module path string');\r\n const source = new Literal(\r\n modulePathToken.value,\r\n modulePathToken.value,\r\n 'string'\r\n );\r\n\r\n logger.trace(` Module path: ${source.value}`);\r\n logger.trace(` Total specifiers: ${specifiers.length}`);\r\n\r\n // \u2705 FIX #9: Consume statement end (handles semicolon and trailing comments)\r\n this.consumeStatementEnd();\r\n\r\n logger.trace(`[parseImportDeclaration] SUCCESS\\n`);\r\n return new ImportDeclaration(specifiers, source, startLocation);\r\n }\r\n\r\n /**\r\n * Helper method: Check if lookahead token matches (needed for peekAhead)\r\n * Add this if not already present\r\n */\r\n peekAhead(n = 1) {\r\n const pos = this.current + n;\r\n if (pos >= this.tokens.length) {\r\n return this.tokens[this.tokens.length - 1];\r\n }\r\n return this.tokens[pos];\r\n }\r\n\r\n parseClassDeclaration() {\r\n const logger = getLogger().createComponentLogger('Parser.parseClassDeclaration');\r\n logger.startSession('parseClassDeclaration');\r\n logger.trace(` Current token: ${this.peek().value} (${this.peek().type})`);\r\n\r\n const startLocation = this.getLocation();\r\n const nameToken = this.consume(TokenType.IDENTIFIER, 'Expected class name');\r\n const name = new Identifier(nameToken.value);\r\n logger.trace(` Class name: ${name.name}`);\r\n\r\n let superClass = null;\r\n if (this.isKeyword('extends')) {\r\n this.advance();\r\n const superName = this.consume(TokenType.IDENTIFIER, 'Expected superclass name').value;\r\n superClass = new Identifier(superName);\r\n logger.trace(` Extends: ${superClass.name}`);\r\n\r\n // Skip generic type parameters like \r\n if (this.isOperator('<')) {\r\n this.advance();\r\n this.consume(TokenType.IDENTIFIER, 'Expected type name');\r\n this.consume(TokenType.OPERATOR, 'Expected >');\r\n }\r\n }\r\n\r\n logger.trace(` Looking for opening brace...`);\r\n logger.trace(` Current token: ${this.peek().value} (${this.peek().type})`);\r\n this.consume(TokenType.PUNCTUATION, 'Expected {');\r\n\r\n const fields = [];\r\n const methods = [];\r\n\r\n logger.trace(` Parsing class body...`);\r\n let itemCount = 0;\r\n\r\n while (!this.isPunctuation('}') && !this.isAtEnd()) {\r\n this.skipComments(); // \u2190 ADD THIS LINE - skip comments in class body\r\n\r\n if (this.isPunctuation('}')) break; // Check again after skipping comments\r\n\r\n logger.trace(` [item ${itemCount}] Current token: ${this.peek().value} (${this.peek().type})`);\r\n\r\n // Skip semicolons\r\n if (this.isPunctuation(';')) {\r\n logger.trace(` Skipping semicolon`);\r\n this.advance();\r\n continue;\r\n }\r\n\r\n // Check for constructor (always a method)\r\n if (this.isKeyword('constructor')) {\r\n logger.trace(` Found constructor`);\r\n methods.push(this.parseMethodDeclaration());\r\n itemCount++;\r\n continue;\r\n }\r\n\r\n // Check for field or method\r\n if (this.check(TokenType.IDENTIFIER)) {\r\n const currentPos = this.current;\r\n const idToken = this.peek();\r\n const fieldName = idToken.value;\r\n logger.trace(` Found identifier: ${fieldName}`);\r\n this.advance();\r\n\r\n // CASE 1: Field initializer - IDENTIFIER = value\r\n if (this.isOperator('=')) {\r\n logger.trace(` -> This is a FIELD (followed by =)`);\r\n this.current = currentPos; // Rewind\r\n try {\r\n fields.push(this.parseFieldDeclaration());\r\n logger.trace(` Field parsed successfully`);\r\n itemCount++;\r\n continue;\r\n } catch (e) {\r\n console.error(` ERROR parsing field: ${e.message}`);\r\n throw e;\r\n }\r\n }\r\n\r\n // CASE 2: Method - IDENTIFIER ( params )\r\n if (this.isPunctuation('(')) {\r\n logger.trace(` -> This is a METHOD (followed by '(')`);\r\n this.current = currentPos; // Rewind\r\n try {\r\n methods.push(this.parseMethodDeclaration());\r\n logger.trace(` Method parsed successfully`);\r\n itemCount++;\r\n continue;\r\n } catch (e) {\r\n console.error(` ERROR parsing method: ${e.message}`);\r\n throw e;\r\n }\r\n }\r\n\r\n logger.trace(` -> Unknown pattern, skipping`);\r\n this.advance();\r\n continue;\r\n }\r\n\r\n // Skip unknown tokens\r\n logger.trace(` Skipping unknown token: ${this.peek().value}`);\r\n this.advance();\r\n }\r\n\r\n logger.trace(` Class body parsing complete. Found ${fields.length} fields, ${methods.length} methods`);\r\n\r\n this.consume(TokenType.PUNCTUATION, 'Expected }');\r\n const body = new ClassBody(fields, methods);\r\n logger.trace(`[parseClassDeclaration] SUCCESS\\n`);\r\n return new ClassDeclaration(name, superClass, body, startLocation);\r\n }\r\n\r\n\r\n parseMethodDeclaration() {\r\n const logger = getLogger().createComponentLogger('Parser.parseMethodDeclaration');\r\n logger.startSession(` [parseMethodDeclaration] STARTING`);\r\n logger.trace(` Current: ${this.peek().value}`);\r\n\r\n const startLocation = this.getLocation();\r\n\r\n let methodName;\r\n if (this.isKeyword('constructor')) {\r\n methodName = 'constructor';\r\n this.advance();\r\n } else {\r\n methodName = this.consume(TokenType.IDENTIFIER, 'Expected method name').value;\r\n }\r\n\r\n logger.trace(` Method name: ${methodName}`);\r\n const key = new Identifier(methodName);\r\n\r\n this.consume(TokenType.PUNCTUATION, 'Expected (');\r\n const params = this.parseParameterList();\r\n logger.trace(` Parameters: ${params.length}`);\r\n this.consume(TokenType.PUNCTUATION, 'Expected )');\r\n\r\n let body = null;\r\n if (this.isOperator('=>')) {\r\n logger.trace(` Arrow function body`);\r\n this.advance();\r\n body = this.parseExpression();\r\n } else if (this.isPunctuation('{')) {\r\n logger.trace(` Block body`);\r\n this.advance();\r\n body = this.parseBlock();\r\n }\r\n\r\n logger.trace(` [parseMethodDeclaration] SUCCESS`);\r\n return new MethodDeclaration(key, params, body, startLocation);\r\n }\r\n parseFieldDeclaration() {\r\n console.log(` [parseFieldDeclaration] STARTING`);\r\n console.log(` Current: ${this.peek().value}`);\r\n\r\n const startLocation = this.getLocation();\r\n const fieldName = this.consume(TokenType.IDENTIFIER, 'Expected field name').value;\r\n const key = new Identifier(fieldName);\r\n console.log(` Field name: ${fieldName}`);\r\n\r\n let initialValue = null;\r\n if (this.isOperator('=')) {\r\n console.log(` Found = operator, parsing initializer...`);\r\n this.advance();\r\n try {\r\n initialValue = this.parseExpression();\r\n console.log(` Initializer parsed: ${initialValue.type}`);\r\n } catch (e) {\r\n console.error(` ERROR parsing initializer: ${e.message}`);\r\n throw e;\r\n }\r\n }\r\n\r\n this.consumeStatementEnd();\r\n console.log(` [parseFieldDeclaration] SUCCESS`);\r\n return new FieldDeclaration(key, initialValue, startLocation);\r\n }\r\n\r\n parseFunctionDeclaration() {\r\n const startLocation = this.getLocation();\r\n const nameToken = this.consume(TokenType.IDENTIFIER, 'Expected function name');\r\n const name = nameToken.value ? new Identifier(nameToken.value) : null;\r\n\r\n this.consume(TokenType.PUNCTUATION, 'Expected (');\r\n const params = this.parseParameterList();\r\n this.consume(TokenType.PUNCTUATION, 'Expected )');\r\n\r\n this.consume(TokenType.PUNCTUATION, 'Expected {');\r\n const body = this.parseBlock();\r\n\r\n return new FunctionDeclaration(name, params, body, false, startLocation);\r\n }\r\n\r\n /**\r\n * Parse parameter list - FIXED to handle UNDEFINED and NULL token types\r\n */\r\n parseParameterList() {\r\n const params = [];\r\n\r\n while (!this.isPunctuation(')') && !this.isAtEnd()) {\r\n const paramLocation = this.getLocation();\r\n\r\n // Handle destructuring: { key = value }\r\n if (this.isPunctuation('{')) {\r\n this.advance();\r\n while (!this.isPunctuation('}') && !this.isAtEnd()) {\r\n const paramName = this.consume(TokenType.IDENTIFIER, 'Expected param name').value;\r\n let defaultValue = null;\r\n\r\n if (this.isOperator('=')) {\r\n this.advance();\r\n // FIXED: Check token type, not just keywords\r\n const token = this.peek();\r\n\r\n if (this.check(TokenType.IDENTIFIER)) {\r\n defaultValue = new Identifier(this.advance().value);\r\n } else if (this.check(TokenType.NUMBER)) {\r\n defaultValue = new Literal(parseFloat(this.advance().value), '', 'number');\r\n } else if (this.check(TokenType.UNDEFINED)) {\r\n // FIXED: Handle UNDEFINED token type\r\n this.advance();\r\n defaultValue = new Literal(undefined, 'undefined', 'undefined');\r\n } else if (this.check(TokenType.NULL)) {\r\n // FIXED: Handle NULL token type\r\n this.advance();\r\n defaultValue = new Literal(null, 'null', 'null');\r\n } else if (this.isKeyword('undefined')) {\r\n this.advance();\r\n defaultValue = new Literal(undefined, 'undefined', 'undefined');\r\n } else if (this.isKeyword('null')) {\r\n this.advance();\r\n defaultValue = new Literal(null, 'null', 'null');\r\n }\r\n }\r\n\r\n params.push(new Parameter(new Identifier(paramName), defaultValue !== null, defaultValue, paramLocation));\r\n\r\n if (!this.isPunctuation(',')) break;\r\n this.advance();\r\n }\r\n this.consume(TokenType.PUNCTUATION, 'Expected }');\r\n\r\n // Handle = {} after destructuring\r\n if (this.isOperator('=')) {\r\n this.advance();\r\n if (this.isPunctuation('{')) {\r\n this.advance();\r\n let braceDepth = 1;\r\n while (braceDepth > 0 && !this.isAtEnd()) {\r\n if (this.isPunctuation('{')) braceDepth++;\r\n else if (this.isPunctuation('}')) braceDepth--;\r\n if (braceDepth > 0) this.advance();\r\n }\r\n this.consume(TokenType.PUNCTUATION, 'Expected }');\r\n }\r\n }\r\n } else if (this.check(TokenType.IDENTIFIER)) {\r\n // Regular parameter\r\n const paramName = this.consume(TokenType.IDENTIFIER, 'Expected param name').value;\r\n let defaultValue = null;\r\n\r\n if (this.isOperator('=')) {\r\n this.advance();\r\n const token = this.peek();\r\n\r\n if (this.check(TokenType.IDENTIFIER)) {\r\n defaultValue = new Identifier(this.advance().value);\r\n } else if (this.check(TokenType.NUMBER)) {\r\n defaultValue = new Literal(parseFloat(this.advance().value), '', 'number');\r\n } else if (this.check(TokenType.UNDEFINED)) {\r\n this.advance();\r\n defaultValue = new Literal(undefined, 'undefined', 'undefined');\r\n } else if (this.check(TokenType.NULL)) {\r\n this.advance();\r\n defaultValue = new Literal(null, 'null', 'null');\r\n } else if (this.isKeyword('undefined')) {\r\n this.advance();\r\n defaultValue = new Literal(undefined, 'undefined', 'undefined');\r\n } else if (this.isKeyword('null')) {\r\n this.advance();\r\n defaultValue = new Literal(null, 'null', 'null');\r\n }\r\n }\r\n\r\n params.push(new Parameter(new Identifier(paramName), defaultValue !== null, defaultValue, paramLocation));\r\n } else {\r\n break;\r\n }\r\n\r\n if (!this.isPunctuation(',')) break;\r\n this.advance();\r\n }\r\n\r\n return params;\r\n }\r\n\r\n parseBlock() {\r\n console.log(`\\n[parseBlock] STARTING at token: ${this.peek().value}`);\r\n\r\n const startLocation = this.getLocation();\r\n const statements = [];\r\n\r\n while (!this.isPunctuation('}') && !this.isAtEnd()) {\r\n this.skipComments(); // \u2190 ADD THIS LINE - skip comments in block\r\n\r\n if (this.isPunctuation('}')) break; // Check again after skipping\r\n\r\n console.log(` [parseBlock] Current token: ${this.peek().value} (${this.peek().type})`);\r\n\r\n if (this.isKeyword('return')) {\r\n console.log(` Found RETURN statement`);\r\n this.advance();\r\n let argument = null;\r\n\r\n if (!this.isPunctuation(';') && !this.isPunctuation('}')) {\r\n console.log(` Parsing return argument...`);\r\n try {\r\n argument = this.parseExpression();\r\n console.log(` Return argument parsed successfully`);\r\n } catch (error) {\r\n console.error(` \u274C ERROR parsing return argument: ${error.message}`);\r\n console.error(` Token was: ${this.peek().value}`);\r\n\r\n // Skip to semicolon\r\n while (!this.isPunctuation(';') && !this.isPunctuation('}') && !this.isAtEnd()) {\r\n this.advance();\r\n }\r\n }\r\n }\r\n\r\n this.consumeStatementEnd();\r\n statements.push(new ReturnStatement(argument, startLocation));\r\n\r\n } else {\r\n console.log(` Parsing expression statement...`);\r\n try {\r\n const expr = this.parseExpression();\r\n console.log(` Expression parsed successfully: ${expr.type}`);\r\n this.consumeStatementEnd();\r\n statements.push(new ExpressionStatement(expr, startLocation));\r\n } catch (error) {\r\n console.error(` \u274C ERROR parsing expression: ${error.message}`);\r\n console.error(` Token was: ${this.peek().value}`);\r\n\r\n // Skip to next statement\r\n while (!this.isPunctuation(';') && !this.isPunctuation('}') && !this.isAtEnd()) {\r\n this.advance();\r\n }\r\n if (this.isPunctuation(';')) {\r\n this.advance();\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.isPunctuation('}')) {\r\n this.advance();\r\n }\r\n\r\n console.log(`[parseBlock] SUCCESS - ${statements.length} statements\\n`);\r\n return new BlockStatement(statements, startLocation);\r\n }\r\n\r\n parseExpression() {\r\n console.log(` [parseExpression] Current token: ${this.peek().value}`);\r\n try {\r\n const result = this.parseAssignment();\r\n console.log(` [parseExpression] \u2713 Success, type: ${result.type}`);\r\n return result;\r\n } catch (e) {\r\n console.error(` [parseExpression] \u2717 Failed: ${e.message}`);\r\n throw e;\r\n }\r\n }\r\n\r\n parseAssignment() {\r\n let expr = this.parseTernary();\r\n\r\n if (this.isOperator('=')) {\r\n this.advance();\r\n const value = this.parseAssignment();\r\n return { type: 'AssignmentExpression', left: expr, right: value };\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n parseTernary() {\r\n let expr = this.parseLogicalOr();\r\n\r\n if (this.isOperator('?')) {\r\n this.advance();\r\n const consequent = this.parseExpression();\r\n this.consume(TokenType.OPERATOR, 'Expected :');\r\n const alternate = this.parseExpression();\r\n return { type: 'ConditionalExpression', test: expr, consequent, alternate };\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n parseLogicalOr() {\r\n let expr = this.parseLogicalAnd();\r\n\r\n while (this.isOperator('||')) {\r\n this.advance();\r\n const right = this.parseLogicalAnd();\r\n expr = { type: 'LogicalExpression', operator: '||', left: expr, right };\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n parseLogicalAnd() {\r\n let expr = this.parseEquality();\r\n\r\n while (this.isOperator('&&')) {\r\n this.advance();\r\n const right = this.parseEquality();\r\n expr = { type: 'LogicalExpression', operator: '&&', left: expr, right };\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n parseEquality() {\r\n let expr = this.parseRelational();\r\n\r\n while (this.isOperator('===') || this.isOperator('!==') || this.isOperator('==') || this.isOperator('!=')) {\r\n const operator = this.advance().value;\r\n const right = this.parseRelational();\r\n expr = { type: 'BinaryExpression', operator, left: expr, right };\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n parseRelational() {\r\n let expr = this.parseAdditive();\r\n\r\n while (this.isOperator('<') || this.isOperator('>') || this.isOperator('<=') || this.isOperator('>=')) {\r\n const operator = this.advance().value;\r\n const right = this.parseAdditive();\r\n expr = { type: 'BinaryExpression', operator, left: expr, right };\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n parseAdditive() {\r\n let expr = this.parseMultiplicative();\r\n\r\n while (this.isOperator('+') || this.isOperator('-')) {\r\n const operator = this.advance().value;\r\n const right = this.parseMultiplicative();\r\n expr = { type: 'BinaryExpression', operator, left: expr, right };\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n parseMultiplicative() {\r\n let expr = this.parseUnary();\r\n\r\n while (this.isOperator('*') || this.isOperator('/') || this.isOperator('%')) {\r\n const operator = this.advance().value;\r\n const right = this.parseUnary();\r\n expr = { type: 'BinaryExpression', operator, left: expr, right };\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n parseUnary() {\r\n console.log(` [parseUnary] Current: ${this.peek().value}`);\r\n\r\n if (this.isOperator('!') || this.isOperator('-') || this.isOperator('+') || this.isOperator('~')) {\r\n const operator = this.advance().value;\r\n const expr = this.parseUnary();\r\n return { type: 'UnaryExpression', operator, argument: expr };\r\n }\r\n\r\n\r\n console.log(` [parseUnary] Calling parsePostfix`);\r\n return this.parsePostfix();\r\n }\r\n\r\n parsePostfix() {\r\n console.log(` [parsePostfix] Starting, calling parseCall`);\r\n let expr = this.parseCall();\r\n console.log(` [parsePostfix] parseCall returned: ${expr.type || expr.name}`);\r\n console.log(` [parsePostfix] Next token: ${this.peek().value}`);\r\n\r\n while (true) {\r\n if (this.isOperator('++') || this.isOperator('--')) {\r\n const operator = this.advance().value;\r\n expr = { type: 'UpdateExpression', operator, argument: expr, prefix: false };\r\n } else if (this.isPunctuation('.')) {\r\n console.log(` [parsePostfix] Found . member access`);\r\n this.advance();\r\n const property = new Identifier(this.consume(TokenType.IDENTIFIER, 'Expected property').value);\r\n expr = new MemberExpression(expr, property, false);\r\n console.log(` [parsePostfix] Created MemberExpression: ${expr.object.name}.${expr.property.name}`);\r\n } else if (this.isPunctuation('[')) {\r\n console.log(` [parsePostfix] Found [ computed access`);\r\n this.advance();\r\n const property = this.parseExpression();\r\n this.consume(TokenType.PUNCTUATION, 'Expected ]');\r\n expr = new MemberExpression(expr, property, true);\r\n } else {\r\n console.log(` [parsePostfix] No more postfix ops, returning ${expr.type}`);\r\n break;\r\n }\r\n }\r\n\r\n return expr;\r\n }\r\n\r\n\r\n parseCall() {\r\n console.log(` [parseCall] Starting, calling parsePrimary`);\r\n let expr = this.parsePrimary();\r\n console.log(` [parseCall] parsePrimary returned: ${expr.type || expr.name}`);\r\n console.log(` [parseCall] Next token: ${this.peek().value} (${this.peek().type})`);\r\n\r\n while (this.isPunctuation('(')) {\r\n console.log(` [parseCall] Found (, parsing function call`);\r\n this.advance();\r\n const args = this.parseArguments();\r\n console.log(` [parseCall] Parsed ${args.length} arguments`);\r\n this.consume(TokenType.PUNCTUATION, 'Expected )');\r\n expr = new CallExpression(expr, args);\r\n console.log(` [parseCall] Created CallExpression`);\r\n }\r\n\r\n console.log(` [parseCall] Returning: ${expr.type}`);\r\n return expr;\r\n }\r\n\r\n parsePrimary() {\r\n console.log(` [parsePrimary] Current: ${this.peek().value} (${this.peek().type})`);\r\n\r\n // Handle 'this' keyword FIRST\r\n if (this.isKeyword('this')) {\r\n this.advance();\r\n console.log(` [parsePrimary] \u2713 this keyword`);\r\n return new Identifier('this');\r\n }\r\n\r\n if (this.check(TokenType.STRING)) {\r\n const token = this.advance();\r\n console.log(` [parsePrimary] \u2713 string literal: ${token.value}`);\r\n return new Literal(token.value, token.value, 'string');\r\n }\r\n\r\n if (this.check(TokenType.NUMBER)) {\r\n const token = this.advance();\r\n console.log(` [parsePrimary] \u2713 number literal: ${token.value}`);\r\n return new Literal(parseFloat(token.value), token.value, 'number');\r\n }\r\n\r\n if (this.check(TokenType.BOOLEAN)) {\r\n const token = this.advance();\r\n console.log(` [parsePrimary] \u2713 boolean: ${token.value}`);\r\n return new Literal(token.value === 'true', token.value, 'boolean');\r\n }\r\n\r\n if (this.check(TokenType.NULL)) {\r\n this.advance();\r\n console.log(` [parsePrimary] \u2713 null`);\r\n return new Literal(null, 'null', 'null');\r\n }\r\n\r\n if (this.check(TokenType.UNDEFINED)) {\r\n this.advance();\r\n console.log(` [parsePrimary] \u2713 undefined`);\r\n return new Literal(undefined, 'undefined', 'undefined');\r\n }\r\n\r\n if (this.isKeyword('null')) {\r\n this.advance();\r\n console.log(` [parsePrimary] \u2713 null keyword`);\r\n return new Literal(null, 'null', 'null');\r\n }\r\n\r\n if (this.isKeyword('undefined')) {\r\n this.advance();\r\n console.log(` [parsePrimary] \u2713 undefined keyword`);\r\n return new Literal(undefined, 'undefined', 'undefined');\r\n }\r\n\r\n if (this.isPunctuation('(')) {\r\n console.log(` [parsePrimary] Found ( - checking for arrow function or grouped expr`);\r\n const savedPos = this.current;\r\n this.advance();\r\n\r\n if (this.isPunctuation(')')) {\r\n const nextPos = this.current + 1;\r\n if (nextPos < this.tokens.length &&\r\n this.tokens[nextPos].type === TokenType.OPERATOR &&\r\n this.tokens[nextPos].value === '=>') {\r\n console.log(` [parsePrimary] \u2713 arrow function with no params: () => ...`);\r\n this.consume(TokenType.PUNCTUATION, 'Expected )');\r\n this.consume(TokenType.OPERATOR, 'Expected =>');\r\n const body = this.parseExpression();\r\n return new ArrowFunctionExpression([], body);\r\n }\r\n }\r\n\r\n const expr = this.parseExpression();\r\n this.consume(TokenType.PUNCTUATION, 'Expected )');\r\n\r\n if (this.isOperator('=>')) {\r\n console.log(` [parsePrimary] \u2713 arrow function: (x) => ...`);\r\n this.advance();\r\n const body = this.parseExpression();\r\n let params = [];\r\n if (expr.type === 'Identifier') {\r\n params = [new Parameter(expr, false, null)];\r\n }\r\n return new ArrowFunctionExpression(params, body);\r\n }\r\n\r\n console.log(` [parsePrimary] \u2713 grouped expression`);\r\n return expr;\r\n }\r\n\r\n if (this.isPunctuation('{')) {\r\n console.log(` [parsePrimary] \u2713 object literal`);\r\n this.advance();\r\n return this.parseObjectLiteral();\r\n }\r\n\r\n if (this.isPunctuation('[')) {\r\n console.log(` [parsePrimary] \u2713 array literal`);\r\n this.advance();\r\n const elements = [];\r\n while (!this.isPunctuation(']') && !this.isAtEnd()) {\r\n elements.push(this.parseExpression());\r\n if (!this.isPunctuation(',')) break;\r\n this.advance();\r\n }\r\n this.consume(TokenType.PUNCTUATION, 'Expected ]');\r\n return { type: 'ArrayLiteral', elements };\r\n }\r\n\r\n if (this.isKeyword('new')) {\r\n console.log(` [parsePrimary] \u2713 new expression`);\r\n this.advance();\r\n const callee = new Identifier(this.consume(TokenType.IDENTIFIER, 'Expected class name').value);\r\n this.consume(TokenType.PUNCTUATION, 'Expected (');\r\n const args = this.parseArguments();\r\n this.consume(TokenType.PUNCTUATION, 'Expected )');\r\n return new NewExpression(callee, args);\r\n }\r\n\r\n if (this.isKeyword('const')) {\r\n const savedPos = this.current;\r\n this.advance();\r\n\r\n // Case 1: const new ClassName(...)\r\n if (this.isKeyword('new')) {\r\n console.log(` [parsePrimary] \u2713 const new expression`);\r\n this.advance();\r\n const callee = new Identifier(this.consume(TokenType.IDENTIFIER, 'Expected class name').value);\r\n this.consume(TokenType.PUNCTUATION, 'Expected (');\r\n const args = this.parseArguments();\r\n this.consume(TokenType.PUNCTUATION, 'Expected )');\r\n const expr = new NewExpression(callee, args);\r\n expr.isConst = true;\r\n return expr;\r\n }\r\n\r\n // Case 2: const ClassName(...) - implicit new\r\n if (this.check(TokenType.IDENTIFIER)) {\r\n console.log(` [parsePrimary] \u2713 const implicit new expression (ignoring const)`);\r\n // Just treat it as a normal identifier start, we consumed 'const'\r\n // Recursively call parsePrimary to handle the Identifier\r\n return this.parsePrimary();\r\n }\r\n\r\n // Case 3: const [] - constant array\r\n if (this.isPunctuation('[')) {\r\n console.log(` [parsePrimary] \u2713 const array literal`);\r\n // recurse to handle [\r\n return this.parsePrimary();\r\n }\r\n\r\n // Case 4: const {} - constant object/map\r\n if (this.isPunctuation('{')) {\r\n console.log(` [parsePrimary] \u2713 const object literal`);\r\n return this.parsePrimary();\r\n }\r\n\r\n // Fallback\r\n this.current = savedPos;\r\n }\r\n\r\n if (this.check(TokenType.IDENTIFIER)) {\r\n const token = this.advance();\r\n const ident = new Identifier(token.value);\r\n console.log(` [parsePrimary] \u2713 identifier: ${token.value}`);\r\n\r\n if (this.isOperator('=>')) {\r\n console.log(` [parsePrimary] \u2713 arrow function: x => ...`);\r\n this.advance();\r\n const body = this.parseExpression();\r\n return new ArrowFunctionExpression([new Parameter(ident)], body);\r\n }\r\n\r\n return ident;\r\n }\r\n\r\n // If we get here, we couldn't parse anything\r\n console.error(` [parsePrimary] \u274C FAILED - Cannot parse token: ${this.peek().value} (${this.peek().type})`);\r\n throw this.error('Expected expression');\r\n }\r\n\r\n\r\n enterMethod(methodName) {\r\n if (!this.callStack) this.callStack = [];\r\n this.callStack.push({\r\n method: methodName,\r\n line: this.peek().line,\r\n column: this.peek().column,\r\n token: this.peek().value,\r\n });\r\n }\r\n\r\n parseObjectLiteral() {\r\n this.enterMethod('parseObjectLiteral');\r\n const properties = [];\r\n\r\n try {\r\n while (!this.isPunctuation('}') && !this.isAtEnd()) {\r\n if (this.isPunctuation(',')) {\r\n this.advance();\r\n continue;\r\n }\r\n\r\n let key = null;\r\n let shorthand = false;\r\n\r\n if (this.isPunctuation('[')) {\r\n this.advance();\r\n key = this.parseExpression();\r\n this.consume(TokenType.PUNCTUATION, 'Expected ]');\r\n } else if (this.check(TokenType.IDENTIFIER)) {\r\n const token = this.advance();\r\n key = new Identifier(token.value);\r\n\r\n if (this.isPunctuation(',') || this.isPunctuation('}')) {\r\n shorthand = true;\r\n }\r\n } else if (this.check(TokenType.STRING)) {\r\n const token = this.advance();\r\n key = new Literal(token.value, token.value, 'string');\r\n } else {\r\n this.advance();\r\n continue;\r\n }\r\n\r\n let value = key;\r\n if (!shorthand && this.isPunctuation(':')) {\r\n this.advance();\r\n\r\n try {\r\n value = this.parseTernary();\r\n } catch (error) {\r\n if (error.parserError) {\r\n this.reportParserError(error.parserError);\r\n }\r\n value = key;\r\n\r\n while (!this.isPunctuation(',') && !this.isPunctuation('}') && !this.isAtEnd()) {\r\n this.advance();\r\n }\r\n }\r\n }\r\n\r\n const prop = new Property(key, value);\r\n prop.shorthand = shorthand;\r\n properties.push(prop);\r\n\r\n if (this.isPunctuation(',')) {\r\n this.advance();\r\n }\r\n }\r\n\r\n if (this.isPunctuation('}')) {\r\n this.advance();\r\n }\r\n\r\n this.exitMethod('parseObjectLiteral');\r\n return new ObjectLiteral(properties);\r\n } catch (e) {\r\n this.exitMethod('parseObjectLiteral');\r\n throw e;\r\n }\r\n }\r\n parseArguments() {\r\n const args = [];\r\n\r\n while (!this.isPunctuation(')') && !this.isAtEnd()) {\r\n try {\r\n // \u2B50 KEY FIX: Use parseTernary() instead of parseLogicalOr()\r\n // This allows all operators except assignment\r\n args.push(this.parseTernary());\r\n } catch (error) {\r\n break;\r\n }\r\n\r\n if (!this.isPunctuation(',')) break;\r\n this.advance();\r\n }\r\n\r\n return args;\r\n }\r\n\r\n check(type) {\r\n if (this.isAtEnd()) return false;\r\n return this.peek().type === type;\r\n }\r\n\r\n consume(type, message = '') {\r\n if (this.check(type)) {\r\n return this.advance();\r\n }\r\n throw this.error(message || `Expected ${type}`);\r\n }\r\n\r\n consumeStatementEnd() {\r\n this.skipComments(); // \u2190 ADD THIS LINE\r\n\r\n if (this.isPunctuation(';')) {\r\n this.advance();\r\n }\r\n\r\n this.skipComments(); // \u2190 ADD THIS LINE - skip trailing comments too\r\n }\r\n\r\n advance() {\r\n if (!this.isAtEnd()) {\r\n this.current++;\r\n }\r\n return this.previous();\r\n }\r\n\r\n peek() {\r\n return this.tokens[this.current];\r\n }\r\n\r\n\r\n previous() {\r\n return this.tokens[this.current - 1];\r\n }\r\n\r\n isAtEnd() {\r\n return this.peek().type === TokenType.EOF;\r\n }\r\n\r\n getLocation() {\r\n const token = this.peek();\r\n return { line: token.line, column: token.column };\r\n }\r\n /**\r\n * Enhanced error reporting with full call stack\r\n */\r\n error(message) {\r\n const token = this.peek();\r\n const errorObj = new Error(\r\n `Parse error at line ${token.line}, column ${token.column}: ${message}`\r\n );\r\n errorObj.parserError = {\r\n message: `Parse error at line ${token.line}, column ${token.column}: ${message}`,\r\n line: token.line,\r\n column: token.column,\r\n token: { type: token.type, value: token.value },\r\n callStack: this.callStack ? [...this.callStack] : [],\r\n };\r\n return errorObj;\r\n }\r\n /**\r\n * Get context around current token (5 tokens before and after)\r\n */\r\n getContext() {\r\n const start = Math.max(0, this.current - 5);\r\n const end = Math.min(this.tokens.length, this.current + 6);\r\n\r\n return {\r\n before: this.tokens.slice(start, this.current).map(t => `${t.value}(${t.type})`).join(' '),\r\n current: `\u2192 ${this.peek().value}(${this.peek().type}) \u2190`,\r\n after: this.tokens.slice(this.current + 1, end).map(t => `${t.value}(${t.type})`).join(' '),\r\n };\r\n }\r\n /**\r\n * Track when exiting a parser method\r\n */\r\n exitMethod(methodName) {\r\n if (!this.callStack) this.callStack = [];\r\n if (this.callStack.length > 0) {\r\n const last = this.callStack[this.callStack.length - 1];\r\n if (last.method === methodName) {\r\n this.callStack.pop();\r\n }\r\n }\r\n }\r\n\r\n getTokenContext() {\r\n const start = Math.max(0, this.current - 5);\r\n const end = Math.min(this.tokens.length, this.current + 6);\r\n\r\n const before = this.tokens\r\n .slice(start, this.current)\r\n .map(t => `${t.value}`)\r\n .join(' ');\r\n\r\n const after = this.tokens\r\n .slice(this.current + 1, end)\r\n .map(t => `${t.value}`)\r\n .join(' ');\r\n\r\n return {\r\n before: before,\r\n current: `\u2192 ${this.peek().value} \u2190`,\r\n after: after,\r\n };\r\n }\r\n\r\n synchronize() {\r\n this.advance();\r\n while (!this.isAtEnd()) {\r\n if (this.isPunctuation(';')) {\r\n this.advance();\r\n return;\r\n }\r\n if (this.isKeyword('class') || this.isKeyword('function') || this.isKeyword('import')) {\r\n return;\r\n }\r\n this.advance();\r\n }\r\n }\r\n\r\n getErrors() {\r\n return this.errors;\r\n }\r\n\r\n /**\r\n * Report error with full context\r\n */\r\n reportError(error) {\r\n this.errors.push(error);\r\n\r\n if (this.debugMode) {\r\n console.error('\\n\u274C PARSER ERROR DETECTED:\\n');\r\n console.error(`Message: ${error.message}\\n`);\r\n\r\n console.error('\uD83D\uDCCD Token Context:');\r\n console.error(` Before: ${error.context.before}`);\r\n console.error(` Current: ${error.context.current}`);\r\n console.error(` After: ${error.context.after}\\n`);\r\n\r\n console.error('\uD83D\uDCDA Call Stack (where error came from):');\r\n if (error.callStack.length === 0) {\r\n console.error(' (top level)\\n');\r\n } else {\r\n error.callStack.forEach((frame, idx) => {\r\n const arrow = idx === error.callStack.length - 1 ? '\u2192' : ' ';\r\n console.error(` ${arrow} ${idx + 1}. ${frame.method}()`);\r\n console.error(` at token: \"${frame.token}\" (line ${frame.line}, col ${frame.column})`);\r\n });\r\n console.error('');\r\n }\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n Parser,\r\n Program,\r\n ImportDeclaration,\r\n ImportSpecifier,\r\n ClassDeclaration,\r\n ClassBody,\r\n FieldDeclaration,\r\n MethodDeclaration,\r\n Parameter,\r\n FunctionDeclaration,\r\n BlockStatement,\r\n ReturnStatement,\r\n ExpressionStatement,\r\n Identifier,\r\n Literal,\r\n CallExpression,\r\n NewExpression,\r\n ObjectLiteral,\r\n Property,\r\n ArrowFunctionExpression,\r\n MemberExpression,\r\n ASTNode,\r\n};"], + "mappings": "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", + "names": ["TokenType", "getLogger", "ASTNode", "type", "location", "Program", "body", "ImportDeclaration", "specifiers", "source", "ImportSpecifier", "imported", "local", "ClassDeclaration", "id", "superClass", "ClassBody", "fields", "methods", "FieldDeclaration", "key", "initialValue", "MethodDeclaration", "params", "Parameter", "name", "optional", "defaultValue", "FunctionDeclaration", "isAsync", "BlockStatement", "ReturnStatement", "argument", "ExpressionStatement", "expression", "Identifier", "Literal", "value", "raw", "CallExpression", "callee", "args", "NewExpression", "ObjectLiteral", "properties", "Property", "ArrowFunctionExpression", "MemberExpression", "object", "property", "computed", "Parser", "tokens", "options", "stmt", "error", "expr", "token", "logger", "startLocation", "importedName", "localName", "defaultName", "imported2", "local2", "modulePathToken", "n", "pos", "nameToken", "superName", "itemCount", "currentPos", "fieldName", "e", "methodName", "paramLocation", "paramName", "braceDepth", "statements", "result", "consequent", "alternate", "right", "operator", "savedPos", "nextPos", "elements", "ident", "shorthand", "prop", "message", "errorObj", "start", "end", "t", "before", "after", "frame", "idx", "arrow"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/flutterjs_report_generator.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_report_generator.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/flutterjs_report_generator.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_report_generator.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_report_generator.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_report_generator.js.map new file mode 100644 index 00000000..4b551a4f --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_report_generator.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/flutterjs_report_generator.js"], + "sourcesContent": ["/**\r\n * FlutterJS Report Generator - Enhanced Phase 3 (FIXED)\r\n * Generates JSON, Markdown, and Console reports from analysis results\r\n * \r\n * Integrates Phase 1 (Widget Analysis), Phase 2 (State Analysis),\r\n * and Phase 3 (Context + SSR Analysis)\r\n */\r\n\r\nimport { getLogger } from './flutterjs_logger.js';\r\n\r\n// ============================================================================\r\n// REPORT GENERATOR CLASS\r\n// ============================================================================\r\n\r\nclass ReportGenerator {\r\n constructor(widgetResults, stateResults, contextResults = null, ssrResults = null, options = {}) {\r\n this.widgetResults = widgetResults;\r\n this.stateResults = stateResults;\r\n this.contextResults = contextResults;\r\n this.ssrResults = ssrResults;\r\n\r\n this.options = {\r\n format: 'json',\r\n includeMetrics: true,\r\n includeTree: true,\r\n includeValidation: true,\r\n includeSuggestions: true,\r\n includeContext: true,\r\n includeSsr: true,\r\n prettyPrint: true,\r\n ...options,\r\n };\r\n\r\n // Initialize logger\r\n this.logger = getLogger().createComponentLogger('ReportGenerator');\r\n\r\n this.metadata = {};\r\n this.report = {};\r\n }\r\n\r\n /**\r\n * Main entry point - generate report\r\n */\r\n generate() {\r\n this.logger.startSession('ReportGeneration');\r\n this.logger.info('Generating report');\r\n\r\n try {\r\n this.calculateMetrics();\r\n this.buildReport();\r\n\r\n let output;\r\n switch (this.options.format) {\r\n case 'json':\r\n output = this.toJSON();\r\n break;\r\n case 'markdown':\r\n output = this.toMarkdown();\r\n break;\r\n case 'console':\r\n output = this.toConsole();\r\n break;\r\n default:\r\n output = this.toJSON();\r\n }\r\n\r\n this.logger.success('Report generation complete');\r\n this.logger.endSession('ReportGeneration');\r\n return output;\r\n } catch (error) {\r\n this.logger.failure('Report generation failed', error.message);\r\n this.logger.endSession('ReportGeneration');\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Calculate metrics from analysis results\r\n */\r\n calculateMetrics() {\r\n const widgets = this.widgetResults.widgets || [];\r\n const functions = this.widgetResults.functions || [];\r\n const imports = this.widgetResults.imports || [];\r\n const stateClasses = this.stateResults.stateClasses || [];\r\n const stateFields = this.stateResults.stateFields || [];\r\n const setStateCalls = this.stateResults.setStateCalls || [];\r\n const lifecycleMethods = this.stateResults.lifecycleMethods || [];\r\n const eventHandlers = this.stateResults.eventHandlers || [];\r\n\r\n // Phase 3: Context metrics\r\n const inheritedWidgets = this.contextResults?.inheritedWidgets || [];\r\n const changeNotifiers = this.contextResults?.changeNotifiers || [];\r\n const providers = this.contextResults?.providers || [];\r\n const contextAccessPoints = this.contextResults?.contextAccessPoints || [];\r\n\r\n // Phase 3: SSR metrics\r\n const ssrScore = this.ssrResults?.ssrCompatibilityScore || 0;\r\n const ssrSafePatterns = this.ssrResults?.ssrSafePatterns || [];\r\n const ssrUnsafePatterns = this.ssrResults?.ssrUnsafePatterns || [];\r\n const hydrationRequirements = this.ssrResults?.hydrationRequirements || [];\r\n\r\n this.metadata = {\r\n // Widget metrics (Phase 1)\r\n totalWidgets: widgets.length,\r\n statelessWidgets: widgets.filter((w) => w.type === 'stateless').length,\r\n statefulWidgets: widgets.filter((w) => w.type === 'stateful').length,\r\n componentWidgets: widgets.filter((w) => w.type === 'component').length,\r\n stateClasses: stateClasses.length,\r\n\r\n // State metrics (Phase 2)\r\n totalStateFields: stateFields.length,\r\n setStateCallCount: setStateCalls.length,\r\n lifecycleMethodCount: lifecycleMethods.length,\r\n eventHandlerCount: eventHandlers.length,\r\n\r\n // Context metrics (Phase 3)\r\n inheritedWidgets: inheritedWidgets.length,\r\n changeNotifiers: changeNotifiers.length,\r\n providers: providers.length,\r\n contextAccessPoints: contextAccessPoints.length,\r\n\r\n // SSR metrics (Phase 3)\r\n ssrCompatibilityScore: ssrScore,\r\n ssrCompatibility: this.ssrResults?.overallCompatibility || 'unknown',\r\n ssrSafePatterns: ssrSafePatterns.length,\r\n ssrUnsafePatterns: ssrUnsafePatterns.length,\r\n hydrationRequired: hydrationRequirements.length > 0,\r\n hydrationCount: hydrationRequirements.length,\r\n\r\n // Function metrics\r\n totalFunctions: functions.length,\r\n entryPoint: this.widgetResults.entryPoint,\r\n rootWidget: this.widgetResults.rootWidget,\r\n\r\n // Import metrics\r\n totalImports: imports.length,\r\n externalPackages: new Set(imports.map((imp) => imp.source)).size,\r\n\r\n // Widget tree metrics\r\n treeDepth: this.calculateTreeDepth(this.widgetResults.widgetTree),\r\n\r\n // Validation metrics\r\n errorCount: this.countValidationIssues(this.stateResults.validationResults, 'error'),\r\n warningCount: this.countValidationIssues(this.stateResults.validationResults, 'warning'),\r\n infoCount: this.countValidationIssues(this.stateResults.validationResults, 'info'),\r\n };\r\n\r\n // Calculate scores\r\n this.metadata.healthScore = this.calculateHealthScore();\r\n this.metadata.complexityScore = this.calculateComplexityScore();\r\n }\r\n\r\n /**\r\n * Calculate tree depth\r\n */\r\n calculateTreeDepth(node, depth = 1) {\r\n if (!node || !node.children || node.children.length === 0) {\r\n return depth;\r\n }\r\n return 1 + Math.max(...node.children.map((child) => this.calculateTreeDepth(child, depth + 1)));\r\n }\r\n\r\n /**\r\n * Count validation issues by severity\r\n */\r\n countValidationIssues(results, severity) {\r\n if (!results) return 0;\r\n return results.filter((r) => r.severity === severity).length;\r\n }\r\n\r\n /**\r\n * Calculate health score (0-100)\r\n */\r\n calculateHealthScore() {\r\n let score = 100;\r\n\r\n score -= this.metadata.errorCount * 10;\r\n score -= this.metadata.warningCount * 2;\r\n\r\n if (this.metadata.entryPoint) {\r\n score += 5;\r\n }\r\n\r\n if (this.metadata.statefulWidgets > this.metadata.statelessWidgets) {\r\n score -= 10;\r\n }\r\n\r\n if (this.metadata.treeDepth > 5) {\r\n score -= 5;\r\n }\r\n\r\n if (this.metadata.ssrCompatibilityScore < 50) {\r\n score -= 15;\r\n }\r\n\r\n return Math.max(0, Math.min(100, score));\r\n }\r\n\r\n /**\r\n * Calculate complexity score (0-100)\r\n */\r\n calculateComplexityScore() {\r\n let score = 0;\r\n\r\n score += Math.min(this.metadata.totalStateFields * 10, 40);\r\n score += Math.min(this.metadata.setStateCallCount * 5, 30);\r\n score += Math.min(this.metadata.eventHandlerCount * 2, 20);\r\n\r\n if (this.metadata.treeDepth > 5) {\r\n score += 10;\r\n }\r\n\r\n score += Math.min(this.metadata.contextAccessPoints * 3, 15);\r\n\r\n return Math.min(100, score);\r\n }\r\n\r\n /**\r\n * Build comprehensive report object\r\n */\r\n buildReport() {\r\n const widgets = this.widgetResults.widgets || [];\r\n const stateClasses = this.stateResults.stateClasses || [];\r\n const validationResults = this.stateResults.validationResults || [];\r\n\r\n this.report = {\r\n analysis: {\r\n file: this.widgetResults.file || 'analysis',\r\n timestamp: new Date().toISOString(),\r\n status: validationResults.some((r) => r.severity === 'error') ? 'warning' : 'success',\r\n phase: 'phase1+phase2+phase3',\r\n },\r\n\r\n summary: {\r\n widgets: {\r\n total: this.metadata.totalWidgets,\r\n stateless: this.metadata.statelessWidgets,\r\n stateful: this.metadata.statefulWidgets,\r\n components: this.metadata.componentWidgets,\r\n },\r\n state: {\r\n stateClasses: this.metadata.stateClasses,\r\n stateFields: this.metadata.totalStateFields,\r\n setStateCalls: this.metadata.setStateCallCount,\r\n lifecycleMethods: this.metadata.lifecycleMethodCount,\r\n eventHandlers: this.metadata.eventHandlerCount,\r\n },\r\n context: this.options.includeContext ? {\r\n inheritedWidgets: this.metadata.inheritedWidgets,\r\n changeNotifiers: this.metadata.changeNotifiers,\r\n providers: this.metadata.providers,\r\n contextAccessPoints: this.metadata.contextAccessPoints,\r\n } : null,\r\n ssr: this.options.includeSsr ? {\r\n compatibility: this.metadata.ssrCompatibility,\r\n compatibilityScore: this.metadata.ssrCompatibilityScore,\r\n safePatterns: this.metadata.ssrSafePatterns,\r\n unsafePatterns: this.metadata.ssrUnsafePatterns,\r\n hydrationRequired: this.metadata.hydrationRequired,\r\n hydrationCount: this.metadata.hydrationCount,\r\n } : null,\r\n functions: this.metadata.totalFunctions,\r\n imports: this.metadata.totalImports,\r\n externalPackages: this.metadata.externalPackages,\r\n entryPoint: this.metadata.entryPoint,\r\n rootWidget: this.metadata.rootWidget,\r\n treeDepth: this.metadata.treeDepth,\r\n healthScore: this.metadata.healthScore,\r\n complexityScore: this.metadata.complexityScore,\r\n },\r\n\r\n widgets: this.formatWidgets(),\r\n stateClasses: this.formatStateClasses(),\r\n imports: this.formatImports(),\r\n functions: this.formatFunctions(),\r\n\r\n context: this.options.includeContext ? this.formatContext() : null,\r\n ssr: this.options.includeSsr ? this.formatSsr() : null,\r\n\r\n widgetTree: this.options.includeTree ? this.formatWidgetTree() : null,\r\n dependencyGraph: this.formatDependencyGraph(),\r\n validation: this.options.includeValidation ? this.formatValidation() : null,\r\n suggestions: this.options.includeSuggestions ? this.generateSuggestions() : null,\r\n\r\n metrics: this.options.includeMetrics ? this.getDetailedMetrics() : null,\r\n };\r\n }\r\n\r\n /**\r\n * Phase 3: Format context analysis results\r\n */\r\n formatContext() {\r\n if (!this.contextResults) {\r\n return {\r\n inheritedWidgets: [],\r\n changeNotifiers: [],\r\n providers: [],\r\n contextFlow: {},\r\n };\r\n }\r\n\r\n return {\r\n inheritedWidgets: this.contextResults.inheritedWidgets?.map((widget) => ({\r\n name: widget.name,\r\n properties: widget.properties,\r\n staticAccessors: widget.staticAccessors?.map((a) => a.name),\r\n updateShouldNotifyImplemented: widget.updateShouldNotifyImplemented,\r\n usedIn: widget.usedIn,\r\n usageCount: widget.usageCount,\r\n })) || [],\r\n\r\n changeNotifiers: this.contextResults.changeNotifiers?.map((notifier) => ({\r\n name: notifier.name,\r\n properties: notifier.properties?.length || 0,\r\n getters: notifier.getters?.map((g) => g.name) || [],\r\n methods: notifier.methods?.map((m) => ({\r\n name: m.name,\r\n callsNotifyListeners: m.callsNotifyListeners,\r\n mutations: m.mutations,\r\n })) || [],\r\n consumers: notifier.consumers || [],\r\n })) || [],\r\n\r\n providers: this.contextResults.providers?.map((provider) => ({\r\n type: provider.providerType,\r\n valueType: provider.valueType,\r\n consumers: provider.consumers || [],\r\n accessPatterns: provider.accessPatterns || [],\r\n })) || [],\r\n\r\n contextFlow: {\r\n inheritedWidgetGraph: this.contextResults.inheritedWidgetGraph || {},\r\n providerGraph: this.contextResults.providerGraph || {},\r\n },\r\n\r\n contextAccessPoints: this.contextResults.contextAccessPoints?.map((usage) => ({\r\n pattern: usage.pattern,\r\n type: usage.type,\r\n location: usage.location,\r\n ssrSafe: usage.ssrSafe,\r\n reason: usage.reason,\r\n })) || [],\r\n };\r\n }\r\n\r\n /**\r\n * Phase 3: Format SSR analysis results\r\n */\r\n formatSsr() {\r\n if (!this.ssrResults) {\r\n return {\r\n compatibility: 'unknown',\r\n score: 0,\r\n patterns: { safe: [], unsafe: [] },\r\n hydration: [],\r\n migration: [],\r\n };\r\n }\r\n\r\n return {\r\n overallCompatibility: this.ssrResults.overallCompatibility,\r\n compatibilityScore: this.ssrResults.ssrCompatibilityScore,\r\n readinessScore: this.ssrResults.ssrReadinessScore || this.ssrResults.ssrCompatibilityScore,\r\n estimatedEffort: this.ssrResults.estimatedEffort,\r\n\r\n patterns: {\r\n safe: this.ssrResults.ssrSafePatterns?.map((p) => ({\r\n pattern: p.pattern,\r\n example: p.example,\r\n why: p.why,\r\n confidence: p.confidence,\r\n })) || [],\r\n\r\n unsafe: this.ssrResults.ssrUnsafePatterns?.map((p) => ({\r\n pattern: p.pattern,\r\n example: p.example,\r\n why: p.why,\r\n severity: p.severity,\r\n suggestion: p.suggestion,\r\n location: p.location,\r\n })) || [],\r\n },\r\n\r\n hydration: {\r\n required: this.ssrResults.hydrationCount > 0,\r\n count: this.ssrResults.hydrationCount,\r\n requirements: this.ssrResults.hydrationRequirements?.map((r) => ({\r\n dependency: r.dependency,\r\n reason: r.reason,\r\n order: r.order,\r\n requiredProviders: r.requiredProviders,\r\n requiredState: r.requiredState,\r\n })) || [],\r\n },\r\n\r\n lazyLoadingOpportunities: this.ssrResults.lazyLoadOpportunities?.map((opp) => ({\r\n target: opp.target,\r\n reason: opp.reason,\r\n estimatedSize: opp.estimatedSize,\r\n priority: opp.priority,\r\n recommendation: opp.recommendation,\r\n })) || [],\r\n\r\n migrationPath: this.ssrResults.ssrMigrationPath?.map((step) => ({\r\n step: step.step,\r\n action: step.action,\r\n description: step.description,\r\n example: step.example,\r\n effort: step.effort,\r\n priority: step.priority,\r\n locations: step.locations,\r\n })) || [],\r\n\r\n validationIssues: {\r\n critical: this.ssrResults.criticalIssues?.map((i) => ({\r\n type: i.type,\r\n message: i.message,\r\n suggestion: i.suggestion,\r\n location: i.location,\r\n })) || [],\r\n\r\n warnings: this.ssrResults.warningIssues?.map((i) => ({\r\n type: i.type,\r\n message: i.message,\r\n suggestion: i.suggestion,\r\n })) || [],\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Format widgets for report\r\n */\r\n formatWidgets() {\r\n const widgets = {};\r\n\r\n (this.widgetResults.widgets || []).forEach((widget) => {\r\n widgets[widget.name] = {\r\n type: widget.type,\r\n superClass: widget.superClass || null,\r\n location: widget.location,\r\n constructor: widget.constructor\r\n ? {\r\n params: widget.constructor.params || [],\r\n }\r\n : null,\r\n methods: widget.methods.map((m) => ({\r\n name: m.name,\r\n params: m.params || [],\r\n })),\r\n properties: widget.properties || [],\r\n linkedStateClass: widget.linkedStateClass || null,\r\n imports: widget.imports || [],\r\n };\r\n });\r\n\r\n return widgets;\r\n }\r\n\r\n /**\r\n * FIXED: Format state classes for report\r\n * Properly handle StateField objects which may or may not have isUsed method\r\n */\r\n formatStateClasses() {\r\n const stateClasses = {};\r\n\r\n (this.stateResults.stateClasses || []).forEach((sc) => {\r\n const metadata = sc.metadata || sc; // Handle both wrapped and unwrapped formats\r\n \r\n stateClasses[metadata.name] = {\r\n name: metadata.name,\r\n linkedStatefulWidget: metadata.linkedStatefulWidget,\r\n location: metadata.location,\r\n\r\n stateFields: (metadata.stateFields || []).map((field) => {\r\n // FIXED: Check if isUsed is a function before calling it\r\n const isUsed = typeof field.isUsed === 'function' \r\n ? field.isUsed() \r\n : (field.usedInMethods && field.usedInMethods.length > 0);\r\n\r\n return {\r\n name: field.name,\r\n type: field.type || 'any',\r\n initialValue: field.initialValueString || field.initialValue?.toString() || 'undefined',\r\n isUsed: isUsed,\r\n usedInMethods: field.usedInMethods || [],\r\n mutatedInMethods: field.mutatedInMethods || [],\r\n mutationCount: (field.mutations && field.mutations.length) || 0,\r\n };\r\n }),\r\n\r\n lifecycleMethods: (metadata.lifecycleMethods || []).map((lc) => {\r\n // FIXED: Check if isValid is a function\r\n const isValid = typeof lc.isValid === 'function' \r\n ? lc.isValid() \r\n : true;\r\n\r\n return {\r\n name: lc.name,\r\n callsSuper: lc.callsSuper || false,\r\n hasSideEffects: lc.hasSideEffects || false,\r\n isValid: isValid,\r\n issues: lc.validationIssues || [],\r\n };\r\n }),\r\n\r\n otherMethods: (metadata.otherMethods || []).map((m) => ({\r\n name: m.name,\r\n params: m.params || [],\r\n })),\r\n };\r\n });\r\n\r\n return stateClasses;\r\n }\r\n\r\n /**\r\n * Format imports for report\r\n */\r\n formatImports() {\r\n const imports = {};\r\n\r\n (this.widgetResults.imports || []).forEach((imp) => {\r\n imports[imp.source] = imp.items || [];\r\n });\r\n\r\n return imports;\r\n }\r\n\r\n /**\r\n * Format functions for report\r\n */\r\n formatFunctions() {\r\n const functions = {};\r\n\r\n (this.widgetResults.functions || []).forEach((func) => {\r\n functions[func.name] = {\r\n type: func.type,\r\n location: func.location,\r\n params: (func.params || []).map((p) => ({\r\n name: p.name,\r\n optional: p.optional,\r\n })),\r\n isEntryPoint: func.isEntryPoint || false,\r\n };\r\n });\r\n\r\n return functions;\r\n }\r\n\r\n /**\r\n * Format widget tree for report\r\n */\r\n formatWidgetTree() {\r\n if (!this.widgetResults.widgetTree) {\r\n return null;\r\n }\r\n\r\n return this.treeNodeToObject(this.widgetResults.widgetTree);\r\n }\r\n\r\n /**\r\n * Convert tree node to object recursively\r\n */\r\n treeNodeToObject(node) {\r\n if (!node) return null;\r\n\r\n return {\r\n name: node.widget?.name || 'Unknown',\r\n type: node.widget?.type || 'unknown',\r\n depth: node.depth || 0,\r\n children: (node.children || []).map((child) => this.treeNodeToObject(child)),\r\n };\r\n }\r\n\r\n /**\r\n * Format dependency graph for report\r\n */\r\n formatDependencyGraph() {\r\n const graph = this.stateResults.dependencyGraph;\r\n if (!graph) return null;\r\n\r\n return {\r\n stateToMethods: Object.fromEntries(graph.stateToMethods || []),\r\n methodToState: Object.fromEntries(graph.methodToState || []),\r\n eventToState: Object.fromEntries(graph.eventToState || []),\r\n };\r\n }\r\n\r\n /**\r\n * Format validation results for report\r\n */\r\n formatValidation() {\r\n const results = this.stateResults.validationResults || [];\r\n\r\n return {\r\n totalIssues: results.length,\r\n errors: results.filter((r) => r.severity === 'error'),\r\n warnings: results.filter((r) => r.severity === 'warning'),\r\n info: results.filter((r) => r.severity === 'info'),\r\n };\r\n }\r\n\r\n /**\r\n * Generate suggestions based on analysis\r\n */\r\n generateSuggestions() {\r\n const suggestions = [];\r\n\r\n // Phase 1 & 2 Suggestions\r\n if (this.metadata.statefulWidgets > this.metadata.statelessWidgets) {\r\n suggestions.push({\r\n type: 'structure',\r\n severity: 'info',\r\n message: 'More stateful than stateless widgets',\r\n suggestion: 'Consider using stateless widgets where possible for better performance',\r\n });\r\n }\r\n\r\n if (this.metadata.treeDepth > 5) {\r\n suggestions.push({\r\n type: 'structure',\r\n severity: 'warning',\r\n message: 'Deep widget tree detected',\r\n suggestion: 'Consider refactoring to reduce nesting depth (aim for < 5 levels)',\r\n });\r\n }\r\n\r\n // Phase 3: SSR Suggestions\r\n if (this.options.includeSsr && this.ssrResults) {\r\n if (this.metadata.ssrCompatibilityScore < 50) {\r\n suggestions.push({\r\n type: 'ssr-compatibility',\r\n severity: 'warning',\r\n message: `Low SSR compatibility score (${this.metadata.ssrCompatibilityScore}/100)`,\r\n suggestion: `Follow the ${this.ssrResults.ssrMigrationPath?.length || 0} migration steps to improve SSR support`,\r\n migrationSteps: this.ssrResults.ssrMigrationPath?.length || 0,\r\n });\r\n }\r\n\r\n if (this.metadata.ssrUnsafePatterns > 5) {\r\n suggestions.push({\r\n type: 'ssr-patterns',\r\n severity: 'warning',\r\n message: `Found ${this.metadata.ssrUnsafePatterns} SSR-unsafe patterns`,\r\n suggestion: 'Refactor unsafe patterns to enable server-side rendering',\r\n unsafePatterns: this.metadata.ssrUnsafePatterns,\r\n });\r\n }\r\n\r\n if (this.metadata.hydrationRequired) {\r\n suggestions.push({\r\n type: 'hydration',\r\n severity: 'info',\r\n message: `App requires hydration for ${this.metadata.hydrationCount} dependencies`,\r\n suggestion: 'Implement hydration layer to re-attach listeners after server render',\r\n hydrationDependencies: this.metadata.hydrationCount,\r\n });\r\n }\r\n\r\n if (this.ssrResults.lazyLoadOpportunities?.length > 0) {\r\n suggestions.push({\r\n type: 'optimization',\r\n severity: 'info',\r\n message: `Found ${this.ssrResults.lazyLoadOpportunities.length} lazy-load opportunities`,\r\n suggestion: 'Implement code splitting to reduce initial bundle size',\r\n opportunities: this.ssrResults.lazyLoadOpportunities.length,\r\n });\r\n }\r\n }\r\n\r\n // Phase 3: Context Suggestions\r\n if (this.options.includeContext && this.contextResults) {\r\n if (this.metadata.inheritedWidgets > 3) {\r\n suggestions.push({\r\n type: 'context-hierarchy',\r\n severity: 'info',\r\n message: `Multiple InheritedWidgets detected (${this.metadata.inheritedWidgets})`,\r\n suggestion: 'Consider consolidating context providers to reduce nesting',\r\n inheritedWidgets: this.metadata.inheritedWidgets,\r\n });\r\n }\r\n\r\n if (this.metadata.providers > 0) {\r\n suggestions.push({\r\n type: 'state-management',\r\n severity: 'info',\r\n message: `Using Provider pattern (${this.metadata.providers} providers)`,\r\n suggestion: 'Ensure providers are properly organized and lazy-initialized where possible',\r\n providers: this.metadata.providers,\r\n });\r\n }\r\n }\r\n\r\n return suggestions;\r\n }\r\n\r\n /**\r\n * Get detailed metrics\r\n */\r\n getDetailedMetrics() {\r\n return {\r\n widgetMetrics: {\r\n total: this.metadata.totalWidgets,\r\n byType: {\r\n stateless: this.metadata.statelessWidgets,\r\n stateful: this.metadata.statefulWidgets,\r\n component: this.metadata.componentWidgets,\r\n state: this.metadata.stateClasses,\r\n },\r\n },\r\n\r\n stateMetrics: {\r\n stateClasses: this.metadata.stateClasses,\r\n totalFields: this.metadata.totalStateFields,\r\n setStateCalls: this.metadata.setStateCallCount,\r\n lifecycleMethods: this.metadata.lifecycleMethodCount,\r\n eventHandlers: this.metadata.eventHandlerCount,\r\n },\r\n\r\n contextMetrics: this.options.includeContext ? {\r\n inheritedWidgets: this.metadata.inheritedWidgets,\r\n changeNotifiers: this.metadata.changeNotifiers,\r\n providers: this.metadata.providers,\r\n contextAccessPoints: this.metadata.contextAccessPoints,\r\n } : null,\r\n\r\n ssrMetrics: this.options.includeSsr ? {\r\n compatibilityScore: this.metadata.ssrCompatibilityScore,\r\n compatibility: this.metadata.ssrCompatibility,\r\n safePatterns: this.metadata.ssrSafePatterns,\r\n unsafePatterns: this.metadata.ssrUnsafePatterns,\r\n hydrationRequired: this.metadata.hydrationRequired,\r\n hydrationCount: this.metadata.hydrationCount,\r\n } : null,\r\n\r\n functionMetrics: {\r\n total: this.metadata.totalFunctions,\r\n entryPoint: this.metadata.entryPoint || 'none',\r\n },\r\n\r\n dependencyMetrics: {\r\n totalImports: this.metadata.totalImports,\r\n externalPackages: this.metadata.externalPackages,\r\n },\r\n\r\n structureMetrics: {\r\n widgetTreeDepth: this.metadata.treeDepth,\r\n rootWidget: this.metadata.rootWidget || 'none',\r\n },\r\n\r\n healthMetrics: {\r\n healthScore: this.metadata.healthScore,\r\n complexityScore: this.metadata.complexityScore,\r\n errors: this.metadata.errorCount,\r\n warnings: this.metadata.warningCount,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Generate JSON report\r\n */\r\n toJSON() {\r\n if (this.options.prettyPrint) {\r\n return JSON.stringify(this.report, null, 2);\r\n } else {\r\n return JSON.stringify(this.report);\r\n }\r\n }\r\n\r\n /**\r\n * Generate Markdown report\r\n */\r\n toMarkdown() {\r\n let md = '# FlutterJS Code Analysis Report (Phase 1 + 2 + 3)\\n\\n';\r\n\r\n md += `**Generated:** ${new Date().toISOString()}\\n\\n`;\r\n\r\n // Summary Table\r\n md += '## Summary\\n\\n';\r\n md += `| Metric | Count |\\n`;\r\n md += `|--------|-------|\\n`;\r\n md += `| Total Widgets | ${this.metadata.totalWidgets} |\\n`;\r\n md += `| Stateless | ${this.metadata.statelessWidgets} |\\n`;\r\n md += `| Stateful | ${this.metadata.statefulWidgets} |\\n`;\r\n md += `| State Classes | ${this.metadata.stateClasses} |\\n`;\r\n md += `| State Fields | ${this.metadata.totalStateFields} |\\n`;\r\n md += `| Health Score | ${this.metadata.healthScore}/100 |\\n`;\r\n md += `| Complexity Score | ${this.metadata.complexityScore}/100 |\\n`;\r\n\r\n if (this.options.includeContext) {\r\n md += `| InheritedWidgets | ${this.metadata.inheritedWidgets} |\\n`;\r\n md += `| ChangeNotifiers | ${this.metadata.changeNotifiers} |\\n`;\r\n md += `| Providers | ${this.metadata.providers} |\\n`;\r\n }\r\n\r\n if (this.options.includeSsr) {\r\n md += `| SSR Compatibility | ${this.metadata.ssrCompatibility} |\\n`;\r\n md += `| SSR Score | ${this.metadata.ssrCompatibilityScore}/100 |\\n`;\r\n md += `| Hydration Required | ${this.metadata.hydrationRequired ? 'Yes' : 'No'} |\\n`;\r\n }\r\n\r\n md += '\\n';\r\n\r\n // Context Section\r\n if (this.options.includeContext && this.contextResults) {\r\n md += '## Context Analysis (Phase 3)\\n\\n';\r\n\r\n if (this.metadata.inheritedWidgets > 0) {\r\n md += '### InheritedWidgets\\n\\n';\r\n (this.contextResults.inheritedWidgets || []).forEach((widget) => {\r\n md += `- **${widget.name}**\\n`;\r\n if (widget.properties && widget.properties.length > 0) {\r\n md += ` - Properties: ${widget.properties.map((p) => p.name).join(', ')}\\n`;\r\n }\r\n if (widget.usedIn && widget.usedIn.length > 0) {\r\n md += ` - Used in: ${widget.usedIn.join(', ')}\\n`;\r\n }\r\n });\r\n md += '\\n';\r\n }\r\n\r\n if (this.metadata.changeNotifiers > 0) {\r\n md += '### ChangeNotifiers\\n\\n';\r\n (this.contextResults.changeNotifiers || []).forEach((notifier) => {\r\n md += `- **${notifier.name}**\\n`;\r\n if (notifier.consumers && notifier.consumers.length > 0) {\r\n md += ` - Consumed by: ${notifier.consumers.join(', ')}\\n`;\r\n }\r\n });\r\n md += '\\n';\r\n }\r\n }\r\n\r\n // SSR Section\r\n if (this.options.includeSsr && this.ssrResults) {\r\n md += '## SSR Compatibility Analysis (Phase 3)\\n\\n';\r\n md += `**Overall Compatibility:** ${this.metadata.ssrCompatibility}\\n`;\r\n md += `**Score:** ${this.metadata.ssrCompatibilityScore}/100\\n`;\r\n md += `**Effort to fix:** ${this.ssrResults.estimatedEffort}\\n\\n`;\r\n\r\n if (this.metadata.ssrUnsafePatterns > 0) {\r\n md += `### Unsafe Patterns (${this.metadata.ssrUnsafePatterns})\\n\\n`;\r\n (this.ssrResults.ssrUnsafePatterns || []).slice(0, 10).forEach((pattern) => {\r\n md += `- **${pattern.pattern}**: ${pattern.why}\\n`;\r\n });\r\n if (this.metadata.ssrUnsafePatterns > 10) {\r\n md += `- ... and ${this.metadata.ssrUnsafePatterns - 10} more\\n`;\r\n }\r\n md += '\\n';\r\n }\r\n\r\n if (this.ssrResults.hydrationCount > 0) {\r\n md += `### Hydration Requirements (${this.ssrResults.hydrationCount})\\n\\n`;\r\n (this.ssrResults.hydrationRequirements || []).forEach((req) => {\r\n md += `- **${req.dependency}**: ${req.reason}\\n`;\r\n });\r\n md += '\\n';\r\n }\r\n\r\n if (this.ssrResults.ssrMigrationPath && this.ssrResults.ssrMigrationPath.length > 0) {\r\n md += `### Migration Path (${this.ssrResults.ssrMigrationPath.length} steps)\\n\\n`;\r\n (this.ssrResults.ssrMigrationPath || []).forEach((step) => {\r\n md += `**Step ${step.step}: ${step.action}**\\n`;\r\n if (step.description) {\r\n md += `${step.description}\\n`;\r\n }\r\n if (step.effort) {\r\n md += `- Effort: ${step.effort}\\n`;\r\n }\r\n md += '\\n';\r\n });\r\n }\r\n }\r\n\r\n md += '\\n';\r\n\r\n // Suggestions\r\n if (this.options.includeSuggestions) {\r\n const suggestions = this.generateSuggestions();\r\n if (suggestions.length > 0) {\r\n md += '## Suggestions\\n\\n';\r\n suggestions.forEach((sug) => {\r\n md += `- **${sug.message}**: ${sug.suggestion}\\n`;\r\n });\r\n md += '\\n';\r\n }\r\n }\r\n\r\n return md;\r\n }\r\n\r\n /**\r\n * Generate Console report\r\n */\r\n toConsole() {\r\n const lines = [];\r\n\r\n lines.push('\\n' + '='.repeat(80));\r\n lines.push('FlutterJS CODE ANALYSIS REPORT (Phase 1 + 2 + 3)');\r\n lines.push('='.repeat(80) + '\\n');\r\n\r\n // Summary\r\n lines.push('SUMMARY');\r\n lines.push('-'.repeat(80));\r\n lines.push(` Widgets: ${this.metadata.totalWidgets} (${this.metadata.statelessWidgets} stateless, ${this.metadata.statefulWidgets} stateful)`);\r\n lines.push(` State Classes: ${this.metadata.stateClasses}`);\r\n lines.push(` State Fields: ${this.metadata.totalStateFields}`);\r\n lines.push(` Health Score: ${this.metadata.healthScore}/100`);\r\n lines.push(` Complexity: ${this.metadata.complexityScore}/100`);\r\n\r\n if (this.options.includeContext) {\r\n lines.push(` InheritedWidgets: ${this.metadata.inheritedWidgets}`);\r\n lines.push(` ChangeNotifiers: ${this.metadata.changeNotifiers}`);\r\n lines.push(` Providers: ${this.metadata.providers}`);\r\n }\r\n\r\n if (this.options.includeSsr) {\r\n lines.push(` SSR Compatibility: ${this.metadata.ssrCompatibility}`);\r\n lines.push(` SSR Score: ${this.metadata.ssrCompatibilityScore}/100`);\r\n lines.push(` Migration Steps: ${this.ssrResults?.ssrMigrationPath?.length || 0}`);\r\n }\r\n\r\n lines.push('');\r\n\r\n // Context Section\r\n if (this.options.includeContext && this.contextResults && this.metadata.inheritedWidgets > 0) {\r\n lines.push('CONTEXT ANALYSIS (Phase 3)');\r\n lines.push('-'.repeat(80));\r\n\r\n if (this.metadata.inheritedWidgets > 0) {\r\n lines.push(' InheritedWidgets:');\r\n (this.contextResults.inheritedWidgets || []).forEach((widget) => {\r\n lines.push(` - ${widget.name}`);\r\n if (widget.usedIn && widget.usedIn.length > 0) {\r\n lines.push(` Used in: ${widget.usedIn.join(', ')}`);\r\n }\r\n });\r\n }\r\n\r\n if (this.metadata.changeNotifiers > 0) {\r\n lines.push(' ChangeNotifiers:');\r\n (this.contextResults.changeNotifiers || []).forEach((notifier) => {\r\n lines.push(` - ${notifier.name}`);\r\n if (notifier.consumers && notifier.consumers.length > 0) {\r\n lines.push(` Consumers: ${notifier.consumers.join(', ')}`);\r\n }\r\n });\r\n }\r\n\r\n lines.push('');\r\n }\r\n\r\n // SSR Section\r\n if (this.options.includeSsr && this.ssrResults) {\r\n lines.push('SSR COMPATIBILITY ANALYSIS (Phase 3)');\r\n lines.push('-'.repeat(80));\r\n lines.push(` Overall: ${this.metadata.ssrCompatibility} (${this.metadata.ssrCompatibilityScore}/100)`);\r\n lines.push(` Safe Patterns: ${this.metadata.ssrSafePatterns}`);\r\n lines.push(` Unsafe Patterns: ${this.metadata.ssrUnsafePatterns}`);\r\n\r\n if (this.ssrResults.hydrationCount > 0) {\r\n lines.push(` Hydration Required: Yes (${this.ssrResults.hydrationCount} dependencies)`);\r\n }\r\n\r\n if (this.ssrResults.ssrMigrationPath && this.ssrResults.ssrMigrationPath.length > 0) {\r\n lines.push(` Migration Steps: ${this.ssrResults.ssrMigrationPath.length}`);\r\n lines.push(` Estimated Effort: ${this.ssrResults.estimatedEffort}`);\r\n }\r\n\r\n lines.push('');\r\n }\r\n\r\n // Validation\r\n if (this.stateResults && this.stateResults.validationResults && this.stateResults.validationResults.length > 0) {\r\n lines.push('VALIDATION ISSUES');\r\n lines.push('-'.repeat(80));\r\n (this.stateResults.validationResults || []).forEach((result) => {\r\n const icon = result.severity === 'error' ? '\u274C' : result.severity === 'warning' ? '\u26A0\uFE0F ' : '\u2139\uFE0F ';\r\n lines.push(` ${icon} [${result.severity.toUpperCase()}] ${result.message}`);\r\n if (result.suggestion) {\r\n lines.push(` \u2192 ${result.suggestion}`);\r\n }\r\n });\r\n lines.push('');\r\n }\r\n\r\n lines.push('='.repeat(80) + '\\n');\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n /**\r\n * Save report to file\r\n */\r\n saveToFile(filePath, fs) {\r\n const content = this.generate();\r\n fs.writeFileSync(filePath, content, 'utf-8');\r\n return filePath;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport { ReportGenerator };"], + "mappings": "AAQA,OAAS,aAAAA,MAAiB,wBAM1B,MAAMC,CAAgB,CACpB,YAAYC,EAAeC,EAAcC,EAAiB,KAAMC,EAAa,KAAMC,EAAU,CAAC,EAAG,CAC/F,KAAK,cAAgBJ,EACrB,KAAK,aAAeC,EACpB,KAAK,eAAiBC,EACtB,KAAK,WAAaC,EAElB,KAAK,QAAU,CACb,OAAQ,OACR,eAAgB,GAChB,YAAa,GACb,kBAAmB,GACnB,mBAAoB,GACpB,eAAgB,GAChB,WAAY,GACZ,YAAa,GACb,GAAGC,CACL,EAGA,KAAK,OAASN,EAAU,EAAE,sBAAsB,iBAAiB,EAEjE,KAAK,SAAW,CAAC,EACjB,KAAK,OAAS,CAAC,CACjB,CAKA,UAAW,CACT,KAAK,OAAO,aAAa,kBAAkB,EAC3C,KAAK,OAAO,KAAK,mBAAmB,EAEpC,GAAI,CACF,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAEjB,IAAIO,EACJ,OAAQ,KAAK,QAAQ,OAAQ,CAC3B,IAAK,OACHA,EAAS,KAAK,OAAO,EACrB,MACF,IAAK,WACHA,EAAS,KAAK,WAAW,EACzB,MACF,IAAK,UACHA,EAAS,KAAK,UAAU,EACxB,MACF,QACEA,EAAS,KAAK,OAAO,CACzB,CAEA,YAAK,OAAO,QAAQ,4BAA4B,EAChD,KAAK,OAAO,WAAW,kBAAkB,EAClCA,CACT,OAASC,EAAO,CACd,WAAK,OAAO,QAAQ,2BAA4BA,EAAM,OAAO,EAC7D,KAAK,OAAO,WAAW,kBAAkB,EACnCA,CACR,CACF,CAKA,kBAAmB,CACjB,MAAMC,EAAU,KAAK,cAAc,SAAW,CAAC,EACzCC,EAAY,KAAK,cAAc,WAAa,CAAC,EAC7CC,EAAU,KAAK,cAAc,SAAW,CAAC,EACzCC,EAAe,KAAK,aAAa,cAAgB,CAAC,EAClDC,EAAc,KAAK,aAAa,aAAe,CAAC,EAChDC,EAAgB,KAAK,aAAa,eAAiB,CAAC,EACpDC,EAAmB,KAAK,aAAa,kBAAoB,CAAC,EAC1DC,EAAgB,KAAK,aAAa,eAAiB,CAAC,EAGpDC,EAAmB,KAAK,gBAAgB,kBAAoB,CAAC,EAC7DC,EAAkB,KAAK,gBAAgB,iBAAmB,CAAC,EAC3DC,EAAY,KAAK,gBAAgB,WAAa,CAAC,EAC/CC,EAAsB,KAAK,gBAAgB,qBAAuB,CAAC,EAGnEC,EAAW,KAAK,YAAY,uBAAyB,EACrDC,EAAkB,KAAK,YAAY,iBAAmB,CAAC,EACvDC,EAAoB,KAAK,YAAY,mBAAqB,CAAC,EAC3DC,EAAwB,KAAK,YAAY,uBAAyB,CAAC,EAEzE,KAAK,SAAW,CAEd,aAAcf,EAAQ,OACtB,iBAAkBA,EAAQ,OAAQgB,GAAMA,EAAE,OAAS,WAAW,EAAE,OAChE,gBAAiBhB,EAAQ,OAAQgB,GAAMA,EAAE,OAAS,UAAU,EAAE,OAC9D,iBAAkBhB,EAAQ,OAAQgB,GAAMA,EAAE,OAAS,WAAW,EAAE,OAChE,aAAcb,EAAa,OAG3B,iBAAkBC,EAAY,OAC9B,kBAAmBC,EAAc,OACjC,qBAAsBC,EAAiB,OACvC,kBAAmBC,EAAc,OAGjC,iBAAkBC,EAAiB,OACnC,gBAAiBC,EAAgB,OACjC,UAAWC,EAAU,OACrB,oBAAqBC,EAAoB,OAGzC,sBAAuBC,EACvB,iBAAkB,KAAK,YAAY,sBAAwB,UAC3D,gBAAiBC,EAAgB,OACjC,kBAAmBC,EAAkB,OACrC,kBAAmBC,EAAsB,OAAS,EAClD,eAAgBA,EAAsB,OAGtC,eAAgBd,EAAU,OAC1B,WAAY,KAAK,cAAc,WAC/B,WAAY,KAAK,cAAc,WAG/B,aAAcC,EAAQ,OACtB,iBAAkB,IAAI,IAAIA,EAAQ,IAAKe,GAAQA,EAAI,MAAM,CAAC,EAAE,KAG5D,UAAW,KAAK,mBAAmB,KAAK,cAAc,UAAU,EAGhE,WAAY,KAAK,sBAAsB,KAAK,aAAa,kBAAmB,OAAO,EACnF,aAAc,KAAK,sBAAsB,KAAK,aAAa,kBAAmB,SAAS,EACvF,UAAW,KAAK,sBAAsB,KAAK,aAAa,kBAAmB,MAAM,CACnF,EAGA,KAAK,SAAS,YAAc,KAAK,qBAAqB,EACtD,KAAK,SAAS,gBAAkB,KAAK,yBAAyB,CAChE,CAKA,mBAAmBC,EAAMC,EAAQ,EAAG,CAClC,MAAI,CAACD,GAAQ,CAACA,EAAK,UAAYA,EAAK,SAAS,SAAW,EAC/CC,EAEF,EAAI,KAAK,IAAI,GAAGD,EAAK,SAAS,IAAKE,GAAU,KAAK,mBAAmBA,EAAOD,EAAQ,CAAC,CAAC,CAAC,CAChG,CAKA,sBAAsBE,EAASC,EAAU,CACvC,OAAKD,EACEA,EAAQ,OAAQE,GAAMA,EAAE,WAAaD,CAAQ,EAAE,OADjC,CAEvB,CAKA,sBAAuB,CACrB,IAAIE,EAAQ,IAEZ,OAAAA,GAAS,KAAK,SAAS,WAAa,GACpCA,GAAS,KAAK,SAAS,aAAe,EAElC,KAAK,SAAS,aAChBA,GAAS,GAGP,KAAK,SAAS,gBAAkB,KAAK,SAAS,mBAChDA,GAAS,IAGP,KAAK,SAAS,UAAY,IAC5BA,GAAS,GAGP,KAAK,SAAS,sBAAwB,KACxCA,GAAS,IAGJ,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKA,CAAK,CAAC,CACzC,CAKA,0BAA2B,CACzB,IAAIA,EAAQ,EAEZ,OAAAA,GAAS,KAAK,IAAI,KAAK,SAAS,iBAAmB,GAAI,EAAE,EACzDA,GAAS,KAAK,IAAI,KAAK,SAAS,kBAAoB,EAAG,EAAE,EACzDA,GAAS,KAAK,IAAI,KAAK,SAAS,kBAAoB,EAAG,EAAE,EAErD,KAAK,SAAS,UAAY,IAC5BA,GAAS,IAGXA,GAAS,KAAK,IAAI,KAAK,SAAS,oBAAsB,EAAG,EAAE,EAEpD,KAAK,IAAI,IAAKA,CAAK,CAC5B,CAKA,aAAc,CACZ,MAAMxB,EAAU,KAAK,cAAc,SAAW,CAAC,EACzCG,EAAe,KAAK,aAAa,cAAgB,CAAC,EAClDsB,EAAoB,KAAK,aAAa,mBAAqB,CAAC,EAElE,KAAK,OAAS,CACZ,SAAU,CACR,KAAM,KAAK,cAAc,MAAQ,WACjC,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,OAAQA,EAAkB,KAAMF,GAAMA,EAAE,WAAa,OAAO,EAAI,UAAY,UAC5E,MAAO,sBACT,EAEA,QAAS,CACP,QAAS,CACP,MAAO,KAAK,SAAS,aACrB,UAAW,KAAK,SAAS,iBACzB,SAAU,KAAK,SAAS,gBACxB,WAAY,KAAK,SAAS,gBAC5B,EACA,MAAO,CACL,aAAc,KAAK,SAAS,aAC5B,YAAa,KAAK,SAAS,iBAC3B,cAAe,KAAK,SAAS,kBAC7B,iBAAkB,KAAK,SAAS,qBAChC,cAAe,KAAK,SAAS,iBAC/B,EACA,QAAS,KAAK,QAAQ,eAAiB,CACrC,iBAAkB,KAAK,SAAS,iBAChC,gBAAiB,KAAK,SAAS,gBAC/B,UAAW,KAAK,SAAS,UACzB,oBAAqB,KAAK,SAAS,mBACrC,EAAI,KACJ,IAAK,KAAK,QAAQ,WAAa,CAC7B,cAAe,KAAK,SAAS,iBAC7B,mBAAoB,KAAK,SAAS,sBAClC,aAAc,KAAK,SAAS,gBAC5B,eAAgB,KAAK,SAAS,kBAC9B,kBAAmB,KAAK,SAAS,kBACjC,eAAgB,KAAK,SAAS,cAChC,EAAI,KACJ,UAAW,KAAK,SAAS,eACzB,QAAS,KAAK,SAAS,aACvB,iBAAkB,KAAK,SAAS,iBAChC,WAAY,KAAK,SAAS,WAC1B,WAAY,KAAK,SAAS,WAC1B,UAAW,KAAK,SAAS,UACzB,YAAa,KAAK,SAAS,YAC3B,gBAAiB,KAAK,SAAS,eACjC,EAEA,QAAS,KAAK,cAAc,EAC5B,aAAc,KAAK,mBAAmB,EACtC,QAAS,KAAK,cAAc,EAC5B,UAAW,KAAK,gBAAgB,EAEhC,QAAS,KAAK,QAAQ,eAAiB,KAAK,cAAc,EAAI,KAC9D,IAAK,KAAK,QAAQ,WAAa,KAAK,UAAU,EAAI,KAElD,WAAY,KAAK,QAAQ,YAAc,KAAK,iBAAiB,EAAI,KACjE,gBAAiB,KAAK,sBAAsB,EAC5C,WAAY,KAAK,QAAQ,kBAAoB,KAAK,iBAAiB,EAAI,KACvE,YAAa,KAAK,QAAQ,mBAAqB,KAAK,oBAAoB,EAAI,KAE5E,QAAS,KAAK,QAAQ,eAAiB,KAAK,mBAAmB,EAAI,IACrE,CACF,CAKA,eAAgB,CACd,OAAK,KAAK,eASH,CACL,iBAAkB,KAAK,eAAe,kBAAkB,IAAKG,IAAY,CACvE,KAAMA,EAAO,KACb,WAAYA,EAAO,WACnB,gBAAiBA,EAAO,iBAAiB,IAAKC,GAAMA,EAAE,IAAI,EAC1D,8BAA+BD,EAAO,8BACtC,OAAQA,EAAO,OACf,WAAYA,EAAO,UACrB,EAAE,GAAK,CAAC,EAER,gBAAiB,KAAK,eAAe,iBAAiB,IAAKE,IAAc,CACvE,KAAMA,EAAS,KACf,WAAYA,EAAS,YAAY,QAAU,EAC3C,QAASA,EAAS,SAAS,IAAKC,GAAMA,EAAE,IAAI,GAAK,CAAC,EAClD,QAASD,EAAS,SAAS,IAAKE,IAAO,CACrC,KAAMA,EAAE,KACR,qBAAsBA,EAAE,qBACxB,UAAWA,EAAE,SACf,EAAE,GAAK,CAAC,EACR,UAAWF,EAAS,WAAa,CAAC,CACpC,EAAE,GAAK,CAAC,EAER,UAAW,KAAK,eAAe,WAAW,IAAKG,IAAc,CAC3D,KAAMA,EAAS,aACf,UAAWA,EAAS,UACpB,UAAWA,EAAS,WAAa,CAAC,EAClC,eAAgBA,EAAS,gBAAkB,CAAC,CAC9C,EAAE,GAAK,CAAC,EAER,YAAa,CACX,qBAAsB,KAAK,eAAe,sBAAwB,CAAC,EACnE,cAAe,KAAK,eAAe,eAAiB,CAAC,CACvD,EAEA,oBAAqB,KAAK,eAAe,qBAAqB,IAAKC,IAAW,CAC5E,QAASA,EAAM,QACf,KAAMA,EAAM,KACZ,SAAUA,EAAM,SAChB,QAASA,EAAM,QACf,OAAQA,EAAM,MAChB,EAAE,GAAK,CAAC,CACV,EAjDS,CACL,iBAAkB,CAAC,EACnB,gBAAiB,CAAC,EAClB,UAAW,CAAC,EACZ,YAAa,CAAC,CAChB,CA6CJ,CAKA,WAAY,CACV,OAAK,KAAK,WAUH,CACL,qBAAsB,KAAK,WAAW,qBACtC,mBAAoB,KAAK,WAAW,sBACpC,eAAgB,KAAK,WAAW,mBAAqB,KAAK,WAAW,sBACrE,gBAAiB,KAAK,WAAW,gBAEjC,SAAU,CACR,KAAM,KAAK,WAAW,iBAAiB,IAAKC,IAAO,CACjD,QAASA,EAAE,QACX,QAASA,EAAE,QACX,IAAKA,EAAE,IACP,WAAYA,EAAE,UAChB,EAAE,GAAK,CAAC,EAER,OAAQ,KAAK,WAAW,mBAAmB,IAAKA,IAAO,CACrD,QAASA,EAAE,QACX,QAASA,EAAE,QACX,IAAKA,EAAE,IACP,SAAUA,EAAE,SACZ,WAAYA,EAAE,WACd,SAAUA,EAAE,QACd,EAAE,GAAK,CAAC,CACV,EAEA,UAAW,CACT,SAAU,KAAK,WAAW,eAAiB,EAC3C,MAAO,KAAK,WAAW,eACvB,aAAc,KAAK,WAAW,uBAAuB,IAAKV,IAAO,CAC/D,WAAYA,EAAE,WACd,OAAQA,EAAE,OACV,MAAOA,EAAE,MACT,kBAAmBA,EAAE,kBACrB,cAAeA,EAAE,aACnB,EAAE,GAAK,CAAC,CACV,EAEA,yBAA0B,KAAK,WAAW,uBAAuB,IAAKW,IAAS,CAC7E,OAAQA,EAAI,OACZ,OAAQA,EAAI,OACZ,cAAeA,EAAI,cACnB,SAAUA,EAAI,SACd,eAAgBA,EAAI,cACtB,EAAE,GAAK,CAAC,EAER,cAAe,KAAK,WAAW,kBAAkB,IAAKC,IAAU,CAC9D,KAAMA,EAAK,KACX,OAAQA,EAAK,OACb,YAAaA,EAAK,YAClB,QAASA,EAAK,QACd,OAAQA,EAAK,OACb,SAAUA,EAAK,SACf,UAAWA,EAAK,SAClB,EAAE,GAAK,CAAC,EAER,iBAAkB,CAChB,SAAU,KAAK,WAAW,gBAAgB,IAAKC,IAAO,CACpD,KAAMA,EAAE,KACR,QAASA,EAAE,QACX,WAAYA,EAAE,WACd,SAAUA,EAAE,QACd,EAAE,GAAK,CAAC,EAER,SAAU,KAAK,WAAW,eAAe,IAAKA,IAAO,CACnD,KAAMA,EAAE,KACR,QAASA,EAAE,QACX,WAAYA,EAAE,UAChB,EAAE,GAAK,CAAC,CACV,CACF,EA7ES,CACL,cAAe,UACf,MAAO,EACP,SAAU,CAAE,KAAM,CAAC,EAAG,OAAQ,CAAC,CAAE,EACjC,UAAW,CAAC,EACZ,UAAW,CAAC,CACd,CAwEJ,CAKA,eAAgB,CACd,MAAMpC,EAAU,CAAC,EAEjB,OAAC,KAAK,cAAc,SAAW,CAAC,GAAG,QAAS0B,GAAW,CACrD1B,EAAQ0B,EAAO,IAAI,EAAI,CACrB,KAAMA,EAAO,KACb,WAAYA,EAAO,YAAc,KACjC,SAAUA,EAAO,SACjB,YAAaA,EAAO,YAChB,CACA,OAAQA,EAAO,YAAY,QAAU,CAAC,CACxC,EACE,KACJ,QAASA,EAAO,QAAQ,IAAKI,IAAO,CAClC,KAAMA,EAAE,KACR,OAAQA,EAAE,QAAU,CAAC,CACvB,EAAE,EACF,WAAYJ,EAAO,YAAc,CAAC,EAClC,iBAAkBA,EAAO,kBAAoB,KAC7C,QAASA,EAAO,SAAW,CAAC,CAC9B,CACF,CAAC,EAEM1B,CACT,CAMA,oBAAqB,CACnB,MAAMG,EAAe,CAAC,EAEtB,OAAC,KAAK,aAAa,cAAgB,CAAC,GAAG,QAASkC,GAAO,CACrD,MAAMC,EAAWD,EAAG,UAAYA,EAEhClC,EAAamC,EAAS,IAAI,EAAI,CAC5B,KAAMA,EAAS,KACf,qBAAsBA,EAAS,qBAC/B,SAAUA,EAAS,SAEnB,aAAcA,EAAS,aAAe,CAAC,GAAG,IAAKC,GAAU,CAEvD,MAAMC,EAAS,OAAOD,EAAM,QAAW,WACnCA,EAAM,OAAO,EACZA,EAAM,eAAiBA,EAAM,cAAc,OAAS,EAEzD,MAAO,CACL,KAAMA,EAAM,KACZ,KAAMA,EAAM,MAAQ,MACpB,aAAcA,EAAM,oBAAsBA,EAAM,cAAc,SAAS,GAAK,YAC5E,OAAQC,EACR,cAAeD,EAAM,eAAiB,CAAC,EACvC,iBAAkBA,EAAM,kBAAoB,CAAC,EAC7C,cAAgBA,EAAM,WAAaA,EAAM,UAAU,QAAW,CAChE,CACF,CAAC,EAED,kBAAmBD,EAAS,kBAAoB,CAAC,GAAG,IAAKG,GAAO,CAE9D,MAAMC,EAAU,OAAOD,EAAG,SAAY,WAClCA,EAAG,QAAQ,EACX,GAEJ,MAAO,CACL,KAAMA,EAAG,KACT,WAAYA,EAAG,YAAc,GAC7B,eAAgBA,EAAG,gBAAkB,GACrC,QAASC,EACT,OAAQD,EAAG,kBAAoB,CAAC,CAClC,CACF,CAAC,EAED,cAAeH,EAAS,cAAgB,CAAC,GAAG,IAAKR,IAAO,CACtD,KAAMA,EAAE,KACR,OAAQA,EAAE,QAAU,CAAC,CACvB,EAAE,CACJ,CACF,CAAC,EAEM3B,CACT,CAKA,eAAgB,CACd,MAAMD,EAAU,CAAC,EAEjB,OAAC,KAAK,cAAc,SAAW,CAAC,GAAG,QAASe,GAAQ,CAClDf,EAAQe,EAAI,MAAM,EAAIA,EAAI,OAAS,CAAC,CACtC,CAAC,EAEMf,CACT,CAKA,iBAAkB,CAChB,MAAMD,EAAY,CAAC,EAEnB,OAAC,KAAK,cAAc,WAAa,CAAC,GAAG,QAAS0C,GAAS,CACrD1C,EAAU0C,EAAK,IAAI,EAAI,CACrB,KAAMA,EAAK,KACX,SAAUA,EAAK,SACf,QAASA,EAAK,QAAU,CAAC,GAAG,IAAKV,IAAO,CACtC,KAAMA,EAAE,KACR,SAAUA,EAAE,QACd,EAAE,EACF,aAAcU,EAAK,cAAgB,EACrC,CACF,CAAC,EAEM1C,CACT,CAKA,kBAAmB,CACjB,OAAK,KAAK,cAAc,WAIjB,KAAK,iBAAiB,KAAK,cAAc,UAAU,EAHjD,IAIX,CAKA,iBAAiBiB,EAAM,CACrB,OAAKA,EAEE,CACL,KAAMA,EAAK,QAAQ,MAAQ,UAC3B,KAAMA,EAAK,QAAQ,MAAQ,UAC3B,MAAOA,EAAK,OAAS,EACrB,UAAWA,EAAK,UAAY,CAAC,GAAG,IAAKE,GAAU,KAAK,iBAAiBA,CAAK,CAAC,CAC7E,EAPkB,IAQpB,CAKA,uBAAwB,CACtB,MAAMwB,EAAQ,KAAK,aAAa,gBAChC,OAAKA,EAEE,CACL,eAAgB,OAAO,YAAYA,EAAM,gBAAkB,CAAC,CAAC,EAC7D,cAAe,OAAO,YAAYA,EAAM,eAAiB,CAAC,CAAC,EAC3D,aAAc,OAAO,YAAYA,EAAM,cAAgB,CAAC,CAAC,CAC3D,EANmB,IAOrB,CAKA,kBAAmB,CACjB,MAAMvB,EAAU,KAAK,aAAa,mBAAqB,CAAC,EAExD,MAAO,CACL,YAAaA,EAAQ,OACrB,OAAQA,EAAQ,OAAQE,GAAMA,EAAE,WAAa,OAAO,EACpD,SAAUF,EAAQ,OAAQE,GAAMA,EAAE,WAAa,SAAS,EACxD,KAAMF,EAAQ,OAAQE,GAAMA,EAAE,WAAa,MAAM,CACnD,CACF,CAKA,qBAAsB,CACpB,MAAMsB,EAAc,CAAC,EAGrB,OAAI,KAAK,SAAS,gBAAkB,KAAK,SAAS,kBAChDA,EAAY,KAAK,CACf,KAAM,YACN,SAAU,OACV,QAAS,uCACT,WAAY,wEACd,CAAC,EAGC,KAAK,SAAS,UAAY,GAC5BA,EAAY,KAAK,CACf,KAAM,YACN,SAAU,UACV,QAAS,4BACT,WAAY,mEACd,CAAC,EAIC,KAAK,QAAQ,YAAc,KAAK,aAC9B,KAAK,SAAS,sBAAwB,IACxCA,EAAY,KAAK,CACf,KAAM,oBACN,SAAU,UACV,QAAS,gCAAgC,KAAK,SAAS,qBAAqB,QAC5E,WAAY,cAAc,KAAK,WAAW,kBAAkB,QAAU,CAAC,0CACvE,eAAgB,KAAK,WAAW,kBAAkB,QAAU,CAC9D,CAAC,EAGC,KAAK,SAAS,kBAAoB,GACpCA,EAAY,KAAK,CACf,KAAM,eACN,SAAU,UACV,QAAS,SAAS,KAAK,SAAS,iBAAiB,uBACjD,WAAY,2DACZ,eAAgB,KAAK,SAAS,iBAChC,CAAC,EAGC,KAAK,SAAS,mBAChBA,EAAY,KAAK,CACf,KAAM,YACN,SAAU,OACV,QAAS,8BAA8B,KAAK,SAAS,cAAc,gBACnE,WAAY,uEACZ,sBAAuB,KAAK,SAAS,cACvC,CAAC,EAGC,KAAK,WAAW,uBAAuB,OAAS,GAClDA,EAAY,KAAK,CACf,KAAM,eACN,SAAU,OACV,QAAS,SAAS,KAAK,WAAW,sBAAsB,MAAM,2BAC9D,WAAY,yDACZ,cAAe,KAAK,WAAW,sBAAsB,MACvD,CAAC,GAKD,KAAK,QAAQ,gBAAkB,KAAK,iBAClC,KAAK,SAAS,iBAAmB,GACnCA,EAAY,KAAK,CACf,KAAM,oBACN,SAAU,OACV,QAAS,uCAAuC,KAAK,SAAS,gBAAgB,IAC9E,WAAY,6DACZ,iBAAkB,KAAK,SAAS,gBAClC,CAAC,EAGC,KAAK,SAAS,UAAY,GAC5BA,EAAY,KAAK,CACf,KAAM,mBACN,SAAU,OACV,QAAS,2BAA2B,KAAK,SAAS,SAAS,cAC3D,WAAY,8EACZ,UAAW,KAAK,SAAS,SAC3B,CAAC,GAIEA,CACT,CAKA,oBAAqB,CACnB,MAAO,CACL,cAAe,CACb,MAAO,KAAK,SAAS,aACrB,OAAQ,CACN,UAAW,KAAK,SAAS,iBACzB,SAAU,KAAK,SAAS,gBACxB,UAAW,KAAK,SAAS,iBACzB,MAAO,KAAK,SAAS,YACvB,CACF,EAEA,aAAc,CACZ,aAAc,KAAK,SAAS,aAC5B,YAAa,KAAK,SAAS,iBAC3B,cAAe,KAAK,SAAS,kBAC7B,iBAAkB,KAAK,SAAS,qBAChC,cAAe,KAAK,SAAS,iBAC/B,EAEA,eAAgB,KAAK,QAAQ,eAAiB,CAC5C,iBAAkB,KAAK,SAAS,iBAChC,gBAAiB,KAAK,SAAS,gBAC/B,UAAW,KAAK,SAAS,UACzB,oBAAqB,KAAK,SAAS,mBACrC,EAAI,KAEJ,WAAY,KAAK,QAAQ,WAAa,CACpC,mBAAoB,KAAK,SAAS,sBAClC,cAAe,KAAK,SAAS,iBAC7B,aAAc,KAAK,SAAS,gBAC5B,eAAgB,KAAK,SAAS,kBAC9B,kBAAmB,KAAK,SAAS,kBACjC,eAAgB,KAAK,SAAS,cAChC,EAAI,KAEJ,gBAAiB,CACf,MAAO,KAAK,SAAS,eACrB,WAAY,KAAK,SAAS,YAAc,MAC1C,EAEA,kBAAmB,CACjB,aAAc,KAAK,SAAS,aAC5B,iBAAkB,KAAK,SAAS,gBAClC,EAEA,iBAAkB,CAChB,gBAAiB,KAAK,SAAS,UAC/B,WAAY,KAAK,SAAS,YAAc,MAC1C,EAEA,cAAe,CACb,YAAa,KAAK,SAAS,YAC3B,gBAAiB,KAAK,SAAS,gBAC/B,OAAQ,KAAK,SAAS,WACtB,SAAU,KAAK,SAAS,YAC1B,CACF,CACF,CAKA,QAAS,CACP,OAAI,KAAK,QAAQ,YACR,KAAK,UAAU,KAAK,OAAQ,KAAM,CAAC,EAEnC,KAAK,UAAU,KAAK,MAAM,CAErC,CAKA,YAAa,CACX,IAAIC,EAAK;AAAA;AAAA,EAwGT,GAtGAA,GAAM,kBAAkB,IAAI,KAAK,EAAE,YAAY,CAAC;AAAA;AAAA,EAGhDA,GAAM;AAAA;AAAA,EACNA,GAAM;AAAA,EACNA,GAAM;AAAA,EACNA,GAAM,qBAAqB,KAAK,SAAS,YAAY;AAAA,EACrDA,GAAM,iBAAiB,KAAK,SAAS,gBAAgB;AAAA,EACrDA,GAAM,gBAAgB,KAAK,SAAS,eAAe;AAAA,EACnDA,GAAM,qBAAqB,KAAK,SAAS,YAAY;AAAA,EACrDA,GAAM,oBAAoB,KAAK,SAAS,gBAAgB;AAAA,EACxDA,GAAM,oBAAoB,KAAK,SAAS,WAAW;AAAA,EACnDA,GAAM,wBAAwB,KAAK,SAAS,eAAe;AAAA,EAEvD,KAAK,QAAQ,iBACfA,GAAM,wBAAwB,KAAK,SAAS,gBAAgB;AAAA,EAC5DA,GAAM,uBAAuB,KAAK,SAAS,eAAe;AAAA,EAC1DA,GAAM,iBAAiB,KAAK,SAAS,SAAS;AAAA,GAG5C,KAAK,QAAQ,aACfA,GAAM,yBAAyB,KAAK,SAAS,gBAAgB;AAAA,EAC7DA,GAAM,iBAAiB,KAAK,SAAS,qBAAqB;AAAA,EAC1DA,GAAM,0BAA0B,KAAK,SAAS,kBAAoB,MAAQ,IAAI;AAAA,GAGhFA,GAAM;AAAA,EAGF,KAAK,QAAQ,gBAAkB,KAAK,iBACtCA,GAAM;AAAA;AAAA,EAEF,KAAK,SAAS,iBAAmB,IACnCA,GAAM;AAAA;AAAA,GACL,KAAK,eAAe,kBAAoB,CAAC,GAAG,QAASpB,GAAW,CAC/DoB,GAAM,OAAOpB,EAAO,IAAI;AAAA,EACpBA,EAAO,YAAcA,EAAO,WAAW,OAAS,IAClDoB,GAAM,mBAAmBpB,EAAO,WAAW,IAAKO,GAAMA,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,GAEtEP,EAAO,QAAUA,EAAO,OAAO,OAAS,IAC1CoB,GAAM,gBAAgBpB,EAAO,OAAO,KAAK,IAAI,CAAC;AAAA,EAElD,CAAC,EACDoB,GAAM;AAAA,GAGJ,KAAK,SAAS,gBAAkB,IAClCA,GAAM;AAAA;AAAA,GACL,KAAK,eAAe,iBAAmB,CAAC,GAAG,QAASlB,GAAa,CAChEkB,GAAM,OAAOlB,EAAS,IAAI;AAAA,EACtBA,EAAS,WAAaA,EAAS,UAAU,OAAS,IACpDkB,GAAM,oBAAoBlB,EAAS,UAAU,KAAK,IAAI,CAAC;AAAA,EAE3D,CAAC,EACDkB,GAAM;AAAA,IAKN,KAAK,QAAQ,YAAc,KAAK,aAClCA,GAAM;AAAA;AAAA,EACNA,GAAM,8BAA8B,KAAK,SAAS,gBAAgB;AAAA,EAClEA,GAAM,cAAc,KAAK,SAAS,qBAAqB;AAAA,EACvDA,GAAM,sBAAsB,KAAK,WAAW,eAAe;AAAA;AAAA,EAEvD,KAAK,SAAS,kBAAoB,IACpCA,GAAM,wBAAwB,KAAK,SAAS,iBAAiB;AAAA;AAAA,GAC5D,KAAK,WAAW,mBAAqB,CAAC,GAAG,MAAM,EAAG,EAAE,EAAE,QAASC,GAAY,CAC1ED,GAAM,OAAOC,EAAQ,OAAO,OAAOA,EAAQ,GAAG;AAAA,CAChD,CAAC,EACG,KAAK,SAAS,kBAAoB,KACpCD,GAAM,aAAa,KAAK,SAAS,kBAAoB,EAAE;AAAA,GAEzDA,GAAM;AAAA,GAGJ,KAAK,WAAW,eAAiB,IACnCA,GAAM,+BAA+B,KAAK,WAAW,cAAc;AAAA;AAAA,GAClE,KAAK,WAAW,uBAAyB,CAAC,GAAG,QAASE,GAAQ,CAC7DF,GAAM,OAAOE,EAAI,UAAU,OAAOA,EAAI,MAAM;AAAA,CAC9C,CAAC,EACDF,GAAM;AAAA,GAGJ,KAAK,WAAW,kBAAoB,KAAK,WAAW,iBAAiB,OAAS,IAChFA,GAAM,uBAAuB,KAAK,WAAW,iBAAiB,MAAM;AAAA;AAAA,GACnE,KAAK,WAAW,kBAAoB,CAAC,GAAG,QAASX,GAAS,CACzDW,GAAM,UAAUX,EAAK,IAAI,KAAKA,EAAK,MAAM;AAAA,EACrCA,EAAK,cACPW,GAAM,GAAGX,EAAK,WAAW;AAAA,GAEvBA,EAAK,SACPW,GAAM,aAAaX,EAAK,MAAM;AAAA,GAEhCW,GAAM;AAAA,CACR,CAAC,IAILA,GAAM;AAAA,EAGF,KAAK,QAAQ,mBAAoB,CACnC,MAAMD,EAAc,KAAK,oBAAoB,EACzCA,EAAY,OAAS,IACvBC,GAAM;AAAA;AAAA,EACND,EAAY,QAASI,GAAQ,CAC3BH,GAAM,OAAOG,EAAI,OAAO,OAAOA,EAAI,UAAU;AAAA,CAC/C,CAAC,EACDH,GAAM;AAAA,EAEV,CAEA,OAAOA,CACT,CAKA,WAAY,CACV,MAAMI,EAAQ,CAAC,EAEf,OAAAA,EAAM,KAAK;AAAA,EAAO,IAAI,OAAO,EAAE,CAAC,EAChCA,EAAM,KAAK,kDAAkD,EAC7DA,EAAM,KAAK,IAAI,OAAO,EAAE,EAAI;AAAA,CAAI,EAGhCA,EAAM,KAAK,SAAS,EACpBA,EAAM,KAAK,IAAI,OAAO,EAAE,CAAC,EACzBA,EAAM,KAAK,cAAc,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,gBAAgB,eAAe,KAAK,SAAS,eAAe,YAAY,EAC9IA,EAAM,KAAK,oBAAoB,KAAK,SAAS,YAAY,EAAE,EAC3DA,EAAM,KAAK,mBAAmB,KAAK,SAAS,gBAAgB,EAAE,EAC9DA,EAAM,KAAK,mBAAmB,KAAK,SAAS,WAAW,MAAM,EAC7DA,EAAM,KAAK,iBAAiB,KAAK,SAAS,eAAe,MAAM,EAE3D,KAAK,QAAQ,iBACfA,EAAM,KAAK,uBAAuB,KAAK,SAAS,gBAAgB,EAAE,EAClEA,EAAM,KAAK,sBAAsB,KAAK,SAAS,eAAe,EAAE,EAChEA,EAAM,KAAK,gBAAgB,KAAK,SAAS,SAAS,EAAE,GAGlD,KAAK,QAAQ,aACfA,EAAM,KAAK,wBAAwB,KAAK,SAAS,gBAAgB,EAAE,EACnEA,EAAM,KAAK,gBAAgB,KAAK,SAAS,qBAAqB,MAAM,EACpEA,EAAM,KAAK,sBAAsB,KAAK,YAAY,kBAAkB,QAAU,CAAC,EAAE,GAGnFA,EAAM,KAAK,EAAE,EAGT,KAAK,QAAQ,gBAAkB,KAAK,gBAAkB,KAAK,SAAS,iBAAmB,IACzFA,EAAM,KAAK,4BAA4B,EACvCA,EAAM,KAAK,IAAI,OAAO,EAAE,CAAC,EAErB,KAAK,SAAS,iBAAmB,IACnCA,EAAM,KAAK,qBAAqB,GAC/B,KAAK,eAAe,kBAAoB,CAAC,GAAG,QAASxB,GAAW,CAC/DwB,EAAM,KAAK,SAASxB,EAAO,IAAI,EAAE,EAC7BA,EAAO,QAAUA,EAAO,OAAO,OAAS,GAC1CwB,EAAM,KAAK,kBAAkBxB,EAAO,OAAO,KAAK,IAAI,CAAC,EAAE,CAE3D,CAAC,GAGC,KAAK,SAAS,gBAAkB,IAClCwB,EAAM,KAAK,oBAAoB,GAC9B,KAAK,eAAe,iBAAmB,CAAC,GAAG,QAAStB,GAAa,CAChEsB,EAAM,KAAK,SAAStB,EAAS,IAAI,EAAE,EAC/BA,EAAS,WAAaA,EAAS,UAAU,OAAS,GACpDsB,EAAM,KAAK,oBAAoBtB,EAAS,UAAU,KAAK,IAAI,CAAC,EAAE,CAElE,CAAC,GAGHsB,EAAM,KAAK,EAAE,GAIX,KAAK,QAAQ,YAAc,KAAK,aAClCA,EAAM,KAAK,sCAAsC,EACjDA,EAAM,KAAK,IAAI,OAAO,EAAE,CAAC,EACzBA,EAAM,KAAK,cAAc,KAAK,SAAS,gBAAgB,KAAK,KAAK,SAAS,qBAAqB,OAAO,EACtGA,EAAM,KAAK,oBAAoB,KAAK,SAAS,eAAe,EAAE,EAC9DA,EAAM,KAAK,sBAAsB,KAAK,SAAS,iBAAiB,EAAE,EAE9D,KAAK,WAAW,eAAiB,GACnCA,EAAM,KAAK,8BAA8B,KAAK,WAAW,cAAc,gBAAgB,EAGrF,KAAK,WAAW,kBAAoB,KAAK,WAAW,iBAAiB,OAAS,IAChFA,EAAM,KAAK,sBAAsB,KAAK,WAAW,iBAAiB,MAAM,EAAE,EAC1EA,EAAM,KAAK,uBAAuB,KAAK,WAAW,eAAe,EAAE,GAGrEA,EAAM,KAAK,EAAE,GAIX,KAAK,cAAgB,KAAK,aAAa,mBAAqB,KAAK,aAAa,kBAAkB,OAAS,IAC3GA,EAAM,KAAK,mBAAmB,EAC9BA,EAAM,KAAK,IAAI,OAAO,EAAE,CAAC,GACxB,KAAK,aAAa,mBAAqB,CAAC,GAAG,QAASC,GAAW,CAC9D,MAAMC,EAAOD,EAAO,WAAa,QAAU,SAAMA,EAAO,WAAa,UAAY,gBAAQ,gBACzFD,EAAM,KAAK,KAAKE,CAAI,KAAKD,EAAO,SAAS,YAAY,CAAC,KAAKA,EAAO,OAAO,EAAE,EACvEA,EAAO,YACTD,EAAM,KAAK,eAAUC,EAAO,UAAU,EAAE,CAE5C,CAAC,EACDD,EAAM,KAAK,EAAE,GAGfA,EAAM,KAAK,IAAI,OAAO,EAAE,EAAI;AAAA,CAAI,EAEzBA,EAAM,KAAK;AAAA,CAAI,CACxB,CAKA,WAAWG,EAAUC,EAAI,CACvB,MAAMC,EAAU,KAAK,SAAS,EAC9B,OAAAD,EAAG,cAAcD,EAAUE,EAAS,OAAO,EACpCF,CACT,CACF", + "names": ["getLogger", "ReportGenerator", "widgetResults", "stateResults", "contextResults", "ssrResults", "options", "output", "error", "widgets", "functions", "imports", "stateClasses", "stateFields", "setStateCalls", "lifecycleMethods", "eventHandlers", "inheritedWidgets", "changeNotifiers", "providers", "contextAccessPoints", "ssrScore", "ssrSafePatterns", "ssrUnsafePatterns", "hydrationRequirements", "w", "imp", "node", "depth", "child", "results", "severity", "r", "score", "validationResults", "widget", "a", "notifier", "g", "m", "provider", "usage", "p", "opp", "step", "i", "sc", "metadata", "field", "isUsed", "lc", "isValid", "func", "graph", "suggestions", "md", "pattern", "req", "sug", "lines", "result", "icon", "filePath", "fs", "content"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/flutterjs_widget_analyzer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_widget_analyzer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/flutterjs_widget_analyzer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_widget_analyzer.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_widget_analyzer.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_widget_analyzer.js.map new file mode 100644 index 00000000..abdf4534 --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/flutterjs_widget_analyzer.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/flutterjs_widget_analyzer.js"], + "sourcesContent": ["/**\r\n * WidgetAnalyzer Enhancement - Track field references\r\n * \r\n * Understand that:\r\n * _count = 0; <- field declaration\r\n * this._count <- field reference\r\n * \r\n * These are the same thing!\r\n */\r\n\r\nimport { getLogger } from './flutterjs_logger.js';\r\n\r\nclass WidgetAnalyzer {\r\n constructor(ast, options = {}) {\r\n this.ast = ast;\r\n this.options = {\r\n strict: false,\r\n ...options,\r\n };\r\n this.logger = getLogger().createComponentLogger('WidgetAnalyzer');\r\n this.widgets = new Map(); // key: className, value: Widget object\r\n this.functions = new Map(); // key: functionName, value: Function object\r\n this.imports = [];\r\n this.externalDependencies = new Set();\r\n this.entryPoint = null;\r\n this.rootWidget = null;\r\n this.widgetTree = null;\r\n this.errors = [];\r\n }\r\n\r\n /**\r\n * Main entry point - analyze entire AST\r\n */\r\n analyze() {\r\n this.logger.startSession('WidgetAnalyzer');\r\n if (!this.ast || !this.ast.body) {\r\n throw new Error('Invalid AST provided');\r\n }\r\n\r\n this.logger.trace('[WidgetAnalyzer] Starting analysis...');\r\n\r\n try {\r\n // Phase 1: Extract all classes and functions\r\n this.logger.trace('[WidgetAnalyzer] Phase 1: Extracting classes and functions...');\r\n this.extractClassesAndFunctions();\r\n this.logger.trace(`[WidgetAnalyzer] Found ${this.widgets.size} classes in total`);\r\n\r\n // Phase 2: Detect which classes are widgets\r\n this.logger.trace('[WidgetAnalyzer] Phase 2: Detecting widgets...');\r\n this.detectWidgets();\r\n this.logger.trace(`[WidgetAnalyzer] Detected widgets: ${Array.from(this.widgets.values()).filter(w => w.type !== 'class').length}`);\r\n\r\n // Phase 3: Extract imports and dependencies\r\n this.logger.trace('[WidgetAnalyzer] Phase 3: Extracting imports...');\r\n this.extractImports();\r\n this.logger.trace(`[WidgetAnalyzer] Found ${this.imports.length} imports`);\r\n\r\n // Phase 4: Find entry point\r\n this.logger.trace('[WidgetAnalyzer] Phase 4: Finding entry point...');\r\n this.findEntryPoint();\r\n this.logger.trace(`[WidgetAnalyzer] Entry point: ${this.entryPoint || 'NOT FOUND'}`);\r\n\r\n // Phase 5: Build widget tree\r\n this.logger.trace('[WidgetAnalyzer] Phase 5: Building widget tree...');\r\n this.buildWidgetTree();\r\n this.logger.trace(`[WidgetAnalyzer] Tree root: ${this.rootWidget || 'NOT FOUND'}`);\r\n\r\n this.logger.trace('[WidgetAnalyzer] Analysis complete\\n');\r\n\r\n return this.getResults();\r\n } catch (error) {\r\n this.errors.push({\r\n type: 'analysis-error',\r\n message: error.message,\r\n stack: error.stack,\r\n });\r\n return this.getResults();\r\n }\r\n }\r\n\r\n /**\r\n * Phase 1: Extract all classes and functions from AST\r\n */\r\n extractClassesAndFunctions() {\r\n if (!this.ast.body) return;\r\n\r\n for (const node of this.ast.body) {\r\n if (node.type === 'ClassDeclaration') {\r\n this.extractClassDeclaration(node);\r\n } else if (node.type === 'FunctionDeclaration') {\r\n this.extractFunctionDeclaration(node);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Extract a single class declaration\r\n * Handles both field declarations and method declarations\r\n */\r\n extractClassDeclaration(classNode) {\r\n const name = classNode.id?.name;\r\n if (!name) return;\r\n\r\n const superClass = classNode.superClass?.name || null;\r\n const location = classNode.location;\r\n\r\n const widget = {\r\n name,\r\n type: 'class',\r\n location,\r\n superClass,\r\n constructor: null,\r\n properties: [], // Fields with their initial values\r\n methods: [],\r\n fieldReferences: {}, // Map of which methods use which fields\r\n imports: [],\r\n children: [],\r\n linkedStateClass: null,\r\n };\r\n\r\n // Extract fields (declared with _count = 0; syntax)\r\n if (classNode.body?.fields) {\r\n classNode.body.fields.forEach((field) => {\r\n const fieldName = field.key?.name;\r\n const initialValue = field.initialValue ? this.expressionToString(field.initialValue) : null;\r\n\r\n widget.properties.push({\r\n name: fieldName,\r\n initialValue: initialValue,\r\n type: this.inferFieldType(field.initialValue),\r\n });\r\n\r\n // Track that this field exists\r\n if (!widget.fieldReferences[fieldName]) {\r\n widget.fieldReferences[fieldName] = [];\r\n }\r\n });\r\n }\r\n\r\n // Extract constructor\r\n if (classNode.body?.methods) {\r\n const constructorMethod = classNode.body.methods.find(\r\n (m) => m.key?.name === 'constructor'\r\n );\r\n if (constructorMethod) {\r\n widget.constructor = {\r\n name: 'constructor',\r\n params: constructorMethod.params || [],\r\n location: constructorMethod.location,\r\n };\r\n }\r\n\r\n // Extract other methods and track field usage\r\n classNode.body.methods.forEach((method) => {\r\n if (method.key?.name !== 'constructor') {\r\n const methodName = method.key?.name;\r\n const methodData = {\r\n name: methodName,\r\n params: method.params || [],\r\n location: method.location,\r\n hasBody: method.body !== null,\r\n usesFields: [], // Which fields this method references\r\n };\r\n\r\n // Track field references in this method\r\n if (method.body) {\r\n const fieldRefs = this.findFieldReferencesInBody(method.body);\r\n methodData.usesFields = fieldRefs;\r\n\r\n // Update the field reference map\r\n fieldRefs.forEach((fieldName) => {\r\n if (widget.fieldReferences[fieldName]) {\r\n widget.fieldReferences[fieldName].push(methodName);\r\n }\r\n });\r\n }\r\n\r\n widget.methods.push(methodData);\r\n }\r\n });\r\n }\r\n\r\n this.widgets.set(name, widget);\r\n this.logger.trace(`[WidgetAnalyzer] Extracted class: ${name} extends ${superClass}`);\r\n if (widget.properties.length > 0) {\r\n this.logger.trace(`[WidgetAnalyzer] Fields: ${widget.properties.map(p => `${p.name}=${p.initialValue}`).join(', ')}`);\r\n }\r\n }\r\n\r\n /**\r\n * Find all field references (this._fieldName) in a method body\r\n */\r\n findFieldReferencesInBody(body) {\r\n const fields = [];\r\n\r\n // Simple traversal to find this.fieldName patterns\r\n // This is a basic implementation - enhance as needed\r\n const traverse = (node) => {\r\n if (!node) return;\r\n\r\n // Look for MemberExpression: this._fieldName\r\n if (node.type === 'MemberExpression') {\r\n if (node.object?.name === 'this' && node.property?.name) {\r\n fields.push(node.property.name);\r\n }\r\n }\r\n\r\n // Recursively traverse all node properties\r\n for (const key in node) {\r\n if (key !== 'location' && typeof node[key] === 'object') {\r\n if (Array.isArray(node[key])) {\r\n node[key].forEach(traverse);\r\n } else {\r\n traverse(node[key]);\r\n }\r\n }\r\n }\r\n };\r\n\r\n traverse(body);\r\n return [...new Set(fields)]; // Remove duplicates\r\n }\r\n\r\n /**\r\n * Infer the type of a field from its initializer\r\n */\r\n inferFieldType(initialValue) {\r\n if (!initialValue) return 'any';\r\n\r\n if (initialValue.type === 'Literal') {\r\n const val = initialValue.value;\r\n if (typeof val === 'number') return 'int' | 'double';\r\n if (typeof val === 'boolean') return 'bool';\r\n if (typeof val === 'string') return 'String';\r\n if (val === null) return 'null';\r\n }\r\n\r\n if (initialValue.type === 'Identifier') {\r\n return initialValue.name;\r\n }\r\n\r\n if (initialValue.type === 'ArrayExpression') {\r\n return 'List';\r\n }\r\n\r\n if (initialValue.type === 'ObjectExpression') {\r\n return 'Map';\r\n }\r\n\r\n return 'dynamic';\r\n }\r\n\r\n /**\r\n * Extract a function declaration\r\n */\r\n extractFunctionDeclaration(funcNode) {\r\n const name = funcNode.id?.name || 'anonymous';\r\n const location = funcNode.location;\r\n\r\n const func = {\r\n name,\r\n type: 'function',\r\n location,\r\n params: funcNode.params?.map((p) => ({\r\n name: p.name?.name || 'param',\r\n optional: p.optional || false,\r\n })) || [],\r\n isAsync: funcNode.isAsync || false,\r\n isEntryPoint: false,\r\n };\r\n\r\n this.functions.set(name, func);\r\n }\r\n\r\n /**\r\n * Phase 2: Detect which classes are widgets\r\n */\r\n detectWidgets() {\r\n this.widgets.forEach((widget) => {\r\n if (!widget.superClass) {\r\n widget.type = 'class';\r\n return;\r\n }\r\n\r\n const superClass = widget.superClass;\r\n\r\n if (superClass === 'StatelessWidget') {\r\n widget.type = 'stateless';\r\n this.logger.trace(`[WidgetAnalyzer] ${widget.name} is StatelessWidget`);\r\n } else if (superClass === 'StatefulWidget') {\r\n widget.type = 'stateful';\r\n this.logger.trace(`[WidgetAnalyzer] ${widget.name} is StatefulWidget`);\r\n } else if (superClass?.startsWith('State')) {\r\n widget.type = 'state';\r\n this.logger.trace(`[WidgetAnalyzer] ${widget.name} is State class`);\r\n } else {\r\n widget.type = 'component';\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Phase 3: Extract imports\r\n */\r\n // In flutterjs_widget_analyzer.js\r\n extractImports() {\r\n if (!this.ast.body) return;\r\n\r\n this.ast.body.forEach((node) => {\r\n if (node.type === 'ImportDeclaration') {\r\n const source = node.source?.value;\r\n\r\n // \u2705 Get all imported items (handles multi-line properly)\r\n const items = node.specifiers?.map((spec) => {\r\n // Use the local name (after 'as')\r\n return spec.local?.name || spec.imported?.name;\r\n }) || [];\r\n\r\n this.imports.push({\r\n source,\r\n items,\r\n specifiers: node.specifiers, // Keep raw specifiers for later\r\n });\r\n\r\n this.externalDependencies.add(source);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Phase 4: Find entry point\r\n */\r\n findEntryPoint() {\r\n if (this.functions.has('main')) {\r\n this.entryPoint = 'main';\r\n const mainFunc = this.functions.get('main');\r\n mainFunc.isEntryPoint = true;\r\n\r\n const mainAstNode = this.ast.body.find(\r\n (n) => n.type === 'FunctionDeclaration' && n.id?.name === 'main'\r\n );\r\n\r\n if (mainAstNode?.body?.body) {\r\n this.rootWidget = this.findRunAppWidget(mainAstNode.body.body);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Find which widget is passed to runApp()\r\n */\r\n findRunAppWidget(statements) {\r\n for (const stmt of statements) {\r\n if (stmt.type === 'ExpressionStatement' && stmt.expression?.type === 'CallExpression') {\r\n const call = stmt.expression;\r\n if (call.callee?.name === 'runApp' && call.args?.length > 0) {\r\n return this.getWidgetNameFromExpression(call.args[0]);\r\n }\r\n }\r\n if (stmt.type === 'ReturnStatement' && stmt.argument?.type === 'CallExpression') {\r\n const call = stmt.argument;\r\n if (call.callee?.name === 'runApp' && call.args?.length > 0) {\r\n return this.getWidgetNameFromExpression(call.args[0]);\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Extract widget name from expression\r\n */\r\n getWidgetNameFromExpression(expr) {\r\n if (!expr) return null;\r\n\r\n if (expr.type === 'NewExpression') {\r\n return expr.callee?.name;\r\n }\r\n\r\n if (expr.type === 'CallExpression') {\r\n return expr.callee?.name;\r\n }\r\n\r\n if (expr.type === 'Identifier') {\r\n return expr.name;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Phase 5: Build widget tree\r\n */\r\n buildWidgetTree() {\r\n if (!this.rootWidget || !this.widgets.has(this.rootWidget)) {\r\n return;\r\n }\r\n\r\n const rootWidget = this.widgets.get(this.rootWidget);\r\n this.widgetTree = {\r\n widget: rootWidget,\r\n depth: 0,\r\n children: [],\r\n };\r\n }\r\n\r\n /**\r\n * Convert expression to string representation\r\n */\r\n expressionToString(expr) {\r\n if (!expr) return null;\r\n\r\n if (expr.type === 'Literal') {\r\n return expr.value;\r\n }\r\n\r\n if (expr.type === 'Identifier') {\r\n const name = expr.name;\r\n if (name === 'true' || name === 'false') return name === 'true';\r\n if (name === 'null') return null;\r\n if (name === 'undefined') return undefined;\r\n return name;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Get results\r\n */\r\n getResults() {\r\n const widgetArray = Array.from(this.widgets.values()).filter(\r\n (w) => w.type === 'stateless' || w.type === 'stateful' || w.type === 'state' || w.type === 'component'\r\n );\r\n\r\n this.logger.trace(`[WidgetAnalyzer] getResults() returning ${widgetArray.length} widgets`);\r\n\r\n return {\r\n widgets: widgetArray,\r\n functions: Array.from(this.functions.values()),\r\n imports: this.imports,\r\n externalDependencies: Array.from(this.externalDependencies),\r\n entryPoint: this.entryPoint,\r\n rootWidget: this.rootWidget,\r\n widgetTree: this.widgetTree,\r\n errors: this.errors,\r\n };\r\n }\r\n\r\n /**\r\n * Get summary statistics\r\n */\r\n getSummary() {\r\n const widgets = Array.from(this.widgets.values());\r\n const statelessCount = widgets.filter((w) => w.type === 'stateless').length;\r\n const statefulCount = widgets.filter((w) => w.type === 'stateful').length;\r\n const stateCount = widgets.filter((w) => w.type === 'state').length;\r\n\r\n return {\r\n totalWidgets: widgets.length,\r\n statelessWidgets: statelessCount,\r\n statefulWidgets: statefulCount,\r\n stateClasses: stateCount,\r\n totalFunctions: this.functions.size,\r\n totalImports: this.imports.length,\r\n externalPackages: this.externalDependencies.size,\r\n entryPoint: this.entryPoint,\r\n rootWidget: this.rootWidget,\r\n };\r\n }\r\n\r\n /**\r\n * Get all errors\r\n */\r\n getErrors() {\r\n return this.errors;\r\n }\r\n}\r\n\r\nexport { WidgetAnalyzer };"], + "mappings": "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", + "names": ["getLogger", "WidgetAnalyzer", "ast", "options", "w", "error", "node", "classNode", "name", "superClass", "location", "widget", "field", "fieldName", "initialValue", "constructorMethod", "m", "method", "methodName", "methodData", "fieldRefs", "p", "body", "fields", "traverse", "key", "val", "funcNode", "func", "source", "items", "spec", "mainFunc", "mainAstNode", "n", "statements", "stmt", "call", "expr", "rootWidget", "widgetArray", "widgets", "statelessCount", "statefulCount", "stateCount"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/lexer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/lexer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/lexer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/lexer.js diff --git a/packages/flutterjs_engine/src/analyzer/dist/lexer.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/lexer.js.map similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/lexer.js.map rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/lexer.js.map diff --git a/packages/flutterjs_engine/src/analyzer/dist/ssr_analyzer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/ssr_analyzer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/ssr_analyzer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/ssr_analyzer.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/ssr_analyzer.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/ssr_analyzer.js.map new file mode 100644 index 00000000..25de424c --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/ssr_analyzer.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/ssr_analyzer.js"], + "sourcesContent": ["/**\r\n * FlutterJS SSR Analyzer - Phase 3 (FIXED)\r\n * Analyzes Server-Side Rendering (SSR) compatibility\r\n * Detects SSR-safe and unsafe patterns\r\n * Generates migration path for SSR compliance\r\n */\r\n\r\nimport {\r\n HydrationRequirement,\r\n LazyLoadOpportunity,\r\n} from './context_analyzer_data.js';\r\nimport { getLogger } from './flutterjs_logger.js';\r\n\r\nclass SSRAnalyzer {\r\n constructor(contextAnalysisResults, stateAnalysisResults = null, options = {}) {\r\n // Input from Phase 2 & 3\r\n this.contextResults = contextAnalysisResults;\r\n this.stateResults = stateAnalysisResults;\r\n\r\n this.options = {\r\n strict: false,\r\n targetPlatform: 'node',\r\n ...options,\r\n };\r\n\r\n // Initialize logger\r\n this.logger = getLogger().createComponentLogger('SSRAnalyzer');\r\n\r\n // Results storage\r\n this.ssrSafePatterns = [];\r\n this.ssrUnsafePatterns = [];\r\n this.hydrationRequirements = [];\r\n this.lazyLoadOpportunities = [];\r\n this.ssrMigrationPath = [];\r\n this.validationIssues = [];\r\n\r\n // Metrics\r\n this.ssrCompatibilityScore = 0;\r\n this.hydrationCount = 0;\r\n this.errors = [];\r\n }\r\n\r\n /**\r\n * Main entry point - analyze SSR compatibility\r\n */\r\n analyze() {\r\n this.logger.startSession('SSRAnalysis');\r\n this.logger.info('Starting SSR compatibility analysis');\r\n\r\n try {\r\n // Phase 1: Detect SSR-safe patterns\r\n this.detectSsrSafePatterns();\r\n this.logger.count('SSR-safe patterns found', this.ssrSafePatterns.length);\r\n\r\n // Phase 2: Detect SSR-unsafe patterns\r\n this.detectSsrUnsafePatterns();\r\n this.logger.count('SSR-unsafe patterns found', this.ssrUnsafePatterns.length);\r\n\r\n // Phase 3: Identify hydration needs\r\n this.identifyHydrationNeeds();\r\n this.logger.count('Hydration dependencies', this.hydrationRequirements.length);\r\n\r\n // Phase 4: Detect lazy load opportunities\r\n this.detectLazyLoadOpportunities();\r\n this.logger.count('Lazy load opportunities', this.lazyLoadOpportunities.length);\r\n\r\n // Phase 5: Generate migration path\r\n this.generateMigrationPath();\r\n this.logger.count('Migration steps', this.ssrMigrationPath.length);\r\n\r\n // Phase 6: Validate and score\r\n this.validateSsrRequirements();\r\n this.calculateCompatibilityScore();\r\n this.logger.count('SSR Compatibility Score', this.ssrCompatibilityScore);\r\n\r\n this.logger.success('SSR analysis complete');\r\n this.logger.endSession('SSRAnalysis');\r\n\r\n return this.getResults();\r\n } catch (error) {\r\n this.logger.failure('SSR analysis failed', error.message);\r\n this.errors.push(error);\r\n this.logger.endSession('SSRAnalysis');\r\n return this.getResults();\r\n }\r\n }\r\n\r\n /**\r\n * Phase 1: Detect SSR-safe patterns\r\n */\r\n detectSsrSafePatterns() {\r\n const patterns = [];\r\n\r\n // Pattern 1: InheritedWidget static accessors\r\n patterns.push({\r\n pattern: 'InheritedWidget static accessors',\r\n example: 'ThemeProvider.of(context)',\r\n safeFor: 'SSR',\r\n why: 'Pure value access, no subscription required',\r\n confidence: 1.0,\r\n category: 'context-access',\r\n frequency: 0,\r\n });\r\n\r\n // Pattern 2: context.read() in build()\r\n patterns.push({\r\n pattern: 'context.read() in build()',\r\n example: 'context.read()',\r\n safeFor: 'SSR',\r\n why: 'Single read at render time, no re-subscription needed',\r\n confidence: 0.95,\r\n category: 'provider-access',\r\n frequency: 0,\r\n });\r\n\r\n // Pattern 3: Static property access\r\n patterns.push({\r\n pattern: 'Theme data access',\r\n example: 'theme.primaryColor',\r\n safeFor: 'SSR',\r\n why: 'Read-only during rendering',\r\n confidence: 1.0,\r\n category: 'value-access',\r\n frequency: 0,\r\n });\r\n\r\n // Pattern 4: MediaQuery for initial layout\r\n patterns.push({\r\n pattern: 'MediaQuery.of() for responsive layout',\r\n example: 'MediaQuery.of(context).size.width',\r\n safeFor: 'SSR',\r\n why: 'Server can set default viewport; client hydrates with actual size',\r\n confidence: 0.85,\r\n category: 'responsive-design',\r\n frequency: 0,\r\n });\r\n\r\n // Pattern 5: One-time async operations\r\n patterns.push({\r\n pattern: 'Async data in FutureBuilder (with cached data)',\r\n example: 'FutureBuilder with pre-fetched data',\r\n safeFor: 'SSR',\r\n why: 'Server can execute async, pass pre-rendered HTML to client',\r\n confidence: 0.80,\r\n category: 'async-operation',\r\n frequency: 0,\r\n });\r\n\r\n // Scan context results for actual safe patterns\r\n if (this.contextResults && this.contextResults.contextAccessPoints) {\r\n this.contextResults.contextAccessPoints.forEach((usage) => {\r\n if (usage.ssrSafe) {\r\n const pattern = patterns.find((p) => p.example.includes(usage.pattern.split('(')[0]));\r\n if (pattern) {\r\n pattern.frequency++;\r\n }\r\n\r\n this.ssrSafePatterns.push({\r\n pattern: usage.pattern,\r\n type: usage.type,\r\n location: usage.location,\r\n example: usage.pattern,\r\n why: usage.reason,\r\n confidence: 0.95,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Add framework patterns\r\n this.ssrSafePatterns.push(...patterns);\r\n }\r\n\r\n /**\r\n * Phase 2: Detect SSR-unsafe patterns\r\n */\r\n detectSsrUnsafePatterns() {\r\n const basePatterns = [\r\n {\r\n pattern: 'context.watch() subscriptions',\r\n example: 'context.watch()',\r\n unsafeFor: 'SSR',\r\n why: 'Requires reactive subscription & listeners on client, not available during server render',\r\n confidence: 1.0,\r\n category: 'provider-subscription',\r\n severity: 'error',\r\n frequency: 0,\r\n },\r\n {\r\n pattern: 'State mutations in event handlers',\r\n example: 'counter.increment() in onPressed',\r\n unsafeFor: 'SSR',\r\n why: 'Event handlers don\\'t exist on server, mutations have no effect',\r\n confidence: 1.0,\r\n category: 'state-mutation',\r\n severity: 'error',\r\n frequency: 0,\r\n },\r\n {\r\n pattern: 'ChangeNotifier.notifyListeners() calls',\r\n example: 'notifyListeners() in method',\r\n unsafeFor: 'SSR',\r\n why: 'Listeners don\\'t exist during initial SSR render',\r\n confidence: 0.95,\r\n category: 'notification',\r\n severity: 'error',\r\n frequency: 0,\r\n },\r\n {\r\n pattern: 'Browser APIs',\r\n example: 'window.localStorage, document.getElementById()',\r\n unsafeFor: 'SSR',\r\n why: 'window and document objects don\\'t exist on Node.js server',\r\n confidence: 1.0,\r\n category: 'browser-api',\r\n severity: 'critical',\r\n frequency: 0,\r\n },\r\n {\r\n pattern: 'Timers and intervals',\r\n example: 'setTimeout, setInterval, setImmediate',\r\n unsafeFor: 'SSR',\r\n why: 'Can cause unexpected behavior and performance issues during server render',\r\n confidence: 0.90,\r\n category: 'async-operation',\r\n severity: 'warning',\r\n frequency: 0,\r\n },\r\n {\r\n pattern: 'Random values without seeding',\r\n example: 'Math.random()',\r\n unsafeFor: 'SSR',\r\n why: 'Different values on server vs client cause hydration mismatch',\r\n confidence: 0.99,\r\n category: 'determinism',\r\n severity: 'error',\r\n frequency: 0,\r\n },\r\n {\r\n pattern: 'Navigator and route access',\r\n example: 'Navigator.of(context).push()',\r\n unsafeFor: 'SSR',\r\n why: 'Navigation happens on client, not on server',\r\n confidence: 1.0,\r\n category: 'navigation',\r\n severity: 'warning',\r\n frequency: 0,\r\n },\r\n {\r\n pattern: 'GestureDetector and event handlers',\r\n example: 'GestureDetector, onTap, onLongPress',\r\n unsafeFor: 'SSR',\r\n why: 'User interactions don\\'t exist on server',\r\n confidence: 1.0,\r\n category: 'user-interaction',\r\n severity: 'warning',\r\n frequency: 0,\r\n },\r\n {\r\n pattern: 'setState in initState or build',\r\n example: 'this.setState(() => {...}) in build()',\r\n unsafeFor: 'SSR',\r\n why: 'Triggers re-render during render cycle, can cause infinite loops',\r\n confidence: 0.95,\r\n category: 'state-management',\r\n severity: 'critical',\r\n frequency: 0,\r\n },\r\n ];\r\n\r\n // Scan context results for actual unsafe patterns\r\n if (this.contextResults && this.contextResults.contextAccessPoints) {\r\n this.contextResults.contextAccessPoints.forEach((usage) => {\r\n if (!usage.ssrSafe) {\r\n const pattern = basePatterns.find((p) => p.example.includes(usage.pattern.split('(')[0]));\r\n if (pattern) {\r\n pattern.frequency++;\r\n }\r\n\r\n this.ssrUnsafePatterns.push({\r\n pattern: usage.pattern,\r\n type: usage.type,\r\n location: usage.location,\r\n example: usage.pattern,\r\n why: usage.reason,\r\n confidence: 0.95,\r\n severity: 'error',\r\n suggestion: usage.getMigrationAdvice?.() || 'Refactor to SSR-safe pattern',\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Add base patterns with frequencies\r\n this.ssrUnsafePatterns.push(...basePatterns);\r\n }\r\n\r\n /**\r\n * Phase 3: Identify hydration needs\r\n */\r\n identifyHydrationNeeds() {\r\n const hydrationNeeds = [];\r\n\r\n // Need 1: ChangeNotifier instances\r\n if (this.contextResults && this.contextResults.changeNotifiers) {\r\n this.contextResults.changeNotifiers.forEach((notifier) => {\r\n if (notifier.consumers && notifier.consumers.length > 0) {\r\n const requirement = new HydrationRequirement(\r\n notifier.name,\r\n `State needs to be re-created and listeners re-attached post-hydration for ${notifier.consumers.length} consumer(s)`,\r\n 0\r\n );\r\n\r\n notifier.consumers.forEach((consumer) => {\r\n requirement.requiredState.push(`${consumer}.state`);\r\n });\r\n\r\n hydrationNeeds.push(requirement);\r\n this.hydrationCount++;\r\n }\r\n });\r\n }\r\n\r\n // Need 2: Provider subscriptions\r\n if (this.contextResults && this.contextResults.providers) {\r\n this.contextResults.providers.forEach((provider) => {\r\n if (provider.accessPatterns && provider.accessPatterns.includes('watch')) {\r\n const requirement = new HydrationRequirement(\r\n `Provider<${provider.valueType}>`,\r\n `context.watch() subscriptions need to be re-established on client for reactive updates`,\r\n 1\r\n );\r\n\r\n requirement.requiresProvider(provider.providerType);\r\n hydrationNeeds.push(requirement);\r\n this.hydrationCount++;\r\n }\r\n });\r\n }\r\n\r\n // Need 3: Event handlers\r\n if (this.stateResults && this.stateResults.eventHandlers) {\r\n this.stateResults.eventHandlers.forEach((handler) => {\r\n if (!hydrationNeeds.some((h) => h.dependency === handler.handler)) {\r\n const requirement = new HydrationRequirement(\r\n handler.handler,\r\n `Event handler \"${handler.handler}\" must be attached to DOM after hydration`,\r\n 2\r\n );\r\n hydrationNeeds.push(requirement);\r\n this.hydrationCount++;\r\n }\r\n });\r\n }\r\n\r\n hydrationNeeds.sort((a, b) => a.order - b.order);\r\n this.hydrationRequirements = hydrationNeeds;\r\n }\r\n\r\n /**\r\n * Phase 4: Detect lazy load opportunities\r\n */\r\n detectLazyLoadOpportunities() {\r\n const opportunities = [];\r\n\r\n // Opportunity 1: Pages not rendered initially\r\n if (this.contextResults && this.contextResults.inheritedWidgets) {\r\n this.contextResults.inheritedWidgets.forEach((widget) => {\r\n if (widget.usageCount === 0 || (widget.usageCount && widget.usageCount <= 1)) {\r\n const opp = new LazyLoadOpportunity(\r\n widget.name,\r\n `${widget.name} is not needed until user navigates to it`,\r\n '15KB',\r\n 'widget'\r\n );\r\n opp.setRecommendation('Use LazyRoute or dynamic import: import(widgetPath)');\r\n opp.calculatePriority(15);\r\n opportunities.push(opp);\r\n }\r\n });\r\n }\r\n\r\n // Opportunity 2: Heavy ChangeNotifiers\r\n if (this.contextResults && this.contextResults.changeNotifiers) {\r\n this.contextResults.changeNotifiers.forEach((notifier) => {\r\n if (notifier.methods && notifier.methods.length > 10) {\r\n const opp = new LazyLoadOpportunity(\r\n notifier.name,\r\n `${notifier.name} is complex and only needed if feature is used`,\r\n '8KB',\r\n 'notifier'\r\n );\r\n opp.setRecommendation('Lazy create in Provider: create: (context) => Provider.lazy(() => import(...))');\r\n opp.calculatePriority(8);\r\n opportunities.push(opp);\r\n }\r\n });\r\n }\r\n\r\n this.lazyLoadOpportunities = opportunities;\r\n }\r\n\r\n /**\r\n * Phase 5: Generate migration path\r\n */\r\n generateMigrationPath() {\r\n const steps = [];\r\n\r\n // Step 1: Replace context.watch()\r\n const watchUnsafe = this.ssrUnsafePatterns.filter((p) => p.pattern?.includes('watch'));\r\n if (watchUnsafe.length > 0) {\r\n steps.push({\r\n step: 1,\r\n action: 'Replace context.watch() with context.read() for SSR',\r\n locations: watchUnsafe.map((p) => p.location),\r\n description: `Found ${watchUnsafe.length} context.watch() calls that need refactoring`,\r\n example: `\r\n// Before (not SSR safe):\r\nfinal counter = context.watch();\r\n\r\n// After (SSR safe):\r\nfinal counter = context.read();\r\n// Subscribe to changes in didChangeDependencies() instead (client-only)`,\r\n effort: 'medium',\r\n priority: 'high',\r\n files: watchUnsafe.length,\r\n });\r\n }\r\n\r\n // Step 2: Move state mutations\r\n const mutationUnsafe = this.ssrUnsafePatterns.filter((p) => p.pattern?.includes('mutation'));\r\n if (mutationUnsafe.length > 0) {\r\n steps.push({\r\n step: 2,\r\n action: 'Move notifyListeners() calls to client-only code',\r\n locations: mutationUnsafe.map((p) => p.location),\r\n description: `Found ${mutationUnsafe.length} state mutations that don't work in SSR`,\r\n example: `\r\n// Before (not SSR safe):\r\ncounter.increment();\r\n\r\n// After (SSR safe):\r\nif (kIsWeb) { // Only on client\r\n counter.increment();\r\n}`,\r\n effort: 'low',\r\n priority: 'high',\r\n files: mutationUnsafe.length,\r\n });\r\n }\r\n\r\n // Step 3: Implement hydration layer\r\n if (this.hydrationRequirements.length > 0) {\r\n steps.push({\r\n step: 3,\r\n action: 'Create hydration layer to re-subscribe listeners post-render',\r\n description: `App requires hydration for ${this.hydrationRequirements.length} dependencies`,\r\n example: `\r\n// In main.js or app.dart after runApp():\r\nif (kIsWeb) {\r\n // Re-create listeners, reattach subscriptions\r\n hydrate(flutterApp);\r\n}`,\r\n effort: 'high',\r\n priority: 'critical',\r\n dependencies: this.hydrationRequirements.length,\r\n });\r\n }\r\n\r\n // Step 4: Add browser API checks\r\n const browserApiUnsafe = this.ssrUnsafePatterns.filter((p) => p.category === 'browser-api');\r\n if (browserApiUnsafe.length > 0) {\r\n steps.push({\r\n step: 4,\r\n action: 'Wrap browser-specific APIs in kIsWeb checks',\r\n description: `Found ${browserApiUnsafe.length} browser API calls`,\r\n example: `\r\n// Before:\r\nfinal stored = window.localStorage.getItem('key');\r\n\r\n// After:\r\nfinal stored = kIsWeb ? window.localStorage.getItem('key') : null;`,\r\n effort: 'low',\r\n priority: 'medium',\r\n files: browserApiUnsafe.length,\r\n });\r\n }\r\n\r\n // Step 5: Implement lazy loading\r\n if (this.lazyLoadOpportunities.length > 0) {\r\n steps.push({\r\n step: 5,\r\n action: 'Implement code splitting for lazy-loaded widgets',\r\n description: `${this.lazyLoadOpportunities.length} opportunities identified`,\r\n example: `\r\n// Use dynamic routes\r\nfinal route = await LazyRoute.create(\r\n () => import('pages/DetailPage.dart')\r\n);`,\r\n effort: 'medium',\r\n priority: 'low',\r\n opportunities: this.lazyLoadOpportunities.length,\r\n });\r\n }\r\n\r\n // Step 6: Test SSR rendering\r\n steps.push({\r\n step: steps.length + 1,\r\n action: 'Set up SSR testing pipeline',\r\n description: 'Render app on server, verify HTML structure',\r\n example: `\r\n// Test SSR output matches CSR:\r\nconst serverHtml = await renderAppOnServer();\r\nconst clientHtml = await renderAppOnClient();\r\nassert(serverHtml === clientHtml, 'SSR/CSR mismatch');`,\r\n effort: 'medium',\r\n priority: 'critical',\r\n });\r\n\r\n this.ssrMigrationPath = steps;\r\n }\r\n\r\n /**\r\n * Phase 6: Validate SSR requirements\r\n */\r\n validateSsrRequirements() {\r\n // Check 1: Browser APIs\r\n this.ssrUnsafePatterns.forEach((pattern) => {\r\n if (pattern.category === 'browser-api') {\r\n this.validationIssues.push({\r\n type: 'browser-api-usage',\r\n severity: 'critical',\r\n pattern: pattern.pattern,\r\n location: pattern.location,\r\n message: `Browser API \"${pattern.pattern}\" is not available on server`,\r\n suggestion: 'Wrap in kIsWeb check or use platform-agnostic alternative',\r\n });\r\n }\r\n });\r\n\r\n // Check 2: Non-deterministic operations\r\n this.ssrUnsafePatterns.forEach((pattern) => {\r\n if (pattern.category === 'determinism') {\r\n this.validationIssues.push({\r\n type: 'non-deterministic',\r\n severity: 'error',\r\n pattern: pattern.pattern,\r\n location: pattern.location,\r\n message: `Non-deterministic operation \"${pattern.pattern}\" causes hydration mismatch`,\r\n suggestion: 'Use seeded random or remove randomness from render path',\r\n });\r\n }\r\n });\r\n\r\n // Check 3: Event handlers in build\r\n const eventHandlersInBuild = this.ssrUnsafePatterns.filter(\r\n (p) => p.category === 'user-interaction'\r\n );\r\n if (eventHandlersInBuild.length > 0) {\r\n this.validationIssues.push({\r\n type: 'event-handlers-in-build',\r\n severity: 'warning',\r\n count: eventHandlersInBuild.length,\r\n message: `${eventHandlersInBuild.length} event handlers defined in build() - they'll be recreated on every render`,\r\n suggestion: 'Move event handler definitions to initState or class level',\r\n });\r\n }\r\n\r\n // Check 4: Hydration completeness\r\n if (this.hydrationRequirements.length > 0 && this.ssrMigrationPath.length === 0) {\r\n this.validationIssues.push({\r\n type: 'incomplete-hydration',\r\n severity: 'error',\r\n message: `App has ${this.hydrationRequirements.length} hydration needs but no hydration layer implemented`,\r\n suggestion: 'Add hydration step to migration path',\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Calculate SSR compatibility score (0-100)\r\n * FIXED: criticalIssues is now defined properly\r\n */\r\n calculateCompatibilityScore() {\r\n let score = 100;\r\n\r\n // Deduct for unsafe patterns\r\n const unsafeCount = this.ssrUnsafePatterns.length;\r\n score -= Math.min(unsafeCount * 5, 40);\r\n\r\n // Deduct for critical issues\r\n const criticalIssues = this.validationIssues.filter((i) => i.severity === 'critical');\r\n score -= criticalIssues.length * 15;\r\n\r\n // Deduct for browser APIs\r\n const browserApiIssues = this.validationIssues.filter((i) => i.type === 'browser-api-usage');\r\n score -= browserApiIssues.length * 10;\r\n\r\n // Add bonus for SSR-safe patterns\r\n const safeCount = this.ssrSafePatterns.length;\r\n if (safeCount > 0) {\r\n score += Math.min(safeCount * 2, 15);\r\n }\r\n\r\n // Add bonus for successful hydration setup\r\n if (this.ssrMigrationPath.length > 3) {\r\n score += 10;\r\n }\r\n\r\n // Ensure score is in valid range\r\n this.ssrCompatibilityScore = Math.max(0, Math.min(100, score));\r\n }\r\n\r\n /**\r\n * Determine overall SSR compatibility\r\n */\r\n getOverallCompatibility() {\r\n if (this.ssrCompatibilityScore >= 85) {\r\n return 'full';\r\n } else if (this.ssrCompatibilityScore >= 60) {\r\n return 'partial';\r\n } else if (this.ssrCompatibilityScore >= 30) {\r\n return 'limited';\r\n } else {\r\n return 'none';\r\n }\r\n }\r\n\r\n /**\r\n * Get estimated migration effort\r\n */\r\n getEstimatedEffort() {\r\n const totalEffort = this.ssrMigrationPath.reduce((sum, step) => {\r\n const effortMap = { low: 1, medium: 2, high: 3 };\r\n return sum + (effortMap[step.effort] || 0);\r\n }, 0);\r\n\r\n if (totalEffort <= 3) {\r\n return 'minimal';\r\n } else if (totalEffort <= 6) {\r\n return 'moderate';\r\n } else if (totalEffort <= 9) {\r\n return 'significant';\r\n } else {\r\n return 'major-rewrite';\r\n }\r\n }\r\n\r\n /**\r\n * Get results - FIXED: criticalIssues defined locally\r\n */\r\n getResults() {\r\n // FIXED: Define criticalIssues locally\r\n const criticalIssues = this.validationIssues.filter((i) => i.severity === 'critical');\r\n\r\n return {\r\n overallCompatibility: this.getOverallCompatibility(),\r\n ssrCompatibilityScore: this.ssrCompatibilityScore,\r\n ssrReadinessScore: this.ssrCompatibilityScore,\r\n\r\n // Patterns\r\n ssrSafePatterns: this.ssrSafePatterns,\r\n ssrUnsafePatterns: this.ssrUnsafePatterns,\r\n\r\n // Hydration & Optimization\r\n hydrationRequirements: this.hydrationRequirements,\r\n hydrationCount: this.hydrationCount,\r\n lazyLoadOpportunities: this.lazyLoadOpportunities,\r\n\r\n // Migration Path\r\n ssrMigrationPath: this.ssrMigrationPath,\r\n estimatedEffort: this.getEstimatedEffort(),\r\n\r\n // Validation & Issues\r\n validationIssues: this.validationIssues,\r\n criticalIssues: criticalIssues,\r\n warningIssues: this.validationIssues.filter((i) => i.severity === 'warning'),\r\n\r\n // Summary\r\n summary: {\r\n compatibility: this.getOverallCompatibility(),\r\n score: this.ssrCompatibilityScore,\r\n safePatterns: this.ssrSafePatterns.length,\r\n unsafePatterns: this.ssrUnsafePatterns.length,\r\n hydrationNeeded: this.hydrationCount,\r\n migrationSteps: this.ssrMigrationPath.length,\r\n criticalIssues: criticalIssues.length,\r\n effort: this.getEstimatedEffort(),\r\n },\r\n\r\n errors: this.errors,\r\n };\r\n }\r\n}\r\n\r\nexport { SSRAnalyzer };"], + "mappings": "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", + "names": ["HydrationRequirement", "LazyLoadOpportunity", "getLogger", "SSRAnalyzer", "contextAnalysisResults", "stateAnalysisResults", "options", "error", "patterns", "usage", "pattern", "p", "basePatterns", "hydrationNeeds", "notifier", "requirement", "consumer", "provider", "handler", "h", "a", "b", "opportunities", "widget", "opp", "steps", "watchUnsafe", "mutationUnsafe", "browserApiUnsafe", "eventHandlersInBuild", "score", "unsafeCount", "criticalIssues", "i", "browserApiIssues", "safeCount", "totalEffort", "sum", "step"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/state_analyzer_data.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_data.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/state_analyzer_data.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_data.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_data.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_data.js.map new file mode 100644 index 00000000..9276c0fa --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_data.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/state_analyzer_data.js"], + "sourcesContent": ["/**\r\n * FlutterJS State Analyzer - Data Classes\r\n * Phase 2 Implementation\r\n * \r\n * Represents all state-related concepts in structured classes\r\n */\r\n\r\n// ============================================================================\r\n// STATE CLASS METADATA\r\n// ============================================================================\r\n\r\n/**\r\n * Metadata about a State class\r\n * Represents: class _MyCounterState extends State { ... }\r\n */\r\nclass StateClassMetadata {\r\n constructor(name, location, linkedStatefulWidget = null) {\r\n // Identity\r\n this.name = name;\r\n this.location = location;\r\n this.linkedStatefulWidget = linkedStatefulWidget;\r\n\r\n // Contents\r\n this.stateFields = []; // _count, _isLoading, etc.\r\n this.lifecycleMethods = []; // initState, dispose, build, etc.\r\n this.eventHandlers = []; // Handlers for events\r\n this.otherMethods = []; // Helper methods like _increment\r\n\r\n // Metadata\r\n this.extends = 'State'; // Usually State or State\r\n this.constructor = null; // Constructor info\r\n }\r\n\r\n /**\r\n * Add a state field to this class\r\n */\r\n addStateField(field) {\r\n if (field instanceof StateField) {\r\n this.stateFields.push(field);\r\n }\r\n }\r\n\r\n /**\r\n * Add a lifecycle method\r\n */\r\n addLifecycleMethod(method) {\r\n if (method instanceof LifecycleMethod) {\r\n this.lifecycleMethods.push(method);\r\n }\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n name: this.name,\r\n statefulWidget: this.linkedStatefulWidget,\r\n fieldCount: this.stateFields.length,\r\n lifecycleMethodCount: this.lifecycleMethods.length,\r\n totalMethods: this.otherMethods.length,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// STATE FIELD\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a single state variable\r\n * Example: _count = 0\r\n */\r\nclass StateField {\r\n constructor(name, type, initialValue, location) {\r\n // Identity\r\n this.name = name;\r\n this.type = type; // 'number', 'string', 'boolean', 'any', etc.\r\n this.location = location;\r\n\r\n // Initial value\r\n this.initialValue = initialValue;\r\n this.initialValueString = this.valueToString(initialValue);\r\n\r\n // Mutability\r\n this.isMutable = true;\r\n this.mutations = []; // Record of where field is mutated\r\n\r\n // Usage tracking\r\n this.usedInMethods = []; // Which methods read this field\r\n this.mutatedInMethods = []; // Which methods mutate this field\r\n this.usedInBuild = false; // Is it used in build() method?\r\n }\r\n\r\n /**\r\n * Record that this field is used in a method\r\n */\r\n recordUsage(methodName) {\r\n if (!this.usedInMethods.includes(methodName)) {\r\n this.usedInMethods.push(methodName);\r\n }\r\n }\r\n\r\n /**\r\n * Record that this field is mutated in a method\r\n */\r\n recordMutation(methodName, operation = '=', location = null) {\r\n this.mutations.push({\r\n method: methodName,\r\n operation, // '++', '--', '=', '+=', '-=', etc.\r\n location,\r\n wrappedInSetState: false, // Will be updated during validation\r\n });\r\n\r\n if (!this.mutatedInMethods.includes(methodName)) {\r\n this.mutatedInMethods.push(methodName);\r\n }\r\n }\r\n\r\n /**\r\n * Check if field is used anywhere\r\n */\r\n isUsed() {\r\n return this.usedInMethods.length > 0 || this.usedInBuild;\r\n }\r\n\r\n /**\r\n * Convert value to string representation\r\n */\r\n valueToString(value) {\r\n if (value === null) return 'null';\r\n if (value === undefined) return 'undefined';\r\n if (typeof value === 'string') return `\"${value}\"`;\r\n if (typeof value === 'boolean') return value ? 'true' : 'false';\r\n if (typeof value === 'number') return String(value);\r\n return String(value);\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n name: this.name,\r\n type: this.type,\r\n initialValue: this.initialValueString,\r\n isUsed: this.isUsed(),\r\n usedInMethods: this.usedInMethods,\r\n mutatedInMethods: this.mutatedInMethods,\r\n mutationCount: this.mutations.length,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// LIFECYCLE METHOD\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a lifecycle hook method\r\n * Examples: initState(), dispose(), didUpdateWidget(), build()\r\n */\r\nclass LifecycleMethod {\r\n constructor(name, location, params = [], callsSuper = false, hasSideEffects = false) {\r\n // Identity\r\n this.name = name;\r\n this.location = location;\r\n this.params = params;\r\n\r\n // Behavior\r\n this.callsSuper = callsSuper;\r\n this.hasSideEffects = hasSideEffects;\r\n\r\n // Validation\r\n this.shouldCallSuper = false; // True if this method should call super\r\n this.validationIssues = [];\r\n }\r\n\r\n /**\r\n * Check if this method type should call super\r\n */\r\n setMustCallSuper(mustCall) {\r\n this.shouldCallSuper = mustCall;\r\n }\r\n\r\n /**\r\n * Add a validation issue\r\n */\r\n addIssue(type, message, severity = 'warning') {\r\n this.validationIssues.push({\r\n type,\r\n message,\r\n severity,\r\n });\r\n }\r\n\r\n /**\r\n * Check if method is valid\r\n */\r\n isValid() {\r\n // dispose() MUST call super\r\n if (this.name === 'dispose' && !this.callsSuper) {\r\n return false;\r\n }\r\n\r\n // initState should call super\r\n if (this.name === 'initState' && !this.callsSuper) {\r\n return false;\r\n }\r\n\r\n return this.validationIssues.filter(v => v.severity === 'error').length === 0;\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n name: this.name,\r\n callsSuper: this.callsSuper,\r\n shouldCallSuper: this.shouldCallSuper,\r\n hasSideEffects: this.hasSideEffects,\r\n isValid: this.isValid(),\r\n issues: this.validationIssues,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// STATE UPDATE CALL\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a single setState() call\r\n * Example: this.setState(() => { this._count++; })\r\n */\r\nclass StateUpdateCall {\r\n constructor(location, method, updates = [], stateClassName) {\r\n // Location\r\n this.location = location;\r\n this.method = method; // Which method contains this call\r\n this.stateClassName = stateClassName;\r\n\r\n // What's being updated\r\n this.updates = updates || []; // Field names being updated\r\n\r\n // Validation\r\n this.isValid = true;\r\n this.issues = [];\r\n }\r\n\r\n /**\r\n * Add a validation issue\r\n */\r\n addIssue(type, message, severity = 'error') {\r\n this.issues.push({\r\n type,\r\n message,\r\n severity,\r\n });\r\n if (severity === 'error') {\r\n this.isValid = false;\r\n }\r\n }\r\n\r\n /**\r\n * Check if this call updates a specific field\r\n */\r\n updatesField(fieldName) {\r\n return this.updates.includes(fieldName);\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n method: this.method,\r\n updates: this.updates,\r\n isValid: this.isValid,\r\n issueCount: this.issues.length,\r\n issues: this.issues,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EVENT HANDLER\r\n// ============================================================================\r\n\r\n/**\r\n * Represents an event handler attached to a widget\r\n * Example: onPressed: () => this._increment()\r\n */\r\nclass EventHandler {\r\n constructor(event, handler, location, component = 'Unknown') {\r\n // Identification\r\n this.event = event; // 'onPressed', 'onChange', etc.\r\n this.handler = handler; // Method name: '_increment'\r\n this.location = location;\r\n this.component = component; // 'Button', 'TextField', etc.\r\n\r\n // Validation\r\n this.isValid = true;\r\n this.issues = [];\r\n this.triggersSetState = false; // Does handler call setState?\r\n }\r\n\r\n /**\r\n * Add validation issue\r\n */\r\n addIssue(type, message, severity = 'error') {\r\n this.issues.push({\r\n type,\r\n message,\r\n severity,\r\n });\r\n if (severity === 'error') {\r\n this.isValid = false;\r\n }\r\n }\r\n\r\n /**\r\n * Mark that this handler triggers setState\r\n */\r\n marksSetState(trigger = true) {\r\n this.triggersSetState = trigger;\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n event: this.event,\r\n handler: this.handler,\r\n component: this.component,\r\n triggersSetState: this.triggersSetState,\r\n isValid: this.isValid,\r\n issues: this.issues,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// DEPENDENCY GRAPH\r\n// ============================================================================\r\n\r\n/**\r\n * Maps relationships between state, methods, and events\r\n */\r\nclass DependencyGraph {\r\n constructor() {\r\n // State \u2192 Methods: which methods use which state\r\n this.stateToMethods = new Map();\r\n\r\n // Method \u2192 State: which state each method uses\r\n this.methodToState = new Map();\r\n\r\n // Event \u2192 State: which state each event updates\r\n this.eventToState = new Map();\r\n\r\n // Method \u2192 Methods: which methods call which methods\r\n this.methodToMethods = new Map();\r\n }\r\n\r\n /**\r\n * Add state \u2192 method mapping\r\n */\r\n addStateUse(stateName, methodName) {\r\n if (!this.stateToMethods.has(stateName)) {\r\n this.stateToMethods.set(stateName, []);\r\n }\r\n const methods = this.stateToMethods.get(stateName);\r\n if (!methods.includes(methodName)) {\r\n methods.push(methodName);\r\n }\r\n }\r\n\r\n /**\r\n * Add method \u2192 state mapping\r\n */\r\n addMethodStateUse(methodName, stateName) {\r\n if (!this.methodToState.has(methodName)) {\r\n this.methodToState.set(methodName, []);\r\n }\r\n const states = this.methodToState.get(methodName);\r\n if (!states.includes(stateName)) {\r\n states.push(stateName);\r\n }\r\n }\r\n\r\n /**\r\n * Add event \u2192 state mapping\r\n */\r\n addEventStateUse(eventName, stateName) {\r\n if (!this.eventToState.has(eventName)) {\r\n this.eventToState.set(eventName, []);\r\n }\r\n const states = this.eventToState.get(eventName);\r\n if (!states.includes(stateName)) {\r\n states.push(stateName);\r\n }\r\n }\r\n\r\n /**\r\n * Get all state that a method depends on\r\n */\r\n getStateForMethod(methodName) {\r\n return this.methodToState.get(methodName) || [];\r\n }\r\n\r\n /**\r\n * Get all methods that use a state\r\n */\r\n getMethodsForState(stateName) {\r\n return this.stateToMethods.get(stateName) || [];\r\n }\r\n\r\n /**\r\n * Get state that an event triggers\r\n */\r\n getStateForEvent(eventName) {\r\n return this.eventToState.get(eventName) || [];\r\n }\r\n\r\n /**\r\n * Get summary\r\n */\r\n summary() {\r\n return {\r\n stateToMethods: Object.fromEntries(this.stateToMethods),\r\n methodToState: Object.fromEntries(this.methodToState),\r\n eventToState: Object.fromEntries(this.eventToState),\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// VALIDATION RESULT\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a single validation issue found during analysis\r\n */\r\nclass ValidationResult {\r\n constructor(type, message, severity = 'warning', location = null) {\r\n this.type = type; // 'unused-state', 'missing-super', etc.\r\n this.message = message;\r\n this.severity = severity; // 'error', 'warning', 'info'\r\n this.location = location;\r\n\r\n this.suggestion = null; // How to fix it\r\n this.affectedItem = null; // Field, method, etc. that has the issue\r\n }\r\n\r\n /**\r\n * Add a suggestion for fixing the issue\r\n */\r\n withSuggestion(suggestion) {\r\n this.suggestion = suggestion;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set what item is affected\r\n */\r\n affecting(item) {\r\n this.affectedItem = item;\r\n return this;\r\n }\r\n\r\n /**\r\n * Convert to output format\r\n */\r\n toObject() {\r\n return {\r\n type: this.type,\r\n message: this.message,\r\n severity: this.severity,\r\n location: this.location,\r\n suggestion: this.suggestion,\r\n affectedItem: this.affectedItem,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// ANALYSIS SUMMARY\r\n// ============================================================================\r\n\r\n/**\r\n * Summary statistics of the entire state analysis\r\n */\r\nclass AnalysisSummary {\r\n constructor() {\r\n this.stateClassCount = 0;\r\n this.stateFieldCount = 0;\r\n this.setStateCallCount = 0;\r\n this.lifecycleMethodCount = 0;\r\n this.eventHandlerCount = 0;\r\n\r\n this.errorCount = 0;\r\n this.warningCount = 0;\r\n\r\n this.complexityScore = 0; // 0-100\r\n this.healthScore = 0; // 0-100\r\n }\r\n\r\n /**\r\n * Calculate complexity score based on state complexity\r\n */\r\n calculateComplexity() {\r\n let score = 0;\r\n\r\n // More state fields = more complex\r\n score += Math.min(this.stateFieldCount * 10, 40);\r\n\r\n // More setState calls = more complex\r\n score += Math.min(this.setStateCallCount * 5, 30);\r\n\r\n // More event handlers = more complex\r\n score += Math.min(this.eventHandlerCount * 2, 20);\r\n\r\n this.complexityScore = Math.min(100, score);\r\n return this.complexityScore;\r\n }\r\n\r\n /**\r\n * Calculate health score\r\n */\r\n calculateHealth() {\r\n let score = 100;\r\n\r\n // Deduct for errors\r\n score -= this.errorCount * 10;\r\n\r\n // Deduct for warnings\r\n score -= this.warningCount * 2;\r\n\r\n // Deduct for high complexity\r\n if (this.complexityScore > 70) {\r\n score -= 10;\r\n }\r\n\r\n this.healthScore = Math.max(0, score);\r\n return this.healthScore;\r\n }\r\n\r\n /**\r\n * Get summary object\r\n */\r\n toObject() {\r\n return {\r\n stateClasses: this.stateClassCount,\r\n stateFields: this.stateFieldCount,\r\n setStateCalls: this.setStateCallCount,\r\n lifecycleMethods: this.lifecycleMethodCount,\r\n eventHandlers: this.eventHandlerCount,\r\n errors: this.errorCount,\r\n warnings: this.warningCount,\r\n complexityScore: this.complexityScore,\r\n healthScore: this.healthScore,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n StateClassMetadata,\r\n StateField,\r\n LifecycleMethod,\r\n StateUpdateCall,\r\n EventHandler,\r\n DependencyGraph,\r\n ValidationResult,\r\n AnalysisSummary,\r\n};"], + "mappings": "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", + "names": ["StateClassMetadata", "name", "location", "linkedStatefulWidget", "field", "StateField", "method", "LifecycleMethod", "type", "initialValue", "methodName", "operation", "value", "params", "callsSuper", "hasSideEffects", "mustCall", "message", "severity", "v", "StateUpdateCall", "updates", "stateClassName", "fieldName", "EventHandler", "event", "handler", "component", "trigger", "DependencyGraph", "stateName", "methods", "states", "eventName", "ValidationResult", "suggestion", "item", "AnalysisSummary", "score"] +} diff --git a/packages/flutterjs_engine/src/analyzer/dist/state_analyzer_implementation.js b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_implementation.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/dist/state_analyzer_implementation.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_implementation.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_implementation.js.map b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_implementation.js.map new file mode 100644 index 00000000..c29af207 --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/dist/state_analyzer_implementation.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/state_analyzer_implementation.js"], + "sourcesContent": ["/**\r\n * FlutterJS State Analyzer\r\n * Phase 2 Implementation\r\n * \r\n * Extracts state management information from StatefulWidget/State classes\r\n * No external dependencies - pure Node.js\r\n */\r\n\r\n// ============================================================================\r\n// STATE ANALYZER CLASS\r\n// ============================================================================\r\n\r\nclass StateAnalyzer {\r\n constructor(ast, widgets, options = {}) {\r\n this.ast = ast;\r\n this.widgets = widgets; // from Phase 1 WidgetAnalyzer\r\n this.options = {\r\n strict: false,\r\n ...options,\r\n };\r\n\r\n // Results storage\r\n this.stateClasses = new Map();\r\n this.stateFields = new Map();\r\n this.setStateCalls = [];\r\n this.lifecycleMethods = [];\r\n this.eventHandlers = [];\r\n this.dependencyGraph = null;\r\n this.validationResults = [];\r\n this.errors = [];\r\n }\r\n\r\n /**\r\n * Main entry point - analyze all state-related code\r\n */\r\n analyze() {\r\n if (!this.ast || !this.ast.body) {\r\n throw new Error('Invalid AST provided');\r\n }\r\n\r\n try {\r\n // Phase 1: Find and link StatefulWidget/State pairs\r\n this.linkStatefulToState();\r\n\r\n // Phase 2: Extract state fields from State classes\r\n this.extractStateFields();\r\n\r\n // Phase 3: Find setState calls\r\n this.findSetStateCalls();\r\n\r\n // Phase 4: Extract lifecycle methods\r\n this.extractLifecycleMethods();\r\n\r\n // Phase 5: Extract event handlers\r\n this.extractEventHandlers();\r\n\r\n // Phase 6: Build dependency graph\r\n this.buildDependencyGraph();\r\n\r\n // Phase 7: Validate everything\r\n this.validateState();\r\n\r\n return this.getResults();\r\n } catch (error) {\r\n this.errors.push(error);\r\n return this.getResults();\r\n }\r\n }\r\n\r\n /**\r\n * Phase 1: Link StatefulWidget to State class\r\n * \r\n * StatefulWidget.createState() returns State class instance\r\n * We need to find the return value and match it with State class\r\n */\r\n linkStatefulToState() {\r\n this.widgets.forEach((widget) => {\r\n if (widget.type !== 'stateful') return;\r\n\r\n // Find the createState method\r\n const createStateMethod = widget.methods.find(\r\n (m) => m.name === 'createState'\r\n );\r\n\r\n if (!createStateMethod) {\r\n this.errors.push({\r\n type: 'missing-create-state',\r\n widget: widget.name,\r\n message: `StatefulWidget \"${widget.name}\" has no createState() method`,\r\n });\r\n return;\r\n }\r\n\r\n // Find the corresponding class declaration in AST\r\n const widgetNode = this.ast.body.find(\r\n (n) => n.type === 'ClassDeclaration' && n.id.name === widget.name\r\n );\r\n\r\n if (!widgetNode) return;\r\n\r\n // Find what createState returns\r\n const createStateNode = widgetNode.body.methods.find(\r\n (m) => m.key.name === 'createState'\r\n );\r\n\r\n if (!createStateNode) return;\r\n\r\n // Extract the returned State class name\r\n const stateClassName = this.extractReturnedClassName(createStateNode.body);\r\n\r\n if (!stateClassName) {\r\n this.errors.push({\r\n type: 'cannot-parse-create-state',\r\n widget: widget.name,\r\n message: `Cannot determine which State class is returned by ${widget.name}.createState()`,\r\n });\r\n return;\r\n }\r\n\r\n // Find the State class\r\n const stateClassNode = this.ast.body.find(\r\n (n) => n.type === 'ClassDeclaration' && n.id.name === stateClassName\r\n );\r\n\r\n if (!stateClassNode) {\r\n this.errors.push({\r\n type: 'missing-state-class',\r\n widget: widget.name,\r\n stateClass: stateClassName,\r\n message: `State class \"${stateClassName}\" not found`,\r\n });\r\n return;\r\n }\r\n\r\n // Check if it extends State\r\n if (!stateClassNode.superClass || !stateClassNode.superClass.name.startsWith('State')) {\r\n this.errors.push({\r\n type: 'invalid-state-class',\r\n stateClass: stateClassName,\r\n message: `Class \"${stateClassName}\" does not extend State`,\r\n });\r\n return;\r\n }\r\n\r\n // Create StateClassMetadata\r\n const stateMetadata = new StateClassMetadata(\r\n stateClassName,\r\n stateClassNode.location,\r\n widget.name\r\n );\r\n\r\n this.stateClasses.set(stateClassName, {\r\n astNode: stateClassNode,\r\n metadata: stateMetadata,\r\n });\r\n\r\n // Link bidirectional\r\n widget.linkedStateClass = stateClassName;\r\n });\r\n }\r\n\r\n /**\r\n * Extract the class name returned from a method\r\n * Looks for: return new ClassName(); or return new ClassName();\r\n */\r\n extractReturnedClassName(methodBody) {\r\n if (!methodBody) return null;\r\n\r\n // Handle BlockStatement: { return new ClassName(); }\r\n if (methodBody.type === 'BlockStatement' && methodBody.body) {\r\n for (const stmt of methodBody.body) {\r\n if (stmt.type === 'ReturnStatement' && stmt.argument) {\r\n const className = this.getClassNameFromExpression(stmt.argument);\r\n if (className) return className;\r\n }\r\n }\r\n }\r\n\r\n // Handle direct expression: return new ClassName();\r\n if (methodBody.type === 'NewExpression') {\r\n return methodBody.callee.name;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Extract class name from expression (new ClassName or ClassName)\r\n */\r\n getClassNameFromExpression(expr) {\r\n if (!expr) return null;\r\n\r\n if (expr.type === 'NewExpression' && expr.callee) {\r\n return expr.callee.name;\r\n }\r\n\r\n if (expr.type === 'Identifier') {\r\n return expr.name;\r\n }\r\n\r\n if (expr.type === 'CallExpression' && expr.callee) {\r\n if (expr.callee.type === 'Identifier') {\r\n return expr.callee.name;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Phase 2: Extract state fields from State classes\r\n * \r\n * State fields are class properties that can be mutated\r\n * Examples: _count = 0, _isLoading = false\r\n */\r\n extractStateFields() {\r\n this.stateClasses.forEach(({ astNode, metadata }) => {\r\n if (!astNode.body || !astNode.body.fields) return;\r\n\r\n astNode.body.fields.forEach((field) => {\r\n const fieldName = field.key.name;\r\n const initialValue = field.initialValue;\r\n\r\n // Infer type from initial value\r\n const type = this.inferFieldType(initialValue);\r\n\r\n const stateField = new StateField(\r\n fieldName,\r\n type,\r\n this.expressionToValue(initialValue),\r\n initialValue ? initialValue.location : field.location\r\n );\r\n\r\n // Track in global map and in metadata\r\n this.stateFields.set(`${metadata.name}.${fieldName}`, stateField);\r\n metadata.stateFields.push(stateField);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Infer field type from initial value expression\r\n */\r\n inferFieldType(expr) {\r\n if (!expr) return 'any';\r\n\r\n if (expr.type === 'Literal') {\r\n if (typeof expr.value === 'number') return 'number';\r\n if (typeof expr.value === 'string') return 'string';\r\n if (typeof expr.value === 'boolean') return 'boolean';\r\n if (expr.value === null) return 'null';\r\n }\r\n\r\n if (expr.type === 'Identifier') {\r\n const name = expr.name;\r\n if (name === 'true' || name === 'false') return 'boolean';\r\n if (name === 'null') return 'null';\r\n if (name === 'undefined') return 'undefined';\r\n }\r\n\r\n // Array literal\r\n if (expr.type === 'ArrayLiteral') return 'array';\r\n\r\n // Object literal\r\n if (expr.type === 'ObjectLiteral') return 'object';\r\n\r\n // Function call - unknown return type\r\n if (expr.type === 'CallExpression') return 'any';\r\n\r\n return 'any';\r\n }\r\n\r\n /**\r\n * Convert expression to actual value (for initialization)\r\n */\r\n expressionToValue(expr) {\r\n if (!expr) return undefined;\r\n\r\n if (expr.type === 'Literal') {\r\n return expr.value;\r\n }\r\n\r\n if (expr.type === 'Identifier') {\r\n const name = expr.name;\r\n if (name === 'true') return true;\r\n if (name === 'false') return false;\r\n if (name === 'null') return null;\r\n if (name === 'undefined') return undefined;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Phase 3: Find all setState() calls\r\n */\r\n findSetStateCalls() {\r\n this.stateClasses.forEach(({ astNode, metadata }) => {\r\n if (!astNode.body || !astNode.body.methods) return;\r\n\r\n // Search all methods for setState calls\r\n astNode.body.methods.forEach((method) => {\r\n const setStateCalls = this.findSetStateInMethod(method, metadata.name);\r\n this.setStateCalls.push(...setStateCalls);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Find setState calls within a method\r\n */\r\n findSetStateInMethod(method, stateClassName) {\r\n const calls = [];\r\n const methodName = method.key.name;\r\n\r\n // Search method body for setState calls\r\n if (method.body) {\r\n const stmts = method.body.type === 'BlockStatement'\r\n ? method.body.body\r\n : [method.body];\r\n\r\n stmts.forEach((stmt) => {\r\n this.findSetStateInStatement(stmt, calls, methodName, stateClassName);\r\n });\r\n }\r\n\r\n return calls;\r\n }\r\n\r\n /**\r\n * Recursively find setState in statements\r\n */\r\n findSetStateInStatement(stmt, calls, methodName, stateClassName) {\r\n if (!stmt) return;\r\n\r\n // Handle expression statements\r\n if (stmt.type === 'ExpressionStatement' && stmt.expression) {\r\n this.findSetStateInExpression(stmt.expression, calls, methodName, stateClassName);\r\n }\r\n\r\n // Handle return statements\r\n if (stmt.type === 'ReturnStatement' && stmt.argument) {\r\n this.findSetStateInExpression(stmt.argument, calls, methodName, stateClassName);\r\n }\r\n\r\n // Handle blocks\r\n if (stmt.type === 'BlockStatement' && stmt.body) {\r\n stmt.body.forEach((s) => {\r\n this.findSetStateInStatement(s, calls, methodName, stateClassName);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Find setState in expression tree\r\n */\r\n findSetStateInExpression(expr, calls, methodName, stateClassName) {\r\n if (!expr) return;\r\n\r\n // Check if this is a setState call: this.setState(callback)\r\n if (expr.type === 'CallExpression') {\r\n // Check if it's this.setState(...)\r\n const isSetState = this.isSetStateCall(expr);\r\n\r\n if (isSetState) {\r\n const updatedFields = this.extractSetStateUpdates(expr, stateClassName);\r\n const call = new StateUpdateCall(\r\n expr.location,\r\n methodName,\r\n updatedFields,\r\n stateClassName\r\n );\r\n calls.push(call);\r\n }\r\n\r\n // Also check arguments for nested setState calls\r\n expr.args.forEach((arg) => {\r\n this.findSetStateInExpression(arg, calls, methodName, stateClassName);\r\n });\r\n }\r\n\r\n // Recursively check nested expressions\r\n if (expr.type === 'ObjectLiteral' && expr.properties) {\r\n expr.properties.forEach((prop) => {\r\n this.findSetStateInExpression(prop.value, calls, methodName, stateClassName);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Check if expression is this.setState(...)\r\n */\r\n isSetStateCall(expr) {\r\n if (expr.type !== 'CallExpression') return false;\r\n if (!expr.callee) return false;\r\n\r\n // Check for member expression: this.setState\r\n if (expr.callee.type === 'MemberExpression') {\r\n const obj = expr.callee.object;\r\n const prop = expr.callee.property;\r\n\r\n // this.setState\r\n if (obj.type === 'Identifier' && obj.name === 'this' &&\r\n prop.type === 'Identifier' && prop.name === 'setState') {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Extract which state fields are updated in setState\r\n * setState(() => { this._count++; })\r\n */\r\n extractSetStateUpdates(setStateCall, stateClassName) {\r\n const updated = [];\r\n\r\n if (!setStateCall.args || setStateCall.args.length === 0) return updated;\r\n\r\n // First argument is the callback: () => { ... }\r\n const callback = setStateCall.args[0];\r\n\r\n if (callback.type === 'ArrowFunctionExpression') {\r\n // Extract body\r\n const body = callback.body;\r\n\r\n if (body.type === 'BlockStatement' && body.body) {\r\n // Search for field mutations: this._field = value, this._field++, etc.\r\n body.body.forEach((stmt) => {\r\n const mutated = this.extractMutatedFields(stmt, stateClassName);\r\n updated.push(...mutated);\r\n });\r\n } else if (body.type === 'UpdateExpression' || body.type === 'AssignmentExpression') {\r\n // Direct mutation in arrow body\r\n const mutated = this.extractMutatedFields(body, stateClassName);\r\n updated.push(...mutated);\r\n }\r\n }\r\n\r\n return [...new Set(updated)]; // Remove duplicates\r\n }\r\n\r\n /**\r\n * Extract mutated fields from statement\r\n * Looks for: this._field = x, this._field++, this._field += x\r\n */\r\n extractMutatedFields(stmt, stateClassName) {\r\n const fields = [];\r\n\r\n if (!stmt) return fields;\r\n\r\n // Assignment: this._field = value\r\n if (stmt.type === 'ExpressionStatement' && stmt.expression) {\r\n const expr = stmt.expression;\r\n\r\n if (expr.type === 'AssignmentExpression') {\r\n const fieldName = this.getFieldNameFromTarget(expr.left);\r\n if (fieldName) fields.push(fieldName);\r\n }\r\n\r\n // Update expression: this._field++, this._field--\r\n if (expr.type === 'UpdateExpression') {\r\n const fieldName = this.getFieldNameFromTarget(expr.argument);\r\n if (fieldName) fields.push(fieldName);\r\n }\r\n }\r\n\r\n // Direct assignment/update (arrow body)\r\n if (stmt.type === 'AssignmentExpression') {\r\n const fieldName = this.getFieldNameFromTarget(stmt.left);\r\n if (fieldName) fields.push(fieldName);\r\n }\r\n\r\n if (stmt.type === 'UpdateExpression') {\r\n const fieldName = this.getFieldNameFromTarget(stmt.argument);\r\n if (fieldName) fields.push(fieldName);\r\n }\r\n\r\n return fields;\r\n }\r\n\r\n /**\r\n * Get field name from assignment target\r\n * Handles: this._field, obj.field, etc.\r\n */\r\n getFieldNameFromTarget(target) {\r\n if (!target) return null;\r\n\r\n // this._field\r\n if (target.type === 'MemberExpression') {\r\n const obj = target.object;\r\n const prop = target.property;\r\n\r\n // this._field\r\n if (obj.type === 'Identifier' && obj.name === 'this' &&\r\n prop.type === 'Identifier') {\r\n return prop.name;\r\n }\r\n }\r\n\r\n // _field (direct identifier)\r\n if (target.type === 'Identifier') {\r\n return target.name;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Phase 4: Extract lifecycle methods\r\n * \r\n * Lifecycle methods: initState, dispose, didUpdateWidget, build\r\n */\r\n extractLifecycleMethods() {\r\n const lifecycleNames = ['initState', 'dispose', 'didUpdateWidget', 'build'];\r\n\r\n this.stateClasses.forEach(({ astNode, metadata }) => {\r\n if (!astNode.body || !astNode.body.methods) return;\r\n\r\n astNode.body.methods.forEach((method) => {\r\n const methodName = method.key.name;\r\n\r\n if (lifecycleNames.includes(methodName)) {\r\n const lifecycle = new LifecycleMethod(\r\n methodName,\r\n method.location,\r\n method.params || [],\r\n this.checkCallsSuper(method),\r\n this.checkHasSideEffects(method)\r\n );\r\n\r\n this.lifecycleMethods.push(lifecycle);\r\n metadata.lifecycleMethods.push(lifecycle);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Check if method calls super.methodName()\r\n */\r\n checkCallsSuper(method) {\r\n if (!method.body) return false;\r\n\r\n const stmts = method.body.type === 'BlockStatement'\r\n ? method.body.body\r\n : [method.body];\r\n\r\n for (const stmt of stmts) {\r\n if (stmt.type === 'ExpressionStatement' && stmt.expression) {\r\n const expr = stmt.expression;\r\n\r\n // super.initState() pattern\r\n if (expr.type === 'CallExpression' && expr.callee.type === 'MemberExpression') {\r\n const obj = expr.callee.object;\r\n const prop = expr.callee.property;\r\n\r\n if (obj.type === 'Identifier' && obj.name === 'super' &&\r\n prop.type === 'Identifier' && prop.name === method.key.name) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if method has side effects (console.log, assignments, etc.)\r\n */\r\n checkHasSideEffects(method) {\r\n if (!method.body) return false;\r\n\r\n const stmts = method.body.type === 'BlockStatement'\r\n ? method.body.body\r\n : [method.body];\r\n\r\n for (const stmt of stmts) {\r\n // Assignment has side effect\r\n if (stmt.type === 'ExpressionStatement' && stmt.expression) {\r\n const expr = stmt.expression;\r\n\r\n if (expr.type === 'AssignmentExpression' || expr.type === 'UpdateExpression') {\r\n return true;\r\n }\r\n\r\n // Function calls might have side effects\r\n if (expr.type === 'CallExpression') {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Phase 5: Extract event handlers from build method\r\n * \r\n * Looks for: onPressed: () => handler(), onChange: handler, etc.\r\n */\r\n extractEventHandlers() {\r\n this.stateClasses.forEach(({ astNode, metadata }) => {\r\n if (!astNode.body || !astNode.body.methods) return;\r\n\r\n // Find build method\r\n const buildMethod = astNode.body.methods.find((m) => m.key.name === 'build');\r\n if (!buildMethod) return;\r\n\r\n // Extract event handlers from the build method body\r\n const handlers = this.findEventHandlersInMethod(buildMethod, metadata.name);\r\n this.eventHandlers.push(...handlers);\r\n });\r\n }\r\n\r\n /**\r\n * Find event handlers in method body\r\n */\r\n findEventHandlersInMethod(method, stateClassName) {\r\n const handlers = [];\r\n\r\n if (!method.body) return handlers;\r\n\r\n const stmts = method.body.type === 'BlockStatement'\r\n ? method.body.body\r\n : [method.body];\r\n\r\n stmts.forEach((stmt) => {\r\n this.findEventHandlersInStatement(stmt, handlers, stateClassName);\r\n });\r\n\r\n return handlers;\r\n }\r\n\r\n /**\r\n * Recursively find event handlers in statements\r\n */\r\n findEventHandlersInStatement(stmt, handlers, stateClassName) {\r\n if (!stmt) return;\r\n\r\n if (stmt.type === 'ExpressionStatement' && stmt.expression) {\r\n this.findEventHandlersInExpression(stmt.expression, handlers, stateClassName);\r\n }\r\n\r\n if (stmt.type === 'ReturnStatement' && stmt.argument) {\r\n this.findEventHandlersInExpression(stmt.argument, handlers, stateClassName);\r\n }\r\n\r\n if (stmt.type === 'BlockStatement' && stmt.body) {\r\n stmt.body.forEach((s) => {\r\n this.findEventHandlersInStatement(s, handlers, stateClassName);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Find event handlers in expressions\r\n * Looks for: { onPressed: () => handler(), onChange: handler }\r\n */\r\n findEventHandlersInExpression(expr, handlers, stateClassName) {\r\n if (!expr) return;\r\n\r\n // Check object literals for event properties\r\n if (expr.type === 'ObjectLiteral' && expr.properties) {\r\n expr.properties.forEach((prop) => {\r\n // Property key is the event name (onPressed, onChange, etc.)\r\n const eventName = this.getPropertyKey(prop.key);\r\n const eventPattern = /^on[A-Z]/; // onPressed, onChange, etc.\r\n\r\n if (eventPattern.test(eventName)) {\r\n // Extract handler from property value\r\n const handler = this.extractEventHandler(prop.value, stateClassName);\r\n\r\n if (handler) {\r\n handlers.push({\r\n event: eventName,\r\n handler: handler,\r\n location: prop.location,\r\n component: this.getComponentNameFromContext(expr),\r\n });\r\n }\r\n }\r\n\r\n // Also search nested values\r\n this.findEventHandlersInExpression(prop.value, handlers, stateClassName);\r\n });\r\n }\r\n\r\n // Check call expressions (widget calls)\r\n if (expr.type === 'CallExpression' && expr.args) {\r\n expr.args.forEach((arg) => {\r\n this.findEventHandlersInExpression(arg, handlers, stateClassName);\r\n });\r\n }\r\n\r\n // Check new expressions\r\n if (expr.type === 'NewExpression' && expr.args) {\r\n expr.args.forEach((arg) => {\r\n this.findEventHandlersInExpression(arg, handlers, stateClassName);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get property key from object property\r\n */\r\n getPropertyKey(keyExpr) {\r\n if (!keyExpr) return null;\r\n\r\n if (keyExpr.type === 'Identifier') {\r\n return keyExpr.name;\r\n }\r\n\r\n if (keyExpr.type === 'Literal') {\r\n return String(keyExpr.value);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Extract handler reference from property value\r\n * Can be: () => handler(), handler, () => { ... }\r\n */\r\n extractEventHandler(value, stateClassName) {\r\n if (!value) return null;\r\n\r\n // Arrow function: () => handler()\r\n if (value.type === 'ArrowFunctionExpression') {\r\n if (value.body.type === 'CallExpression') {\r\n const handlerName = this.getClassNameFromExpression(value.body.callee);\r\n return handlerName;\r\n }\r\n\r\n // Check if body is identifier: () => handler\r\n if (value.body.type === 'Identifier') {\r\n return value.body.name;\r\n }\r\n }\r\n\r\n // Direct identifier: handler\r\n if (value.type === 'Identifier') {\r\n return value.name;\r\n }\r\n\r\n // Member expression: this.handler\r\n if (value.type === 'MemberExpression') {\r\n if (value.property.type === 'Identifier') {\r\n return value.property.name;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get component name (for context, since we don't have full widget info here)\r\n */\r\n getComponentNameFromContext(expr) {\r\n // This is simplified - in a real scenario you'd track which widget\r\n // contains this object literal\r\n if (expr.type === 'CallExpression' && expr.callee) {\r\n return this.getClassNameFromExpression(expr.callee);\r\n }\r\n\r\n return 'Unknown';\r\n }\r\n\r\n /**\r\n * Phase 6: Build state dependency graph\r\n * \r\n * Maps:\r\n * - stateToMethods: which methods use which state\r\n * - methodToState: which state each method uses\r\n * - eventToState: which state each event updates\r\n */\r\n buildDependencyGraph() {\r\n this.dependencyGraph = new DependencyGraph();\r\n\r\n // State to methods\r\n this.stateFields.forEach((field, key) => {\r\n const methods = this.findMethodsUsingField(field.name);\r\n if (methods.length > 0) {\r\n this.dependencyGraph.stateToMethods.set(field.name, methods);\r\n }\r\n });\r\n\r\n // Methods to state\r\n this.stateClasses.forEach(({ metadata }) => {\r\n metadata.stateFields.forEach((field) => {\r\n const methodsUsing = this.findMethodsReadingField(metadata.name, field.name);\r\n if (methodsUsing.length > 0) {\r\n this.dependencyGraph.methodToState.set(field.name, methodsUsing);\r\n }\r\n });\r\n });\r\n\r\n // Event to state\r\n this.eventHandlers.forEach((event) => {\r\n const stateChanged = this.findStateChangedByMethod(event.handler);\r\n if (stateChanged.length > 0) {\r\n this.dependencyGraph.eventToState.set(event.event, stateChanged);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Find methods that use a state field\r\n */\r\n findMethodsUsingField(fieldName) {\r\n const methods = new Set();\r\n\r\n this.setStateCalls.forEach((call) => {\r\n if (call.updates.includes(fieldName)) {\r\n methods.add(call.method);\r\n }\r\n });\r\n\r\n // Also check if field is used in build (for reading)\r\n this.stateClasses.forEach(({ astNode, metadata }) => {\r\n if (!astNode.body || !astNode.body.methods) return;\r\n\r\n const buildMethod = astNode.body.methods.find((m) => m.key.name === 'build');\r\n if (buildMethod && this.methodUsesField(buildMethod, fieldName)) {\r\n methods.add('build');\r\n }\r\n });\r\n\r\n return Array.from(methods);\r\n }\r\n\r\n /**\r\n * Check if method uses a field\r\n */\r\n methodUsesField(method, fieldName) {\r\n if (!method.body) return false;\r\n\r\n const stmts = method.body.type === 'BlockStatement'\r\n ? method.body.body\r\n : [method.body];\r\n\r\n for (const stmt of stmts) {\r\n if (this.statementUsesField(stmt, fieldName)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if statement contains field reference\r\n */\r\n statementUsesField(stmt, fieldName) {\r\n if (!stmt) return false;\r\n\r\n // Simple search for this._fieldName pattern\r\n const code = JSON.stringify(stmt);\r\n return code.includes(fieldName);\r\n }\r\n\r\n /**\r\n * Find methods that are triggered by reading state\r\n */\r\n findMethodsReadingField(stateClassName, fieldName) {\r\n const methods = [];\r\n\r\n this.stateClasses.forEach(({ metadata }) => {\r\n if (metadata.name !== stateClassName) return;\r\n\r\n metadata.stateFields.forEach((field) => {\r\n if (field.name === fieldName) {\r\n methods.push(...field.usedInMethods);\r\n }\r\n });\r\n });\r\n\r\n return methods;\r\n }\r\n\r\n /**\r\n * Find state changed by a method\r\n */\r\n findStateChangedByMethod(methodName) {\r\n const changed = new Set();\r\n\r\n this.setStateCalls.forEach((call) => {\r\n if (call.method === methodName) {\r\n call.updates.forEach((update) => changed.add(update));\r\n }\r\n });\r\n\r\n return Array.from(changed);\r\n }\r\n\r\n /**\r\n * Phase 7: Validate all state patterns\r\n */\r\n validateState() {\r\n this.validateSetStatePatterns();\r\n this.validateStateFieldUsage();\r\n this.validateLifecyclePatterns();\r\n this.validateEventHandlers();\r\n }\r\n\r\n /**\r\n * Validate setState usage patterns\r\n */\r\n validateSetStatePatterns() {\r\n this.setStateCalls.forEach((call) => {\r\n const issues = [];\r\n\r\n // Check if called from valid context (State class method)\r\n const stateClass = this.stateClasses.get(call.stateClassName);\r\n if (!stateClass) {\r\n issues.push({\r\n type: 'invalid-context',\r\n message: `setState called outside of ${call.stateClassName}`,\r\n });\r\n }\r\n\r\n // Check if updates valid fields\r\n if (call.updates.length === 0) {\r\n issues.push({\r\n type: 'empty-update',\r\n message: 'setState called with no state updates',\r\n severity: 'warning',\r\n });\r\n }\r\n\r\n call.updates.forEach((field) => {\r\n if (!this.stateFields.has(`${call.stateClassName}.${field}`)) {\r\n issues.push({\r\n type: 'unknown-field',\r\n message: `setState updates unknown field \"${field}\"`,\r\n field,\r\n });\r\n }\r\n });\r\n\r\n // Record validation\r\n call.isValid = issues.length === 0;\r\n call.issues = issues;\r\n });\r\n }\r\n\r\n /**\r\n * Validate state field usage\r\n */\r\n validateStateFieldUsage() {\r\n this.stateFields.forEach((field, key) => {\r\n const parts = key.split('.');\r\n const stateClassName = parts[0];\r\n const fieldName = parts[1];\r\n\r\n // Check if field is used\r\n if (!this.fieldIsUsed(fieldName, stateClassName)) {\r\n this.validationResults.push({\r\n type: 'unused-state-field',\r\n severity: 'warning',\r\n field: fieldName,\r\n location: field.location,\r\n message: `State field \"${fieldName}\" is defined but never used`,\r\n suggestion: 'Remove unused field or implement its usage',\r\n });\r\n }\r\n\r\n // Check if field is mutated outside setState\r\n const mutationsOutsideSetState = this.findMutationsOutsideSetState(\r\n fieldName,\r\n stateClassName\r\n );\r\n if (mutationsOutsideSetState.length > 0) {\r\n this.validationResults.push({\r\n type: 'mutation-outside-setstate',\r\n severity: 'error',\r\n field: fieldName,\r\n locations: mutationsOutsideSetState,\r\n message: `State field \"${fieldName}\" is mutated outside setState()`,\r\n suggestion: 'Always use setState() to update state fields',\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Check if field is used anywhere\r\n */\r\n fieldIsUsed(fieldName, stateClassName) {\r\n // Check if read in build\r\n const stateClass = this.stateClasses.get(stateClassName);\r\n if (!stateClass) return false;\r\n\r\n const buildMethod = stateClass.astNode.body.methods.find(\r\n (m) => m.key.name === 'build'\r\n );\r\n\r\n if (buildMethod && this.methodUsesField(buildMethod, fieldName)) {\r\n return true;\r\n }\r\n\r\n // Check if modified in setState\r\n return this.setStateCalls.some((call) => call.updates.includes(fieldName));\r\n }\r\n\r\n /**\r\n * Find mutations outside setState\r\n */\r\n findMutationsOutsideSetState(fieldName, stateClassName) {\r\n const locations = [];\r\n const inSetState = new Set();\r\n\r\n // Collect all fields modified in setState\r\n this.setStateCalls.forEach((call) => {\r\n call.updates.forEach((field) => {\r\n inSetState.add(field);\r\n });\r\n });\r\n\r\n // If field is only in setState, it's good\r\n if (!inSetState.has(fieldName)) {\r\n return locations;\r\n }\r\n\r\n // For now, we assume mutations are only through setState\r\n // In a full implementation, you'd scan all methods for direct assignments\r\n return locations;\r\n }\r\n\r\n /**\r\n * Validate lifecycle patterns\r\n */\r\n validateLifecyclePatterns() {\r\n this.stateClasses.forEach(({ metadata }) => {\r\n const methodMap = {};\r\n\r\n metadata.lifecycleMethods.forEach((method) => {\r\n methodMap[method.name] = method;\r\n });\r\n\r\n // dispose should call super.dispose\r\n if (methodMap.dispose && !methodMap.dispose.callsSuper) {\r\n this.validationResults.push({\r\n type: 'lifecycle-issue',\r\n severity: 'error',\r\n method: 'dispose',\r\n location: methodMap.dispose.location,\r\n message: 'dispose() should call super.dispose()',\r\n suggestion: 'Add super.dispose() call at the end of dispose()',\r\n });\r\n }\r\n\r\n // initState should call super.initState\r\n if (methodMap.initState && !methodMap.initState.callsSuper) {\r\n this.validationResults.push({\r\n type: 'lifecycle-issue',\r\n severity: 'warning',\r\n method: 'initState',\r\n location: methodMap.initState.location,\r\n message: 'initState() should call super.initState()',\r\n suggestion: 'Add super.initState() call',\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Validate event handlers\r\n */\r\n validateEventHandlers() {\r\n this.eventHandlers.forEach((handler) => {\r\n // Check if handler method exists\r\n const handlerExists = this.stateClasses.values().some((sc) => {\r\n return sc.metadata.stateFields.some((f) => f.name === handler.handler) ||\r\n sc.astNode.body.methods.some((m) => m.key.name === handler.handler);\r\n });\r\n\r\n if (!handlerExists && handler.handler) {\r\n this.validationResults.push({\r\n type: 'missing-handler',\r\n severity: 'error',\r\n handler: handler.handler,\r\n event: handler.event,\r\n location: handler.location,\r\n message: `Event handler \"${handler.handler}\" not found`,\r\n suggestion: `Create a method called ${handler.handler} in the State class`,\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Get final results\r\n */\r\n getResults() {\r\n return {\r\n stateClasses: Array.from(this.stateClasses.entries()).map(([name, data]) => ({\r\n name,\r\n metadata: data.metadata,\r\n })),\r\n stateFields: Array.from(this.stateFields.values()),\r\n setStateCalls: this.setStateCalls,\r\n lifecycleMethods: this.lifecycleMethods,\r\n eventHandlers: this.eventHandlers,\r\n dependencyGraph: this.dependencyGraph,\r\n validationResults: this.validationResults,\r\n errors: this.errors,\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// DATA CLASSES\r\n// ============================================================================\r\n\r\nclass StateClassMetadata {\r\n constructor(name, location, linkedStatefulWidget) {\r\n this.name = name;\r\n this.location = location;\r\n this.linkedStatefulWidget = linkedStatefulWidget;\r\n this.stateFields = [];\r\n this.lifecycleMethods = [];\r\n this.methods = [];\r\n }\r\n}\r\n\r\nclass StateField {\r\n constructor(name, type, initialValue, location) {\r\n this.name = name;\r\n this.type = type;\r\n this.initialValue = initialValue;\r\n this.location = location;\r\n this.isMutable = true;\r\n this.mutations = [];\r\n this.usedInMethods = [];\r\n this.usedInBuild = false;\r\n }\r\n}\r\n\r\nclass LifecycleMethod {\r\n constructor(name, location, params, callsSuper, hasSideEffects) {\r\n this.name = name;\r\n this.location = location;\r\n this.params = params;\r\n this.callsSuper = callsSuper;\r\n this.hasSideEffects = hasSideEffects;\r\n }\r\n}\r\n\r\nclass StateUpdateCall {\r\n constructor(location, method, updates, stateClassName) {\r\n this.location = location;\r\n this.method = method;\r\n this.updates = updates || [];\r\n this.stateClassName = stateClassName;\r\n this.isValid = true;\r\n this.issues = [];\r\n }\r\n}\r\n\r\nclass DependencyGraph {\r\n constructor() {\r\n this.stateToMethods = new Map();\r\n this.methodToState = new Map();\r\n this.eventToState = new Map();\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n StateAnalyzer,\r\n StateClassMetadata,\r\n StateField,\r\n LifecycleMethod,\r\n StateUpdateCall,\r\n DependencyGraph,\r\n};"], + "mappings": "AAYA,MAAMA,CAAc,CAClB,YAAYC,EAAKC,EAASC,EAAU,CAAC,EAAG,CACtC,KAAK,IAAMF,EACX,KAAK,QAAUC,EACf,KAAK,QAAU,CACb,OAAQ,GACR,GAAGC,CACL,EAGA,KAAK,aAAe,IAAI,IACxB,KAAK,YAAc,IAAI,IACvB,KAAK,cAAgB,CAAC,EACtB,KAAK,iBAAmB,CAAC,EACzB,KAAK,cAAgB,CAAC,EACtB,KAAK,gBAAkB,KACvB,KAAK,kBAAoB,CAAC,EAC1B,KAAK,OAAS,CAAC,CACjB,CAKA,SAAU,CACR,GAAI,CAAC,KAAK,KAAO,CAAC,KAAK,IAAI,KACzB,MAAM,IAAI,MAAM,sBAAsB,EAGxC,GAAI,CAEF,YAAK,oBAAoB,EAGzB,KAAK,mBAAmB,EAGxB,KAAK,kBAAkB,EAGvB,KAAK,wBAAwB,EAG7B,KAAK,qBAAqB,EAG1B,KAAK,qBAAqB,EAG1B,KAAK,cAAc,EAEZ,KAAK,WAAW,CACzB,OAASC,EAAO,CACd,YAAK,OAAO,KAAKA,CAAK,EACf,KAAK,WAAW,CACzB,CACF,CAQA,qBAAsB,CACpB,KAAK,QAAQ,QAASC,GAAW,CAC/B,GAAIA,EAAO,OAAS,WAAY,OAOhC,GAAI,CAJsBA,EAAO,QAAQ,KACtCC,GAAMA,EAAE,OAAS,aACpB,EAEwB,CACtB,KAAK,OAAO,KAAK,CACf,KAAM,uBACN,OAAQD,EAAO,KACf,QAAS,mBAAmBA,EAAO,IAAI,+BACzC,CAAC,EACD,MACF,CAGA,MAAME,EAAa,KAAK,IAAI,KAAK,KAC9BC,GAAMA,EAAE,OAAS,oBAAsBA,EAAE,GAAG,OAASH,EAAO,IAC/D,EAEA,GAAI,CAACE,EAAY,OAGjB,MAAME,EAAkBF,EAAW,KAAK,QAAQ,KAC7CD,GAAMA,EAAE,IAAI,OAAS,aACxB,EAEA,GAAI,CAACG,EAAiB,OAGtB,MAAMC,EAAiB,KAAK,yBAAyBD,EAAgB,IAAI,EAEzE,GAAI,CAACC,EAAgB,CACnB,KAAK,OAAO,KAAK,CACf,KAAM,4BACN,OAAQL,EAAO,KACf,QAAS,qDAAqDA,EAAO,IAAI,gBAC3E,CAAC,EACD,MACF,CAGA,MAAMM,EAAiB,KAAK,IAAI,KAAK,KAClCH,GAAMA,EAAE,OAAS,oBAAsBA,EAAE,GAAG,OAASE,CACxD,EAEA,GAAI,CAACC,EAAgB,CACnB,KAAK,OAAO,KAAK,CACf,KAAM,sBACN,OAAQN,EAAO,KACf,WAAYK,EACZ,QAAS,gBAAgBA,CAAc,aACzC,CAAC,EACD,MACF,CAGA,GAAI,CAACC,EAAe,YAAc,CAACA,EAAe,WAAW,KAAK,WAAW,OAAO,EAAG,CACrF,KAAK,OAAO,KAAK,CACf,KAAM,sBACN,WAAYD,EACZ,QAAS,UAAUA,CAAc,yBACnC,CAAC,EACD,MACF,CAGA,MAAME,EAAgB,IAAIC,EACxBH,EACAC,EAAe,SACfN,EAAO,IACT,EAEA,KAAK,aAAa,IAAIK,EAAgB,CACpC,QAASC,EACT,SAAUC,CACZ,CAAC,EAGDP,EAAO,iBAAmBK,CAC5B,CAAC,CACH,CAMA,yBAAyBI,EAAY,CACnC,GAAI,CAACA,EAAY,OAAO,KAGxB,GAAIA,EAAW,OAAS,kBAAoBA,EAAW,MACrD,UAAWC,KAAQD,EAAW,KAC5B,GAAIC,EAAK,OAAS,mBAAqBA,EAAK,SAAU,CACpD,MAAMC,EAAY,KAAK,2BAA2BD,EAAK,QAAQ,EAC/D,GAAIC,EAAW,OAAOA,CACxB,EAKJ,OAAIF,EAAW,OAAS,gBACfA,EAAW,OAAO,KAGpB,IACT,CAKA,2BAA2BG,EAAM,CAC/B,OAAKA,EAEDA,EAAK,OAAS,iBAAmBA,EAAK,OACjCA,EAAK,OAAO,KAGjBA,EAAK,OAAS,aACTA,EAAK,KAGVA,EAAK,OAAS,kBAAoBA,EAAK,QACrCA,EAAK,OAAO,OAAS,aAChBA,EAAK,OAAO,KAIhB,KAhBW,IAiBpB,CAQA,oBAAqB,CACnB,KAAK,aAAa,QAAQ,CAAC,CAAE,QAAAC,EAAS,SAAAC,CAAS,IAAM,CAC/C,CAACD,EAAQ,MAAQ,CAACA,EAAQ,KAAK,QAEnCA,EAAQ,KAAK,OAAO,QAASE,GAAU,CACrC,MAAMC,EAAYD,EAAM,IAAI,KACtBE,EAAeF,EAAM,aAGrBG,EAAO,KAAK,eAAeD,CAAY,EAEvCE,EAAa,IAAIC,EACrBJ,EACAE,EACA,KAAK,kBAAkBD,CAAY,EACnCA,EAAeA,EAAa,SAAWF,EAAM,QAC/C,EAGA,KAAK,YAAY,IAAI,GAAGD,EAAS,IAAI,IAAIE,CAAS,GAAIG,CAAU,EAChEL,EAAS,YAAY,KAAKK,CAAU,CACtC,CAAC,CACH,CAAC,CACH,CAKA,eAAeP,EAAM,CACnB,GAAI,CAACA,EAAM,MAAO,MAElB,GAAIA,EAAK,OAAS,UAAW,CAC3B,GAAI,OAAOA,EAAK,OAAU,SAAU,MAAO,SAC3C,GAAI,OAAOA,EAAK,OAAU,SAAU,MAAO,SAC3C,GAAI,OAAOA,EAAK,OAAU,UAAW,MAAO,UAC5C,GAAIA,EAAK,QAAU,KAAM,MAAO,MAClC,CAEA,GAAIA,EAAK,OAAS,aAAc,CAC9B,MAAMS,EAAOT,EAAK,KAClB,GAAIS,IAAS,QAAUA,IAAS,QAAS,MAAO,UAChD,GAAIA,IAAS,OAAQ,MAAO,OAC5B,GAAIA,IAAS,YAAa,MAAO,WACnC,CAGA,OAAIT,EAAK,OAAS,eAAuB,QAGrCA,EAAK,OAAS,gBAAwB,UAGtCA,EAAK,OAAS,iBAAyB,MAG7C,CAKA,kBAAkBA,EAAM,CACtB,GAAKA,EAEL,IAAIA,EAAK,OAAS,UAChB,OAAOA,EAAK,MAGd,GAAIA,EAAK,OAAS,aAAc,CAC9B,MAAMS,EAAOT,EAAK,KAClB,GAAIS,IAAS,OAAQ,MAAO,GAC5B,GAAIA,IAAS,QAAS,MAAO,GAC7B,GAAIA,IAAS,OAAQ,OAAO,KAC5B,GAAIA,IAAS,YAAa,MAC5B,EAGF,CAKA,mBAAoB,CAClB,KAAK,aAAa,QAAQ,CAAC,CAAE,QAAAR,EAAS,SAAAC,CAAS,IAAM,CAC/C,CAACD,EAAQ,MAAQ,CAACA,EAAQ,KAAK,SAGnCA,EAAQ,KAAK,QAAQ,QAASS,GAAW,CACvC,MAAMC,EAAgB,KAAK,qBAAqBD,EAAQR,EAAS,IAAI,EACrE,KAAK,cAAc,KAAK,GAAGS,CAAa,CAC1C,CAAC,CACH,CAAC,CACH,CAKA,qBAAqBD,EAAQjB,EAAgB,CAC3C,MAAMmB,EAAQ,CAAC,EACTC,EAAaH,EAAO,IAAI,KAG9B,OAAIA,EAAO,OACKA,EAAO,KAAK,OAAS,iBAC/BA,EAAO,KAAK,KACZ,CAACA,EAAO,IAAI,GAEV,QAASZ,GAAS,CACtB,KAAK,wBAAwBA,EAAMc,EAAOC,EAAYpB,CAAc,CACtE,CAAC,EAGImB,CACT,CAKA,wBAAwBd,EAAMc,EAAOC,EAAYpB,EAAgB,CAC1DK,IAGDA,EAAK,OAAS,uBAAyBA,EAAK,YAC9C,KAAK,yBAAyBA,EAAK,WAAYc,EAAOC,EAAYpB,CAAc,EAI9EK,EAAK,OAAS,mBAAqBA,EAAK,UAC1C,KAAK,yBAAyBA,EAAK,SAAUc,EAAOC,EAAYpB,CAAc,EAI5EK,EAAK,OAAS,kBAAoBA,EAAK,MACzCA,EAAK,KAAK,QAASgB,GAAM,CACvB,KAAK,wBAAwBA,EAAGF,EAAOC,EAAYpB,CAAc,CACnE,CAAC,EAEL,CAKA,yBAAyBO,EAAMY,EAAOC,EAAYpB,EAAgB,CAChE,GAAKO,EAGL,IAAIA,EAAK,OAAS,iBAAkB,CAIlC,GAFmB,KAAK,eAAeA,CAAI,EAE3B,CACd,MAAMe,EAAgB,KAAK,uBAAuBf,EAAMP,CAAc,EAChEuB,EAAO,IAAIC,EACfjB,EAAK,SACLa,EACAE,EACAtB,CACF,EACAmB,EAAM,KAAKI,CAAI,CACjB,CAGAhB,EAAK,KAAK,QAASkB,GAAQ,CACzB,KAAK,yBAAyBA,EAAKN,EAAOC,EAAYpB,CAAc,CACtE,CAAC,CACH,CAGIO,EAAK,OAAS,iBAAmBA,EAAK,YACxCA,EAAK,WAAW,QAASmB,GAAS,CAChC,KAAK,yBAAyBA,EAAK,MAAOP,EAAOC,EAAYpB,CAAc,CAC7E,CAAC,EAEL,CAKA,eAAeO,EAAM,CAEnB,GADIA,EAAK,OAAS,kBACd,CAACA,EAAK,OAAQ,MAAO,GAGzB,GAAIA,EAAK,OAAO,OAAS,mBAAoB,CAC3C,MAAMoB,EAAMpB,EAAK,OAAO,OAClBmB,EAAOnB,EAAK,OAAO,SAGzB,GAAIoB,EAAI,OAAS,cAAgBA,EAAI,OAAS,QAC5CD,EAAK,OAAS,cAAgBA,EAAK,OAAS,WAC5C,MAAO,EAEX,CAEA,MAAO,EACT,CAMA,uBAAuBE,EAAc5B,EAAgB,CACnD,MAAM6B,EAAU,CAAC,EAEjB,GAAI,CAACD,EAAa,MAAQA,EAAa,KAAK,SAAW,EAAG,OAAOC,EAGjE,MAAMC,EAAWF,EAAa,KAAK,CAAC,EAEpC,GAAIE,EAAS,OAAS,0BAA2B,CAE/C,MAAMC,EAAOD,EAAS,KAEtB,GAAIC,EAAK,OAAS,kBAAoBA,EAAK,KAEzCA,EAAK,KAAK,QAAS1B,GAAS,CAC1B,MAAM2B,EAAU,KAAK,qBAAqB3B,EAAML,CAAc,EAC9D6B,EAAQ,KAAK,GAAGG,CAAO,CACzB,CAAC,UACQD,EAAK,OAAS,oBAAsBA,EAAK,OAAS,uBAAwB,CAEnF,MAAMC,EAAU,KAAK,qBAAqBD,EAAM/B,CAAc,EAC9D6B,EAAQ,KAAK,GAAGG,CAAO,CACzB,CACF,CAEA,MAAO,CAAC,GAAG,IAAI,IAAIH,CAAO,CAAC,CAC7B,CAMA,qBAAqBxB,EAAML,EAAgB,CACzC,MAAMiC,EAAS,CAAC,EAEhB,GAAI,CAAC5B,EAAM,OAAO4B,EAGlB,GAAI5B,EAAK,OAAS,uBAAyBA,EAAK,WAAY,CAC1D,MAAME,EAAOF,EAAK,WAElB,GAAIE,EAAK,OAAS,uBAAwB,CACxC,MAAMI,EAAY,KAAK,uBAAuBJ,EAAK,IAAI,EACnDI,GAAWsB,EAAO,KAAKtB,CAAS,CACtC,CAGA,GAAIJ,EAAK,OAAS,mBAAoB,CACpC,MAAMI,EAAY,KAAK,uBAAuBJ,EAAK,QAAQ,EACvDI,GAAWsB,EAAO,KAAKtB,CAAS,CACtC,CACF,CAGA,GAAIN,EAAK,OAAS,uBAAwB,CACxC,MAAMM,EAAY,KAAK,uBAAuBN,EAAK,IAAI,EACnDM,GAAWsB,EAAO,KAAKtB,CAAS,CACtC,CAEA,GAAIN,EAAK,OAAS,mBAAoB,CACpC,MAAMM,EAAY,KAAK,uBAAuBN,EAAK,QAAQ,EACvDM,GAAWsB,EAAO,KAAKtB,CAAS,CACtC,CAEA,OAAOsB,CACT,CAMA,uBAAuBC,EAAQ,CAC7B,GAAI,CAACA,EAAQ,OAAO,KAGpB,GAAIA,EAAO,OAAS,mBAAoB,CACtC,MAAMP,EAAMO,EAAO,OACbR,EAAOQ,EAAO,SAGpB,GAAIP,EAAI,OAAS,cAAgBA,EAAI,OAAS,QAC5CD,EAAK,OAAS,aACd,OAAOA,EAAK,IAEhB,CAGA,OAAIQ,EAAO,OAAS,aACXA,EAAO,KAGT,IACT,CAOA,yBAA0B,CACxB,MAAMC,EAAiB,CAAC,YAAa,UAAW,kBAAmB,OAAO,EAE1E,KAAK,aAAa,QAAQ,CAAC,CAAE,QAAA3B,EAAS,SAAAC,CAAS,IAAM,CAC/C,CAACD,EAAQ,MAAQ,CAACA,EAAQ,KAAK,SAEnCA,EAAQ,KAAK,QAAQ,QAASS,GAAW,CACvC,MAAMG,EAAaH,EAAO,IAAI,KAE9B,GAAIkB,EAAe,SAASf,CAAU,EAAG,CACvC,MAAMgB,EAAY,IAAIC,EACpBjB,EACAH,EAAO,SACPA,EAAO,QAAU,CAAC,EAClB,KAAK,gBAAgBA,CAAM,EAC3B,KAAK,oBAAoBA,CAAM,CACjC,EAEA,KAAK,iBAAiB,KAAKmB,CAAS,EACpC3B,EAAS,iBAAiB,KAAK2B,CAAS,CAC1C,CACF,CAAC,CACH,CAAC,CACH,CAKA,gBAAgBnB,EAAQ,CACtB,GAAI,CAACA,EAAO,KAAM,MAAO,GAEzB,MAAMqB,EAAQrB,EAAO,KAAK,OAAS,iBAC/BA,EAAO,KAAK,KACZ,CAACA,EAAO,IAAI,EAEhB,UAAWZ,KAAQiC,EACjB,GAAIjC,EAAK,OAAS,uBAAyBA,EAAK,WAAY,CAC1D,MAAME,EAAOF,EAAK,WAGlB,GAAIE,EAAK,OAAS,kBAAoBA,EAAK,OAAO,OAAS,mBAAoB,CAC7E,MAAMoB,EAAMpB,EAAK,OAAO,OAClBmB,EAAOnB,EAAK,OAAO,SAEzB,GAAIoB,EAAI,OAAS,cAAgBA,EAAI,OAAS,SAC5CD,EAAK,OAAS,cAAgBA,EAAK,OAAST,EAAO,IAAI,KACvD,MAAO,EAEX,CACF,CAGF,MAAO,EACT,CAKA,oBAAoBA,EAAQ,CAC1B,GAAI,CAACA,EAAO,KAAM,MAAO,GAEzB,MAAMqB,EAAQrB,EAAO,KAAK,OAAS,iBAC/BA,EAAO,KAAK,KACZ,CAACA,EAAO,IAAI,EAEhB,UAAWZ,KAAQiC,EAEjB,GAAIjC,EAAK,OAAS,uBAAyBA,EAAK,WAAY,CAC1D,MAAME,EAAOF,EAAK,WAOlB,GALIE,EAAK,OAAS,wBAA0BA,EAAK,OAAS,oBAKtDA,EAAK,OAAS,iBAChB,MAAO,EAEX,CAGF,MAAO,EACT,CAOA,sBAAuB,CACrB,KAAK,aAAa,QAAQ,CAAC,CAAE,QAAAC,EAAS,SAAAC,CAAS,IAAM,CACnD,GAAI,CAACD,EAAQ,MAAQ,CAACA,EAAQ,KAAK,QAAS,OAG5C,MAAM+B,EAAc/B,EAAQ,KAAK,QAAQ,KAAMZ,GAAMA,EAAE,IAAI,OAAS,OAAO,EAC3E,GAAI,CAAC2C,EAAa,OAGlB,MAAMC,EAAW,KAAK,0BAA0BD,EAAa9B,EAAS,IAAI,EAC1E,KAAK,cAAc,KAAK,GAAG+B,CAAQ,CACrC,CAAC,CACH,CAKA,0BAA0BvB,EAAQjB,EAAgB,CAChD,MAAMwC,EAAW,CAAC,EAElB,OAAKvB,EAAO,OAEEA,EAAO,KAAK,OAAS,iBAC/BA,EAAO,KAAK,KACZ,CAACA,EAAO,IAAI,GAEV,QAASZ,GAAS,CACtB,KAAK,6BAA6BA,EAAMmC,EAAUxC,CAAc,CAClE,CAAC,EAEMwC,CACT,CAKA,6BAA6BnC,EAAMmC,EAAUxC,EAAgB,CACtDK,IAEDA,EAAK,OAAS,uBAAyBA,EAAK,YAC9C,KAAK,8BAA8BA,EAAK,WAAYmC,EAAUxC,CAAc,EAG1EK,EAAK,OAAS,mBAAqBA,EAAK,UAC1C,KAAK,8BAA8BA,EAAK,SAAUmC,EAAUxC,CAAc,EAGxEK,EAAK,OAAS,kBAAoBA,EAAK,MACzCA,EAAK,KAAK,QAASgB,GAAM,CACvB,KAAK,6BAA6BA,EAAGmB,EAAUxC,CAAc,CAC/D,CAAC,EAEL,CAMA,8BAA8BO,EAAMiC,EAAUxC,EAAgB,CACvDO,IAGDA,EAAK,OAAS,iBAAmBA,EAAK,YACxCA,EAAK,WAAW,QAASmB,GAAS,CAEhC,MAAMe,EAAY,KAAK,eAAef,EAAK,GAAG,EAG9C,GAFqB,WAEJ,KAAKe,CAAS,EAAG,CAEhC,MAAMC,EAAU,KAAK,oBAAoBhB,EAAK,MAAO1B,CAAc,EAE/D0C,GACFF,EAAS,KAAK,CACZ,MAAOC,EACP,QAASC,EACT,SAAUhB,EAAK,SACf,UAAW,KAAK,4BAA4BnB,CAAI,CAClD,CAAC,CAEL,CAGA,KAAK,8BAA8BmB,EAAK,MAAOc,EAAUxC,CAAc,CACzE,CAAC,EAICO,EAAK,OAAS,kBAAoBA,EAAK,MACzCA,EAAK,KAAK,QAASkB,GAAQ,CACzB,KAAK,8BAA8BA,EAAKe,EAAUxC,CAAc,CAClE,CAAC,EAICO,EAAK,OAAS,iBAAmBA,EAAK,MACxCA,EAAK,KAAK,QAASkB,GAAQ,CACzB,KAAK,8BAA8BA,EAAKe,EAAUxC,CAAc,CAClE,CAAC,EAEL,CAKA,eAAe2C,EAAS,CACtB,OAAKA,EAEDA,EAAQ,OAAS,aACZA,EAAQ,KAGbA,EAAQ,OAAS,UACZ,OAAOA,EAAQ,KAAK,EAGtB,KAVc,IAWvB,CAMA,oBAAoBC,EAAO5C,EAAgB,CACzC,GAAI,CAAC4C,EAAO,OAAO,KAGnB,GAAIA,EAAM,OAAS,0BAA2B,CAC5C,GAAIA,EAAM,KAAK,OAAS,iBAEtB,OADoB,KAAK,2BAA2BA,EAAM,KAAK,MAAM,EAKvE,GAAIA,EAAM,KAAK,OAAS,aACtB,OAAOA,EAAM,KAAK,IAEtB,CAGA,OAAIA,EAAM,OAAS,aACVA,EAAM,KAIXA,EAAM,OAAS,oBACbA,EAAM,SAAS,OAAS,aACnBA,EAAM,SAAS,KAInB,IACT,CAKA,4BAA4BrC,EAAM,CAGhC,OAAIA,EAAK,OAAS,kBAAoBA,EAAK,OAClC,KAAK,2BAA2BA,EAAK,MAAM,EAG7C,SACT,CAUA,sBAAuB,CACrB,KAAK,gBAAkB,IAAIsC,EAG3B,KAAK,YAAY,QAAQ,CAACnC,EAAOoC,IAAQ,CACvC,MAAMC,EAAU,KAAK,sBAAsBrC,EAAM,IAAI,EACjDqC,EAAQ,OAAS,GACnB,KAAK,gBAAgB,eAAe,IAAIrC,EAAM,KAAMqC,CAAO,CAE/D,CAAC,EAGD,KAAK,aAAa,QAAQ,CAAC,CAAE,SAAAtC,CAAS,IAAM,CAC1CA,EAAS,YAAY,QAASC,GAAU,CACtC,MAAMsC,EAAe,KAAK,wBAAwBvC,EAAS,KAAMC,EAAM,IAAI,EACvEsC,EAAa,OAAS,GACxB,KAAK,gBAAgB,cAAc,IAAItC,EAAM,KAAMsC,CAAY,CAEnE,CAAC,CACH,CAAC,EAGD,KAAK,cAAc,QAASC,GAAU,CACpC,MAAMC,EAAe,KAAK,yBAAyBD,EAAM,OAAO,EAC5DC,EAAa,OAAS,GACxB,KAAK,gBAAgB,aAAa,IAAID,EAAM,MAAOC,CAAY,CAEnE,CAAC,CACH,CAKA,sBAAsBvC,EAAW,CAC/B,MAAMoC,EAAU,IAAI,IAEpB,YAAK,cAAc,QAASxB,GAAS,CAC/BA,EAAK,QAAQ,SAASZ,CAAS,GACjCoC,EAAQ,IAAIxB,EAAK,MAAM,CAE3B,CAAC,EAGD,KAAK,aAAa,QAAQ,CAAC,CAAE,QAAAf,EAAS,SAAAC,CAAS,IAAM,CACnD,GAAI,CAACD,EAAQ,MAAQ,CAACA,EAAQ,KAAK,QAAS,OAE5C,MAAM+B,EAAc/B,EAAQ,KAAK,QAAQ,KAAMZ,GAAMA,EAAE,IAAI,OAAS,OAAO,EACvE2C,GAAe,KAAK,gBAAgBA,EAAa5B,CAAS,GAC5DoC,EAAQ,IAAI,OAAO,CAEvB,CAAC,EAEM,MAAM,KAAKA,CAAO,CAC3B,CAKA,gBAAgB9B,EAAQN,EAAW,CACjC,GAAI,CAACM,EAAO,KAAM,MAAO,GAEzB,MAAMqB,EAAQrB,EAAO,KAAK,OAAS,iBAC/BA,EAAO,KAAK,KACZ,CAACA,EAAO,IAAI,EAEhB,UAAWZ,KAAQiC,EACjB,GAAI,KAAK,mBAAmBjC,EAAMM,CAAS,EACzC,MAAO,GAIX,MAAO,EACT,CAKA,mBAAmBN,EAAMM,EAAW,CAClC,OAAKN,EAGQ,KAAK,UAAUA,CAAI,EACpB,SAASM,CAAS,EAJZ,EAKpB,CAKA,wBAAwBX,EAAgBW,EAAW,CACjD,MAAMoC,EAAU,CAAC,EAEjB,YAAK,aAAa,QAAQ,CAAC,CAAE,SAAAtC,CAAS,IAAM,CACtCA,EAAS,OAAST,GAEtBS,EAAS,YAAY,QAASC,GAAU,CAClCA,EAAM,OAASC,GACjBoC,EAAQ,KAAK,GAAGrC,EAAM,aAAa,CAEvC,CAAC,CACH,CAAC,EAEMqC,CACT,CAKA,yBAAyB3B,EAAY,CACnC,MAAM+B,EAAU,IAAI,IAEpB,YAAK,cAAc,QAAS5B,GAAS,CAC/BA,EAAK,SAAWH,GAClBG,EAAK,QAAQ,QAAS6B,GAAWD,EAAQ,IAAIC,CAAM,CAAC,CAExD,CAAC,EAEM,MAAM,KAAKD,CAAO,CAC3B,CAKA,eAAgB,CACd,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,CAC7B,CAKA,0BAA2B,CACzB,KAAK,cAAc,QAAS5B,GAAS,CACnC,MAAM8B,EAAS,CAAC,EAGG,KAAK,aAAa,IAAI9B,EAAK,cAAc,GAE1D8B,EAAO,KAAK,CACV,KAAM,kBACN,QAAS,8BAA8B9B,EAAK,cAAc,EAC5D,CAAC,EAICA,EAAK,QAAQ,SAAW,GAC1B8B,EAAO,KAAK,CACV,KAAM,eACN,QAAS,wCACT,SAAU,SACZ,CAAC,EAGH9B,EAAK,QAAQ,QAASb,GAAU,CACzB,KAAK,YAAY,IAAI,GAAGa,EAAK,cAAc,IAAIb,CAAK,EAAE,GACzD2C,EAAO,KAAK,CACV,KAAM,gBACN,QAAS,mCAAmC3C,CAAK,IACjD,MAAAA,CACF,CAAC,CAEL,CAAC,EAGDa,EAAK,QAAU8B,EAAO,SAAW,EACjC9B,EAAK,OAAS8B,CAChB,CAAC,CACH,CAKA,yBAA0B,CACxB,KAAK,YAAY,QAAQ,CAAC3C,EAAOoC,IAAQ,CACvC,MAAMQ,EAAQR,EAAI,MAAM,GAAG,EACrB9C,EAAiBsD,EAAM,CAAC,EACxB3C,EAAY2C,EAAM,CAAC,EAGpB,KAAK,YAAY3C,EAAWX,CAAc,GAC7C,KAAK,kBAAkB,KAAK,CAC1B,KAAM,qBACN,SAAU,UACV,MAAOW,EACP,SAAUD,EAAM,SAChB,QAAS,gBAAgBC,CAAS,8BAClC,WAAY,4CACd,CAAC,EAIH,MAAM4C,EAA2B,KAAK,6BACpC5C,EACAX,CACF,EACIuD,EAAyB,OAAS,GACpC,KAAK,kBAAkB,KAAK,CAC1B,KAAM,4BACN,SAAU,QACV,MAAO5C,EACP,UAAW4C,EACX,QAAS,gBAAgB5C,CAAS,kCAClC,WAAY,8CACd,CAAC,CAEL,CAAC,CACH,CAKA,YAAYA,EAAWX,EAAgB,CAErC,MAAMwD,EAAa,KAAK,aAAa,IAAIxD,CAAc,EACvD,GAAI,CAACwD,EAAY,MAAO,GAExB,MAAMjB,EAAciB,EAAW,QAAQ,KAAK,QAAQ,KACjD5D,GAAMA,EAAE,IAAI,OAAS,OACxB,EAEA,OAAI2C,GAAe,KAAK,gBAAgBA,EAAa5B,CAAS,EACrD,GAIF,KAAK,cAAc,KAAMY,GAASA,EAAK,QAAQ,SAASZ,CAAS,CAAC,CAC3E,CAKA,6BAA6BA,EAAWX,EAAgB,CACtD,MAAMyD,EAAY,CAAC,EACbC,EAAa,IAAI,IAUvB,OAPA,KAAK,cAAc,QAASnC,GAAS,CACnCA,EAAK,QAAQ,QAASb,GAAU,CAC9BgD,EAAW,IAAIhD,CAAK,CACtB,CAAC,CACH,CAAC,EAGIgD,EAAW,IAAI/C,CAAS,EAMtB8C,CACT,CAKA,2BAA4B,CAC1B,KAAK,aAAa,QAAQ,CAAC,CAAE,SAAAhD,CAAS,IAAM,CAC1C,MAAMkD,EAAY,CAAC,EAEnBlD,EAAS,iBAAiB,QAASQ,GAAW,CAC5C0C,EAAU1C,EAAO,IAAI,EAAIA,CAC3B,CAAC,EAGG0C,EAAU,SAAW,CAACA,EAAU,QAAQ,YAC1C,KAAK,kBAAkB,KAAK,CAC1B,KAAM,kBACN,SAAU,QACV,OAAQ,UACR,SAAUA,EAAU,QAAQ,SAC5B,QAAS,wCACT,WAAY,kDACd,CAAC,EAICA,EAAU,WAAa,CAACA,EAAU,UAAU,YAC9C,KAAK,kBAAkB,KAAK,CAC1B,KAAM,kBACN,SAAU,UACV,OAAQ,YACR,SAAUA,EAAU,UAAU,SAC9B,QAAS,4CACT,WAAY,4BACd,CAAC,CAEL,CAAC,CACH,CAKA,uBAAwB,CACtB,KAAK,cAAc,QAASjB,GAAY,CAOlC,CALkB,KAAK,aAAa,OAAO,EAAE,KAAMkB,GAC9CA,EAAG,SAAS,YAAY,KAAMC,GAAMA,EAAE,OAASnB,EAAQ,OAAO,GACnEkB,EAAG,QAAQ,KAAK,QAAQ,KAAMhE,GAAMA,EAAE,IAAI,OAAS8C,EAAQ,OAAO,CACrE,GAEqBA,EAAQ,SAC5B,KAAK,kBAAkB,KAAK,CAC1B,KAAM,kBACN,SAAU,QACV,QAASA,EAAQ,QACjB,MAAOA,EAAQ,MACf,SAAUA,EAAQ,SAClB,QAAS,kBAAkBA,EAAQ,OAAO,cAC1C,WAAY,0BAA0BA,EAAQ,OAAO,qBACvD,CAAC,CAEL,CAAC,CACH,CAKA,YAAa,CACX,MAAO,CACL,aAAc,MAAM,KAAK,KAAK,aAAa,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC1B,EAAM8C,CAAI,KAAO,CAC3E,KAAA9C,EACA,SAAU8C,EAAK,QACjB,EAAE,EACF,YAAa,MAAM,KAAK,KAAK,YAAY,OAAO,CAAC,EACjD,cAAe,KAAK,cACpB,iBAAkB,KAAK,iBACvB,cAAe,KAAK,cACpB,gBAAiB,KAAK,gBACtB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,MACf,CACF,CACF,CAMA,MAAM3D,CAAmB,CACvB,YAAYa,EAAM+C,EAAUC,EAAsB,CAChD,KAAK,KAAOhD,EACZ,KAAK,SAAW+C,EAChB,KAAK,qBAAuBC,EAC5B,KAAK,YAAc,CAAC,EACpB,KAAK,iBAAmB,CAAC,EACzB,KAAK,QAAU,CAAC,CAClB,CACF,CAEA,MAAMjD,CAAW,CACf,YAAYC,EAAMH,EAAMD,EAAcmD,EAAU,CAC9C,KAAK,KAAO/C,EACZ,KAAK,KAAOH,EACZ,KAAK,aAAeD,EACpB,KAAK,SAAWmD,EAChB,KAAK,UAAY,GACjB,KAAK,UAAY,CAAC,EAClB,KAAK,cAAgB,CAAC,EACtB,KAAK,YAAc,EACrB,CACF,CAEA,MAAM1B,CAAgB,CACpB,YAAYrB,EAAM+C,EAAUE,EAAQC,EAAYC,EAAgB,CAC9D,KAAK,KAAOnD,EACZ,KAAK,SAAW+C,EAChB,KAAK,OAASE,EACd,KAAK,WAAaC,EAClB,KAAK,eAAiBC,CACxB,CACF,CAEA,MAAM3C,CAAgB,CACpB,YAAYuC,EAAU9C,EAAQmD,EAASpE,EAAgB,CACrD,KAAK,SAAW+D,EAChB,KAAK,OAAS9C,EACd,KAAK,QAAUmD,GAAW,CAAC,EAC3B,KAAK,eAAiBpE,EACtB,KAAK,QAAU,GACf,KAAK,OAAS,CAAC,CACjB,CACF,CAEA,MAAM6C,CAAgB,CACpB,aAAc,CACZ,KAAK,eAAiB,IAAI,IAC1B,KAAK,cAAgB,IAAI,IACzB,KAAK,aAAe,IAAI,GAC1B,CACF", + "names": ["StateAnalyzer", "ast", "widgets", "options", "error", "widget", "m", "widgetNode", "n", "createStateNode", "stateClassName", "stateClassNode", "stateMetadata", "StateClassMetadata", "methodBody", "stmt", "className", "expr", "astNode", "metadata", "field", "fieldName", "initialValue", "type", "stateField", "StateField", "name", "method", "setStateCalls", "calls", "methodName", "s", "updatedFields", "call", "StateUpdateCall", "arg", "prop", "obj", "setStateCall", "updated", "callback", "body", "mutated", "fields", "target", "lifecycleNames", "lifecycle", "LifecycleMethod", "stmts", "buildMethod", "handlers", "eventName", "handler", "keyExpr", "value", "DependencyGraph", "key", "methods", "methodsUsing", "event", "stateChanged", "changed", "update", "issues", "parts", "mutationsOutsideSetState", "stateClass", "locations", "inSetState", "methodMap", "sc", "f", "data", "location", "linkedStatefulWidget", "params", "callsSuper", "hasSideEffects", "updates"] +} diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/package.json b/packages/flutterjs_analyzer/flutterjs_analyzer/package.json new file mode 100644 index 00000000..2cbd0b89 --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/package.json @@ -0,0 +1,55 @@ +{ + "name": "@flutterjs/analyzer", + "version": "1.0.0", + "description": "Flutter widget analyzer in JavaScript", + "type": "module", + "main": "./dist/analyzer.js", + "exports": { + "./analyzer": "./dist/analyzer.js", + "./context_analyzer_data": "./dist/context_analyzer_data.js", + "./context_analyzer": "./dist/context_analyzer.js", + "./flutter_import_resolver": "./dist/flutter_import_resolver.js", + "./flutter_resolver_config": "./dist/flutter_resolver_config.js", + "./flutterjs_logger": "./dist/flutterjs_logger.js", + "./flutterjs_parser": "./dist/flutterjs_parser.js", + "./flutterjs_report_generator": "./dist/flutterjs_report_generator.js", + "./flutterjs_widget_analyzer": "./dist/flutterjs_widget_analyzer.js", + "./lexer": "./dist/lexer.js", + "./ssr_analyzer": "./dist/ssr_analyzer.js", + "./state_analyzer_data": "./dist/state_analyzer_data.js", + "./state_analyzer_implementation": "./dist/state_analyzer_implementation.js" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "node build.js", + "run:lexer": "node lexer.js", + "test": "node test/runner.js", + "test:lexer": "node test/lexer.test.js", + "test:parser": "node test/parser.test.js", + "test:analyzer": "node test/widget-analyzer.test.js", + "test:import": "node test/import_resolver.test.js", + "test:all": "npm run test:lexer && npm run test:parser && npm run test:analyzer", + "test:watch": "node test/runner.js --watch" + }, + "keywords": [ + "flutter", + "analyzer", + "dart", + "widget", + "parser", + "javascript" + ], + "dependencies": { + "@flutterjs/runtime": "file:../../flutterjs_runtime/flutterjs_runtime", + "@flutterjs/vdom": "file:../../flutterjs_vdom/flutterjs_vdom", + "@flutterjs/material": "file:../../flutterjs_material/flutterjs_material" + }, + "author": "jayprakash.pal@flutterjs.dev", + "license": "MIT", + "devDependencies": { + "esbuild": "^0.27.2", + "jest": "^29.7.0" + } +} \ No newline at end of file diff --git a/packages/flutterjs_engine/src/analyzer/src/analyzer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/analyzer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/analyzer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/analyzer.js diff --git a/packages/flutterjs_engine/src/analyzer/src/context_analyzer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/context_analyzer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/context_analyzer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/context_analyzer.js diff --git a/packages/flutterjs_engine/src/analyzer/src/context_analyzer_data.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/context_analyzer_data.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/context_analyzer_data.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/context_analyzer_data.js diff --git a/packages/flutterjs_engine/src/analyzer/src/flutter_import_resolver.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/flutter_import_resolver.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/flutter_import_resolver.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/flutter_import_resolver.js diff --git a/packages/flutterjs_engine/src/analyzer/src/flutter_resolver_config.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/flutter_resolver_config.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/flutter_resolver_config.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/flutter_resolver_config.js diff --git a/packages/flutterjs_engine/src/analyzer/src/flutterjs_logger.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_logger.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/flutterjs_logger.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_logger.js diff --git a/packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_parser.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_parser.js new file mode 100644 index 00000000..639088d8 --- /dev/null +++ b/packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_parser.js @@ -0,0 +1,1486 @@ +/** + * FlutterJS Parser - Converts tokens to AST (FIXED VERSION) + * Phase 1.2 MVP Implementation - Complete Fixes + * + * Final fix: parseParameterList handles UNDEFINED and NULL token types + */ + + +import { TokenType } from './lexer.js'; +import { getLogger } from './flutterjs_logger.js'; + +// ============================================================================ +// AST NODE CLASSES +// ============================================================================ + +class ASTNode { + constructor(type, location) { + this.type = type; + this.location = location; + } +} + +class Program extends ASTNode { + constructor(body = [], location = null) { + super('Program', location); + this.body = body; + } +} + +class ImportDeclaration extends ASTNode { + constructor(specifiers = [], source = null, location = null) { + super('ImportDeclaration', location); + this.specifiers = specifiers; + this.source = source; + } +} + +class ImportSpecifier extends ASTNode { + constructor(imported = null, local = null, location = null) { + super('ImportSpecifier', location); + this.imported = imported; + this.local = local; + } +} + +class ClassDeclaration extends ASTNode { + constructor(id = null, superClass = null, body = null, location = null) { + super('ClassDeclaration', location); + this.id = id; + this.superClass = superClass; + this.body = body; + } +} + +class ClassBody extends ASTNode { + constructor(fields = [], methods = [], location = null) { + super('ClassBody', location); + this.fields = fields; + this.methods = methods; + } +} + +class FieldDeclaration extends ASTNode { + constructor(key = null, initialValue = null, location = null) { + super('FieldDeclaration', location); + this.key = key; + this.initialValue = initialValue; + } +} + +class MethodDeclaration extends ASTNode { + constructor(key = null, params = [], body = null, location = null) { + super('MethodDeclaration', location); + this.key = key; + this.params = params; + this.body = body; + } +} + +class Parameter extends ASTNode { + constructor(name = null, optional = false, defaultValue = null, location = null) { + super('Parameter', location); + this.name = name; + this.optional = optional; + this.defaultValue = defaultValue; + } +} + +class FunctionDeclaration extends ASTNode { + constructor(id = null, params = [], body = null, isAsync = false, location = null) { + super('FunctionDeclaration', location); + this.id = id; + this.params = params; + this.body = body; + this.isAsync = isAsync; + } +} + +class BlockStatement extends ASTNode { + constructor(body = [], location = null) { + super('BlockStatement', location); + this.body = body; + } +} + +class ReturnStatement extends ASTNode { + constructor(argument = null, location = null) { + super('ReturnStatement', location); + this.argument = argument; + } +} + +class ExpressionStatement extends ASTNode { + constructor(expression = null, location = null) { + super('ExpressionStatement', location); + this.expression = expression; + } +} + +class Identifier extends ASTNode { + constructor(name = '', location = null) { + super('Identifier', location); + this.name = name; + } +} + +class Literal extends ASTNode { + constructor(value = null, raw = '', type = 'string', location = null) { + super('Literal', location); + this.value = value; + this.raw = raw; + this.literalType = type; + } +} + +class CallExpression extends ASTNode { + constructor(callee = null, args = [], location = null) { + super('CallExpression', location); + this.callee = callee; + this.args = args; + } +} + +class NewExpression extends ASTNode { + constructor(callee = null, args = [], location = null) { + super('NewExpression', location); + this.callee = callee; + this.args = args; + this.isConst = false; + } +} + +class ObjectLiteral extends ASTNode { + constructor(properties = [], location = null) { + super('ObjectLiteral', location); + this.properties = properties; + } +} + +class Property extends ASTNode { + constructor(key = null, value = null, location = null) { + super('Property', location); + this.key = key; + this.value = value; + this.shorthand = false; + } +} + +class ArrowFunctionExpression extends ASTNode { + constructor(params = [], body = null, location = null) { + super('ArrowFunctionExpression', location); + this.params = params; + this.body = body; + } +} + +class MemberExpression extends ASTNode { + constructor(object = null, property = null, computed = false, location = null) { + super('MemberExpression', location); + this.object = object; + this.property = property; + this.computed = computed; + } +} + +// ============================================================================ +// PARSER CLASS +// ============================================================================ + +class Parser { + constructor(tokens = [], options = {}) { + this.tokens = tokens; + this.current = 0; + this.errors = []; + this.options = { strict: false, ...options }; + // NEW: Call stack tracking + this.callStack = []; + + this.debugMode = true; + } + + parse() { + const body = []; + + while (!this.isAtEnd()) { + try { + const stmt = this.parseTopLevel(); + if (stmt && stmt.type === 'ImportDeclaration') { + console.log('DEBUG - ImportDeclaration:', JSON.stringify(stmt, null, 2)); + } + if (stmt) { + body.push(stmt); + } + } catch (error) { + this.errors.push(error); + this.synchronize(); + } + } + + return new Program(body); + } + + /** + * Skip any comment tokens + * Comments should be transparent to the parser + */ + skipComments() { + while (!this.isAtEnd() && this.check(TokenType.COMMENT)) { + this.advance(); + } + } + + /** + * Check if token is a comment + */ + isComment() { + if (this.isAtEnd()) return false; + return this.peek().type === TokenType.COMMENT; + } + + + parseTopLevel() { + this.skipComments(); // โ† ADD THIS LINE + + if (this.isAtEnd()) return null; + + if (this.isKeyword('import')) { + this.advance(); + return this.parseImportDeclaration(); + } + + if (this.isKeyword('class')) { + this.advance(); + return this.parseClassDeclaration(); + } + + if (this.isKeyword('function')) { + this.advance(); + return this.parseFunctionDeclaration(); + } + + const expr = this.parseExpression(); + this.consumeStatementEnd(); + return new ExpressionStatement(expr, this.getLocation()); + } + isKeyword(value) { + if (this.isAtEnd()) return false; + const token = this.peek(); + return token.type === TokenType.KEYWORD && token.value === value; + } + + isPunctuation(value) { + if (this.isAtEnd()) return false; + const token = this.peek(); + return token.type === TokenType.PUNCTUATION && token.value === value; + } + + isOperator(value) { + if (this.isAtEnd()) return false; + const token = this.peek(); + return token.type === TokenType.OPERATOR && token.value === value; + } + + /** + * FIXED: parseImportDeclaration() in flutterjs_parser.js + * Handles multi-line imports with comments and proper spacing + * + * Replace the entire parseImportDeclaration() method with this version + */ + + parseImportDeclaration() { + const logger = getLogger().createComponentLogger('Parser.parseImportDeclaration'); + logger.startSession('parseImportDeclaration'); + + const startLocation = this.getLocation(); + const specifiers = []; + + logger.trace(` Starting import parse at token: ${this.peek().value}`); + + // Case 1: Named imports { x, y, z } + if (this.isPunctuation('{')) { + logger.trace(` Found opening brace, parsing named imports...`); + this.advance(); + + // โœ… FIX #1: Skip comments right after opening brace + this.skipComments(); + + while (!this.isPunctuation('}') && !this.isAtEnd()) { + // โœ… FIX #2: Skip comments before checking for closing brace + this.skipComments(); + + // Check if we hit the closing brace (after skipping comments) + if (this.isPunctuation('}')) { + logger.trace(` Found closing brace, exiting loop`); + break; + } + + // Expect an identifier + if (!this.check(TokenType.IDENTIFIER)) { + logger.warn(` Expected identifier but got: ${this.peek().value}`); + this.advance(); + continue; + } + + // Get the imported name + const importedName = this.consume(TokenType.IDENTIFIER, 'Expected identifier').value; + const imported = new Identifier(importedName); + logger.trace(` Imported: ${importedName}`); + + let local = imported; // Default: local name = imported name + + // โœ… FIX #3: Skip comments before checking for 'as' + this.skipComments(); + + // Check for 'as' alias + if (this.isKeyword('as')) { + logger.trace(` Found 'as' keyword`); + this.advance(); + + // โœ… FIX #4: Skip comments after 'as' + this.skipComments(); + + const localName = this.consume(TokenType.IDENTIFIER, 'Expected identifier after as').value; + local = new Identifier(localName); + logger.trace(` Local name: ${localName}`); + } + + // Add specifier to list + specifiers.push(new ImportSpecifier(imported, local)); + + // โœ… FIX #5: Skip comments before checking for comma + this.skipComments(); + + // Check for comma separator + if (this.isPunctuation(',')) { + logger.trace(` Found comma, continuing...`); + this.advance(); + + // โœ… FIX #6: Skip comments after comma + this.skipComments(); + + // Continue to next item + continue; + } else { + logger.trace(` No comma, expected closing brace next`); + // No more items, should see closing brace + break; + } + } + + logger.trace(` Parsed ${specifiers.length} named imports`); + + // Consume closing brace + this.consume(TokenType.PUNCTUATION, 'Expected }'); + } + + // Case 2: Default import or default + named + // import MyDefault from 'module' + // import MyDefault, { x, y } from 'module' + else if (this.check(TokenType.IDENTIFIER) && this.peekAhead(1).value !== 'from') { + logger.trace(` Found identifier without opening brace, parsing default import...`); + + const defaultName = this.consume(TokenType.IDENTIFIER, 'Expected identifier').value; + const imported = new Identifier(defaultName); + const local = new Identifier(defaultName); + specifiers.push(new ImportSpecifier(imported, local)); + + logger.trace(` Default import: ${defaultName}`); + + // Check for comma and additional named imports + this.skipComments(); + if (this.isPunctuation(',')) { + logger.trace(` Found comma after default import, checking for named imports...`); + this.advance(); + + this.skipComments(); + if (this.isPunctuation('{')) { + logger.trace(` Found opening brace, parsing additional named imports...`); + this.advance(); + + this.skipComments(); + while (!this.isPunctuation('}') && !this.isAtEnd()) { + this.skipComments(); + + if (this.isPunctuation('}')) break; + + if (!this.check(TokenType.IDENTIFIER)) { + this.advance(); + continue; + } + + const name = this.consume(TokenType.IDENTIFIER, 'Expected identifier').value; + const imported2 = new Identifier(name); + let local2 = imported2; + + this.skipComments(); + + if (this.isKeyword('as')) { + this.advance(); + this.skipComments(); + const localName = this.consume(TokenType.IDENTIFIER, 'Expected identifier after as').value; + local2 = new Identifier(localName); + } + + specifiers.push(new ImportSpecifier(imported2, local2)); + + this.skipComments(); + + if (this.isPunctuation(',')) { + this.advance(); + this.skipComments(); + continue; + } else { + break; + } + } + + this.consume(TokenType.PUNCTUATION, 'Expected }'); + } + } + } + + // โœ… FIX #7: Skip comments before 'from' + this.skipComments(); + + // Consume 'from' keyword + this.consume(TokenType.KEYWORD, 'Expected from'); + + // โœ… FIX #8: Skip comments before module path string + this.skipComments(); + + // Get the module/source path + const modulePathToken = this.consume(TokenType.STRING, 'Expected module path string'); + const source = new Literal( + modulePathToken.value, + modulePathToken.value, + 'string' + ); + + logger.trace(` Module path: ${source.value}`); + logger.trace(` Total specifiers: ${specifiers.length}`); + + // โœ… FIX #9: Consume statement end (handles semicolon and trailing comments) + this.consumeStatementEnd(); + + logger.trace(`[parseImportDeclaration] SUCCESS\n`); + return new ImportDeclaration(specifiers, source, startLocation); + } + + /** + * Helper method: Check if lookahead token matches (needed for peekAhead) + * Add this if not already present + */ + peekAhead(n = 1) { + const pos = this.current + n; + if (pos >= this.tokens.length) { + return this.tokens[this.tokens.length - 1]; + } + return this.tokens[pos]; + } + + parseClassDeclaration() { + const logger = getLogger().createComponentLogger('Parser.parseClassDeclaration'); + logger.startSession('parseClassDeclaration'); + logger.trace(` Current token: ${this.peek().value} (${this.peek().type})`); + + const startLocation = this.getLocation(); + const nameToken = this.consume(TokenType.IDENTIFIER, 'Expected class name'); + const name = new Identifier(nameToken.value); + logger.trace(` Class name: ${name.name}`); + + let superClass = null; + if (this.isKeyword('extends')) { + this.advance(); + const superName = this.consume(TokenType.IDENTIFIER, 'Expected superclass name').value; + superClass = new Identifier(superName); + logger.trace(` Extends: ${superClass.name}`); + + // Skip generic type parameters like + if (this.isOperator('<')) { + this.advance(); + this.consume(TokenType.IDENTIFIER, 'Expected type name'); + this.consume(TokenType.OPERATOR, 'Expected >'); + } + } + + logger.trace(` Looking for opening brace...`); + logger.trace(` Current token: ${this.peek().value} (${this.peek().type})`); + this.consume(TokenType.PUNCTUATION, 'Expected {'); + + const fields = []; + const methods = []; + + logger.trace(` Parsing class body...`); + let itemCount = 0; + + while (!this.isPunctuation('}') && !this.isAtEnd()) { + this.skipComments(); // โ† ADD THIS LINE - skip comments in class body + + if (this.isPunctuation('}')) break; // Check again after skipping comments + + logger.trace(` [item ${itemCount}] Current token: ${this.peek().value} (${this.peek().type})`); + + // Skip semicolons + if (this.isPunctuation(';')) { + logger.trace(` Skipping semicolon`); + this.advance(); + continue; + } + + // Check for constructor (always a method) + if (this.isKeyword('constructor')) { + logger.trace(` Found constructor`); + methods.push(this.parseMethodDeclaration()); + itemCount++; + continue; + } + + // Check for field or method + if (this.check(TokenType.IDENTIFIER)) { + const currentPos = this.current; + const idToken = this.peek(); + const fieldName = idToken.value; + logger.trace(` Found identifier: ${fieldName}`); + this.advance(); + + // CASE 1: Field initializer - IDENTIFIER = value + if (this.isOperator('=')) { + logger.trace(` -> This is a FIELD (followed by =)`); + this.current = currentPos; // Rewind + try { + fields.push(this.parseFieldDeclaration()); + logger.trace(` Field parsed successfully`); + itemCount++; + continue; + } catch (e) { + console.error(` ERROR parsing field: ${e.message}`); + throw e; + } + } + + // CASE 2: Method - IDENTIFIER ( params ) + if (this.isPunctuation('(')) { + logger.trace(` -> This is a METHOD (followed by '(')`); + this.current = currentPos; // Rewind + try { + methods.push(this.parseMethodDeclaration()); + logger.trace(` Method parsed successfully`); + itemCount++; + continue; + } catch (e) { + console.error(` ERROR parsing method: ${e.message}`); + throw e; + } + } + + logger.trace(` -> Unknown pattern, skipping`); + this.advance(); + continue; + } + + // Skip unknown tokens + logger.trace(` Skipping unknown token: ${this.peek().value}`); + this.advance(); + } + + logger.trace(` Class body parsing complete. Found ${fields.length} fields, ${methods.length} methods`); + + this.consume(TokenType.PUNCTUATION, 'Expected }'); + const body = new ClassBody(fields, methods); + logger.trace(`[parseClassDeclaration] SUCCESS\n`); + return new ClassDeclaration(name, superClass, body, startLocation); + } + + + parseMethodDeclaration() { + const logger = getLogger().createComponentLogger('Parser.parseMethodDeclaration'); + logger.startSession(` [parseMethodDeclaration] STARTING`); + logger.trace(` Current: ${this.peek().value}`); + + const startLocation = this.getLocation(); + + let methodName; + if (this.isKeyword('constructor')) { + methodName = 'constructor'; + this.advance(); + } else { + methodName = this.consume(TokenType.IDENTIFIER, 'Expected method name').value; + } + + logger.trace(` Method name: ${methodName}`); + const key = new Identifier(methodName); + + this.consume(TokenType.PUNCTUATION, 'Expected ('); + const params = this.parseParameterList(); + logger.trace(` Parameters: ${params.length}`); + this.consume(TokenType.PUNCTUATION, 'Expected )'); + + let body = null; + if (this.isOperator('=>')) { + logger.trace(` Arrow function body`); + this.advance(); + body = this.parseExpression(); + } else if (this.isPunctuation('{')) { + logger.trace(` Block body`); + this.advance(); + body = this.parseBlock(); + } + + logger.trace(` [parseMethodDeclaration] SUCCESS`); + return new MethodDeclaration(key, params, body, startLocation); + } + parseFieldDeclaration() { + console.log(` [parseFieldDeclaration] STARTING`); + console.log(` Current: ${this.peek().value}`); + + const startLocation = this.getLocation(); + const fieldName = this.consume(TokenType.IDENTIFIER, 'Expected field name').value; + const key = new Identifier(fieldName); + console.log(` Field name: ${fieldName}`); + + let initialValue = null; + if (this.isOperator('=')) { + console.log(` Found = operator, parsing initializer...`); + this.advance(); + try { + initialValue = this.parseExpression(); + console.log(` Initializer parsed: ${initialValue.type}`); + } catch (e) { + console.error(` ERROR parsing initializer: ${e.message}`); + throw e; + } + } + + this.consumeStatementEnd(); + console.log(` [parseFieldDeclaration] SUCCESS`); + return new FieldDeclaration(key, initialValue, startLocation); + } + + parseFunctionDeclaration() { + const startLocation = this.getLocation(); + const nameToken = this.consume(TokenType.IDENTIFIER, 'Expected function name'); + const name = nameToken.value ? new Identifier(nameToken.value) : null; + + this.consume(TokenType.PUNCTUATION, 'Expected ('); + const params = this.parseParameterList(); + this.consume(TokenType.PUNCTUATION, 'Expected )'); + + this.consume(TokenType.PUNCTUATION, 'Expected {'); + const body = this.parseBlock(); + + return new FunctionDeclaration(name, params, body, false, startLocation); + } + + /** + * Parse parameter list - FIXED to handle UNDEFINED and NULL token types + */ + parseParameterList() { + const params = []; + + while (!this.isPunctuation(')') && !this.isAtEnd()) { + const paramLocation = this.getLocation(); + + // Handle destructuring: { key = value } + if (this.isPunctuation('{')) { + this.advance(); + while (!this.isPunctuation('}') && !this.isAtEnd()) { + const paramName = this.consume(TokenType.IDENTIFIER, 'Expected param name').value; + let defaultValue = null; + + if (this.isOperator('=')) { + this.advance(); + // FIXED: Check token type, not just keywords + const token = this.peek(); + + if (this.check(TokenType.IDENTIFIER)) { + defaultValue = new Identifier(this.advance().value); + } else if (this.check(TokenType.NUMBER)) { + defaultValue = new Literal(parseFloat(this.advance().value), '', 'number'); + } else if (this.check(TokenType.UNDEFINED)) { + // FIXED: Handle UNDEFINED token type + this.advance(); + defaultValue = new Literal(undefined, 'undefined', 'undefined'); + } else if (this.check(TokenType.NULL)) { + // FIXED: Handle NULL token type + this.advance(); + defaultValue = new Literal(null, 'null', 'null'); + } else if (this.isKeyword('undefined')) { + this.advance(); + defaultValue = new Literal(undefined, 'undefined', 'undefined'); + } else if (this.isKeyword('null')) { + this.advance(); + defaultValue = new Literal(null, 'null', 'null'); + } + } + + params.push(new Parameter(new Identifier(paramName), defaultValue !== null, defaultValue, paramLocation)); + + if (!this.isPunctuation(',')) break; + this.advance(); + } + this.consume(TokenType.PUNCTUATION, 'Expected }'); + + // Handle = {} after destructuring + if (this.isOperator('=')) { + this.advance(); + if (this.isPunctuation('{')) { + this.advance(); + let braceDepth = 1; + while (braceDepth > 0 && !this.isAtEnd()) { + if (this.isPunctuation('{')) braceDepth++; + else if (this.isPunctuation('}')) braceDepth--; + if (braceDepth > 0) this.advance(); + } + this.consume(TokenType.PUNCTUATION, 'Expected }'); + } + } + } else if (this.check(TokenType.IDENTIFIER)) { + // Regular parameter + const paramName = this.consume(TokenType.IDENTIFIER, 'Expected param name').value; + let defaultValue = null; + + if (this.isOperator('=')) { + this.advance(); + const token = this.peek(); + + if (this.check(TokenType.IDENTIFIER)) { + defaultValue = new Identifier(this.advance().value); + } else if (this.check(TokenType.NUMBER)) { + defaultValue = new Literal(parseFloat(this.advance().value), '', 'number'); + } else if (this.check(TokenType.UNDEFINED)) { + this.advance(); + defaultValue = new Literal(undefined, 'undefined', 'undefined'); + } else if (this.check(TokenType.NULL)) { + this.advance(); + defaultValue = new Literal(null, 'null', 'null'); + } else if (this.isKeyword('undefined')) { + this.advance(); + defaultValue = new Literal(undefined, 'undefined', 'undefined'); + } else if (this.isKeyword('null')) { + this.advance(); + defaultValue = new Literal(null, 'null', 'null'); + } + } + + params.push(new Parameter(new Identifier(paramName), defaultValue !== null, defaultValue, paramLocation)); + } else { + break; + } + + if (!this.isPunctuation(',')) break; + this.advance(); + } + + return params; + } + + parseBlock() { + console.log(`\n[parseBlock] STARTING at token: ${this.peek().value}`); + + const startLocation = this.getLocation(); + const statements = []; + + while (!this.isPunctuation('}') && !this.isAtEnd()) { + this.skipComments(); // โ† ADD THIS LINE - skip comments in block + + if (this.isPunctuation('}')) break; // Check again after skipping + + console.log(` [parseBlock] Current token: ${this.peek().value} (${this.peek().type})`); + + if (this.isKeyword('return')) { + console.log(` Found RETURN statement`); + this.advance(); + let argument = null; + + if (!this.isPunctuation(';') && !this.isPunctuation('}')) { + console.log(` Parsing return argument...`); + try { + argument = this.parseExpression(); + console.log(` Return argument parsed successfully`); + } catch (error) { + console.error(` โŒ ERROR parsing return argument: ${error.message}`); + console.error(` Token was: ${this.peek().value}`); + + // Skip to semicolon + while (!this.isPunctuation(';') && !this.isPunctuation('}') && !this.isAtEnd()) { + this.advance(); + } + } + } + + this.consumeStatementEnd(); + statements.push(new ReturnStatement(argument, startLocation)); + + } else { + console.log(` Parsing expression statement...`); + try { + const expr = this.parseExpression(); + console.log(` Expression parsed successfully: ${expr.type}`); + this.consumeStatementEnd(); + statements.push(new ExpressionStatement(expr, startLocation)); + } catch (error) { + console.error(` โŒ ERROR parsing expression: ${error.message}`); + console.error(` Token was: ${this.peek().value}`); + + // Skip to next statement + while (!this.isPunctuation(';') && !this.isPunctuation('}') && !this.isAtEnd()) { + this.advance(); + } + if (this.isPunctuation(';')) { + this.advance(); + } + } + } + } + + if (this.isPunctuation('}')) { + this.advance(); + } + + console.log(`[parseBlock] SUCCESS - ${statements.length} statements\n`); + return new BlockStatement(statements, startLocation); + } + + parseExpression() { + console.log(` [parseExpression] Current token: ${this.peek().value}`); + try { + const result = this.parseAssignment(); + console.log(` [parseExpression] โœ“ Success, type: ${result.type}`); + return result; + } catch (e) { + console.error(` [parseExpression] โœ— Failed: ${e.message}`); + throw e; + } + } + + parseAssignment() { + let expr = this.parseTernary(); + + if (this.isOperator('=')) { + this.advance(); + const value = this.parseAssignment(); + return { type: 'AssignmentExpression', left: expr, right: value }; + } + + return expr; + } + + parseTernary() { + let expr = this.parseLogicalOr(); + + if (this.isOperator('?')) { + this.advance(); + const consequent = this.parseExpression(); + this.consume(TokenType.OPERATOR, 'Expected :'); + const alternate = this.parseExpression(); + return { type: 'ConditionalExpression', test: expr, consequent, alternate }; + } + + return expr; + } + + parseLogicalOr() { + let expr = this.parseLogicalAnd(); + + while (this.isOperator('||')) { + this.advance(); + const right = this.parseLogicalAnd(); + expr = { type: 'LogicalExpression', operator: '||', left: expr, right }; + } + + return expr; + } + + parseLogicalAnd() { + let expr = this.parseEquality(); + + while (this.isOperator('&&')) { + this.advance(); + const right = this.parseEquality(); + expr = { type: 'LogicalExpression', operator: '&&', left: expr, right }; + } + + return expr; + } + + parseEquality() { + let expr = this.parseRelational(); + + while (this.isOperator('===') || this.isOperator('!==') || this.isOperator('==') || this.isOperator('!=')) { + const operator = this.advance().value; + const right = this.parseRelational(); + expr = { type: 'BinaryExpression', operator, left: expr, right }; + } + + return expr; + } + + parseRelational() { + let expr = this.parseAdditive(); + + while (this.isOperator('<') || this.isOperator('>') || this.isOperator('<=') || this.isOperator('>=')) { + const operator = this.advance().value; + const right = this.parseAdditive(); + expr = { type: 'BinaryExpression', operator, left: expr, right }; + } + + return expr; + } + + parseAdditive() { + let expr = this.parseMultiplicative(); + + while (this.isOperator('+') || this.isOperator('-')) { + const operator = this.advance().value; + const right = this.parseMultiplicative(); + expr = { type: 'BinaryExpression', operator, left: expr, right }; + } + + return expr; + } + + parseMultiplicative() { + let expr = this.parseUnary(); + + while (this.isOperator('*') || this.isOperator('/') || this.isOperator('%')) { + const operator = this.advance().value; + const right = this.parseUnary(); + expr = { type: 'BinaryExpression', operator, left: expr, right }; + } + + return expr; + } + + parseUnary() { + console.log(` [parseUnary] Current: ${this.peek().value}`); + + if (this.isOperator('!') || this.isOperator('-') || this.isOperator('+') || this.isOperator('~')) { + const operator = this.advance().value; + const expr = this.parseUnary(); + return { type: 'UnaryExpression', operator, argument: expr }; + } + + + console.log(` [parseUnary] Calling parsePostfix`); + return this.parsePostfix(); + } + + parsePostfix() { + console.log(` [parsePostfix] Starting, calling parseCall`); + let expr = this.parseCall(); + console.log(` [parsePostfix] parseCall returned: ${expr.type || expr.name}`); + console.log(` [parsePostfix] Next token: ${this.peek().value}`); + + while (true) { + if (this.isOperator('++') || this.isOperator('--')) { + const operator = this.advance().value; + expr = { type: 'UpdateExpression', operator, argument: expr, prefix: false }; + } else if (this.isPunctuation('.')) { + console.log(` [parsePostfix] Found . member access`); + this.advance(); + const property = new Identifier(this.consume(TokenType.IDENTIFIER, 'Expected property').value); + expr = new MemberExpression(expr, property, false); + console.log(` [parsePostfix] Created MemberExpression: ${expr.object.name}.${expr.property.name}`); + } else if (this.isPunctuation('[')) { + console.log(` [parsePostfix] Found [ computed access`); + this.advance(); + const property = this.parseExpression(); + this.consume(TokenType.PUNCTUATION, 'Expected ]'); + expr = new MemberExpression(expr, property, true); + } else { + console.log(` [parsePostfix] No more postfix ops, returning ${expr.type}`); + break; + } + } + + return expr; + } + + + parseCall() { + console.log(` [parseCall] Starting, calling parsePrimary`); + let expr = this.parsePrimary(); + console.log(` [parseCall] parsePrimary returned: ${expr.type || expr.name}`); + console.log(` [parseCall] Next token: ${this.peek().value} (${this.peek().type})`); + + while (this.isPunctuation('(')) { + console.log(` [parseCall] Found (, parsing function call`); + this.advance(); + const args = this.parseArguments(); + console.log(` [parseCall] Parsed ${args.length} arguments`); + this.consume(TokenType.PUNCTUATION, 'Expected )'); + expr = new CallExpression(expr, args); + console.log(` [parseCall] Created CallExpression`); + } + + console.log(` [parseCall] Returning: ${expr.type}`); + return expr; + } + + parsePrimary() { + console.log(` [parsePrimary] Current: ${this.peek().value} (${this.peek().type})`); + + // Handle 'this' keyword FIRST + if (this.isKeyword('this')) { + this.advance(); + console.log(` [parsePrimary] โœ“ this keyword`); + return new Identifier('this'); + } + + if (this.check(TokenType.STRING)) { + const token = this.advance(); + console.log(` [parsePrimary] โœ“ string literal: ${token.value}`); + return new Literal(token.value, token.value, 'string'); + } + + if (this.check(TokenType.NUMBER)) { + const token = this.advance(); + console.log(` [parsePrimary] โœ“ number literal: ${token.value}`); + return new Literal(parseFloat(token.value), token.value, 'number'); + } + + if (this.check(TokenType.BOOLEAN)) { + const token = this.advance(); + console.log(` [parsePrimary] โœ“ boolean: ${token.value}`); + return new Literal(token.value === 'true', token.value, 'boolean'); + } + + if (this.check(TokenType.NULL)) { + this.advance(); + console.log(` [parsePrimary] โœ“ null`); + return new Literal(null, 'null', 'null'); + } + + if (this.check(TokenType.UNDEFINED)) { + this.advance(); + console.log(` [parsePrimary] โœ“ undefined`); + return new Literal(undefined, 'undefined', 'undefined'); + } + + if (this.isKeyword('null')) { + this.advance(); + console.log(` [parsePrimary] โœ“ null keyword`); + return new Literal(null, 'null', 'null'); + } + + if (this.isKeyword('undefined')) { + this.advance(); + console.log(` [parsePrimary] โœ“ undefined keyword`); + return new Literal(undefined, 'undefined', 'undefined'); + } + + if (this.isPunctuation('(')) { + console.log(` [parsePrimary] Found ( - checking for arrow function or grouped expr`); + const savedPos = this.current; + this.advance(); + + if (this.isPunctuation(')')) { + const nextPos = this.current + 1; + if (nextPos < this.tokens.length && + this.tokens[nextPos].type === TokenType.OPERATOR && + this.tokens[nextPos].value === '=>') { + console.log(` [parsePrimary] โœ“ arrow function with no params: () => ...`); + this.consume(TokenType.PUNCTUATION, 'Expected )'); + this.consume(TokenType.OPERATOR, 'Expected =>'); + const body = this.parseExpression(); + return new ArrowFunctionExpression([], body); + } + } + + const expr = this.parseExpression(); + this.consume(TokenType.PUNCTUATION, 'Expected )'); + + if (this.isOperator('=>')) { + console.log(` [parsePrimary] โœ“ arrow function: (x) => ...`); + this.advance(); + const body = this.parseExpression(); + let params = []; + if (expr.type === 'Identifier') { + params = [new Parameter(expr, false, null)]; + } + return new ArrowFunctionExpression(params, body); + } + + console.log(` [parsePrimary] โœ“ grouped expression`); + return expr; + } + + if (this.isPunctuation('{')) { + console.log(` [parsePrimary] โœ“ object literal`); + this.advance(); + return this.parseObjectLiteral(); + } + + if (this.isPunctuation('[')) { + console.log(` [parsePrimary] โœ“ array literal`); + this.advance(); + const elements = []; + while (!this.isPunctuation(']') && !this.isAtEnd()) { + elements.push(this.parseExpression()); + if (!this.isPunctuation(',')) break; + this.advance(); + } + this.consume(TokenType.PUNCTUATION, 'Expected ]'); + return { type: 'ArrayLiteral', elements }; + } + + if (this.isKeyword('new')) { + console.log(` [parsePrimary] โœ“ new expression`); + this.advance(); + const callee = new Identifier(this.consume(TokenType.IDENTIFIER, 'Expected class name').value); + this.consume(TokenType.PUNCTUATION, 'Expected ('); + const args = this.parseArguments(); + this.consume(TokenType.PUNCTUATION, 'Expected )'); + return new NewExpression(callee, args); + } + + if (this.isKeyword('const')) { + const savedPos = this.current; + this.advance(); + + // Case 1: const new ClassName(...) + if (this.isKeyword('new')) { + console.log(` [parsePrimary] โœ“ const new expression`); + this.advance(); + const callee = new Identifier(this.consume(TokenType.IDENTIFIER, 'Expected class name').value); + this.consume(TokenType.PUNCTUATION, 'Expected ('); + const args = this.parseArguments(); + this.consume(TokenType.PUNCTUATION, 'Expected )'); + const expr = new NewExpression(callee, args); + expr.isConst = true; + return expr; + } + + // Case 2: const ClassName(...) - implicit new + if (this.check(TokenType.IDENTIFIER)) { + console.log(` [parsePrimary] โœ“ const implicit new expression (ignoring const)`); + // Just treat it as a normal identifier start, we consumed 'const' + // Recursively call parsePrimary to handle the Identifier + return this.parsePrimary(); + } + + // Case 3: const [] - constant array + if (this.isPunctuation('[')) { + console.log(` [parsePrimary] โœ“ const array literal`); + // recurse to handle [ + return this.parsePrimary(); + } + + // Case 4: const {} - constant object/map + if (this.isPunctuation('{')) { + console.log(` [parsePrimary] โœ“ const object literal`); + return this.parsePrimary(); + } + + // Fallback + this.current = savedPos; + } + + if (this.check(TokenType.IDENTIFIER)) { + const token = this.advance(); + const ident = new Identifier(token.value); + console.log(` [parsePrimary] โœ“ identifier: ${token.value}`); + + if (this.isOperator('=>')) { + console.log(` [parsePrimary] โœ“ arrow function: x => ...`); + this.advance(); + const body = this.parseExpression(); + return new ArrowFunctionExpression([new Parameter(ident)], body); + } + + return ident; + } + + // If we get here, we couldn't parse anything + console.error(` [parsePrimary] โŒ FAILED - Cannot parse token: ${this.peek().value} (${this.peek().type})`); + throw this.error('Expected expression'); + } + + + enterMethod(methodName) { + if (!this.callStack) this.callStack = []; + this.callStack.push({ + method: methodName, + line: this.peek().line, + column: this.peek().column, + token: this.peek().value, + }); + } + + parseObjectLiteral() { + this.enterMethod('parseObjectLiteral'); + const properties = []; + + try { + while (!this.isPunctuation('}') && !this.isAtEnd()) { + if (this.isPunctuation(',')) { + this.advance(); + continue; + } + + let key = null; + let shorthand = false; + + if (this.isPunctuation('[')) { + this.advance(); + key = this.parseExpression(); + this.consume(TokenType.PUNCTUATION, 'Expected ]'); + } else if (this.check(TokenType.IDENTIFIER)) { + const token = this.advance(); + key = new Identifier(token.value); + + if (this.isPunctuation(',') || this.isPunctuation('}')) { + shorthand = true; + } + } else if (this.check(TokenType.STRING)) { + const token = this.advance(); + key = new Literal(token.value, token.value, 'string'); + } else { + this.advance(); + continue; + } + + let value = key; + if (!shorthand && this.isPunctuation(':')) { + this.advance(); + + try { + value = this.parseTernary(); + } catch (error) { + if (error.parserError) { + this.reportParserError(error.parserError); + } + value = key; + + while (!this.isPunctuation(',') && !this.isPunctuation('}') && !this.isAtEnd()) { + this.advance(); + } + } + } + + const prop = new Property(key, value); + prop.shorthand = shorthand; + properties.push(prop); + + if (this.isPunctuation(',')) { + this.advance(); + } + } + + if (this.isPunctuation('}')) { + this.advance(); + } + + this.exitMethod('parseObjectLiteral'); + return new ObjectLiteral(properties); + } catch (e) { + this.exitMethod('parseObjectLiteral'); + throw e; + } + } + parseArguments() { + const args = []; + + while (!this.isPunctuation(')') && !this.isAtEnd()) { + try { + // โญ KEY FIX: Use parseTernary() instead of parseLogicalOr() + // This allows all operators except assignment + args.push(this.parseTernary()); + } catch (error) { + break; + } + + if (!this.isPunctuation(',')) break; + this.advance(); + } + + return args; + } + + check(type) { + if (this.isAtEnd()) return false; + return this.peek().type === type; + } + + consume(type, message = '') { + if (this.check(type)) { + return this.advance(); + } + throw this.error(message || `Expected ${type}`); + } + + consumeStatementEnd() { + this.skipComments(); // โ† ADD THIS LINE + + if (this.isPunctuation(';')) { + this.advance(); + } + + this.skipComments(); // โ† ADD THIS LINE - skip trailing comments too + } + + advance() { + if (!this.isAtEnd()) { + this.current++; + } + return this.previous(); + } + + peek() { + return this.tokens[this.current]; + } + + + previous() { + return this.tokens[this.current - 1]; + } + + isAtEnd() { + return this.peek().type === TokenType.EOF; + } + + getLocation() { + const token = this.peek(); + return { line: token.line, column: token.column }; + } + /** + * Enhanced error reporting with full call stack + */ + error(message) { + const token = this.peek(); + const errorObj = new Error( + `Parse error at line ${token.line}, column ${token.column}: ${message}` + ); + errorObj.parserError = { + message: `Parse error at line ${token.line}, column ${token.column}: ${message}`, + line: token.line, + column: token.column, + token: { type: token.type, value: token.value }, + callStack: this.callStack ? [...this.callStack] : [], + }; + return errorObj; + } + /** + * Get context around current token (5 tokens before and after) + */ + getContext() { + const start = Math.max(0, this.current - 5); + const end = Math.min(this.tokens.length, this.current + 6); + + return { + before: this.tokens.slice(start, this.current).map(t => `${t.value}(${t.type})`).join(' '), + current: `โ†’ ${this.peek().value}(${this.peek().type}) โ†`, + after: this.tokens.slice(this.current + 1, end).map(t => `${t.value}(${t.type})`).join(' '), + }; + } + /** + * Track when exiting a parser method + */ + exitMethod(methodName) { + if (!this.callStack) this.callStack = []; + if (this.callStack.length > 0) { + const last = this.callStack[this.callStack.length - 1]; + if (last.method === methodName) { + this.callStack.pop(); + } + } + } + + getTokenContext() { + const start = Math.max(0, this.current - 5); + const end = Math.min(this.tokens.length, this.current + 6); + + const before = this.tokens + .slice(start, this.current) + .map(t => `${t.value}`) + .join(' '); + + const after = this.tokens + .slice(this.current + 1, end) + .map(t => `${t.value}`) + .join(' '); + + return { + before: before, + current: `โ†’ ${this.peek().value} โ†`, + after: after, + }; + } + + synchronize() { + this.advance(); + while (!this.isAtEnd()) { + if (this.isPunctuation(';')) { + this.advance(); + return; + } + if (this.isKeyword('class') || this.isKeyword('function') || this.isKeyword('import')) { + return; + } + this.advance(); + } + } + + getErrors() { + return this.errors; + } + + /** + * Report error with full context + */ + reportError(error) { + this.errors.push(error); + + if (this.debugMode) { + console.error('\nโŒ PARSER ERROR DETECTED:\n'); + console.error(`Message: ${error.message}\n`); + + console.error('๐Ÿ“ Token Context:'); + console.error(` Before: ${error.context.before}`); + console.error(` Current: ${error.context.current}`); + console.error(` After: ${error.context.after}\n`); + + console.error('๐Ÿ“š Call Stack (where error came from):'); + if (error.callStack.length === 0) { + console.error(' (top level)\n'); + } else { + error.callStack.forEach((frame, idx) => { + const arrow = idx === error.callStack.length - 1 ? 'โ†’' : ' '; + console.error(` ${arrow} ${idx + 1}. ${frame.method}()`); + console.error(` at token: "${frame.token}" (line ${frame.line}, col ${frame.column})`); + }); + console.error(''); + } + } + } +} + +// ============================================================================ +// EXPORTS +// ============================================================================ + +export { + Parser, + Program, + ImportDeclaration, + ImportSpecifier, + ClassDeclaration, + ClassBody, + FieldDeclaration, + MethodDeclaration, + Parameter, + FunctionDeclaration, + BlockStatement, + ReturnStatement, + ExpressionStatement, + Identifier, + Literal, + CallExpression, + NewExpression, + ObjectLiteral, + Property, + ArrowFunctionExpression, + MemberExpression, + ASTNode, +}; \ No newline at end of file diff --git a/packages/flutterjs_engine/src/analyzer/src/flutterjs_report_generator.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_report_generator.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/flutterjs_report_generator.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_report_generator.js diff --git a/packages/flutterjs_engine/src/analyzer/src/flutterjs_widget_analyzer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_widget_analyzer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/flutterjs_widget_analyzer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/flutterjs_widget_analyzer.js diff --git a/packages/flutterjs_engine/src/analyzer/src/lexer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/lexer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/lexer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/lexer.js diff --git a/packages/flutterjs_engine/src/analyzer/src/ssr_analyzer.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/ssr_analyzer.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/ssr_analyzer.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/ssr_analyzer.js diff --git a/packages/flutterjs_engine/src/analyzer/src/state_analyzer_data.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/state_analyzer_data.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/state_analyzer_data.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/state_analyzer_data.js diff --git a/packages/flutterjs_engine/src/analyzer/src/state_analyzer_implementation.js b/packages/flutterjs_analyzer/flutterjs_analyzer/src/state_analyzer_implementation.js similarity index 100% rename from packages/flutterjs_engine/src/analyzer/src/state_analyzer_implementation.js rename to packages/flutterjs_analyzer/flutterjs_analyzer/src/state_analyzer_implementation.js diff --git a/packages/flutterjs_analyzer/pubspec.yaml b/packages/flutterjs_analyzer/pubspec.yaml index 38c07801..b2b5fb3b 100644 --- a/packages/flutterjs_analyzer/pubspec.yaml +++ b/packages/flutterjs_analyzer/pubspec.yaml @@ -1,20 +1,24 @@ name: flutterjs_analyzer -description: A sample command-line application. -version: 1.0.0 -resolution: workspace -# repository: https://github.com/my_org/my_repo +version: 0.1.0 +description: FlutterJS Analyzer - Dart widget analyzer + +homepage: https://github.com/flutterjs/flutterjs_analyzer +repository: https://github.com/flutterjs/flutterjs_analyzer +issue_tracker: https://github.com/flutterjs/flutterjs_analyzer/issues environment: - sdk: ^3.10.0-278.0.dev + sdk: '>=2.19.0 <4.0.0' -# Add regular dependencies here. dependencies: - path: ^1.9.0 - analyzer: - flutterjs_dev_tools: any - - + flutter: + sdk: flutter dev_dependencies: - lints: ^6.0.0 - test: ^1.25.6 + flutter_test: + sdk: flutter + +# FlutterJS metadata +flutterjs: + npm_package: "@flutterjs/analyzer" + implementation_language: "javascript" + js_entry: "flutterjs_analyzer/src/index.js" diff --git a/packages/flutterjs_animation/.gitignore b/packages/flutterjs_animation/.gitignore new file mode 100644 index 00000000..1d4cb04d --- /dev/null +++ b/packages/flutterjs_animation/.gitignore @@ -0,0 +1,31 @@ +# Dependencies +node_modules/ + +# Build outputs +build/ +dist/ +.dev/ +.debug/ + +# Generated files +.flutterjs/ +.cache/ + +# Dart +.dart_tool/ +.packages +pubspec.lock + +# OS files +.DS_Store +Thumbs.db + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# Logs +*.log +npm-debug.log* diff --git a/packages/flutterjs_animation/.pubignore b/packages/flutterjs_animation/.pubignore new file mode 100644 index 00000000..bae5ffcf --- /dev/null +++ b/packages/flutterjs_animation/.pubignore @@ -0,0 +1,11 @@ +# Exclude JavaScript implementation from pub.dev +js/ +node_modules/ +dist/ +build/ +.git/ +.github/ +test/ +package-lock.json +.vscode/ +.idea/ diff --git a/packages/flutterjs_animation/CHANGELOG.md b/packages/flutterjs_animation/CHANGELOG.md new file mode 100644 index 00000000..13187808 --- /dev/null +++ b/packages/flutterjs_animation/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.1.0 + +* Initial release diff --git a/packages/flutterjs_animation/LICENSE b/packages/flutterjs_animation/LICENSE new file mode 100644 index 00000000..14fac913 --- /dev/null +++ b/packages/flutterjs_animation/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/flutterjs_animation/README.md b/packages/flutterjs_animation/README.md new file mode 100644 index 00000000..d4af01d5 --- /dev/null +++ b/packages/flutterjs_animation/README.md @@ -0,0 +1,58 @@ +# FlutterjsAnimation + +A FlutterJS package + +## Installation + +Add to `pubspec.yaml`: + +```yaml +dependencies: + flutterjs_animation: ^0.1.0 +``` + +Then run: + +```bash +flutterjs get +``` + +## Usage + +See `example/` for a complete Flutter app. + +## JavaScript Implementation + +The actual implementation is in `js/src/` (JavaScript). + +To develop: + +```bash +cd js +npm install +``` + +## Features + +- Lightweight implementation +- SEO-friendly (FlutterJS rendering) +- Easy to use + +## Publishing + +### 1. Publish JavaScript to npm + +```bash +cd js +npm publish +``` + +### 2. Publish Dart wrapper to pub.dev + +```bash +dart pub publish +``` + +## License + +MIT diff --git a/packages/flutterjs_animation/example/lib/main.dart b/packages/flutterjs_animation/example/lib/main.dart new file mode 100644 index 00000000..a425720c --- /dev/null +++ b/packages/flutterjs_animation/example/lib/main.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'FlutterjsAnimation Example', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: const ExamplePage(), + ); + } +} + +class ExamplePage extends StatefulWidget { + const ExamplePage({Key? key}) : super(key: key); + + @override + State createState() => _ExamplePageState(); +} + +class _ExamplePageState extends State { + String result = 'Click the button to test'; + + void _testPackage() { + setState(() { + // This will call the JavaScript implementation when running with FlutterJS + result = 'FlutterjsAnimation is ready!\n\nRun: flutterjs run --to-js --serve'; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('FlutterjsAnimation Example'), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + result, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 16), + ), + const SizedBox(height: 20), + ElevatedButton( + onPressed: _testPackage, + child: const Text('Test FlutterjsAnimation'), + ), + ], + ), + ), + ); + } +} diff --git a/packages/flutterjs_animation/example/pubspec.yaml b/packages/flutterjs_animation/example/pubspec.yaml new file mode 100644 index 00000000..af3a894f --- /dev/null +++ b/packages/flutterjs_animation/example/pubspec.yaml @@ -0,0 +1,15 @@ +name: flutterjs_animation_example +description: Example app for flutterjs_animation + +publish_to: 'none' + +environment: + sdk: '>=2.19.0 <4.0.0' + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter diff --git a/packages/flutterjs_animation/flutterjs_animation/build.js b/packages/flutterjs_animation/flutterjs_animation/build.js new file mode 100644 index 00000000..8f0f4096 --- /dev/null +++ b/packages/flutterjs_animation/flutterjs_animation/build.js @@ -0,0 +1,99 @@ +/** + * Build script for @flutterjs/flutterjs_animation + * + * Generates exports.json manifest for the import resolver system + */ + +import { readFileSync, writeFileSync, readdirSync, statSync } from 'fs'; +import { join, extname } from 'path'; + +const srcDir = './src'; + +/** + * Get all JavaScript files recursively + */ +function getAllJsFiles(dir, fileList = []) { + const files = readdirSync(dir); + + for (const file of files) { + const filePath = join(dir, file); + const stat = statSync(filePath); + + if (stat.isDirectory()) { + getAllJsFiles(filePath, fileList); + } else if (extname(file) === '.js') { + fileList.push(filePath); + } + } + + return fileList; +} + +/** + * Scan all source files and generate exports.json manifest + * This manifest tells the Dart code generator what symbols this package exports + */ +function generateExportManifest(sourceFiles) { + const manifest = { + package: '@flutterjs/flutterjs_animation', + version: '0.1.0', + exports: [] + }; + + // Regex patterns to match different export types + const exportRegex = /export\s*{\s*([^}]+)\s*}/g; + const exportStarRegex = /export\s*\*\s*from/g; + const classRegex = /export\s+class\s+(\w+)/g; + const functionRegex = /export\s+function\s+(\w+)/g; + const constRegex = /export\s+const\s+(\w+)/g; + + for (const srcFile of sourceFiles) { + const content = readFileSync(srcFile, 'utf8'); + + // Find named exports: export { Foo, Bar } + for (const match of content.matchAll(exportRegex)) { + const symbols = match[1] + .split(',') + .map(s => s.trim()) + .map(s => s.split(/\s+as\s+/).pop()) // Handle "export { Foo as Bar }" + .filter(s => s && !s.includes('from')); + manifest.exports.push(...symbols); + } + + // Find class exports: export class Foo + for (const match of content.matchAll(classRegex)) { + manifest.exports.push(match[1]); + } + + // Find function exports: export function foo() + for (const match of content.matchAll(functionRegex)) { + manifest.exports.push(match[1]); + } + + // Find const exports: export const FOO + for (const match of content.matchAll(constRegex)) { + manifest.exports.push(match[1]); + } + } + + // Remove duplicates and sort + manifest.exports = [...new Set(manifest.exports)].sort(); + + writeFileSync('./exports.json', JSON.stringify(manifest, null, 2) + '\n'); + console.log(`๐Ÿ“‹ Generated exports.json with ${manifest.exports.length} symbols\n`); +} + +// Main build process +async function build() { + console.log('๐Ÿš€ Building @flutterjs/flutterjs_animation...\n'); + + const allFiles = getAllJsFiles(srcDir); + console.log(`๐Ÿ“ฆ Found ${allFiles.length} JavaScript files\n`); + + // Generate export manifest + generateExportManifest(allFiles); + + console.log('โœ… Build successful!\n'); +} + +build().catch(console.error); diff --git a/packages/flutterjs_animation/flutterjs_animation/package.json b/packages/flutterjs_animation/flutterjs_animation/package.json new file mode 100644 index 00000000..d25d53f4 --- /dev/null +++ b/packages/flutterjs_animation/flutterjs_animation/package.json @@ -0,0 +1,26 @@ +{ + "name": "@flutterjs/flutterjs_animation", + "version": "0.1.0", + "description": "A FlutterJS package", + "main": "src/index.js", + "type": "module", + "scripts": { + "test": "echo \"No tests yet\"", + "prepublishOnly": "echo \"Ready to publish\"" + }, + "keywords": [ + "flutterjs", + "flutterjs_animation" + ], + "author": "", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/flutterjsdev/flutterjs.git" + }, + "files": [ + "src/", + "README.md", + "LICENSE" + ] +} diff --git a/packages/flutterjs_animation/flutterjs_animation/src/index.js b/packages/flutterjs_animation/flutterjs_animation/src/index.js new file mode 100644 index 00000000..38395a90 --- /dev/null +++ b/packages/flutterjs_animation/flutterjs_animation/src/index.js @@ -0,0 +1,43 @@ +/** + * FlutterJS FlutterjsAnimation + * + * Simple, lightweight implementation built with JavaScript + */ + +/** + * Main class for FlutterjsAnimation + */ +export class FlutterjsAnimation { + constructor(config = {}) { + this.config = config; + } + + /** + * Example method - replace with your implementation + */ + hello() { + return 'Hello from FlutterjsAnimation!'; + } + + /** + * Example async method + */ + async fetchData(url) { + try { + const response = await fetch(url); + return await response.json(); + } catch (error) { + console.error('Error fetching data:', error); + throw error; + } + } +} + +/** + * Helper function + */ +export function createInstance(config) { + return new FlutterjsAnimation(config); +} + +export default FlutterjsAnimation; diff --git a/packages/flutterjs_animation/lib/flutterjs_animation.dart b/packages/flutterjs_animation/lib/flutterjs_animation.dart new file mode 100644 index 00000000..91fcc961 --- /dev/null +++ b/packages/flutterjs_animation/lib/flutterjs_animation.dart @@ -0,0 +1,26 @@ +/// FlutterJS FlutterjsAnimation +/// +/// A FlutterJS package +/// +/// The actual implementation is in JavaScript. +/// This package is a metadata wrapper published to pub.dev. +/// +/// ## Usage +/// +/// Add to your `pubspec.yaml`: +/// ```yaml +/// dependencies: +/// flutterjs_animation: ^0.1.0 +/// ``` +/// +/// Then run: +/// ```bash +/// flutterjs get +/// ``` +/// +/// The package will be installed to: `build/flutterjs/node_modules/@flutterjs/flutterjs_animation` +/// +/// See `example/` for a complete working app. +library flutterjs_animation; + +// The real implementation is in js/src/ diff --git a/packages/flutterjs_animation/pubspec.yaml b/packages/flutterjs_animation/pubspec.yaml new file mode 100644 index 00000000..34886831 --- /dev/null +++ b/packages/flutterjs_animation/pubspec.yaml @@ -0,0 +1,24 @@ +name: flutterjs_animation +version: 0.1.0 +description: A FlutterJS package + +homepage: https://github.com/flutterjs/flutterjs_animation +repository: https://github.com/flutterjs/flutterjs_animation +issue_tracker: https://github.com/flutterjs/flutterjs_animation/issues + +environment: + sdk: '>=2.19.0 <4.0.0' + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +# FlutterJS metadata +flutterjs: + npm_package: "@flutterjs/flutterjs_animation" + implementation_language: "javascript" + js_entry: "js/src/index.js" diff --git a/packages/flutterjs_cupertino/.gitignore b/packages/flutterjs_cupertino/.gitignore new file mode 100644 index 00000000..1d4cb04d --- /dev/null +++ b/packages/flutterjs_cupertino/.gitignore @@ -0,0 +1,31 @@ +# Dependencies +node_modules/ + +# Build outputs +build/ +dist/ +.dev/ +.debug/ + +# Generated files +.flutterjs/ +.cache/ + +# Dart +.dart_tool/ +.packages +pubspec.lock + +# OS files +.DS_Store +Thumbs.db + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# Logs +*.log +npm-debug.log* diff --git a/packages/flutterjs_cupertino/.pubignore b/packages/flutterjs_cupertino/.pubignore new file mode 100644 index 00000000..bae5ffcf --- /dev/null +++ b/packages/flutterjs_cupertino/.pubignore @@ -0,0 +1,11 @@ +# Exclude JavaScript implementation from pub.dev +js/ +node_modules/ +dist/ +build/ +.git/ +.github/ +test/ +package-lock.json +.vscode/ +.idea/ diff --git a/packages/flutterjs_cupertino/CHANGELOG.md b/packages/flutterjs_cupertino/CHANGELOG.md new file mode 100644 index 00000000..13187808 --- /dev/null +++ b/packages/flutterjs_cupertino/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.1.0 + +* Initial release diff --git a/packages/flutterjs_cupertino/LICENSE b/packages/flutterjs_cupertino/LICENSE new file mode 100644 index 00000000..14fac913 --- /dev/null +++ b/packages/flutterjs_cupertino/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/flutterjs_cupertino/README.md b/packages/flutterjs_cupertino/README.md new file mode 100644 index 00000000..0611dd6b --- /dev/null +++ b/packages/flutterjs_cupertino/README.md @@ -0,0 +1,58 @@ +# FlutterjsCupertino + +A FlutterJS package + +## Installation + +Add to `pubspec.yaml`: + +```yaml +dependencies: + flutterjs_cupertino: ^0.1.0 +``` + +Then run: + +```bash +flutterjs get +``` + +## Usage + +See `example/` for a complete Flutter app. + +## JavaScript Implementation + +The actual implementation is in `js/src/` (JavaScript). + +To develop: + +```bash +cd js +npm install +``` + +## Features + +- Lightweight implementation +- SEO-friendly (FlutterJS rendering) +- Easy to use + +## Publishing + +### 1. Publish JavaScript to npm + +```bash +cd js +npm publish +``` + +### 2. Publish Dart wrapper to pub.dev + +```bash +dart pub publish +``` + +## License + +MIT diff --git a/packages/flutterjs_cupertino/example/lib/main.dart b/packages/flutterjs_cupertino/example/lib/main.dart new file mode 100644 index 00000000..e33e53e4 --- /dev/null +++ b/packages/flutterjs_cupertino/example/lib/main.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'FlutterjsCupertino Example', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: const ExamplePage(), + ); + } +} + +class ExamplePage extends StatefulWidget { + const ExamplePage({Key? key}) : super(key: key); + + @override + State createState() => _ExamplePageState(); +} + +class _ExamplePageState extends State { + String result = 'Click the button to test'; + + void _testPackage() { + setState(() { + // This will call the JavaScript implementation when running with FlutterJS + result = 'FlutterjsCupertino is ready!\n\nRun: flutterjs run --to-js --serve'; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('FlutterjsCupertino Example'), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + result, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 16), + ), + const SizedBox(height: 20), + ElevatedButton( + onPressed: _testPackage, + child: const Text('Test FlutterjsCupertino'), + ), + ], + ), + ), + ); + } +} diff --git a/packages/flutterjs_cupertino/example/pubspec.yaml b/packages/flutterjs_cupertino/example/pubspec.yaml new file mode 100644 index 00000000..4746a6bc --- /dev/null +++ b/packages/flutterjs_cupertino/example/pubspec.yaml @@ -0,0 +1,15 @@ +name: flutterjs_cupertino_example +description: Example app for flutterjs_cupertino + +publish_to: 'none' + +environment: + sdk: '>=2.19.0 <4.0.0' + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter diff --git a/packages/flutterjs_cupertino/flutterjs_cupertino/build.js b/packages/flutterjs_cupertino/flutterjs_cupertino/build.js new file mode 100644 index 00000000..854be9d6 --- /dev/null +++ b/packages/flutterjs_cupertino/flutterjs_cupertino/build.js @@ -0,0 +1,99 @@ +/** + * Build script for @flutterjs/flutterjs_cupertino + * + * Generates exports.json manifest for the import resolver system + */ + +import { readFileSync, writeFileSync, readdirSync, statSync } from 'fs'; +import { join, extname } from 'path'; + +const srcDir = './src'; + +/** + * Get all JavaScript files recursively + */ +function getAllJsFiles(dir, fileList = []) { + const files = readdirSync(dir); + + for (const file of files) { + const filePath = join(dir, file); + const stat = statSync(filePath); + + if (stat.isDirectory()) { + getAllJsFiles(filePath, fileList); + } else if (extname(file) === '.js') { + fileList.push(filePath); + } + } + + return fileList; +} + +/** + * Scan all source files and generate exports.json manifest + * This manifest tells the Dart code generator what symbols this package exports + */ +function generateExportManifest(sourceFiles) { + const manifest = { + package: '@flutterjs/flutterjs_cupertino', + version: '0.1.0', + exports: [] + }; + + // Regex patterns to match different export types + const exportRegex = /export\s*{\s*([^}]+)\s*}/g; + const exportStarRegex = /export\s*\*\s*from/g; + const classRegex = /export\s+class\s+(\w+)/g; + const functionRegex = /export\s+function\s+(\w+)/g; + const constRegex = /export\s+const\s+(\w+)/g; + + for (const srcFile of sourceFiles) { + const content = readFileSync(srcFile, 'utf8'); + + // Find named exports: export { Foo, Bar } + for (const match of content.matchAll(exportRegex)) { + const symbols = match[1] + .split(',') + .map(s => s.trim()) + .map(s => s.split(/\s+as\s+/).pop()) // Handle "export { Foo as Bar }" + .filter(s => s && !s.includes('from')); + manifest.exports.push(...symbols); + } + + // Find class exports: export class Foo + for (const match of content.matchAll(classRegex)) { + manifest.exports.push(match[1]); + } + + // Find function exports: export function foo() + for (const match of content.matchAll(functionRegex)) { + manifest.exports.push(match[1]); + } + + // Find const exports: export const FOO + for (const match of content.matchAll(constRegex)) { + manifest.exports.push(match[1]); + } + } + + // Remove duplicates and sort + manifest.exports = [...new Set(manifest.exports)].sort(); + + writeFileSync('./exports.json', JSON.stringify(manifest, null, 2) + '\n'); + console.log(`๐Ÿ“‹ Generated exports.json with ${manifest.exports.length} symbols\n`); +} + +// Main build process +async function build() { + console.log('๐Ÿš€ Building @flutterjs/flutterjs_cupertino...\n'); + + const allFiles = getAllJsFiles(srcDir); + console.log(`๐Ÿ“ฆ Found ${allFiles.length} JavaScript files\n`); + + // Generate export manifest + generateExportManifest(allFiles); + + console.log('โœ… Build successful!\n'); +} + +build().catch(console.error); diff --git a/packages/flutterjs_cupertino/flutterjs_cupertino/package.json b/packages/flutterjs_cupertino/flutterjs_cupertino/package.json new file mode 100644 index 00000000..261be321 --- /dev/null +++ b/packages/flutterjs_cupertino/flutterjs_cupertino/package.json @@ -0,0 +1,26 @@ +{ + "name": "@flutterjs/flutterjs_cupertino", + "version": "0.1.0", + "description": "A FlutterJS package", + "main": "src/index.js", + "type": "module", + "scripts": { + "test": "echo \"No tests yet\"", + "prepublishOnly": "echo \"Ready to publish\"" + }, + "keywords": [ + "flutterjs", + "flutterjs_cupertino" + ], + "author": "", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/flutterjsdev/flutterjs.git" + }, + "files": [ + "src/", + "README.md", + "LICENSE" + ] +} diff --git a/packages/flutterjs_cupertino/flutterjs_cupertino/src/index.js b/packages/flutterjs_cupertino/flutterjs_cupertino/src/index.js new file mode 100644 index 00000000..7187a7bb --- /dev/null +++ b/packages/flutterjs_cupertino/flutterjs_cupertino/src/index.js @@ -0,0 +1,43 @@ +/** + * FlutterJS FlutterjsCupertino + * + * Simple, lightweight implementation built with JavaScript + */ + +/** + * Main class for FlutterjsCupertino + */ +export class FlutterjsCupertino { + constructor(config = {}) { + this.config = config; + } + + /** + * Example method - replace with your implementation + */ + hello() { + return 'Hello from FlutterjsCupertino!'; + } + + /** + * Example async method + */ + async fetchData(url) { + try { + const response = await fetch(url); + return await response.json(); + } catch (error) { + console.error('Error fetching data:', error); + throw error; + } + } +} + +/** + * Helper function + */ +export function createInstance(config) { + return new FlutterjsCupertino(config); +} + +export default FlutterjsCupertino; diff --git a/packages/flutterjs_cupertino/lib/flutterjs_cupertino.dart b/packages/flutterjs_cupertino/lib/flutterjs_cupertino.dart new file mode 100644 index 00000000..d83a9649 --- /dev/null +++ b/packages/flutterjs_cupertino/lib/flutterjs_cupertino.dart @@ -0,0 +1,26 @@ +/// FlutterJS FlutterjsCupertino +/// +/// A FlutterJS package +/// +/// The actual implementation is in JavaScript. +/// This package is a metadata wrapper published to pub.dev. +/// +/// ## Usage +/// +/// Add to your `pubspec.yaml`: +/// ```yaml +/// dependencies: +/// flutterjs_cupertino: ^0.1.0 +/// ``` +/// +/// Then run: +/// ```bash +/// flutterjs get +/// ``` +/// +/// The package will be installed to: `build/flutterjs/node_modules/@flutterjs/flutterjs_cupertino` +/// +/// See `example/` for a complete working app. +library flutterjs_cupertino; + +// The real implementation is in js/src/ diff --git a/packages/flutterjs_cupertino/pubspec.yaml b/packages/flutterjs_cupertino/pubspec.yaml new file mode 100644 index 00000000..7468eb53 --- /dev/null +++ b/packages/flutterjs_cupertino/pubspec.yaml @@ -0,0 +1,24 @@ +name: flutterjs_cupertino +version: 0.1.0 +description: A FlutterJS package + +homepage: https://github.com/flutterjs/flutterjs_cupertino +repository: https://github.com/flutterjs/flutterjs_cupertino +issue_tracker: https://github.com/flutterjs/flutterjs_cupertino/issues + +environment: + sdk: '>=2.19.0 <4.0.0' + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +# FlutterJS metadata +flutterjs: + npm_package: "@flutterjs/flutterjs_cupertino" + implementation_language: "javascript" + js_entry: "js/src/index.js" diff --git a/packages/flutterjs_dart/README.md b/packages/flutterjs_dart/README.md new file mode 100644 index 00000000..1a4e54cc --- /dev/null +++ b/packages/flutterjs_dart/README.md @@ -0,0 +1,44 @@ +# @flutterjs/dart + +This package provides JavaScript implementations of Dart's core libraries for the FlutterJS runtime. It allows Dart code transpiled by FlutterJS to access standard Dart APIs like `dart:math`, `dart:async`, and `dart:convert` using native JavaScript equivalents. + +## Supported Libraries + +| Dart Library | Implementation Status | Description | +| :--- | :--- | :--- | +| `dart:math` | โœ… Implemented | Wraps JS `Math`, plus `Point`, `Rectangle`. | +| `dart:async` | โœ… Implemented | `Future` (Promise), `Timer`, `Completer`. | +| `dart:convert`| โœ… Implemented | `JSON`, `utf8`, `base64`. | +| `dart:collection`| โœ… Implemented | `Queue`, `LinkedList`, `HashMap`, `HashSet`. | +| `dart:developer`| โœ… Implemented | `log`, `inspect`, `debugger`. | +| `dart:typed_data`| โœ… Implemented | `Uint8Array` wrappers, `ByteBuffer`. | +| `dart:core` | ๐Ÿšง Partially Implemented | Basic primitives handled by transpiler. | + +## Usage + +This package is automatically used by the FlutterJS toolchain. When you import a core library in your Dart code: + +```dart +import 'dart:math'; +``` + +The FlutterJS transpiler converts this to an import from this package: + +```javascript +import { Point, Random } from '@flutterjs/dart/math'; // Maps to dist/math/index.js +``` + +## Structure + +- `src/`: Source code for each library module. +- `dist/`: Compiled JavaScript output (generated by `npm run build`). +- `build.js`: Build script using esbuild. + +## Building + +To build the package manually: + +```bash +npm install +npm run build +``` diff --git a/packages/flutterjs_dart/build.js b/packages/flutterjs_dart/build.js new file mode 100644 index 00000000..d7459214 --- /dev/null +++ b/packages/flutterjs_dart/build.js @@ -0,0 +1,207 @@ +import esbuild from 'esbuild'; +import { readFileSync, writeFileSync, readdirSync, statSync, watch } from 'fs'; +import { join, relative, extname } from 'path'; + +const srcDir = 'src'; +const outDir = 'dist'; + +/** + * โœ… Recursively find ALL .js files in src/ + */ +function getAllJsFiles(dir) { + const files = []; + const items = readdirSync(dir); + + for (const item of items) { + const fullPath = join(dir, item); + const stat = statSync(fullPath); + + if (stat.isDirectory()) { + files.push(...getAllJsFiles(fullPath)); + } else if (extname(item) === '.js') { + files.push(fullPath); + } + } + + return files; +} + +/** + * Build each .js file separately + */ +async function buildAllFiles() { + try { + console.log('๐Ÿš€ Building @flutterjs/dart...\n'); + + // โœ… Find all .js files + const allFiles = getAllJsFiles(srcDir); + + console.log(`๐Ÿ“ Found ${allFiles.length} files\n`); + + // โœ… Build each file separately + for (const srcFile of allFiles) { + const relativePath = relative(srcDir, srcFile); + const outFile = join(outDir, relativePath); + + console.log(`๐Ÿ“ฆ ${relativePath}`); + + await esbuild.build({ + entryPoints: [srcFile], + outfile: outFile, + bundle: false, + minify: true, + platform: 'browser', + target: ['es2020'], + format: 'esm', + sourcemap: true, + }); + } + + console.log(); + + // โœ… Generate exports based on all built files + generateExports(allFiles); + + // โœ… Generate export manifest for Dart code generator + generateExportManifest(allFiles); + + console.log('โœ… Build successful!\n'); + + } catch (error) { + console.error('โŒ Build failed:', error.message); + } +} + +/** + * Auto-generate package.json exports in the exact format requested + */ +function generateExports(sourceFiles) { + const packageJsonPath = './package.json'; + const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')); + + const exports = {}; + + // Main entry point + exports['.'] = './dist/index.js'; + + for (const srcFile of sourceFiles) { + const relativePath = relative(srcDir, srcFile); + + // Skip index.js - it's already the main entry + if (relativePath === 'index.js') { + continue; + } + + // Convert path with .js extension: + // math/index.js -> ./math/index.js (normalized) + + // Normalize slashes for Windows + const normalizedPath = relativePath.replace(/\\/g, '/'); + + // For submodules like math/index.js, we want to expose them as: + // "./math": "./dist/math/index.js" + // And also potentially specific files if needed. + + // If filename is index.js, export the parent directory name + if (normalizedPath.endsWith('/index.js')) { + const dirName = normalizedPath.replace('/index.js', ''); + const exportKey = './' + dirName; + const exportPath = './dist/' + normalizedPath; + exports[exportKey] = exportPath; + } else { + // Normal file + const exportKey = './' + normalizedPath.replaceAll(".js", ""); + const exportPath = './dist/' + normalizedPath; + exports[exportKey] = exportPath; + } + } + + // Update package.json + packageJson.exports = exports; + packageJson.main = './dist/index.js'; + + writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n'); + + console.log('๐Ÿ“ Generated exports:\n'); + Object.entries(exports).forEach(([key, value]) => { + console.log(` "${key}": "${value}"`); + }); + console.log(); +} + +/** + * Scan all source files and generate exports.json manifest + * This manifest tells the Dart code generator what symbols this package exports + */ +function generateExportManifest(sourceFiles) { + const manifest = { + package: '@flutterjs/dart', + version: '1.0.0', + exports: [] + }; + + // Regex patterns to match different export types + const exportRegex = /export\s*{\s*([^}]+)\s*}/g; + const classRegex = /export\s+class\s+(\w+)/g; + const functionRegex = /export\s+function\s+(\w+)/g; + const constRegex = /export\s+const\s+(\w+)/g; + + for (const srcFile of sourceFiles) { + const content = readFileSync(srcFile, 'utf8'); + + // Find named exports: export { Foo, Bar } + for (const match of content.matchAll(exportRegex)) { + const symbols = match[1] + .split(',') + .map(s => s.trim()) + .map(s => s.split(/\s+as\s+/).pop()) // Handle "export { Foo as Bar }" + .filter(s => s && !s.includes('from')); + + manifest.exports.push(...symbols); + } + + // Find class exports: export class Foo + for (const match of content.matchAll(classRegex)) { + manifest.exports.push(match[1]); + } + + // Find function exports: export function foo() + for (const match of content.matchAll(functionRegex)) { + manifest.exports.push(match[1]); + } + + // Find const exports: export const FOO + for (const match of content.matchAll(constRegex)) { + manifest.exports.push(match[1]); + } + } + + // Remove duplicates and sort + manifest.exports = [...new Set(manifest.exports)].sort(); + + writeFileSync('./exports.json', JSON.stringify(manifest, null, 2) + '\n'); + console.log(`๐Ÿ“‹ Generated exports.json with ${manifest.exports.length} symbols\n`); +} + +/** + * Watch mode - rebuild on file changes + */ +function watchMode() { + console.log('๐Ÿ‘€ Watching for changes...\n'); + + watch(srcDir, { recursive: true }, (eventType, filename) => { + if (extname(filename) === '.js') { + console.log(`\nโšก ${filename} changed\n`); + buildAllFiles(); + } + }); +} + +// โœ… Check for --watch flag +const isWatchMode = process.argv.includes('--watch'); + +if (isWatchMode) { + buildAllFiles().then(() => watchMode()); +} else { + buildAllFiles(); +} diff --git a/packages/flutterjs_dart/dist/async/index.js b/packages/flutterjs_dart/dist/async/index.js new file mode 100644 index 00000000..510d78e1 --- /dev/null +++ b/packages/flutterjs_dart/dist/async/index.js @@ -0,0 +1,2 @@ +class c{constructor(e,t){this._timer=setTimeout(t,e.inMilliseconds||e)}static periodic(e,t){const r=new c(0,()=>{});return clearTimeout(r._timer),r._timer=setInterval(()=>t(r),e.inMilliseconds||e),r}static run(e){setTimeout(e,0)}cancel(){clearTimeout(this._timer),clearInterval(this._timer)}}class i{constructor(e){this._promise=new Promise((t,r)=>{try{const s=e();t(s)}catch(s){r(s)}})}static _wrap(e){const t=new i(()=>{});return t._promise=e,t}static value(e){return i._wrap(Promise.resolve(e))}static error(e){return i._wrap(Promise.reject(e))}static delayed(e,t){return i._wrap(new Promise((r,s)=>{setTimeout(()=>{try{r(t?t():null)}catch(n){s(n)}},e.inMilliseconds||e)}))}static wait(e){const t=e.map(r=>r instanceof i?r._promise:r);return i._wrap(Promise.all(t))}then(e,{onError:t}={}){const r=this._promise.then(s=>e(s),s=>{if(t)return t(s);throw s});return i._wrap(r)}catchError(e,{test:t}={}){const r=this._promise.catch(s=>{if(t&&!t(s))throw s;return e(s)});return i._wrap(r)}whenComplete(e){const t=this._promise.finally(()=>e());return i._wrap(t)}thenJS(e,t){return this._promise.then(e,t)}}class l{constructor(){this.future=new i(()=>{}),this.future._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}complete(e){this._resolve(e)}completeError(e){this._reject(e)}get isCompleted(){return!1}}class a{constructor(){}}class m{constructor(){this.stream=new a}}export{l as Completer,i as Future,a as Stream,m as StreamController,c as Timer}; +//# sourceMappingURL=index.js.map diff --git a/packages/flutterjs_dart/dist/async/index.js.map b/packages/flutterjs_dart/dist/async/index.js.map new file mode 100644 index 00000000..b4b575ae --- /dev/null +++ b/packages/flutterjs_dart/dist/async/index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/async/index.js"], + "sourcesContent": ["// dart:async implementation\r\n\r\nexport class Timer {\r\n constructor(duration, callback) {\r\n this._timer = setTimeout(callback, duration.inMilliseconds || duration);\r\n }\r\n\r\n static periodic(duration, callback) {\r\n const timer = new Timer(0, () => { });\r\n // Clear initial timeout, set interval\r\n clearTimeout(timer._timer);\r\n timer._timer = setInterval(() => callback(timer), duration.inMilliseconds || duration);\r\n return timer;\r\n }\r\n\r\n static run(callback) {\r\n setTimeout(callback, 0);\r\n }\r\n\r\n cancel() {\r\n clearTimeout(this._timer); // Works for clearInterval too in browsers usually\r\n clearInterval(this._timer);\r\n }\r\n}\r\n\r\nexport class Future {\r\n constructor(computation) {\r\n this._promise = new Promise((resolve, reject) => {\r\n try {\r\n const result = computation();\r\n resolve(result);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n // Internal: wrap existing promise\r\n static _wrap(promise) {\r\n const f = new Future(() => { });\r\n f._promise = promise;\r\n return f;\r\n }\r\n\r\n static value(value) {\r\n return Future._wrap(Promise.resolve(value));\r\n }\r\n\r\n static error(error) {\r\n return Future._wrap(Promise.reject(error));\r\n }\r\n\r\n static delayed(duration, computation) {\r\n return Future._wrap(new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n try {\r\n if (computation) {\r\n resolve(computation());\r\n } else {\r\n resolve(null);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n }, duration.inMilliseconds || duration);\r\n }));\r\n }\r\n\r\n static wait(futures) {\r\n const promises = futures.map(f => f instanceof Future ? f._promise : f);\r\n return Future._wrap(Promise.all(promises));\r\n }\r\n\r\n then(onValue, { onError } = {}) {\r\n const p = this._promise.then(\r\n val => onValue(val),\r\n err => {\r\n if (onError) {\r\n return onError(err);\r\n }\r\n throw err;\r\n }\r\n );\r\n return Future._wrap(p);\r\n }\r\n\r\n catchError(onError, { test } = {}) {\r\n const p = this._promise.catch(err => {\r\n if (test && !test(err)) throw err;\r\n return onError(err);\r\n });\r\n return Future._wrap(p);\r\n }\r\n\r\n whenComplete(action) {\r\n const p = this._promise.finally(() => {\r\n return action();\r\n });\r\n return Future._wrap(p);\r\n }\r\n\r\n // To allow await in JS specific code if needed (not standard Dart but helpful)\r\n thenJS(onFulfilled, onRejected) {\r\n return this._promise.then(onFulfilled, onRejected);\r\n }\r\n}\r\n\r\nexport class Completer {\r\n constructor() {\r\n this.future = new Future(() => { });\r\n // Replace the promise with one we control\r\n this.future._promise = new Promise((resolve, reject) => {\r\n this._resolve = resolve;\r\n this._reject = reject;\r\n });\r\n }\r\n\r\n complete(value) {\r\n this._resolve(value);\r\n }\r\n\r\n completeError(error) {\r\n this._reject(error);\r\n }\r\n\r\n get isCompleted() {\r\n // Hard to track without extra state, skipping for lightweight wrapper\r\n return false;\r\n }\r\n}\r\n\r\nexport class Stream {\r\n constructor() {\r\n // Basic placeholder\r\n }\r\n // TODO: Full Stream implementation\r\n}\r\n\r\nexport class StreamController {\r\n constructor() {\r\n this.stream = new Stream();\r\n }\r\n // TODO: Full StreamController implementation\r\n}\r\n"], + "mappings": "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", + "names": ["Timer", "duration", "callback", "timer", "Future", "computation", "resolve", "reject", "result", "e", "promise", "f", "value", "error", "futures", "promises", "onValue", "onError", "p", "val", "err", "test", "action", "onFulfilled", "onRejected", "Completer", "Stream", "StreamController"] +} diff --git a/packages/flutterjs_dart/dist/collection/index.js b/packages/flutterjs_dart/dist/collection/index.js new file mode 100644 index 00000000..21ead91a --- /dev/null +++ b/packages/flutterjs_dart/dist/collection/index.js @@ -0,0 +1,2 @@ +class i{constructor(){this._list=[]}add(t){this._list.push(t)}addFirst(t){this._list.unshift(t)}addLast(t){this._list.push(t)}removeFirst(){return this._list.shift()}removeLast(){return this._list.pop()}get first(){return this._list[0]}get last(){return this._list[this._list.length-1]}get length(){return this._list.length}get isEmpty(){return this._list.length===0}get isNotEmpty(){return this._list.length>0}toList(){return[...this._list]}}class h{constructor(){this._head=null,this._tail=null,this._length=0}add(t){this._head?(this._tail.next=t,t.previous=this._tail,this._tail=t):(this._head=t,this._tail=t),this._length++}get length(){return this._length}}class e{constructor(){this.list=null,this.previous=null,this.next=null}unlink(){}}const l=Map,r=Set;export{l as HashMap,r as HashSet,h as LinkedList,e as LinkedListEntry,i as Queue}; +//# sourceMappingURL=index.js.map diff --git a/packages/flutterjs_dart/dist/collection/index.js.map b/packages/flutterjs_dart/dist/collection/index.js.map new file mode 100644 index 00000000..77bd7d03 --- /dev/null +++ b/packages/flutterjs_dart/dist/collection/index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/collection/index.js"], + "sourcesContent": ["// dart:collection implementation\r\n\r\nexport class Queue {\r\n constructor() {\r\n this._list = [];\r\n }\r\n\r\n add(value) { this._list.push(value); }\r\n addFirst(value) { this._list.unshift(value); }\r\n addLast(value) { this._list.push(value); }\r\n\r\n removeFirst() { return this._list.shift(); }\r\n removeLast() { return this._list.pop(); }\r\n\r\n get first() { return this._list[0]; }\r\n get last() { return this._list[this._list.length - 1]; }\r\n get length() { return this._list.length; }\r\n get isEmpty() { return this._list.length === 0; }\r\n get isNotEmpty() { return this._list.length > 0; }\r\n\r\n toList() { return [...this._list]; }\r\n}\r\n\r\nexport class LinkedList {\r\n constructor() {\r\n this._head = null;\r\n this._tail = null;\r\n this._length = 0;\r\n }\r\n\r\n add(entry) {\r\n if (!this._head) {\r\n this._head = entry;\r\n this._tail = entry;\r\n } else {\r\n this._tail.next = entry;\r\n entry.previous = this._tail;\r\n this._tail = entry;\r\n }\r\n this._length++;\r\n }\r\n\r\n // Minimal implementation for now\r\n get length() { return this._length; }\r\n}\r\n\r\nexport class LinkedListEntry {\r\n constructor() {\r\n this.list = null;\r\n this.previous = null;\r\n this.next = null;\r\n }\r\n\r\n unlink() {\r\n // TODO impl\r\n }\r\n}\r\n\r\n// Maps and Sets are just native JS Map/Set usually, but we can export helpers\r\nexport const HashMap = Map;\r\nexport const HashSet = Set;\r\n"], + "mappings": "AAEO,MAAMA,CAAM,CACf,aAAc,CACV,KAAK,MAAQ,CAAC,CAClB,CAEA,IAAIC,EAAO,CAAE,KAAK,MAAM,KAAKA,CAAK,CAAG,CACrC,SAASA,EAAO,CAAE,KAAK,MAAM,QAAQA,CAAK,CAAG,CAC7C,QAAQA,EAAO,CAAE,KAAK,MAAM,KAAKA,CAAK,CAAG,CAEzC,aAAc,CAAE,OAAO,KAAK,MAAM,MAAM,CAAG,CAC3C,YAAa,CAAE,OAAO,KAAK,MAAM,IAAI,CAAG,CAExC,IAAI,OAAQ,CAAE,OAAO,KAAK,MAAM,CAAC,CAAG,CACpC,IAAI,MAAO,CAAE,OAAO,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,CAAG,CACvD,IAAI,QAAS,CAAE,OAAO,KAAK,MAAM,MAAQ,CACzC,IAAI,SAAU,CAAE,OAAO,KAAK,MAAM,SAAW,CAAG,CAChD,IAAI,YAAa,CAAE,OAAO,KAAK,MAAM,OAAS,CAAG,CAEjD,QAAS,CAAE,MAAO,CAAC,GAAG,KAAK,KAAK,CAAG,CACvC,CAEO,MAAMC,CAAW,CACpB,aAAc,CACV,KAAK,MAAQ,KACb,KAAK,MAAQ,KACb,KAAK,QAAU,CACnB,CAEA,IAAIC,EAAO,CACF,KAAK,OAIN,KAAK,MAAM,KAAOA,EAClBA,EAAM,SAAW,KAAK,MACtB,KAAK,MAAQA,IALb,KAAK,MAAQA,EACb,KAAK,MAAQA,GAMjB,KAAK,SACT,CAGA,IAAI,QAAS,CAAE,OAAO,KAAK,OAAS,CACxC,CAEO,MAAMC,CAAgB,CACzB,aAAc,CACV,KAAK,KAAO,KACZ,KAAK,SAAW,KAChB,KAAK,KAAO,IAChB,CAEA,QAAS,CAET,CACJ,CAGO,MAAMC,EAAU,IACVC,EAAU", + "names": ["Queue", "value", "LinkedList", "entry", "LinkedListEntry", "HashMap", "HashSet"] +} diff --git a/packages/flutterjs_dart/dist/convert/index.js b/packages/flutterjs_dart/dist/convert/index.js new file mode 100644 index 00000000..0c3f1d5f --- /dev/null +++ b/packages/flutterjs_dart/dist/convert/index.js @@ -0,0 +1,2 @@ +const u={decode:e=>JSON.parse(e),encode:e=>JSON.stringify(e)};function i(e){return JSON.parse(e)}function s(e){return JSON.stringify(e)}const c=typeof TextEncoder<"u"?new TextEncoder:null,d=typeof TextDecoder<"u"?new TextDecoder:null,a={encode:e=>c?c.encode(e):new Uint8Array(Buffer.from(e,"utf-8")),decode:e=>d?d.decode(e):Buffer.from(e).toString("utf-8")},f={encode:e=>{let o="";const r=e.byteLength;for(let n=0;n{const o=atob(e),r=o.length,n=new Uint8Array(r);for(let t=0;t JSON.parse(source),\r\n encode: (object) => JSON.stringify(object),\r\n};\r\n\r\nexport function jsonDecode(source) {\r\n return JSON.parse(source);\r\n}\r\n\r\nexport function jsonEncode(object) {\r\n return JSON.stringify(object);\r\n}\r\n\r\n// --- UTF8 ---\r\n// Can likely assume Timer/Browser env has TextEncoder/TextDecoder\r\nconst _encoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\r\nconst _decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder() : null;\r\n\r\nexport const utf8 = {\r\n encode: (string) => {\r\n if (_encoder) return _encoder.encode(string);\r\n // Fallback or error if not in browser/node\r\n return new Uint8Array(Buffer.from(string, 'utf-8'));\r\n },\r\n decode: (bytes) => {\r\n if (_decoder) return _decoder.decode(bytes);\r\n return Buffer.from(bytes).toString('utf-8');\r\n }\r\n};\r\n\r\n// --- Base64 ---\r\nexport const base64 = {\r\n encode: (bytes) => {\r\n // Handle bytes -> string\r\n let binary = '';\r\n const len = bytes.byteLength;\r\n for (let i = 0; i < len; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return btoa(binary);\r\n },\r\n decode: (source) => {\r\n const binary = atob(source);\r\n const len = binary.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n }\r\n};\r\n\r\nexport function base64Encode(bytes) {\r\n return base64.encode(bytes);\r\n}\r\n\r\nexport function base64Decode(source) {\r\n return base64.decode(source);\r\n}\r\n"], + "mappings": "AAGO,MAAMA,EAAO,CAChB,OAASC,GAAW,KAAK,MAAMA,CAAM,EACrC,OAASC,GAAW,KAAK,UAAUA,CAAM,CAC7C,EAEO,SAASC,EAAWF,EAAQ,CAC/B,OAAO,KAAK,MAAMA,CAAM,CAC5B,CAEO,SAASG,EAAWF,EAAQ,CAC/B,OAAO,KAAK,UAAUA,CAAM,CAChC,CAIA,MAAMG,EAAW,OAAO,YAAgB,IAAc,IAAI,YAAgB,KACpEC,EAAW,OAAO,YAAgB,IAAc,IAAI,YAAgB,KAE7DC,EAAO,CAChB,OAASC,GACDH,EAAiBA,EAAS,OAAOG,CAAM,EAEpC,IAAI,WAAW,OAAO,KAAKA,EAAQ,OAAO,CAAC,EAEtD,OAASC,GACDH,EAAiBA,EAAS,OAAOG,CAAK,EACnC,OAAO,KAAKA,CAAK,EAAE,SAAS,OAAO,CAElD,EAGaC,EAAS,CAClB,OAASD,GAAU,CAEf,IAAIE,EAAS,GACb,MAAMC,EAAMH,EAAM,WAClB,QAASI,EAAI,EAAGA,EAAID,EAAKC,IACrBF,GAAU,OAAO,aAAaF,EAAMI,CAAC,CAAC,EAE1C,OAAO,KAAKF,CAAM,CACtB,EACA,OAASV,GAAW,CAChB,MAAMU,EAAS,KAAKV,CAAM,EACpBW,EAAMD,EAAO,OACbF,EAAQ,IAAI,WAAWG,CAAG,EAChC,QAASC,EAAI,EAAGA,EAAID,EAAKC,IACrBJ,EAAMI,CAAC,EAAIF,EAAO,WAAWE,CAAC,EAElC,OAAOJ,CACX,CACJ,EAEO,SAASK,EAAaL,EAAO,CAChC,OAAOC,EAAO,OAAOD,CAAK,CAC9B,CAEO,SAASM,EAAad,EAAQ,CACjC,OAAOS,EAAO,OAAOT,CAAM,CAC/B", + "names": ["json", "source", "object", "jsonDecode", "jsonEncode", "_encoder", "_decoder", "utf8", "string", "bytes", "base64", "binary", "len", "i", "base64Encode", "base64Decode"] +} diff --git a/packages/flutterjs_dart/dist/developer/index.js b/packages/flutterjs_dart/dist/developer/index.js new file mode 100644 index 00000000..05542beb --- /dev/null +++ b/packages/flutterjs_dart/dist/developer/index.js @@ -0,0 +1,2 @@ +function u(e,{time:r,sequenceNumber:c,level:l=0,name:n="",zone:s,error:t,stackTrace:o}={}){const i=`[${r?new Date(r).toLocaleTimeString():new Date().toLocaleTimeString()}] ${n?n+": ":""}`;t?(console.error(i+e,t),o&&console.error(o)):console.log(i+e)}function g(e){return console.dir(e),e}function a({message:e,when:r=!0}={}){if(r){e&&console.log(`Debugger triggered: ${e}`);debugger;return!0}return!1}class p{static startSync(r,{arguments:c}={}){typeof performance<"u"&&performance.mark(r)}static finishSync(){}}export{p as Timeline,a as debugger_,g as inspect,u as log}; +//# sourceMappingURL=index.js.map diff --git a/packages/flutterjs_dart/dist/developer/index.js.map b/packages/flutterjs_dart/dist/developer/index.js.map new file mode 100644 index 00000000..e7137674 --- /dev/null +++ b/packages/flutterjs_dart/dist/developer/index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/developer/index.js"], + "sourcesContent": ["// dart:developer implementation\r\n\r\nexport function log(message, { time, sequenceNumber, level = 0, name = '', zone, error, stackTrace } = {}) {\r\n const timestamp = time ? new Date(time).toLocaleTimeString() : new Date().toLocaleTimeString();\r\n const prefix = `[${timestamp}] ${name ? name + ': ' : ''}`;\r\n\r\n if (error) {\r\n console.error(prefix + message, error);\r\n if (stackTrace) console.error(stackTrace);\r\n } else {\r\n console.log(prefix + message);\r\n }\r\n}\r\n\r\nexport function inspect(object) {\r\n console.dir(object);\r\n return object;\r\n}\r\n\r\nexport function debugger_({ message, when = true } = {}) {\r\n if (when) {\r\n if (message) console.log(`Debugger triggered: ${message}`);\r\n // eslint-disable-next-line\r\n debugger;\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport class Timeline {\r\n static startSync(name, { arguments: args } = {}) {\r\n // Use User Timing API\r\n if (typeof performance !== 'undefined') {\r\n performance.mark(name);\r\n }\r\n }\r\n\r\n static finishSync() {\r\n // Ideally we'd match the last mark, but JS performance API is event based.\r\n // This is a loose approximation.\r\n }\r\n}\r\n"], + "mappings": "AAEO,SAASA,EAAIC,EAAS,CAAE,KAAAC,EAAM,eAAAC,EAAgB,MAAAC,EAAQ,EAAG,KAAAC,EAAO,GAAI,KAAAC,EAAM,MAAAC,EAAO,WAAAC,CAAW,EAAI,CAAC,EAAG,CAEvG,MAAMC,EAAS,IADGP,EAAO,IAAI,KAAKA,CAAI,EAAE,mBAAmB,EAAI,IAAI,KAAK,EAAE,mBAAmB,CACjE,KAAKG,EAAOA,EAAO,KAAO,EAAE,GAEpDE,GACA,QAAQ,MAAME,EAASR,EAASM,CAAK,EACjCC,GAAY,QAAQ,MAAMA,CAAU,GAExC,QAAQ,IAAIC,EAASR,CAAO,CAEpC,CAEO,SAASS,EAAQC,EAAQ,CAC5B,eAAQ,IAAIA,CAAM,EACXA,CACX,CAEO,SAASC,EAAU,CAAE,QAAAX,EAAS,KAAAY,EAAO,EAAK,EAAI,CAAC,EAAG,CACrD,GAAIA,EAAM,CACFZ,GAAS,QAAQ,IAAI,uBAAuBA,CAAO,EAAE,EAEzD,SACA,MAAO,EACX,CACA,MAAO,EACX,CAEO,MAAMa,CAAS,CAClB,OAAO,UAAUT,EAAM,CAAE,UAAWU,CAAK,EAAI,CAAC,EAAG,CAEzC,OAAO,YAAgB,KACvB,YAAY,KAAKV,CAAI,CAE7B,CAEA,OAAO,YAAa,CAGpB,CACJ", + "names": ["log", "message", "time", "sequenceNumber", "level", "name", "zone", "error", "stackTrace", "prefix", "inspect", "object", "debugger_", "when", "Timeline", "args"] +} diff --git a/packages/flutterjs_dart/dist/index.js b/packages/flutterjs_dart/dist/index.js new file mode 100644 index 00000000..6c74e16a --- /dev/null +++ b/packages/flutterjs_dart/dist/index.js @@ -0,0 +1,2 @@ +import*as r from"./math/index.js";import*as e from"./async/index.js";import*as t from"./convert/index.js";import*as a from"./collection/index.js";import*as p from"./developer/index.js";import*as m from"./typed_data/index.js";export{e as async,a as collection,t as convert,p as developer,r as math,m as typed_data}; +//# sourceMappingURL=index.js.map diff --git a/packages/flutterjs_dart/dist/index.js.map b/packages/flutterjs_dart/dist/index.js.map new file mode 100644 index 00000000..60bf6967 --- /dev/null +++ b/packages/flutterjs_dart/dist/index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/index.js"], + "sourcesContent": ["export * as math from './math/index.js';\r\nexport * as async from './async/index.js';\r\nexport * as convert from './convert/index.js';\r\nexport * as collection from './collection/index.js';\r\nexport * as developer from './developer/index.js';\r\nexport * as typed_data from './typed_data/index.js';\r\n"], + "mappings": "AAAA,UAAYA,MAAU,kBACtB,UAAYC,MAAW,mBACvB,UAAYC,MAAa,qBACzB,UAAYC,MAAgB,wBAC5B,UAAYC,MAAe,uBAC3B,UAAYC,MAAgB", + "names": ["math", "async", "convert", "collection", "developer", "typed_data"] +} diff --git a/packages/flutterjs_dart/dist/math/index.js b/packages/flutterjs_dart/dist/math/index.js new file mode 100644 index 00000000..c918f088 --- /dev/null +++ b/packages/flutterjs_dart/dist/math/index.js @@ -0,0 +1,2 @@ +const a=Math.E,i=Math.LN10,x=Math.LN2,c=Math.LOG2E,p=Math.LOG10E,M=Math.PI,u=Math.SQRT1_2,g=Math.SQRT2,l=Math.min,d=Math.max,m=Math.sqrt,y=Math.sign,L=Math.sin,R=Math.cos,b=Math.tan,f=Math.acos,w=Math.asin,E=Math.atan,S=Math.atan2,T=Math.exp,q=Math.log,G=Math.pow;class r{constructor(t,o){this.x=t,this.y=o}toString(){return`Point(${this.x}, ${this.y})`}distanceTo(t){const o=this.x-t.x,s=this.y-t.y;return Math.sqrt(o*o+s*s)}get magnitude(){return Math.sqrt(this.x*this.x+this.y*this.y)}operator_add(t){return new r(this.x+t.x,this.y+t.y)}operator_minus(t){return new r(this.x-t.x,this.y-t.y)}}class h{constructor(t,o,s,n){this.left=t,this.top=o,this.width=s,this.height=n}get right(){return this.left+this.width}get bottom(){return this.top+this.height}containsPoint(t){return t.x>=this.left&&t.x=this.top&&t.y=this.left&&t.right<=this.right&&t.top>=this.top&&t.bottom<=this.bottom}}class N extends h{constructor(t,o,s,n){super(t,o,s,n)}}class O{constructor(t){}nextInt(t){return Math.floor(Math.random()*t)}nextDouble(){return Math.random()}nextBool(){return Math.random()>=.5}}export{a as E,i as LN10,x as LN2,p as LOG10E,c as LOG2E,N as MutableRectangle,M as PI,r as Point,O as Random,h as Rectangle,u as SQRT1_2,g as SQRT2,f as acos,w as asin,E as atan,S as atan2,R as cos,T as exp,q as log,d as max,l as min,G as pow,y as sign,L as sin,m as sqrt,b as tan}; +//# sourceMappingURL=index.js.map diff --git a/packages/flutterjs_dart/dist/math/index.js.map b/packages/flutterjs_dart/dist/math/index.js.map new file mode 100644 index 00000000..e8175598 --- /dev/null +++ b/packages/flutterjs_dart/dist/math/index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/math/index.js"], + "sourcesContent": ["// dart:math implementation\r\n\r\nexport const E = Math.E;\r\nexport const LN10 = Math.LN10;\r\nexport const LN2 = Math.LN2;\r\nexport const LOG2E = Math.LOG2E;\r\nexport const LOG10E = Math.LOG10E;\r\nexport const PI = Math.PI;\r\nexport const SQRT1_2 = Math.SQRT1_2;\r\nexport const SQRT2 = Math.SQRT2;\r\n\r\nexport const min = Math.min;\r\nexport const max = Math.max;\r\nexport const sqrt = Math.sqrt;\r\nexport const sign = Math.sign;\r\nexport const sin = Math.sin;\r\nexport const cos = Math.cos;\r\nexport const tan = Math.tan;\r\nexport const acos = Math.acos;\r\nexport const asin = Math.asin;\r\nexport const atan = Math.atan;\r\nexport const atan2 = Math.atan2;\r\nexport const exp = Math.exp;\r\nexport const log = Math.log;\r\nexport const pow = Math.pow;\r\n\r\nexport class Point {\r\n constructor(x, y) {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n\r\n toString() {\r\n return `Point(${this.x}, ${this.y})`;\r\n }\r\n\r\n distanceTo(other) {\r\n const dx = this.x - other.x;\r\n const dy = this.y - other.y;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n\r\n get magnitude() {\r\n return Math.sqrt(this.x * this.x + this.y * this.y);\r\n }\r\n\r\n operator_add(other) {\r\n return new Point(this.x + other.x, this.y + other.y);\r\n }\r\n\r\n operator_minus(other) {\r\n return new Point(this.x - other.x, this.y - other.y);\r\n }\r\n}\r\n\r\nexport class Rectangle {\r\n constructor(left, top, width, height) {\r\n this.left = left;\r\n this.top = top;\r\n this.width = width;\r\n this.height = height;\r\n }\r\n\r\n get right() { return this.left + this.width; }\r\n get bottom() { return this.top + this.height; }\r\n\r\n containsPoint(point) {\r\n return point.x >= this.left && point.x < this.right &&\r\n point.y >= this.top && point.y < this.bottom;\r\n }\r\n\r\n containsRectangle(rect) {\r\n return rect.left >= this.left && rect.right <= this.right &&\r\n rect.top >= this.top && rect.bottom <= this.bottom;\r\n }\r\n}\r\n\r\nexport class MutableRectangle extends Rectangle {\r\n constructor(left, top, width, height) {\r\n super(left, top, width, height);\r\n }\r\n}\r\n\r\nexport class Random {\r\n constructor(seed) {\r\n // JS Math.random() doesn't support seeding natively without a custom PRNG.\r\n // For now, we ignore the seed to rely on browser crypto/random.\r\n // TODO: Implement a seeded PRNG if strict determinism is needed.\r\n }\r\n\r\n nextInt(max) {\r\n return Math.floor(Math.random() * max);\r\n }\r\n\r\n nextDouble() {\r\n return Math.random();\r\n }\r\n\r\n nextBool() {\r\n return Math.random() >= 0.5;\r\n }\r\n}\r\n"], + "mappings": "AAEO,MAAMA,EAAI,KAAK,EACTC,EAAO,KAAK,KACZC,EAAM,KAAK,IACXC,EAAQ,KAAK,MACbC,EAAS,KAAK,OACdC,EAAK,KAAK,GACVC,EAAU,KAAK,QACfC,EAAQ,KAAK,MAEbC,EAAM,KAAK,IACXC,EAAM,KAAK,IACXC,EAAO,KAAK,KACZC,EAAO,KAAK,KACZC,EAAM,KAAK,IACXC,EAAM,KAAK,IACXC,EAAM,KAAK,IACXC,EAAO,KAAK,KACZC,EAAO,KAAK,KACZC,EAAO,KAAK,KACZC,EAAQ,KAAK,MACbC,EAAM,KAAK,IACXC,EAAM,KAAK,IACXC,EAAM,KAAK,IAEjB,MAAMC,CAAM,CACf,YAAYC,EAAGC,EAAG,CACd,KAAK,EAAID,EACT,KAAK,EAAIC,CACb,CAEA,UAAW,CACP,MAAO,SAAS,KAAK,CAAC,KAAK,KAAK,CAAC,GACrC,CAEA,WAAWC,EAAO,CACd,MAAMC,EAAK,KAAK,EAAID,EAAM,EACpBE,EAAK,KAAK,EAAIF,EAAM,EAC1B,OAAO,KAAK,KAAKC,EAAKA,EAAKC,EAAKA,CAAE,CACtC,CAEA,IAAI,WAAY,CACZ,OAAO,KAAK,KAAK,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,CAAC,CACtD,CAEA,aAAaF,EAAO,CAChB,OAAO,IAAIH,EAAM,KAAK,EAAIG,EAAM,EAAG,KAAK,EAAIA,EAAM,CAAC,CACvD,CAEA,eAAeA,EAAO,CAClB,OAAO,IAAIH,EAAM,KAAK,EAAIG,EAAM,EAAG,KAAK,EAAIA,EAAM,CAAC,CACvD,CACJ,CAEO,MAAMG,CAAU,CACnB,YAAYC,EAAMC,EAAKC,EAAOC,EAAQ,CAClC,KAAK,KAAOH,EACZ,KAAK,IAAMC,EACX,KAAK,MAAQC,EACb,KAAK,OAASC,CAClB,CAEA,IAAI,OAAQ,CAAE,OAAO,KAAK,KAAO,KAAK,KAAO,CAC7C,IAAI,QAAS,CAAE,OAAO,KAAK,IAAM,KAAK,MAAQ,CAE9C,cAAcC,EAAO,CACjB,OAAOA,EAAM,GAAK,KAAK,MAAQA,EAAM,EAAI,KAAK,OAC1CA,EAAM,GAAK,KAAK,KAAOA,EAAM,EAAI,KAAK,MAC9C,CAEA,kBAAkBC,EAAM,CACpB,OAAOA,EAAK,MAAQ,KAAK,MAAQA,EAAK,OAAS,KAAK,OAChDA,EAAK,KAAO,KAAK,KAAOA,EAAK,QAAU,KAAK,MACpD,CACJ,CAEO,MAAMC,UAAyBP,CAAU,CAC5C,YAAYC,EAAMC,EAAKC,EAAOC,EAAQ,CAClC,MAAMH,EAAMC,EAAKC,EAAOC,CAAM,CAClC,CACJ,CAEO,MAAMI,CAAO,CAChB,YAAYC,EAAM,CAIlB,CAEA,QAAQ5B,EAAK,CACT,OAAO,KAAK,MAAM,KAAK,OAAO,EAAIA,CAAG,CACzC,CAEA,YAAa,CACT,OAAO,KAAK,OAAO,CACvB,CAEA,UAAW,CACP,OAAO,KAAK,OAAO,GAAK,EAC5B,CACJ", + "names": ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", "SQRT1_2", "SQRT2", "min", "max", "sqrt", "sign", "sin", "cos", "tan", "acos", "asin", "atan", "atan2", "exp", "log", "pow", "Point", "x", "y", "other", "dx", "dy", "Rectangle", "left", "top", "width", "height", "point", "rect", "MutableRectangle", "Random", "seed"] +} diff --git a/packages/flutterjs_dart/dist/typed_data/index.js b/packages/flutterjs_dart/dist/typed_data/index.js new file mode 100644 index 00000000..7ec3cb00 --- /dev/null +++ b/packages/flutterjs_dart/dist/typed_data/index.js @@ -0,0 +1,2 @@ +const i=Uint8Array,r=Int8Array,o=Uint8ClampedArray,a=Uint16Array,h=Int16Array,c=Uint32Array,l=Int32Array,_=Float32Array,u=Float64Array;class w{constructor(t,e=0,s){t instanceof ArrayBuffer?this._view=new DataView(t,e,s):t instanceof Uint8Array||t instanceof i?this._view=new DataView(t.buffer,t.byteOffset+e,s):this._view=new DataView(new ArrayBuffer(t))}getInt8(t){return this._view.getInt8(t)}setInt8(t,e){this._view.setInt8(t,e)}getUint8(t){return this._view.getUint8(t)}setUint8(t,e){this._view.setUint8(t,e)}getInt16(t,e){return this._view.getInt16(t,e===1)}setInt16(t,e,s){this._view.setInt16(t,e,s===1)}get buffer(){return this._view.buffer}}class y{constructor({copy:t=!0}={}){this._chunks=[],this._length=0}add(t){this._chunks.push(t),this._length+=t.length}addByte(t){this._chunks.push(new Uint8Array([t])),this._length++}takeBytes(){const t=this.toBytes();return this.clear(),t}toBytes(){const t=new Uint8Array(this._length);let e=0;for(const s of this._chunks)t.set(s,e),e+=s.length;return t}clear(){this._chunks=[],this._length=0}}export{w as ByteData,y as BytesBuilder,_ as Float32List,u as Float64List,h as Int16List,l as Int32List,r as Int8List,a as Uint16List,c as Uint32List,o as Uint8ClampedList,i as Uint8List}; +//# sourceMappingURL=index.js.map diff --git a/packages/flutterjs_dart/dist/typed_data/index.js.map b/packages/flutterjs_dart/dist/typed_data/index.js.map new file mode 100644 index 00000000..4906919e --- /dev/null +++ b/packages/flutterjs_dart/dist/typed_data/index.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../src/typed_data/index.js"], + "sourcesContent": ["// dart:typed_data implementation\r\n\r\nexport const Uint8List = Uint8Array;\r\nexport const Int8List = Int8Array;\r\nexport const Uint8ClampedList = Uint8ClampedArray;\r\nexport const Uint16List = Uint16Array;\r\nexport const Int16List = Int16Array;\r\nexport const Uint32List = Uint32Array;\r\nexport const Int32List = Int32Array;\r\nexport const Float32List = Float32Array;\r\nexport const Float64List = Float64Array;\r\n\r\n// ByteData wrapper\r\nexport class ByteData {\r\n constructor(buffer, offsetInBytes = 0, lengthInBytes) {\r\n if (buffer instanceof ArrayBuffer) {\r\n this._view = new DataView(buffer, offsetInBytes, lengthInBytes);\r\n } else if (buffer instanceof Uint8Array || buffer instanceof Uint8List) {\r\n this._view = new DataView(buffer.buffer, buffer.byteOffset + offsetInBytes, lengthInBytes);\r\n } else {\r\n // Create new of size\r\n this._view = new DataView(new ArrayBuffer(buffer));\r\n }\r\n }\r\n\r\n getInt8(byteOffset) { return this._view.getInt8(byteOffset); }\r\n setInt8(byteOffset, value) { this._view.setInt8(byteOffset, value); }\r\n\r\n getUint8(byteOffset) { return this._view.getUint8(byteOffset); }\r\n setUint8(byteOffset, value) { this._view.setUint8(byteOffset, value); }\r\n\r\n getInt16(byteOffset, endian) { return this._view.getInt16(byteOffset, endian === 1); } // endian 1 = little? check consts\r\n setInt16(byteOffset, value, endian) { this._view.setInt16(byteOffset, value, endian === 1); }\r\n\r\n // ... add others as needed\r\n\r\n get buffer() { return this._view.buffer; }\r\n}\r\n\r\nexport class BytesBuilder {\r\n constructor({ copy = true } = {}) {\r\n this._chunks = [];\r\n this._length = 0;\r\n }\r\n\r\n add(bytes) {\r\n this._chunks.push(bytes);\r\n this._length += bytes.length;\r\n }\r\n\r\n addByte(byte) {\r\n this._chunks.push(new Uint8Array([byte]));\r\n this._length++;\r\n }\r\n\r\n takeBytes() {\r\n const result = this.toBytes();\r\n this.clear();\r\n return result;\r\n }\r\n\r\n toBytes() {\r\n const result = new Uint8Array(this._length);\r\n let offset = 0;\r\n for (const chunk of this._chunks) {\r\n result.set(chunk, offset);\r\n offset += chunk.length;\r\n }\r\n return result;\r\n }\r\n\r\n clear() {\r\n this._chunks = [];\r\n this._length = 0;\r\n }\r\n}\r\n"], + "mappings": "AAEO,MAAMA,EAAY,WACZC,EAAW,UACXC,EAAmB,kBACnBC,EAAa,YACbC,EAAY,WACZC,EAAa,YACbC,EAAY,WACZC,EAAc,aACdC,EAAc,aAGpB,MAAMC,CAAS,CAClB,YAAYC,EAAQC,EAAgB,EAAGC,EAAe,CAC9CF,aAAkB,YAClB,KAAK,MAAQ,IAAI,SAASA,EAAQC,EAAeC,CAAa,EACvDF,aAAkB,YAAcA,aAAkBV,EACzD,KAAK,MAAQ,IAAI,SAASU,EAAO,OAAQA,EAAO,WAAaC,EAAeC,CAAa,EAGzF,KAAK,MAAQ,IAAI,SAAS,IAAI,YAAYF,CAAM,CAAC,CAEzD,CAEA,QAAQG,EAAY,CAAE,OAAO,KAAK,MAAM,QAAQA,CAAU,CAAG,CAC7D,QAAQA,EAAYC,EAAO,CAAE,KAAK,MAAM,QAAQD,EAAYC,CAAK,CAAG,CAEpE,SAASD,EAAY,CAAE,OAAO,KAAK,MAAM,SAASA,CAAU,CAAG,CAC/D,SAASA,EAAYC,EAAO,CAAE,KAAK,MAAM,SAASD,EAAYC,CAAK,CAAG,CAEtE,SAASD,EAAYE,EAAQ,CAAE,OAAO,KAAK,MAAM,SAASF,EAAYE,IAAW,CAAC,CAAG,CACrF,SAASF,EAAYC,EAAOC,EAAQ,CAAE,KAAK,MAAM,SAASF,EAAYC,EAAOC,IAAW,CAAC,CAAG,CAI5F,IAAI,QAAS,CAAE,OAAO,KAAK,MAAM,MAAQ,CAC7C,CAEO,MAAMC,CAAa,CACtB,YAAY,CAAE,KAAAC,EAAO,EAAK,EAAI,CAAC,EAAG,CAC9B,KAAK,QAAU,CAAC,EAChB,KAAK,QAAU,CACnB,CAEA,IAAIC,EAAO,CACP,KAAK,QAAQ,KAAKA,CAAK,EACvB,KAAK,SAAWA,EAAM,MAC1B,CAEA,QAAQC,EAAM,CACV,KAAK,QAAQ,KAAK,IAAI,WAAW,CAACA,CAAI,CAAC,CAAC,EACxC,KAAK,SACT,CAEA,WAAY,CACR,MAAMC,EAAS,KAAK,QAAQ,EAC5B,YAAK,MAAM,EACJA,CACX,CAEA,SAAU,CACN,MAAMA,EAAS,IAAI,WAAW,KAAK,OAAO,EAC1C,IAAIC,EAAS,EACb,UAAWC,KAAS,KAAK,QACrBF,EAAO,IAAIE,EAAOD,CAAM,EACxBA,GAAUC,EAAM,OAEpB,OAAOF,CACX,CAEA,OAAQ,CACJ,KAAK,QAAU,CAAC,EAChB,KAAK,QAAU,CACnB,CACJ", + "names": ["Uint8List", "Int8List", "Uint8ClampedList", "Uint16List", "Int16List", "Uint32List", "Int32List", "Float32List", "Float64List", "ByteData", "buffer", "offsetInBytes", "lengthInBytes", "byteOffset", "value", "endian", "BytesBuilder", "copy", "bytes", "byte", "result", "offset", "chunk"] +} diff --git a/packages/flutterjs_dart/exports.json b/packages/flutterjs_dart/exports.json new file mode 100644 index 00000000..a15e25ca --- /dev/null +++ b/packages/flutterjs_dart/exports.json @@ -0,0 +1,63 @@ +{ + "package": "@flutterjs/dart", + "version": "1.0.0", + "exports": [ + "ByteData", + "BytesBuilder", + "Completer", + "E", + "Float32List", + "Float64List", + "Future", + "HashMap", + "HashSet", + "Int16List", + "Int32List", + "Int8List", + "LN10", + "LN2", + "LOG10E", + "LOG2E", + "LinkedList", + "LinkedListEntry", + "MutableRectangle", + "PI", + "Point", + "Queue", + "Random", + "Rectangle", + "SQRT1_2", + "SQRT2", + "Stream", + "StreamController", + "Timeline", + "Timer", + "Uint16List", + "Uint32List", + "Uint8ClampedList", + "Uint8List", + "acos", + "asin", + "atan", + "atan2", + "base64", + "base64Decode", + "base64Encode", + "cos", + "debugger_", + "exp", + "inspect", + "json", + "jsonDecode", + "jsonEncode", + "log", + "max", + "min", + "pow", + "sign", + "sin", + "sqrt", + "tan", + "utf8" + ] +} diff --git a/packages/flutterjs_dart/package.json b/packages/flutterjs_dart/package.json new file mode 100644 index 00000000..58b0121a --- /dev/null +++ b/packages/flutterjs_dart/package.json @@ -0,0 +1,31 @@ +{ + "name": "@flutterjs/dart", + "version": "1.0.0", + "description": "Dart Standard Library implementation for FlutterJS", + "type": "module", + "main": "./dist/index.js", + "exports": { + ".": "./dist/index.js", + "./async": "./dist/async/index.js", + "./collection": "./dist/collection/index.js", + "./convert": "./dist/convert/index.js", + "./developer": "./dist/developer/index.js", + "./math": "./dist/math/index.js", + "./typed_data": "./dist/typed_data/index.js" + }, + "scripts": { + "build": "node build.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "devDependencies": { + "esbuild": "^0.18.0" + }, + "keywords": [ + "flutterjs", + "dart", + "stdlib" + ], + "author": "", + "license": "MIT", + "dependencies": {} +} diff --git a/packages/flutterjs_dart/src/async/index.js b/packages/flutterjs_dart/src/async/index.js new file mode 100644 index 00000000..ddde752b --- /dev/null +++ b/packages/flutterjs_dart/src/async/index.js @@ -0,0 +1,144 @@ +// dart:async implementation + +export class Timer { + constructor(duration, callback) { + this._timer = setTimeout(callback, duration.inMilliseconds || duration); + } + + static periodic(duration, callback) { + const timer = new Timer(0, () => { }); + // Clear initial timeout, set interval + clearTimeout(timer._timer); + timer._timer = setInterval(() => callback(timer), duration.inMilliseconds || duration); + return timer; + } + + static run(callback) { + setTimeout(callback, 0); + } + + cancel() { + clearTimeout(this._timer); // Works for clearInterval too in browsers usually + clearInterval(this._timer); + } +} + +export class Future { + constructor(computation) { + this._promise = new Promise((resolve, reject) => { + try { + const result = computation(); + resolve(result); + } catch (e) { + reject(e); + } + }); + } + + // Internal: wrap existing promise + static _wrap(promise) { + const f = new Future(() => { }); + f._promise = promise; + return f; + } + + static value(value) { + return Future._wrap(Promise.resolve(value)); + } + + static error(error) { + return Future._wrap(Promise.reject(error)); + } + + static delayed(duration, computation) { + return Future._wrap(new Promise((resolve, reject) => { + setTimeout(() => { + try { + if (computation) { + resolve(computation()); + } else { + resolve(null); + } + } catch (e) { + reject(e); + } + }, duration.inMilliseconds || duration); + })); + } + + static wait(futures) { + const promises = futures.map(f => f instanceof Future ? f._promise : f); + return Future._wrap(Promise.all(promises)); + } + + then(onValue, { onError } = {}) { + const p = this._promise.then( + val => onValue(val), + err => { + if (onError) { + return onError(err); + } + throw err; + } + ); + return Future._wrap(p); + } + + catchError(onError, { test } = {}) { + const p = this._promise.catch(err => { + if (test && !test(err)) throw err; + return onError(err); + }); + return Future._wrap(p); + } + + whenComplete(action) { + const p = this._promise.finally(() => { + return action(); + }); + return Future._wrap(p); + } + + // To allow await in JS specific code if needed (not standard Dart but helpful) + thenJS(onFulfilled, onRejected) { + return this._promise.then(onFulfilled, onRejected); + } +} + +export class Completer { + constructor() { + this.future = new Future(() => { }); + // Replace the promise with one we control + this.future._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; + }); + } + + complete(value) { + this._resolve(value); + } + + completeError(error) { + this._reject(error); + } + + get isCompleted() { + // Hard to track without extra state, skipping for lightweight wrapper + return false; + } +} + +export class Stream { + constructor() { + // Basic placeholder + } + // TODO: Full Stream implementation +} + +export class StreamController { + constructor() { + this.stream = new Stream(); + } + // TODO: Full StreamController implementation +} diff --git a/packages/flutterjs_dart/src/collection/index.js b/packages/flutterjs_dart/src/collection/index.js new file mode 100644 index 00000000..aaf41953 --- /dev/null +++ b/packages/flutterjs_dart/src/collection/index.js @@ -0,0 +1,61 @@ +// dart:collection implementation + +export class Queue { + constructor() { + this._list = []; + } + + add(value) { this._list.push(value); } + addFirst(value) { this._list.unshift(value); } + addLast(value) { this._list.push(value); } + + removeFirst() { return this._list.shift(); } + removeLast() { return this._list.pop(); } + + get first() { return this._list[0]; } + get last() { return this._list[this._list.length - 1]; } + get length() { return this._list.length; } + get isEmpty() { return this._list.length === 0; } + get isNotEmpty() { return this._list.length > 0; } + + toList() { return [...this._list]; } +} + +export class LinkedList { + constructor() { + this._head = null; + this._tail = null; + this._length = 0; + } + + add(entry) { + if (!this._head) { + this._head = entry; + this._tail = entry; + } else { + this._tail.next = entry; + entry.previous = this._tail; + this._tail = entry; + } + this._length++; + } + + // Minimal implementation for now + get length() { return this._length; } +} + +export class LinkedListEntry { + constructor() { + this.list = null; + this.previous = null; + this.next = null; + } + + unlink() { + // TODO impl + } +} + +// Maps and Sets are just native JS Map/Set usually, but we can export helpers +export const HashMap = Map; +export const HashSet = Set; diff --git a/packages/flutterjs_dart/src/convert/index.js b/packages/flutterjs_dart/src/convert/index.js new file mode 100644 index 00000000..81d43af1 --- /dev/null +++ b/packages/flutterjs_dart/src/convert/index.js @@ -0,0 +1,62 @@ +// dart:convert implementation + +// --- JSON --- +export const json = { + decode: (source) => JSON.parse(source), + encode: (object) => JSON.stringify(object), +}; + +export function jsonDecode(source) { + return JSON.parse(source); +} + +export function jsonEncode(object) { + return JSON.stringify(object); +} + +// --- UTF8 --- +// Can likely assume Timer/Browser env has TextEncoder/TextDecoder +const _encoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null; +const _decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder() : null; + +export const utf8 = { + encode: (string) => { + if (_encoder) return _encoder.encode(string); + // Fallback or error if not in browser/node + return new Uint8Array(Buffer.from(string, 'utf-8')); + }, + decode: (bytes) => { + if (_decoder) return _decoder.decode(bytes); + return Buffer.from(bytes).toString('utf-8'); + } +}; + +// --- Base64 --- +export const base64 = { + encode: (bytes) => { + // Handle bytes -> string + let binary = ''; + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); + }, + decode: (source) => { + const binary = atob(source); + const len = binary.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; + } +}; + +export function base64Encode(bytes) { + return base64.encode(bytes); +} + +export function base64Decode(source) { + return base64.decode(source); +} diff --git a/packages/flutterjs_dart/src/developer/index.js b/packages/flutterjs_dart/src/developer/index.js new file mode 100644 index 00000000..545f7fd7 --- /dev/null +++ b/packages/flutterjs_dart/src/developer/index.js @@ -0,0 +1,42 @@ +// dart:developer implementation + +export function log(message, { time, sequenceNumber, level = 0, name = '', zone, error, stackTrace } = {}) { + const timestamp = time ? new Date(time).toLocaleTimeString() : new Date().toLocaleTimeString(); + const prefix = `[${timestamp}] ${name ? name + ': ' : ''}`; + + if (error) { + console.error(prefix + message, error); + if (stackTrace) console.error(stackTrace); + } else { + console.log(prefix + message); + } +} + +export function inspect(object) { + console.dir(object); + return object; +} + +export function debugger_({ message, when = true } = {}) { + if (when) { + if (message) console.log(`Debugger triggered: ${message}`); + // eslint-disable-next-line + debugger; + return true; + } + return false; +} + +export class Timeline { + static startSync(name, { arguments: args } = {}) { + // Use User Timing API + if (typeof performance !== 'undefined') { + performance.mark(name); + } + } + + static finishSync() { + // Ideally we'd match the last mark, but JS performance API is event based. + // This is a loose approximation. + } +} diff --git a/packages/flutterjs_dart/src/index.js b/packages/flutterjs_dart/src/index.js new file mode 100644 index 00000000..e5d6b4f0 --- /dev/null +++ b/packages/flutterjs_dart/src/index.js @@ -0,0 +1,6 @@ +export * as math from './math/index.js'; +export * as async from './async/index.js'; +export * as convert from './convert/index.js'; +export * as collection from './collection/index.js'; +export * as developer from './developer/index.js'; +export * as typed_data from './typed_data/index.js'; diff --git a/packages/flutterjs_dart/src/math/index.js b/packages/flutterjs_dart/src/math/index.js new file mode 100644 index 00000000..e1132c62 --- /dev/null +++ b/packages/flutterjs_dart/src/math/index.js @@ -0,0 +1,102 @@ +// dart:math implementation + +export const E = Math.E; +export const LN10 = Math.LN10; +export const LN2 = Math.LN2; +export const LOG2E = Math.LOG2E; +export const LOG10E = Math.LOG10E; +export const PI = Math.PI; +export const SQRT1_2 = Math.SQRT1_2; +export const SQRT2 = Math.SQRT2; + +export const min = Math.min; +export const max = Math.max; +export const sqrt = Math.sqrt; +export const sign = Math.sign; +export const sin = Math.sin; +export const cos = Math.cos; +export const tan = Math.tan; +export const acos = Math.acos; +export const asin = Math.asin; +export const atan = Math.atan; +export const atan2 = Math.atan2; +export const exp = Math.exp; +export const log = Math.log; +export const pow = Math.pow; + +export class Point { + constructor(x, y) { + this.x = x; + this.y = y; + } + + toString() { + return `Point(${this.x}, ${this.y})`; + } + + distanceTo(other) { + const dx = this.x - other.x; + const dy = this.y - other.y; + return Math.sqrt(dx * dx + dy * dy); + } + + get magnitude() { + return Math.sqrt(this.x * this.x + this.y * this.y); + } + + operator_add(other) { + return new Point(this.x + other.x, this.y + other.y); + } + + operator_minus(other) { + return new Point(this.x - other.x, this.y - other.y); + } +} + +export class Rectangle { + constructor(left, top, width, height) { + this.left = left; + this.top = top; + this.width = width; + this.height = height; + } + + get right() { return this.left + this.width; } + get bottom() { return this.top + this.height; } + + containsPoint(point) { + return point.x >= this.left && point.x < this.right && + point.y >= this.top && point.y < this.bottom; + } + + containsRectangle(rect) { + return rect.left >= this.left && rect.right <= this.right && + rect.top >= this.top && rect.bottom <= this.bottom; + } +} + +export class MutableRectangle extends Rectangle { + constructor(left, top, width, height) { + super(left, top, width, height); + } +} + +export class Random { + constructor(seed) { + // JS Math.random() doesn't support seeding natively without a custom PRNG. + // For now, we ignore the seed to rely on browser crypto/random. + // TODO: Implement a seeded PRNG if strict determinism is needed. + } + + nextInt(max) { + return Math.floor(Math.random() * max); + } + + nextDouble() { + return Math.random(); + } + + nextBool() { + return Math.random() >= 0.5; + } +} diff --git a/packages/flutterjs_dart/src/typed_data/index.js b/packages/flutterjs_dart/src/typed_data/index.js new file mode 100644 index 00000000..786680db --- /dev/null +++ b/packages/flutterjs_dart/src/typed_data/index.js @@ -0,0 +1,76 @@ +// dart:typed_data implementation + +export const Uint8List = Uint8Array; +export const Int8List = Int8Array; +export const Uint8ClampedList = Uint8ClampedArray; +export const Uint16List = Uint16Array; +export const Int16List = Int16Array; +export const Uint32List = Uint32Array; +export const Int32List = Int32Array; +export const Float32List = Float32Array; +export const Float64List = Float64Array; + +// ByteData wrapper +export class ByteData { + constructor(buffer, offsetInBytes = 0, lengthInBytes) { + if (buffer instanceof ArrayBuffer) { + this._view = new DataView(buffer, offsetInBytes, lengthInBytes); + } else if (buffer instanceof Uint8Array || buffer instanceof Uint8List) { + this._view = new DataView(buffer.buffer, buffer.byteOffset + offsetInBytes, lengthInBytes); + } else { + // Create new of size + this._view = new DataView(new ArrayBuffer(buffer)); + } + } + + getInt8(byteOffset) { return this._view.getInt8(byteOffset); } + setInt8(byteOffset, value) { this._view.setInt8(byteOffset, value); } + + getUint8(byteOffset) { return this._view.getUint8(byteOffset); } + setUint8(byteOffset, value) { this._view.setUint8(byteOffset, value); } + + getInt16(byteOffset, endian) { return this._view.getInt16(byteOffset, endian === 1); } // endian 1 = little? check consts + setInt16(byteOffset, value, endian) { this._view.setInt16(byteOffset, value, endian === 1); } + + // ... add others as needed + + get buffer() { return this._view.buffer; } +} + +export class BytesBuilder { + constructor({ copy = true } = {}) { + this._chunks = []; + this._length = 0; + } + + add(bytes) { + this._chunks.push(bytes); + this._length += bytes.length; + } + + addByte(byte) { + this._chunks.push(new Uint8Array([byte])); + this._length++; + } + + takeBytes() { + const result = this.toBytes(); + this.clear(); + return result; + } + + toBytes() { + const result = new Uint8Array(this._length); + let offset = 0; + for (const chunk of this._chunks) { + result.set(chunk, offset); + offset += chunk.length; + } + return result; + } + + clear() { + this._chunks = []; + this._length = 0; + } +} diff --git a/packages/flutterjs_engine/bin/commands/build_integration.js b/packages/flutterjs_engine/bin/commands/build_integration.js deleted file mode 100644 index c2265c4a..00000000 --- a/packages/flutterjs_engine/bin/commands/build_integration.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * ============================================================================ - * BuildIntegration - Build Pipeline Orchestrator - * ============================================================================ - * - * Coordinates the complete build pipeline: - * - Analysis (Phases 1-7) via BuildAnalyzer - * - Generation (Phases 8-10) via BuildGenerator - * - * This is the main entry point that orchestrates the full build. - */ - -import chalk from "chalk"; -import { BuildAnalyzer } from "./build_integration_analyzer.js"; -import { BuildGenerator } from "./build_integration_generator.js"; - -class BuildIntegration { - constructor(projectRoot, config = {}) { - this.projectRoot = projectRoot; - this.config = { - mode: config.mode || "development", - target: config.target || "web", - outputDir: config.outputDir || "dist", - debugMode: config.debugMode || false, - installDependencies: config.installDependencies !== false, - ...config, - }; - - // Initialize sub-components - this.analyzer = new BuildAnalyzer(this); - this.generator = new BuildGenerator(this); - - // Shared state containers - this.analysis = null; - this.resolution = null; - this.installation = null; - this.collection = null; - this.transformed = null; - this.buildOutput = null; - this.generatedVNodes = null; - this.generatedHTML = null; - this.runtime = null; - this.widgetMetadata = null; - - if (this.config.debugMode) { - console.log(chalk.blue("\n[BuildIntegration] Initialized")); - console.log(chalk.gray(` projectRoot: ${projectRoot}`)); - console.log(chalk.gray(` mode: ${this.config.mode}`)); - console.log(chalk.gray(` outputDir: ${this.config.outputDir}\n`)); - } - } - - /** - * ======================================================================== - * MAIN PIPELINE EXECUTION - * ======================================================================== - */ - async execute() { - console.log(chalk.blue("\n" + "=".repeat(70))); - console.log(chalk.blue("FLUTTERJS BUILD INTEGRATION PIPELINE")); - console.log(chalk.blue("=".repeat(70))); - - const startTime = Date.now(); - - try { - // ========== ANALYSIS PHASE ========== - // Phases 1-7: Analyze, resolve, install, collect, transform, initialize, build - - await this.analyzer.phase1_analyze(); - await this.analyzer.phase2_resolveDependencies(); - - if (this.config.installDependencies) { - await this.analyzer.phase3_installPackages(); - } - - await this.analyzer.phase4_collectPackages(); - await this.analyzer.phase5_transformCode(); - await this.analyzer.phase6_initializeRuntime(); - await this.analyzer.phase7_buildWidgets(); - - // ========== GENERATION PHASE ========== - // Phases 8-10: Generate HTML, output files, and report - - await this.generator.phase8_generateHTML(); - await this.generator.phase9_generateOutput(); - - const duration = Date.now() - startTime; - this.generator.phase10_report(duration); - - return { - success: true, - duration, - analysis: this.analysis, - resolution: this.resolution, - installation: this.installation, - collection: this.collection, - transformed: this.transformed, - output: this.buildOutput, - }; - } catch (error) { - console.error(chalk.red("\nโœ— Build Failed:"), error.message); - if (this.config.debugMode) { - console.error(error.stack); - } - throw error; - } - } -} - -export { BuildIntegration }; -export default BuildIntegration; \ No newline at end of file diff --git a/packages/flutterjs_engine/bin/commands/flutterjs_package_installer.js b/packages/flutterjs_engine/bin/commands/flutterjs_package_installer.js deleted file mode 100644 index 058ee5c1..00000000 --- a/packages/flutterjs_engine/bin/commands/flutterjs_package_installer.js +++ /dev/null @@ -1,950 +0,0 @@ -/** - * ============================================================================ - * FlutterJS Package Installer - Complete Implementation - * ============================================================================ - * - * Handles 3 installation sources: - * 1. SDK Packages - @flutterjs/* (bundled with SDK) - * 2. Registry Packages - Published packages (npm) - * 3. Local Packages - User-made packages (packages/) - * - * Responsibilities: - * - Locate packages from any source - * - Validate package.json structure - * - Copy package files to dist/ - * - Create installation log - * - Handle installation failures gracefully - * - Generate installation report - * - * Location: cli/package_manager/package_installer.js - */ - -import fs from 'fs'; -import path from 'path'; -import chalk from 'chalk'; - -// ============================================================================ -// PACKAGE SOURCE TYPES -// ============================================================================ - -const PackageSource = { - SDK: 'sdk', // @flutterjs/* from SDK - REGISTRY: 'registry', // npm packages from node_modules - LOCAL: 'local' // User packages from packages/ -}; - -// ============================================================================ -// INSTALLATION RESULT TYPES -// ============================================================================ - -/** - * Single package installation result - */ -class PackageInstallResult { - constructor(packageName, source) { - this.packageName = packageName; - this.source = source; - this.success = false; - this.version = null; - this.sourcePath = null; - this.destPath = null; - this.filesCount = 0; - this.size = 0; - this.error = null; - this.warnings = []; - this.timestamp = new Date().toISOString(); - } - - getSizeKB() { - return (this.size / 1024).toFixed(2); - } - - getSizeMB() { - return (this.size / (1024 * 1024)).toFixed(2); - } - - toJSON() { - return { - packageName: this.packageName, - source: this.source, - success: this.success, - version: this.version, - filesCount: this.filesCount, - size: this.size, - error: this.error, - warnings: this.warnings, - timestamp: this.timestamp - }; - } -} - -/** - * Complete installation session result - */ -class InstallationSession { - constructor() { - this.results = []; - this.totalPackages = 0; - this.successCount = 0; - this.failureCount = 0; - this.totalSize = 0; - this.totalFiles = 0; - this.startTime = null; - this.endTime = null; - this.globalErrors = []; - } - - addResult(result) { - this.results.push(result); - this.totalPackages++; - - if (result.success) { - this.successCount++; - this.totalSize += result.size; - this.totalFiles += result.filesCount; - } else { - this.failureCount++; - } - } - - addError(message) { - this.globalErrors.push(message); - } - - getDuration() { - if (!this.startTime || !this.endTime) return 0; - return this.endTime - this.startTime; - } - - getTotalSizeMB() { - return (this.totalSize / (1024 * 1024)).toFixed(2); - } - - isSuccessful() { - return this.failureCount === 0 && this.globalErrors.length === 0; - } - - getReport() { - return { - total: this.totalPackages, - successful: this.successCount, - failed: this.failureCount, - files: this.totalFiles, - size: this.getTotalSizeMB() + ' MB', - duration: this.getDuration() + 'ms', - results: this.results.map(r => r.toJSON()), - errors: this.globalErrors - }; - } -} - -// ============================================================================ -// PACKAGE RESOLVER -// ============================================================================ - -/** - * Resolves package locations from different sources - */ -class PackageResolver { - constructor(projectRoot, options = {}) { - this.projectRoot = projectRoot; - this.debugMode = options.debugMode || false; - - // โœ… FIX: Find the correct SDK root by searching upward - this.sdkRoot = this.findSDKRootUpward(projectRoot); - this.nodeModulesRoot = this.findNodeModulesUpward(projectRoot); - this.localPackagesRoot = path.join(projectRoot, 'packages'); - - if (this.debugMode) { - console.log('\n[PackageResolver] Initialized'); - console.log(` Project Root: ${projectRoot}`); - console.log(` SDK Root: ${this.sdkRoot}`); - console.log(` Node Modules: ${this.nodeModulesRoot}`); - console.log(` Local Packages: ${this.localPackagesRoot}\n`); - } - } - - /** - * โœ… NEW: Search upward for node_modules/@flutterjs - * Looks in current dir and all parent dirs up to root - */ - findNodeModulesUpward(startPath) { - let current = startPath; - const visited = new Set(); - - // Search up to 10 levels - for (let i = 0; i < 10; i++) { - if (visited.has(current)) break; - visited.add(current); - - const nodeModulesPath = path.join(current, 'node_modules', '@flutterjs'); - if (fs.existsSync(nodeModulesPath)) { - if (this.debugMode) { - console.log(`[PackageResolver] Found @flutterjs at: ${nodeModulesPath}`); - } - return path.join(current, 'node_modules'); - } - - // Move up one directory - const parent = path.dirname(current); - if (parent === current) break; // Reached filesystem root - current = parent; - } - - // Fallback - return path.join(startPath, 'node_modules'); - } - - /** - * โœ… FIXED: Search for SDK packages including flutterjs_engine structure - */ - findSDKRootUpward(startPath) { - let current = startPath; - const visited = new Set(); - - for (let i = 0; i < 10; i++) { - if (visited.has(current)) break; - visited.add(current); - - // โœ… CORRECTED: Check packages/flutterjs_engine/src and packages/flutterjs_engine/package - - // Check packages/flutterjs_engine/src/ - const srcPath = path.join(current, 'packages', 'flutterjs_engine', 'src'); - if (fs.existsSync(srcPath)) { - const contents = fs.readdirSync(srcPath); - const hasPackages = contents.some(item => { - const itemPath = path.join(srcPath, item); - return fs.existsSync(path.join(itemPath, 'package.json')); - }); - - if (hasPackages) { - if (this.debugMode) { - console.log(`[PackageResolver] Found SDK packages at: ${srcPath}`); - } - return srcPath; - } - } - - // Check packages/flutterjs_engine/package/ - const packagePath = path.join(current, 'packages', 'flutterjs_engine', 'package'); - if (fs.existsSync(packagePath)) { - const contents = fs.readdirSync(packagePath); - const hasPackages = contents.some(item => { - const itemPath = path.join(packagePath, item); - return fs.existsSync(path.join(itemPath, 'package.json')); - }); - - if (hasPackages) { - if (this.debugMode) { - console.log(`[PackageResolver] Found SDK packages at: ${packagePath}`); - } - return packagePath; - } - } - - // Fallback: Check /src at project root - const projectSrcPath = path.join(current, 'src'); - if (fs.existsSync(projectSrcPath)) { - const contents = fs.readdirSync(projectSrcPath); - const hasPackages = contents.some(item => { - const itemPath = path.join(projectSrcPath, item); - return fs.existsSync(path.join(itemPath, 'package.json')); - }); - - if (hasPackages) { - if (this.debugMode) { - console.log(`[PackageResolver] Found SDK packages at: ${projectSrcPath}`); - } - return projectSrcPath; - } - } - - // Check node_modules - const nodeModulesPath = path.join(current, 'node_modules', '@flutterjs'); - if (fs.existsSync(nodeModulesPath)) { - if (this.debugMode) { - console.log(`[PackageResolver] Found SDK at: ${nodeModulesPath}`); - } - return nodeModulesPath; - } - - const parent = path.dirname(current); - if (parent === current) break; - current = parent; - } - - return path.join(startPath, 'node_modules', '@flutterjs'); - } - - - /** - * Resolve package from any source (auto-detect) - */ - resolve(packageName) { - if (this.debugMode) { - console.log(`[PackageResolver] Resolving: ${packageName}`); - } - - // Try SDK first (@flutterjs/*) - if (packageName.startsWith('@flutterjs/')) { - const sdkPath = this.resolveSdk(packageName); - if (sdkPath) { - if (this.debugMode) { - console.log(` โœ… Found in SDK: ${sdkPath}`); - } - return { path: sdkPath, source: 'sdk' }; - } - } - - // Try node_modules - const registryPath = this.resolveRegistry(packageName); - if (registryPath) { - if (this.debugMode) { - console.log(` โœ… Found in npm: ${registryPath}`); - } - return { path: registryPath, source: 'npm' }; - } - - // Try Local - const localPath = this.resolveLocal(packageName); - if (localPath) { - if (this.debugMode) { - console.log(` โœ… Found locally: ${localPath}`); - } - return { path: localPath, source: 'local' }; - } - - if (this.debugMode) { - console.log(` โŒ Not found`); - } - return null; - } - - /** - * Resolve SDK package (@flutterjs/*) - */ - resolveSdk(packageName) { - if (!packageName.startsWith('@flutterjs/')) { - return null; - } - - const pkgName = packageName.replace('@flutterjs/', ''); - - // Try the found SDK root - let pkgPath = path.join(this.sdkRoot, pkgName); - if (fs.existsSync(path.join(pkgPath, 'package.json'))) { - return pkgPath; - } - - // Try node_modules fallback - pkgPath = path.join(this.nodeModulesRoot, packageName); - if (fs.existsSync(path.join(pkgPath, 'package.json'))) { - return pkgPath; - } - - return null; - } - - /** - * Resolve Registry package (npm) - */ - resolveRegistry(packageName) { - const pkgPath = path.join(this.nodeModulesRoot, packageName); - - if (fs.existsSync(path.join(pkgPath, 'package.json'))) { - return pkgPath; - } - - return null; - } - - /** - * Resolve Local package - */ - resolveLocal(packageName) { - const pkgPath = path.join(this.localPackagesRoot, packageName); - - if (fs.existsSync(path.join(pkgPath, 'package.json'))) { - return pkgPath; - } - - return null; - } - - /** - * List all available SDK packages - */ - listSdkPackages() { - const packages = []; - - if (!fs.existsSync(this.sdkRoot)) { - return packages; - } - - try { - const items = fs.readdirSync(this.sdkRoot); - - for (const item of items) { - const itemPath = path.join(this.sdkRoot, item); - const stat = fs.statSync(itemPath); - - if (stat.isDirectory()) { - const pkgJsonPath = path.join(itemPath, 'package.json'); - if (fs.existsSync(pkgJsonPath)) { - try { - const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')); - packages.push({ - name: pkgJson.name || `@flutterjs/${item}`, - version: pkgJson.version || '1.0.0', - path: itemPath, - description: pkgJson.description || '' - }); - } catch (error) { - // Skip invalid package.json - } - } - } - } - } catch (error) { - if (this.debugMode) { - console.warn(`Could not list SDK packages: ${error.message}`); - } - } - - return packages; - } -} - -// ============================================================================ -// MAIN PACKAGE INSTALLER -// ============================================================================ - -class PackageInstaller { - constructor(projectRoot, options = {}) { - this.projectRoot = projectRoot; - this.options = { - debugMode: options.debugMode || false, - outputDir: options.outputDir || 'dist', - packagesDir: options.packagesDir || 'packages', - overwrite: options.overwrite !== false, - validatePackages: options.validatePackages !== false, - ...options - }; - - // Initialize resolver - this.resolver = new PackageResolver(projectRoot, { - debugMode: this.options.debugMode, - sdkRoot: options.sdkRoot - }); - - // Setup output paths - this.outputBase = path.join(projectRoot, this.options.outputDir); - this.packagesBase = path.join(this.outputBase, this.options.packagesDir); - - // Session tracking - this.currentSession = null; - - if (this.options.debugMode) { - console.log(chalk.gray('[PackageInstaller] Initialized')); - console.log(chalk.gray(` Output: ${this.outputBase}`)); - console.log(chalk.gray(` Packages: ${this.packagesBase}\n`)); - } - } - - /** - * Install single package - */ - async installPackage(packageName) { - try { - // Resolve package location - const resolved = this.resolver.resolve(packageName); - - if (!resolved) { - // โœ… FIX: Don't fail - just mark as uninstalled - console.warn(`[PackageInstaller] โš ๏ธ Package not found locally: ${packageName}`); - console.warn(`[PackageInstaller] Continuing build without local files`); - - const result = new PackageInstallResult(packageName, 'uninstalled'); - result.success = true; // Mark as "resolved" even though not installed - result.error = null; - result.version = '0.0.0'; - result.filesCount = 0; - result.size = 0; - result.warnings.push(`Package files not found locally, using from CDN or bundled`); - - return result; - } - - const result = new PackageInstallResult(packageName, resolved.source); - result.sourcePath = resolved.path; - - // Load and validate package.json - const pkgJson = await this.loadPackageJson(resolved.path); - result.version = pkgJson.version || '1.0.0'; - - // Validate package structure - if (this.options.validatePackages) { - this.validatePackage(pkgJson, resolved.path); - } - - // Determine destination path - const destPath = this.getDestinationPath(packageName); - result.destPath = destPath; - - // Create destination directory - await fs.promises.mkdir(destPath, { recursive: true }); - - // Copy package files - const fileCopyResults = await this.copyPackageFiles(resolved.path, destPath); - - result.filesCount = fileCopyResults.copied; - result.size = fileCopyResults.totalSize; - - // Mark as successful - result.success = true; - - if (this.options.debugMode) { - console.log(`[PackageInstaller] โœ… ${packageName} installed`); - console.log(`[PackageInstaller] Version: ${result.version}`); - console.log(`[PackageInstaller] Files: ${result.filesCount}`); - console.log(`[PackageInstaller] Size: ${result.getSizeKB()} KB\n`); - } - - return result; - - } catch (error) { - // โœ… FIX: Still mark as success (resolved) even on install error - // This allows build to continue - const result = new PackageInstallResult(packageName, 'error'); - result.success = true; // Allow build to continue - result.error = error.message; - result.warnings.push(`Installation error: ${error.message}, using fallback`); - - console.warn(`[PackageInstaller] โš ๏ธ ${packageName}: ${error.message}`); - console.warn(`[PackageInstaller] Build will continue without local files\n`); - - return result; - } - } - - /** - * Install multiple packages - */ - async installPackages(packageNames) { - const session = new InstallationSession(); - session.startTime = Date.now(); - this.currentSession = session; - - if (this.options.debugMode) { - console.log(chalk.blue(`\nInstalling ${packageNames.length} packages...\n`)); - } - - // Ensure output directories exist - try { - await fs.promises.mkdir(this.packagesBase, { recursive: true }); - } catch (error) { - session.addError(`Could not create output directory: ${error.message}`); - session.endTime = Date.now(); - return session; - } - - // Install each package - for (const packageName of packageNames) { - const result = await this.installPackage(packageName); - session.addResult(result); - } - - session.endTime = Date.now(); - - return session; - } - - /** - * Install all SDK packages - */ - async installAllSdk() { - const sdkPackages = this.resolver.listSdkPackages(); - const packageNames = sdkPackages.map(p => p.name); - - if (this.options.debugMode) { - console.log(chalk.blue(`Found ${packageNames.length} SDK packages`)); - packageNames.forEach(name => console.log(chalk.gray(` โ€ข ${name}`))); - console.log(); - } - - return this.installPackages(packageNames); - } - - /** - * Install all local packages - */ - async installAllLocal() { - const localPackages = this.resolver.listLocalPackages(); - const packageNames = localPackages.map(p => p.name); - - if (this.options.debugMode) { - console.log(chalk.blue(`Found ${packageNames.length} local packages`)); - packageNames.forEach(name => console.log(chalk.gray(` โ€ข ${name}`))); - console.log(); - } - - return this.installPackages(packageNames); - } - - /** - * Load package.json - */ - async loadPackageJson(packagePath) { - const pkgJsonPath = path.join(packagePath, 'package.json'); - - if (!fs.existsSync(pkgJsonPath)) { - throw new Error(`package.json not found at ${pkgJsonPath}`); - } - - try { - const content = await fs.promises.readFile(pkgJsonPath, 'utf-8'); - return JSON.parse(content); - } catch (error) { - throw new Error(`Invalid package.json: ${error.message}`); - } - } - - /** - * Validate package structure - */ - validatePackage(pkgJson, packagePath) { - if (!pkgJson.name) { - throw new Error('Package must have a name'); - } - - // Optional: Check for FlutterJS metadata - if (pkgJson.flutterjs) { - const flutterjs = pkgJson.flutterjs; - - if (flutterjs.type && !['widget', 'service', 'utility', 'framework'].includes(flutterjs.type)) { - throw new Error(`Invalid package type: ${flutterjs.type}`); - } - } - } - - /** - * Get destination path for package - */ - // FIXED: - getDestinationPath(packageName) { - // โœ… For @flutterjs/* packages, use node_modules/@flutterjs structure - // We use projectRoot to ensure a single, shared node_modules level - // This avoids creating a duplicate node_modules inside .dev/ - if (packageName.startsWith('@flutterjs/')) { - const scopedName = packageName.split('/')[1]; - return path.join( - this.projectRoot, // Changed from outputBase to projectRoot - 'node_modules', - '@flutterjs', - scopedName - ); - } - - // โœ… For other packages, use packages directory - const cleanName = packageName - .replace('@', '') - .replace(/\//g, '-') - .toLowerCase(); - - return path.join(this.packagesBase, cleanName); - } - - /** - * Copy all package files - */ - async copyPackageFiles(sourcePath, destPath) { - let copied = 0; - let totalSize = 0; - const errors = []; - - try { - // Get all files to copy - const files = await this.getAllPackageFiles(sourcePath); - - for (const file of files) { - try { - const relPath = path.relative(sourcePath, file.path); - const destFile = path.join(destPath, relPath); - const destFileDir = path.dirname(destFile); - - // Create directory - await fs.promises.mkdir(destFileDir, { recursive: true }); - - // Copy file - await fs.promises.copyFile(file.path, destFile); - - // Get file size - const stats = await fs.promises.stat(destFile); - totalSize += stats.size; - copied++; - - } catch (error) { - errors.push({ - file: file.path, - error: error.message - }); - } - } - - } catch (error) { - errors.push({ - step: 'scan', - error: error.message - }); - } - - return { - copied, - totalSize, - errors - }; - } - - /** - * Get all package files recursively - */ - async getAllPackageFiles(packagePath) { - const files = []; - const ignore = new Set([ - '.git', - '.github', - 'build', - 'coverage', - '.DS_Store', - '.env', - '.gitignore', - 'package-lock.json', - 'yarn.lock', - 'pnpm-lock.yaml', - 'README.md', - 'LICENSE' - ]); - - async function traverse(dir) { - try { - const entries = await fs.promises.readdir(dir, { withFileTypes: true }); - - for (const entry of entries) { - // Skip hidden and ignored - if (entry.name.startsWith('.') || ignore.has(entry.name)) { - continue; - } - - const fullPath = path.join(dir, entry.name); - - if (entry.isFile()) { - // Include: .js, .json, .css, .html - if (/\.(js|json|css|html|svg|ttf|woff|woff2)$/i.test(entry.name)) { - files.push({ path: fullPath, name: entry.name }); - } - } else if (entry.isDirectory()) { - await traverse(fullPath); - } - } - } catch (error) { - console.warn(chalk.yellow(`Warning: Could not read ${dir}`)); - } - } - - await traverse(packagePath); - return files; - } - async getAllPackageFiles(packagePath) { - const files = []; - - // โœ… FIXED: Only skip truly unnecessary directories - // Don't skip 'dist', 'src', 'lib' - these contain actual code! - const skipDirs = new Set([ - // Build/version control - skip these - '.git', - '.github', - 'coverage', - 'node_modules', - '.next', - '.nuxt', - - // Testing - skip these (usually) - 'test', - 'tests', - '__tests__', - - // Don't skip: dist, src, lib, build - these have real code! - ]); - - const skipFiles = new Set([ - '.DS_Store', - 'thumbs.db', - '.env', - '.env.local', - '.npmignore', - '.gitignore', - 'package-lock.json', - 'yarn.lock', - 'pnpm-lock.yaml', - 'README.md', - 'README.txt', - 'LICENSE', - 'CHANGELOG.md', - 'Makefile', - '.editorconfig', - ]); - - const skipExtensions = new Set([ - '.map', // Source maps - '.test.js', // Test files - '.spec.js', // Test files - '.test.ts', // Test files - '.spec.ts', // Test files - ]); - - async function traverse(dir, depth = 0) { - const indent = ' '.repeat(depth); - - try { - if (!fs.existsSync(dir)) { - console.warn(chalk.yellow(`${indent}โš ๏ธ Directory doesn't exist: ${dir}`)); - return; - } - - const entries = await fs.promises.readdir(dir, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - const relPath = path.relative(packagePath, fullPath); - - // Skip hidden files and directories (except .npmignore, etc) - if (entry.name.startsWith('.')) { - if (entry.name === '.npmignore' || entry.name === '.npmrc') { - // Include these config files - } else { - continue; - } - } - - // Skip specific files - if (skipFiles.has(entry.name)) { - continue; - } - - // Skip specific directories - if (entry.isDirectory() && skipDirs.has(entry.name)) { - continue; - } - - if (entry.isFile()) { - // โœ… Include all relevant file types - const ext = path.extname(entry.name); - const isRelevantFile = /\.(js|mjs|cjs|ts|tsx|jsx|json|css|scss|less|html|svg|png|jpg|jpeg|gif|woff|woff2|ttf|otf|eot|md|txt)$/i.test(entry.name); - const isNotSkipped = !skipExtensions.has(ext); - - if (isRelevantFile && isNotSkipped) { - files.push(fullPath); - - // Debug logging (optional) - if (false) { // Set to true for debugging - console.log(chalk.gray(`${indent} โœ“ ${relPath}`)); - } - } - } else if (entry.isDirectory()) { - // โœ… RECURSIVELY traverse ALL directories - // This will enter src/, dist/, lib/, etc. - if (false) { // Set to true for debugging - console.log(chalk.gray(`${indent} ๐Ÿ“ ${relPath}/`)); - } - - await traverse(fullPath, depth + 1); - } - } - } catch (error) { - console.warn(chalk.yellow(`${indent}โš ๏ธ Could not read directory ${dir}: ${error.message}`)); - } - } - - // Start traversal from the root package directory - await traverse(packagePath); - - return files; - } - /** - * Generate installation report - */ - generateReport(session) { - if (!session) { - return null; - } - - const report = session.getReport(); - - console.log(chalk.blue('\n' + '='.repeat(70))); - console.log(chalk.blue('INSTALLATION REPORT')); - console.log(chalk.blue('='.repeat(70))); - - console.log(chalk.gray(`\nPackages:`)); - console.log(chalk.gray(` Total: ${report.total}`)); - console.log(chalk.gray(` Successful: ${report.successful}`)); - if (report.failed > 0) { - console.log(chalk.red(` Failed: ${report.failed}`)); - } - - console.log(chalk.gray(`\nFiles & Size:`)); - console.log(chalk.gray(` Files: ${report.files}`)); - console.log(chalk.gray(` Size: ${report.size}`)); - - console.log(chalk.gray(`\nTime: ${report.duration}`)); - - if (report.errors.length > 0) { - console.log(chalk.red(`\nErrors: ${report.errors.length}`)); - report.errors.forEach(err => { - console.log(chalk.red(` โ€ข ${err}`)); - }); - } - - // Show individual package results - console.log(chalk.gray(`\nPackage Details:`)); - for (const result of report.results) { - const icon = result.success ? chalk.green('โœ“') : chalk.red('โœ—'); - console.log(`${icon} ${result.packageName}`); - if (result.success) { - console.log(chalk.gray(` v${result.version} | ${result.filesCount} files | ${(result.size / 1024).toFixed(2)} KB`)); - } else { - console.log(chalk.red(` Error: ${result.error}`)); - } - } - - if (session.isSuccessful()) { - console.log(chalk.green(`\nโœ… Installation successful!\n`)); - } else { - console.log(chalk.red(`\nโŒ Installation completed with errors\n`)); - } - - console.log(chalk.blue('='.repeat(70) + '\n')); - - return report; - } - - /** - * Get session report - */ - getSessionReport() { - return this.currentSession ? this.generateReport(this.currentSession) : null; - } -} - -// ============================================================================ -// EXPORTS -// ============================================================================ - -export { - PackageInstaller, - PackageResolver, - PackageInstallResult, - InstallationSession, - PackageSource -}; - -export default PackageInstaller; \ No newline at end of file diff --git a/packages/flutterjs_engine/bin/commands/index.js b/packages/flutterjs_engine/bin/commands/index.js deleted file mode 100644 index a78138e7..00000000 --- a/packages/flutterjs_engine/bin/commands/index.js +++ /dev/null @@ -1,832 +0,0 @@ -/** - * ============================================================================ - * FlutterJS CLI - Unified Commands Module (FIXED) - * ============================================================================ - * - * All commands integrated with BuildPipeline: - * - build: Production build with analysis - * - dev: Development server with HMR - * - run: All-in-one (build + serve) - * - clean: Remove artifacts - * - preview: Preview production build - * - analyze: Code analysis - * - doctor: Environment check - * - init: Project creation - * - * Location: cli/commands/index.js - */ - -import chalk from 'chalk'; -import ora from 'ora'; -import path from 'path'; -import fs from 'fs'; -import http from 'http'; -import { fileURLToPath } from 'url'; -import { exec, execSync } from 'child_process'; -import { promisify } from 'util'; -import open from 'open'; - -// Try to import optional dependencies -let chokidar; -try { - import('chokidar').then(module => { - chokidar = module.default; - }).catch(() => { - chokidar = null; - }); -} catch (e) { - chokidar = null; -} - -// Import systems -import { BuildPipeline } from './build_pipeline.js'; -import { DevServer } from './dev.js'; -import { initProject } from './init.js'; - -const execAsync = promisify(exec); -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -// ============================================================================ -// CONFIGURATION LOADER (Fix for loadConfig) -// ============================================================================ - -/** - * Deep merge configuration objects - */ -function deepMergeConfig(defaults, userConfig) { - const merged = { ...defaults }; - - for (const key in userConfig) { - if (!userConfig.hasOwnProperty(key)) continue; - - const defaultValue = defaults[key]; - const userValue = userConfig[key]; - - // Recursively merge objects - if ( - typeof userValue === 'object' && - userValue !== null && - !Array.isArray(userValue) && - typeof defaultValue === 'object' && - defaultValue !== null && - !Array.isArray(defaultValue) - ) { - merged[key] = deepMergeConfig(defaultValue, userValue); - } else { - // Direct assignment for primitives and arrays - merged[key] = userValue; - } - } - - return merged; -} - -/** - * Load project configuration - handles both ESM and CommonJS - */ -function loadConfigFile(configPath) { - try { - if (!fs.existsSync(configPath)) { - return null; - } - - const configCode = fs.readFileSync(configPath, 'utf-8'); - - // Create a safe sandbox for eval - const sandbox = { module: { exports: {} } }; - - try { - // Execute the config file in the sandbox - new Function('module', 'exports', configCode).call(sandbox, sandbox.module, sandbox.module.exports); - return sandbox.module.exports; - } catch (evalError) { - console.warn( - chalk.yellow(`โš ๏ธ Could not parse config file: ${evalError.message}`) - ); - return null; - } - } catch (error) { - console.warn(chalk.yellow(`โš ๏ธ Error loading config file: ${error.message}`)); - return null; - } -} - -function loadConfig(projectContext) { - try { - const configPath = path.join(projectContext.projectRoot, 'flutterjs.config.js'); - - if (!fs.existsSync(configPath)) { - if (projectContext.projectRoot !== process.cwd()) { - console.warn(chalk.yellow(`โš ๏ธ No flutterjs.config.js found, using defaults\n`)); - } - return getDefaultConfig(); - } - - // Try to load the actual config file - const userConfig = loadConfigFile(configPath); - - if (userConfig && typeof userConfig === 'object') { - // Deep merge user config with defaults - return deepMergeConfig(getDefaultConfig(), userConfig); - } - - console.warn(chalk.yellow(`โš ๏ธ Could not parse flutterjs.config.js, using defaults\n`)); - return getDefaultConfig(); - } catch (error) { - console.warn(chalk.yellow(`โš ๏ธ Config loading error: ${error.message}, using defaults\n`)); - return getDefaultConfig(); - } -} - -/** - * Get default configuration - */ -function getDefaultConfig() { - return { - project: { - name: 'flutter-js-app', - version: '1.0.0', - }, - entry: { - main: 'lib/main.fjs', - rootWidget: 'MyApp', - }, - build: { - output: 'dist', - source: 'lib', - publicPath: '/', - }, - dev: { - server: { - port: 3000, - host: 'localhost', - https: false, - }, - hmr: { - enabled: true, - interval: 300, - }, - }, - render: { - mode: 'csr', - target: 'web', - }, - }; -} - -// ============================================================================ -// BUILD COMMAND -// ============================================================================ - -/** - * Build command - Production build with optional analysis - */ -export async function build(options, projectContext) { - const spinner = ora('Building for production...').start(); - - try { - // Validate configuration - spinner.text = 'Validating configuration...'; - const config = loadConfig(projectContext); - - // Resolve entry file path - const entryFile = config.entry?.main || 'lib/main.fjs'; - const entryPath = path.resolve(projectContext.projectRoot, entryFile); - - if (!fs.existsSync(entryPath)) { - throw new Error(`Entry file not found: ${entryFile}\n\nExpected at: ${entryPath}`); - } - - // Create build pipeline with FULL config - const pipeline = new BuildPipeline({ - projectRoot: projectContext.projectRoot, - mode: 'production', - target: options.target || 'spa', - entryFile: entryFile, // Pass actual entry file - outputDir: options.output || 'dist', - debugMode: options.debug || false, - enableHotReload: false, - enablePerformanceMonitoring: true, - enableMemoryTracking: true, - // IMPORTANT: Pass full config - config: config, - }); - - // Run build pipeline - spinner.text = 'Analyzing & building source code...'; - const result = await pipeline.run(); - - spinner.stop(); - - // Display build results - console.log(chalk.blue('\n๐Ÿ“Š Build Results:\n')); - console.log(chalk.gray(` Output: ${options.output || 'dist'}`)); - console.log(chalk.gray(` Mode: ${options.target || 'spa'}`)); - console.log(chalk.gray(` Time: ${result.stats.totalTime.toFixed(2)}ms`)); - console.log(chalk.gray(` Widgets: ${result.analysis.widgets?.count || 0}`)); - console.log(); - - // Display file sizes - if (result.output.html) { - const htmlSize = (result.output.html.length / 1024).toFixed(2); - console.log(chalk.gray(` HTML: ${htmlSize} KB`)); - } - - if (result.output.css) { - const cssSize = (result.output.css.length / 1024).toFixed(2); - console.log(chalk.gray(` CSS: ${cssSize} KB`)); - } - - if (result.output.js) { - const jsSize = (result.output.js.length / 1024).toFixed(2); - console.log(chalk.gray(` JavaScript: ${jsSize} KB`)); - } - - console.log(); - - // Analyze bundle if requested - if (options.analyze) { - console.log(chalk.cyan('Analyzing bundle...\n')); - console.log(chalk.gray('(Bundle analysis available via "flutterjs analyze")\n')); - } - - // Cleanup pipeline - pipeline.dispose(); - - console.log(chalk.green('โœ… Build successful!\n')); - - return { - success: true, - outputPath: path.join(projectContext.projectRoot, options.output || 'dist'), - buildTime: result.stats.totalTime, - analysisResults: result.analysis, - }; - - } catch (error) { - spinner.fail(chalk.red('โŒ Build failed')); - console.error(chalk.red(`\nError: ${error.message}`)); - if (options.debug) { - console.error(chalk.gray(error.stack)); - } - process.exit(1); - } -} - -// ============================================================================ -// DEV COMMAND -// ============================================================================ - -/** - * Dev command - Development server with HMR - */ -export async function dev(options, projectContext) { - const spinner = ora('Setting up development environment...').start(); - - try { - // Load configuration - spinner.text = 'Loading project configuration...'; - const config = loadConfig(projectContext); - - // Resolve entry file path - const entryFile = config.entry?.main || 'lib/main.fjs'; - const entryPath = path.resolve(projectContext.projectRoot, entryFile); - - if (!fs.existsSync(entryPath)) { - throw new Error(`Entry file not found: ${entryFile}`); - } - - // Create build pipeline (for initial build) - const pipeline = new BuildPipeline({ - projectRoot: projectContext.projectRoot, - mode: 'development', - target: 'spa', - entryFile: entryFile, // โœ… Pass .fjs file - outputDir: '.dev', - debugMode: options.debug || false, - enableHotReload: true, - enablePerformanceMonitoring: true, - enableMemoryTracking: options.debug || false, - }); - - // Run initial build - spinner.text = 'Running initial build...'; - const buildResult = await pipeline.run(); - - // โœ… Copy app.js to .dev/ - const appJsSource = path.join( - path.dirname(import.meta.url).replace('file://', ''), - '../app.js' - ); - const appJsDest = path.join(projectContext.projectRoot, '.dev', 'app.js'); - - if (fs.existsSync(appJsSource)) { - fs.copyFileSync(appJsSource, appJsDest); - } - - // Create development server - const devServer = new DevServer(config, projectContext); - - spinner.stop(); - - // Start dev server - await devServer.start(); - - // Setup file watching for rebuilds - setupDevWatch(devServer, pipeline, projectContext, config); - - // Handle graceful shutdown - setupGracefulShutdown(devServer, pipeline); - - } catch (error) { - spinner.fail(chalk.red('โœ— Dev server failed')); - console.error(chalk.red(`\nError: ${error.message}`)); - if (options.debug) { - console.error(chalk.gray(error.stack)); - } - process.exit(1); - } -} - -// ============================================================================ -// RUN COMMAND -// ============================================================================ - -/** - * Run command - All-in-one: build + dev server - */ -export async function run(options, projectContext) { - const spinner = ora('Starting FlutterJS runtime...').start(); - - try { - // ===== CRITICAL: AWAIT the config loading ===== - spinner.text = 'Loading configuration...'; - const config = await loadConfig(projectContext); // โ† ADD await HERE! - - console.log('checking' + config?.entry?.main); - - if (!config?.entry?.main) { - throw new Error('No entry.main in config. Check flutterjs.config.js'); - } - - const entryFile = config.entry.main; - const entryPath = path.resolve(projectContext.projectRoot, entryFile); - - if (!fs.existsSync(entryPath)) { - throw new Error(`Entry file not found: ${entryPath}`); - } - - // ===== Create pipeline with FULL config ===== - const pipeline = new BuildPipeline({ - projectRoot: projectContext.projectRoot, - mode: 'development', - target: options.target || 'spa', - outputDir: options.output || 'dist', - debugMode: options.debug || false, - ...config // โ† Pass full config - }); - - // Run build - spinner.text = 'Building application...'; - const buildResult = await pipeline.run(); - - spinner.stop(); - - // Display build info - console.log(chalk.blue('\n๐Ÿ“Š Build Complete:\n')); - console.log(chalk.gray(` Widgets: ${buildResult.analysis.widgets?.count || 0}`)); - console.log(chalk.gray(` Build time: ${buildResult.duration}ms`)); - console.log(); - - // Start server if not production-only - if (options.serve !== false) { - const port = parseInt(options.port || 3000, 10); - const host = 'localhost'; - - console.log(chalk.cyan('Starting development server...\n')); - - const devServer = new DevServer( - { - ...config, - dev: { - ...config.dev, - server: { - port, - host, - https: false, - }, - }, - }, - projectContext - ); - - await devServer.start(); - setupGracefulShutdown(devServer, pipeline); - } else { - pipeline.dispose(); - } - - } catch (error) { - spinner.fail(chalk.red('โŒ Run failed')); - console.error(chalk.red(`\nError: ${error.message}`)); - if (options.debug) { - console.error(chalk.gray('\nStack:'), error.stack); - } - process.exit(1); - } -} -// ============================================================================ -// CLEAN COMMAND -// ============================================================================ - -/** - * Clean command - Remove build artifacts - */ -export async function clean(options, projectContext) { - const spinner = ora('Cleaning build artifacts...').start(); - - try { - const paths = [ - path.join(projectContext.projectRoot, 'dist'), - path.join(projectContext.projectRoot, '.dev'), - path.join(projectContext.projectRoot, '.flutterjs'), - ]; - - if (options.all) { - paths.push(path.join(projectContext.projectRoot, 'node_modules')); - } - - for (const dir of paths) { - if (fs.existsSync(dir)) { - spinner.text = `Removing ${path.relative(projectContext.projectRoot, dir)}...`; - fs.rmSync(dir, { recursive: true, force: true }); - } - } - - spinner.succeed(chalk.green('โœ… Clean complete\n')); - - } catch (error) { - spinner.fail(chalk.red('โŒ Clean failed')); - console.error(chalk.red(`\nError: ${error.message}`)); - process.exit(1); - } -} - -// ============================================================================ -// PREVIEW COMMAND -// ============================================================================ - -/** - * Preview command - Serve production build - */ -export async function preview(options, projectContext) { - const spinner = ora('Starting preview server...').start(); - - try { - const buildDir = options.output || 'dist'; - const buildPath = path.join(projectContext.projectRoot, buildDir); - - // Check if build exists - if (!fs.existsSync(buildPath)) { - throw new Error(`Build not found at ${buildDir}\n\nRun "flutterjs build" first.`); - } - - spinner.text = 'Setting up preview server...'; - - const port = parseInt(options.port || 4173, 10); - - const server = http.createServer((req, res) => { - let filePath = path.join(buildPath, req.url === '/' ? 'index.html' : req.url); - - if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) { - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(fs.readFileSync(filePath)); - } else { - // SPA fallback - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.end(fs.readFileSync(path.join(buildPath, 'index.html'))); - } - }); - - server.listen(port, () => { - spinner.stop(); - console.log(chalk.green('\nโœ… Preview server running!\n')); - console.log(chalk.blue(`๐ŸŒ Open: http://localhost:${port}\n`)); - - // Open browser if requested - if (options.open) { - setTimeout(() => { - open(`http://localhost:${port}`).catch(() => { }); - }, 500); - } - }); - - process.on('SIGINT', () => { - console.log(chalk.yellow('\n\n๐Ÿ‘‹ Shutting down preview server...')); - server.close(() => { - console.log(chalk.green('โœ… Server stopped\n')); - process.exit(0); - }); - }); - - } catch (error) { - spinner.fail(chalk.red('โŒ Preview failed')); - console.error(chalk.red(`\nError: ${error.message}`)); - process.exit(1); - } -} - -// ============================================================================ -// ANALYZE COMMAND -// ============================================================================ - -/** - * Analyze command - Code analysis and reports - */ -export async function analyze(options, projectContext) { - const spinner = ora('Running code analysis...').start(); - - try { - const config = loadConfig(projectContext); - - // Resolve entry file path - const entryFile = config.entry?.main || 'lib/main.fjs'; - const entryPath = path.resolve(projectContext.projectRoot, entryFile); - - if (!fs.existsSync(entryPath)) { - throw new Error(`Entry file not found: ${entryFile}`); - } - - // Create pipeline with analysis - const pipeline = new BuildPipeline({ - projectRoot: projectContext.projectRoot, - mode: 'development', - target: 'spa', - entryFile: entryFile, - outputDir: '.analysis', - debugMode: true, - }); - - spinner.text = 'Analyzing source code...'; - const result = await pipeline.run(); - - spinner.stop(); - - // Display analysis results - console.log(chalk.blue('\n๐Ÿ“Š Code Analysis Results:\n')); - - // Widgets - if (result.analysis.widgets) { - console.log(chalk.cyan('Widgets:')); - console.log(chalk.gray(` Total: ${result.analysis.widgets.count}`)); - console.log(chalk.gray(` Stateless: ${result.analysis.widgets.stateless || 0}`)); - console.log(chalk.gray(` Stateful: ${result.analysis.widgets.stateful || 0}`)); - console.log(); - } - - // Save report if requested - if (options.output) { - const reportPath = path.join(projectContext.projectRoot, options.output); - fs.writeFileSync(reportPath, JSON.stringify(result.analysis, null, 2)); - console.log(chalk.gray(`Report saved to: ${options.output}\n`)); - } - - console.log(chalk.green('โœ… Analysis complete\n')); - - pipeline.dispose(); - - } catch (error) { - spinner.fail(chalk.red('โŒ Analysis failed')); - console.error(chalk.red(`\nError: ${error.message}`)); - process.exit(1); - } -} - -// ============================================================================ -// DOCTOR COMMAND -// ============================================================================ - -/** - * Doctor command - Environment diagnostics - */ -export async function doctor(options, projectContext) { - console.log(chalk.blue('\n๐Ÿฅ FlutterJS Doctor\n')); - - try { - const checks = []; - - // 1. Node.js version - const nodeVersion = process.version; - const nodeOk = semverGte(nodeVersion, '18.0.0'); - checks.push({ - name: 'Node.js', - version: nodeVersion, - status: nodeOk, - message: nodeOk ? 'Compatible' : 'Node.js 18+ required', - }); - - // 2. npm/yarn/pnpm - const packageManagers = checkPackageManagers(); - checks.push({ - name: 'Package Manager', - version: packageManagers.active || 'Not found', - status: !!packageManagers.active, - message: packageManagers.active ? `Using ${packageManagers.active}` : 'Install npm, yarn, or pnpm', - }); - - // 3. Git - const gitOk = isCommandAvailable('git'); - checks.push({ - name: 'Git', - version: gitOk ? 'Installed' : 'Not found', - status: gitOk, - message: gitOk ? 'Ready' : 'Optional - Install Git', - }); - - // 4. FlutterJS config - const configExists = fs.existsSync( - path.join(projectContext.projectRoot, 'flutterjs.config.js') - ); - checks.push({ - name: 'FlutterJS Config', - version: configExists ? 'Found' : 'Not found', - status: configExists, - message: configExists ? 'Valid' : 'Run "flutterjs init" or create flutterjs.config.js', - }); - - // 5. Build artifacts - const distExists = fs.existsSync(path.join(projectContext.projectRoot, 'dist')); - checks.push({ - name: 'Build Artifacts', - version: distExists ? 'Present' : 'None', - status: distExists, - message: distExists ? 'Ready' : 'Run "flutterjs build"', - }); - - // Display results - console.log(chalk.cyan('Checks:\n')); - - checks.forEach((check) => { - const icon = check.status ? chalk.green('โœ“') : chalk.red('โœ—'); - console.log(`${icon} ${chalk.gray(check.name.padEnd(20))} ${check.message}`); - }); - - console.log(); - - const allOk = checks.every((c) => c.status); - - if (allOk) { - console.log(chalk.green('โœ… All checks passed!\n')); - } else { - console.log(chalk.yellow('โš ๏ธ Some checks failed\n')); - } - - } catch (error) { - console.error(chalk.red(`\nError: ${error.message}`)); - process.exit(1); - } -} - -// ============================================================================ -// INIT COMMAND -// ============================================================================ - -/** - * Init command - Create new project - */ -export async function init(projectName, options) { - try { - await initProject(projectName, options); - console.log(chalk.green(`\nโœ… Project created!\n`)); - } catch (error) { - console.error(chalk.red(`\nโŒ Project creation failed\n`)); - console.error(chalk.red(`Error: ${error.message}`)); - process.exit(1); - } -} - -/** - * Setup file watching for development - */ -function setupDevWatch(devServer, pipeline, projectContext, config) { - if (!chokidar) { - console.warn(chalk.yellow('โš ๏ธ chokidar not available, file watching disabled')); - return; - } - - const watcher = chokidar.watch( - [ - path.join(projectContext.projectRoot, config.build?.source || 'lib'), - path.join(projectContext.projectRoot, 'public'), - path.join(projectContext.projectRoot, 'flutterjs.config.js'), - ], - { - ignoreInitial: true, - ignored: /node_modules|dist|\.dev/, - awaitWriteFinish: { - stabilityThreshold: 200, - pollInterval: 100, - }, - } - ); - - watcher.on('change', async (filePath) => { - console.log(chalk.cyan(`\n[CHANGE] ${path.relative(projectContext.projectRoot, filePath)}`)); - - // Trigger rebuild - try { - const result = await pipeline.run(); - devServer.updateBuildAnalysis(result.analysis); - console.log(chalk.green('โœ… Rebuild complete\n')); - } catch (error) { - devServer.reportBuildError(error); - console.error(chalk.red(`Build error: ${error.message}\n`)); - } - }); - - // Cleanup watcher on shutdown - process.on('SIGINT', () => { - watcher.close(); - }); -} - -/** - * Setup graceful shutdown - */ -function setupGracefulShutdown(devServer, pipeline) { - const shutdown = async () => { - await devServer.stop(); - pipeline.dispose(); - process.exit(0); - }; - - process.on('SIGINT', shutdown); - process.on('SIGTERM', shutdown); -} - -/** - * Check if command is available - */ -function isCommandAvailable(cmd) { - try { - execSync(`which ${cmd}`, { stdio: 'ignore' }); - return true; - } catch { - return false; - } -} - -/** - * Check installed package managers - */ -function checkPackageManagers() { - const managers = { npm: false, yarn: false, pnpm: false, active: null }; - - try { - execSync('npm --version', { stdio: 'ignore' }); - managers.npm = true; - if (!managers.active) managers.active = 'npm'; - } catch { } - - try { - execSync('yarn --version', { stdio: 'ignore' }); - managers.yarn = true; - if (!managers.active) managers.active = 'yarn'; - } catch { } - - try { - execSync('pnpm --version', { stdio: 'ignore' }); - managers.pnpm = true; - managers.active = 'pnpm'; - } catch { } - - return managers; -} - -/** - * Simple semver comparison - */ -function semverGte(version, target) { - const parse = (v) => - v.replace(/^v/, '').split('.').map((x) => parseInt(x, 10)); - const [maj1, min1, pat1] = parse(version); - const [maj2, min2, pat2] = parse(target); - - if (maj1 !== maj2) return maj1 > maj2; - if (min1 !== min2) return min1 > min2; - return pat1 >= pat2; -} - -// ============================================================================ -// EXPORTS -// ============================================================================ - -export default { - build, - dev, - run, - clean, - preview, - analyze, - doctor, - init, -}; \ No newline at end of file diff --git a/packages/flutterjs_engine/bin/index.js b/packages/flutterjs_engine/bin/index.js index 77a08faa..22d5aa68 100644 --- a/packages/flutterjs_engine/bin/index.js +++ b/packages/flutterjs_engine/bin/index.js @@ -26,7 +26,7 @@ import { preview, analyze, doctor, -} from './commands/index.js'; +} from '../src/index.js'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); diff --git a/packages/flutterjs_engine/flutterjs.imports.json b/packages/flutterjs_engine/flutterjs.imports.json index 1da2d9b3..47f2aea6 100644 --- a/packages/flutterjs_engine/flutterjs.imports.json +++ b/packages/flutterjs_engine/flutterjs.imports.json @@ -1,6 +1,12 @@ { "imports": { "@flutterjs/material": "./package/material/src/index.js", - "@flutterjs/runtime": "./src/runtime/src/flutterjs_runtime.js" + "@flutterjs/runtime": "./src/runtime/src/flutterjs_runtime.js", + "@flutterjs/dart/math": "../flutterjs_dart/src/math/index.js", + "@flutterjs/dart/async": "../flutterjs_dart/src/async/index.js", + "@flutterjs/dart/convert": "../flutterjs_dart/src/convert/index.js", + "@flutterjs/dart/developer": "../flutterjs_dart/src/developer/index.js", + "@flutterjs/dart/collection": "../flutterjs_dart/src/collection/index.js", + "@flutterjs/dart/typed_data": "../flutterjs_dart/src/typed_data/index.js" } } \ No newline at end of file diff --git a/packages/flutterjs_engine/package-lock.json b/packages/flutterjs_engine/package-lock.json index 5aba2480..fbcb46aa 100644 --- a/packages/flutterjs_engine/package-lock.json +++ b/packages/flutterjs_engine/package-lock.json @@ -9,10 +9,10 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@flutterjs/analyzer": "file:./src/analyzer", - "@flutterjs/material": "file:./package/material", - "@flutterjs/runtime": "file:./src/runtime", - "@flutterjs/vdom": "file:./src/vdom", + "@flutterjs/analyzer": "file:../flutterjs_analyzer/flutterjs_analyzer", + "@flutterjs/material": "file:../flutterjs_material/flutterjs_material", + "@flutterjs/runtime": "file:../flutterjs_runtime/flutterjs_runtime", + "@flutterjs/vdom": "file:../flutterjs_vdom/flutterjs_vdom", "chalk": "^5.6.2", "chokidar": "^5.0.0", "commander": "^14.0.2", @@ -32,9 +32,67 @@ "node": ">=14.0.0" } }, - "../../package/material": {}, - "../../src/runtime": {}, - "../vdom": {}, + "../../package/material": { + "extraneous": true + }, + "../../src/runtime": { + "extraneous": true + }, + "../flutterjs_analyzer/flutterjs_analyzer": { + "name": "@flutterjs/analyzer", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@flutterjs/material": "file:../../flutterjs_material/flutterjs_material", + "@flutterjs/runtime": "file:../../flutterjs_runtime/flutterjs_runtime", + "@flutterjs/vdom": "file:../../flutterjs_vdom/flutterjs_vdom" + }, + "devDependencies": { + "esbuild": "^0.27.2", + "jest": "^29.7.0" + } + }, + "../flutterjs_material/flutterjs_material": { + "name": "@flutterjs/material", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@flutterjs/runtime": "file:../../flutterjs_runtime/flutterjs_runtime", + "@flutterjs/vdom": "file:../../flutterjs_vdom/flutterjs_vdom" + }, + "devDependencies": { + "esbuild": "^0.18.0" + } + }, + "../flutterjs_runtime/flutterjs_runtime": { + "name": "@flutterjs/runtime", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@flutterjs/vdom": "file:../../flutterjs_vdom/flutterjs_vdom", + "jest": "^29.7.0", + "jsdom": "^22.1.0" + }, + "devDependencies": { + "esbuild": "^0.27.2" + } + }, + "../flutterjs_vdom/flutterjs_vdom": { + "name": "@flutterjs/vdom", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@flutterjs/runtime": "file:../../flutterjs_runtime/flutterjs_runtime", + "jest": "^29.7.0", + "jsdom": "^22.1.0" + }, + "devDependencies": { + "esbuild": "^0.27.2" + } + }, + "../vdom": { + "extraneous": true + }, "file./src/vdom": { "extraneous": true }, @@ -499,641 +557,199 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "license": "MIT" }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "node_modules/@flutterjs/analyzer": { + "resolved": "../flutterjs_analyzer/flutterjs_analyzer", + "link": true + }, + "node_modules/@flutterjs/material": { + "resolved": "../flutterjs_material/flutterjs_material", + "link": true + }, + "node_modules/@flutterjs/runtime": { + "resolved": "../flutterjs_runtime/flutterjs_runtime", + "link": true + }, + "node_modules/@flutterjs/vdom": { + "resolved": "../flutterjs_vdom/flutterjs_vdom", + "link": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@flutterjs/analyzer": { - "resolved": "src/analyzer", - "link": true - }, - "node_modules/@flutterjs/material": { - "resolved": "package/material", - "link": true - }, - "node_modules/@flutterjs/runtime": { - "resolved": "src/runtime", - "link": true - }, - "node_modules/@flutterjs/vdom": { - "resolved": "src/vdom", - "link": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { @@ -1484,15 +1100,6 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1606,36 +1213,17 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "license": "BSD-3-Clause" - }, "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "debug": "4" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 0.6" } }, "node_modules/ansi-escapes": { @@ -1696,12 +1284,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -2175,18 +1757,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", @@ -2381,32 +1951,6 @@ "node": ">= 8" } }, - "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "license": "MIT", - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2424,12 +1968,6 @@ } } }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "license": "MIT" - }, "node_modules/dedent": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", @@ -2493,15 +2031,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2529,19 +2058,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2595,18 +2111,6 @@ "node": ">= 0.8" } }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -2646,63 +2150,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2926,43 +2373,6 @@ } } }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3158,21 +2568,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -3185,18 +2580,6 @@ "node": ">= 0.4" } }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3237,20 +2620,6 @@ "node": ">=8.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-proxy-middleware": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", @@ -3268,19 +2637,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -3495,12 +2851,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "license": "MIT" - }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -4650,48 +4000,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", - "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -4980,12 +4288,6 @@ "node": ">=8" } }, - "node_modules/nwsapi": { - "version": "2.2.23", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", - "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", - "license": "MIT" - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5207,18 +4509,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -5362,27 +4652,6 @@ "node": ">= 0.10" } }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -5414,12 +4683,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -5587,12 +4850,6 @@ "node": ">= 18" } }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "license": "MIT" - }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -5631,18 +4888,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -5968,12 +5213,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "license": "MIT" - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -6015,33 +5254,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -6083,15 +5295,6 @@ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "license": "MIT" }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -6131,113 +5334,36 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "license": "MIT", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "license": "ISC", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.12.0" } }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "license": "MIT", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=14" + "makeerror": "1.0.12" } }, "node_modules/which": { @@ -6343,21 +5469,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "license": "MIT" - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -6426,7 +5537,8 @@ }, "package/material": { "name": "@flutterjs/material", - "version": "1.0.0", + "version": "1.0.1", + "extraneous": true, "license": "MIT", "dependencies": { "@flutterjs/runtime": "file:../../src/runtime", @@ -6436,421 +5548,10 @@ "esbuild": "^0.18.0" } }, - "package/material/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "package/material/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, "src/analyzer": { "name": "@flutterjs/analyzer", "version": "1.0.0", + "extraneous": true, "license": "MIT", "dependencies": { "@flutterjs/material": "file:../../../../package/material", @@ -6862,21 +5563,10 @@ "jest": "^29.7.0" } }, - "src/analyzer/node_modules/@flutterjs/material": { - "resolved": "../../package/material", - "link": true - }, - "src/analyzer/node_modules/@flutterjs/runtime": { - "resolved": "../../src/runtime", - "link": true - }, - "src/analyzer/node_modules/@flutterjs/vdom": { - "resolved": "../vdom", - "link": true - }, "src/runtime": { "name": "@flutterjs/runtime", "version": "1.0.0", + "extraneous": true, "license": "ISC", "dependencies": { "@flutterjs/vdom": "file:../vdom", @@ -6890,6 +5580,7 @@ "src/vdom": { "name": "@flutterjs/vdom", "version": "1.0.0", + "extraneous": true, "dependencies": { "@flutterjs/runtime": "file:../runtime", "jest": "^29.7.0", diff --git a/packages/flutterjs_engine/package.json b/packages/flutterjs_engine/package.json index c83c56f8..c89a34be 100644 --- a/packages/flutterjs_engine/package.json +++ b/packages/flutterjs_engine/package.json @@ -31,10 +31,10 @@ "compression": "^1.8.1", "cors": "^2.8.5", "commander": "^14.0.2", - "@flutterjs/analyzer": "file:./src/analyzer", - "@flutterjs/runtime": "file:./src/runtime", - "@flutterjs/vdom": "file:./src/vdom", - "@flutterjs/material": "file:./package/material" + "@flutterjs/analyzer": "file:../flutterjs_analyzer/flutterjs_analyzer", + "@flutterjs/runtime": "file:../flutterjs_runtime/flutterjs_runtime", + "@flutterjs/vdom": "file:../flutterjs_vdom/flutterjs_vdom", + "@flutterjs/material": "file:../flutterjs_material/flutterjs_material" }, "keywords": [ "flutter", diff --git a/packages/flutterjs_engine/package/material/README.md b/packages/flutterjs_engine/package/material/README.md deleted file mode 100644 index 3ff10da2..00000000 --- a/packages/flutterjs_engine/package/material/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# @flutterjs/material - -The Material Design implementation for FlutterJS. - -## Documentation - -- **[Documentation Index](docs/README.md)** -- **[Component Guide](docs/component-guide.md)** -- **[Widget Status](docs/status.md)** - -## Usage - -```javascript -import { MaterialApp, Scaffold, AppBar, Text, Center } from '@flutterjs/material'; - -function MyApp() { - return MaterialApp({ - title: 'My App', - home: Scaffold({ - appBar: AppBar({ title: Text('Hello World') }), - body: Center({ child: Text('Welcome!') }) - }) - }); -} -``` diff --git a/packages/flutterjs_engine/package/material/build.js b/packages/flutterjs_engine/package/material/build.js deleted file mode 100644 index 55d0f1c3..00000000 --- a/packages/flutterjs_engine/package/material/build.js +++ /dev/null @@ -1,142 +0,0 @@ -import esbuild from 'esbuild'; -import { readFileSync, writeFileSync, readdirSync, statSync, watch } from 'fs'; -import { join, relative, extname } from 'path'; - -const srcDir = 'src'; -const outDir = 'dist'; - -/** - * โœ… Recursively find ALL .js files in src/ - */ -function getAllJsFiles(dir) { - const files = []; - const items = readdirSync(dir); - - for (const item of items) { - const fullPath = join(dir, item); - const stat = statSync(fullPath); - - if (stat.isDirectory()) { - files.push(...getAllJsFiles(fullPath)); - } else if (extname(item) === '.js') { - files.push(fullPath); - } - } - - return files; -} - -/** - * Build each .js file separately - */ -async function buildAllFiles() { - try { - console.log('๐Ÿš€ Building @flutterjs/material...\n'); - - // โœ… Find all .js files - const allFiles = getAllJsFiles(srcDir); - - console.log(`๐Ÿ“ Found ${allFiles.length} files\n`); - - // โœ… Build each file separately - for (const srcFile of allFiles) { - const relativePath = relative(srcDir, srcFile); - const outFile = join(outDir, relativePath); - - console.log(`๐Ÿ“ฆ ${relativePath}`); - - await esbuild.build({ - entryPoints: [srcFile], - outfile: outFile, - bundle: false, - minify: true, - platform: 'browser', - target: ['es2020'], - format: 'esm', - sourcemap: true, - }); - } - - console.log(); - - // โœ… Generate exports based on all built files - generateExports(allFiles); - - console.log('โœ… Build successful!\n'); - - } catch (error) { - console.error('โŒ Build failed:', error.message); - } -} - -/** - * Auto-generate package.json exports in the exact format requested - * "./core/widget_element.js" โ†’ "./dist/core/widget_element.js" - */ -function generateExports(sourceFiles) { - const packageJsonPath = './package.json'; - const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')); - - const exports = {}; - - // Main entry point - exports['.'] = './dist/index.js'; - - // โœ… Create export for EVERY built file with exact format - for (const srcFile of sourceFiles) { - const relativePath = relative(srcDir, srcFile); - - // Skip index.js - it's already the main entry - if (relativePath === 'index.js') { - continue; - } - - // Convert path with .js extension: - // core.js โ†’ ./core.js - // core/widget_element.js โ†’ ./core/widget_element.js - // material.js โ†’ ./material.js - // widgets/compoment/multi_child_view.js โ†’ ./widgets/compoment/multi_child_view.js - - // Normalize slashes for Windows - const normalizedPath = relativePath.replace(/\\/g, '/'); - const exportKey = './' + normalizedPath.replaceAll(".js", ""); - const exportPath = './dist/' + normalizedPath; - - exports[exportKey] = exportPath; - } - - // Update package.json - packageJson.exports = exports; - packageJson.main = './dist/index.js'; - - writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n'); - - console.log('๐Ÿ“ Generated exports:\n'); - Object.entries(exports).forEach(([key, value]) => { - console.log(` "${key}": "${value}"`); - }); - console.log(); -} - -/** - * Watch mode - rebuild on file changes - */ -function watchMode() { - console.log('๐Ÿ‘€ Watching for changes...\n'); - - watch(srcDir, { recursive: true }, (eventType, filename) => { - if (extname(filename) === '.js') { - console.log(`\nโšก ${filename} changed\n`); - buildAllFiles(); - } - }); -} - -// โœ… Check for --watch flag -const isWatchMode = process.argv.includes('--watch'); - -if (isWatchMode) { - buildAllFiles().then(() => watchMode()); -} else { - buildAllFiles(); -} \ No newline at end of file diff --git a/packages/flutterjs_engine/package/material/dist/core/core.js b/packages/flutterjs_engine/package/material/dist/core/core.js deleted file mode 100644 index b1c6d1cc..00000000 --- a/packages/flutterjs_engine/package/material/dist/core/core.js +++ /dev/null @@ -1,2 +0,0 @@ -import{State as l,Widget as a,StatelessWidget as i,StatelessElement as o,StatefulWidget as r,StatefulElement as g,ProxyWidget as y,ProxyElement as d,ErrorWidget as s,Key as S,ValueKey as W,ObjectKey as m,GlobalKey as n,Diagnosticable as E}from"./widget_element.js";export{E as Diagnosticable,s as ErrorWidget,n as GlobalKey,S as Key,m as ObjectKey,d as ProxyElement,y as ProxyWidget,l as State,g as StatefulElement,r as StatefulWidget,o as StatelessElement,i as StatelessWidget,W as ValueKey,a as Widget}; -//# sourceMappingURL=core.js.map diff --git a/packages/flutterjs_engine/package/material/dist/core/core.js.map b/packages/flutterjs_engine/package/material/dist/core/core.js.map deleted file mode 100644 index a8382b1e..00000000 --- a/packages/flutterjs_engine/package/material/dist/core/core.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/core/core.js"], - "sourcesContent": ["// src/core/index.js\r\n// Core widget and element classes\r\n\r\nexport {\r\n State,\r\n Widget,\r\n StatelessWidget,\r\n StatelessElement,\r\n StatefulWidget,\r\n StatefulElement,\r\n ProxyWidget,\r\n ProxyElement,\r\n ErrorWidget,\r\n Key,\r\n ValueKey,\r\n ObjectKey,\r\n GlobalKey,\r\n Diagnosticable\r\n} from \"./widget_element.js\";"], - "mappings": "AAGA,OACI,SAAAA,EACA,UAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,kBAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,OAAAC,EACA,YAAAC,EACA,aAAAC,EACA,aAAAC,EACA,kBAAAC,MACG", - "names": ["State", "Widget", "StatelessWidget", "StatelessElement", "StatefulWidget", "StatefulElement", "ProxyWidget", "ProxyElement", "ErrorWidget", "Key", "ValueKey", "ObjectKey", "GlobalKey", "Diagnosticable"] -} diff --git a/packages/flutterjs_engine/package/material/dist/core/widget_element.js b/packages/flutterjs_engine/package/material/dist/core/widget_element.js deleted file mode 100644 index 4d7ec4cf..00000000 --- a/packages/flutterjs_engine/package/material/dist/core/widget_element.js +++ /dev/null @@ -1,2 +0,0 @@ -import{Diagnosticable as s,Element as g,StatelessElement as c,StatefulElement as d}from"@flutterjs/runtime/element";import{VNode as p}from"@flutterjs/vdom/vnode";class S extends s{constructor(){super(),this._element=null,this._widget=null,this._mounted=!1,this._building=!1,this._didInitState=!1,this._didMount=!1,this._isActive=!1,this._buildCount=0}get widget(){return this._widget}get context(){return this._element?.context||null}get mounted(){return this._mounted}initState(){}didUpdateWidget(t){}didChangeDependencies(){}didMount(){}dispose(){}activate(){}deactivate(){}build(t){throw new Error(`${this.constructor.name}.build(context) must be implemented`)}setState(t){if(!this.mounted){console.warn("[State] setState called on unmounted state");return}if(this._building&&console.warn("[State] setState called during build"),typeof t=="function")try{t.call(this)}catch(e){throw console.error("[State] setState update function failed:",e),e}else typeof t=="object"&&t!==null&&Object.assign(this,t);this._element&&typeof this._element.markNeedsBuild=="function"&&this._element.markNeedsBuild()}_init(){if(!this._didInitState){this._didInitState=!0,this._mounted=!0,this._isActive=!0;try{console.log(`[State] Calling initState for ${this.constructor.name}`),this.initState()}catch(t){throw console.error("[State] initState failed:",t),t}}}_didChangeDependencies(){try{this.didChangeDependencies()}catch(t){console.error("[State] didChangeDependencies failed:",t)}}_didMount(){if(!this._didMount){this._didMount=!0;try{console.log(`[State] Calling didMount for ${this.constructor.name}`),this.didMount()}catch(t){console.error("[State] didMount failed:",t)}}}_dispose(){this._mounted=!1,this._isActive=!1;try{console.log(`[State] Calling dispose for ${this.constructor.name}`),this.dispose()}catch(t){console.error("[State] dispose failed:",t)}}_deactivate(){if(this._isActive){this._isActive=!1;try{this.deactivate()}catch(t){console.error("[State] deactivate failed:",t)}}}_reactivate(){if(!this._isActive){this._isActive=!0;try{this.activate()}catch(t){console.error("[State] activate failed:",t)}}}toStringShort(){return`${this.constructor.name}`}}class r extends s{constructor(t=null){if(super(),new.target===r)throw new Error("Widget is abstract and cannot be instantiated");this.key=t}createElement(t,e){throw new Error(`${this.constructor.name}.createElement() must be implemented`)}toStringShort(){return`${this.constructor.name}${this.key?`(key: ${this.key})`:"(unkeyed)"}`}debugFillProperties(t){super.debugFillProperties(t)}}class h extends r{constructor(t=null){super(t)}build(t){throw new Error(`${this.constructor.name}.build(context) must be implemented`)}createElement(t,e){return new c(this,t,e)}}class b extends r{constructor(t=null){super(t)}createState(){throw new Error(`${this.constructor.name}.createState() must be implemented`)}createElement(t,e){return new d(this,t,e)}}class o extends r{constructor({key:t=null,child:e=null}={}){if(super(t),new.target===o)throw new Error("ProxyWidget is abstract");this.child=e}createElement(t,e){return new m(this,t,e)}}class m extends g{constructor(t,e=null,f=null){super(t,e,f)}performRebuild(){if(!this.widget.child)return null;try{const t=this.widget.child.createElement(this,this.runtime);return t&&typeof t.mount=="function"&&t.mount(this),t&&t._vnode?t._vnode:t&&typeof t.performRebuild=="function"?t.performRebuild():null}catch(t){throw console.error("[ProxyElement] performRebuild failed:",t),t}}}class w extends h{constructor({message:t="Error",error:e=null}={}){super(),this.message=t,this.error=e}build(t){return new p({tag:"div",props:{style:{backgroundColor:"#ff1744",color:"white",padding:"16px",borderRadius:"4px",fontFamily:"monospace",fontSize:"12px",whiteSpace:"pre-wrap",wordBreak:"break-word"}},children:[this.message]})}}class i{constructor(){if(new.target===i)throw new Error("Key is abstract")}}class l extends i{constructor(t){super(),this.value=t}equals(t){return t instanceof l&&this.value===t.value}toString(){return`ValueKey(${this.value})`}}class a extends i{constructor(t){super(),this.value=t}equals(t){return t instanceof a&&this.value===t.value}toString(){return`ObjectKey(${this.value})`}}class u extends i{constructor(t=null){super(),this.debugLabel=t,this._currentElement=null}get currentContext(){return this._currentElement?.context||null}get currentWidget(){return this._currentElement?.widget||null}get currentState(){return this._currentElement?.state||null}equals(t){return t instanceof u&&this===t}toString(){return`GlobalKey${this.debugLabel?`(${this.debugLabel})`:""}`}}export{s as Diagnosticable,w as ErrorWidget,u as GlobalKey,i as Key,a as ObjectKey,m as ProxyElement,o as ProxyWidget,S as State,d as StatefulElement,b as StatefulWidget,c as StatelessElement,h as StatelessWidget,l as ValueKey,r as Widget}; -//# sourceMappingURL=widget_element.js.map diff --git a/packages/flutterjs_engine/package/material/dist/core/widget_element.js.map b/packages/flutterjs_engine/package/material/dist/core/widget_element.js.map deleted file mode 100644 index e8922364..00000000 --- a/packages/flutterjs_engine/package/material/dist/core/widget_element.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/core/widget_element.js"], - "sourcesContent": ["/**\r\n * FIXED: Complete Stateful/Stateless Widget System\r\n * \r\n * KEY FIXES:\r\n * 1. StatefulElement properly initializes State with lifecycle\r\n * 2. State.setState() correctly marks element for rebuild\r\n * 3. Proper context passing through entire widget tree\r\n * 4. Both StatelessElement and StatefulElement work correctly\r\n */\r\n\r\nimport { Diagnosticable, Element, StatelessElement, StatefulElement } from \"@flutterjs/runtime/element\";\r\nimport { VNode } from \"@flutterjs/vdom/vnode\";\r\n\r\n// ============================================================================\r\n// STATE BASE CLASS - FIXED\r\n// ============================================================================\r\n\r\n/**\r\n * State - Mutable state holder for StatefulWidget\r\n * \r\n * \u00E2\u0153\u2026 CRITICAL: This is now properly integrated with StatefulElement\r\n */\r\nclass State extends Diagnosticable {\r\n constructor() {\r\n super();\r\n\r\n // Internal references\r\n this._element = null; // Owner StatefulElement\r\n this._widget = null; // Current widget configuration\r\n this._mounted = false; // Is state mounted?\r\n this._building = false; // Currently building?\r\n\r\n // Lifecycle tracking\r\n this._didInitState = false;\r\n this._didMount = false;\r\n this._isActive = false;\r\n\r\n // Performance tracking\r\n this._buildCount = 0;\r\n }\r\n\r\n /**\r\n * Get the widget that created this state\r\n */\r\n get widget() {\r\n return this._widget;\r\n }\r\n\r\n /**\r\n * Get the build context\r\n */\r\n get context() {\r\n return this._element?.context || null;\r\n }\r\n\r\n /**\r\n * Check if state is mounted\r\n */\r\n get mounted() {\r\n return this._mounted;\r\n }\r\n\r\n // ========== LIFECYCLE METHODS ==========\r\n\r\n /**\r\n * Called once when state is first created\r\n * Override to initialize state variables\r\n */\r\n initState() {\r\n // Override in subclass\r\n }\r\n\r\n /**\r\n * Called when widget configuration changes\r\n * @param {Widget} oldWidget - Previous widget\r\n */\r\n didUpdateWidget(oldWidget) {\r\n // Override in subclass\r\n }\r\n\r\n /**\r\n * Called when inherited dependencies change\r\n */\r\n didChangeDependencies() {\r\n // Override in subclass\r\n }\r\n\r\n /**\r\n * Called after first frame is rendered\r\n */\r\n didMount() {\r\n // Override in subclass\r\n }\r\n\r\n /**\r\n * Called when state is about to be permanently removed\r\n * Override to cleanup resources\r\n */\r\n dispose() {\r\n // Override in subclass\r\n }\r\n\r\n /**\r\n * Called when state is reactivated\r\n */\r\n activate() {\r\n // Override in subclass\r\n }\r\n\r\n /**\r\n * Called when state is deactivated\r\n */\r\n deactivate() {\r\n // Override in subclass\r\n }\r\n\r\n /**\r\n * Build the widget tree\r\n * MUST be overridden in subclass\r\n * @param {BuildContext} context - Build context\r\n * @returns {Widget|VNode} Widget tree or VNode\r\n */\r\n build(context) {\r\n throw new Error(`${this.constructor.name}.build(context) must be implemented`);\r\n }\r\n\r\n // ========== STATE MANAGEMENT ==========\r\n\r\n /**\r\n * Update state and schedule rebuild\r\n * @param {Function|Object} updateFn - Update function or object\r\n */\r\n setState(updateFn) {\r\n if (!this.mounted) {\r\n console.warn(`[State] setState called on unmounted state`);\r\n return;\r\n }\r\n\r\n if (this._building) {\r\n console.warn(`[State] setState called during build`);\r\n }\r\n\r\n // Apply update\r\n if (typeof updateFn === 'function') {\r\n try {\r\n updateFn.call(this);\r\n } catch (error) {\r\n console.error(`[State] setState update function failed:`, error);\r\n throw error;\r\n }\r\n } else if (typeof updateFn === 'object' && updateFn !== null) {\r\n Object.assign(this, updateFn);\r\n }\r\n\r\n // Trigger rebuild\r\n if (this._element && typeof this._element.markNeedsBuild === 'function') {\r\n this._element.markNeedsBuild();\r\n }\r\n }\r\n\r\n // ========== INTERNAL LIFECYCLE (called by StatefulElement) ==========\r\n\r\n /**\r\n * Internal: Initialize state\r\n * Called by StatefulElement after mount\r\n */\r\n _init() {\r\n if (this._didInitState) {\r\n return;\r\n }\r\n\r\n this._didInitState = true;\r\n this._mounted = true;\r\n this._isActive = true;\r\n\r\n try {\r\n console.log(`[State] Calling initState for ${this.constructor.name}`);\r\n this.initState();\r\n } catch (error) {\r\n console.error(`[State] initState failed:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Internal: Call didChangeDependencies\r\n */\r\n _didChangeDependencies() {\r\n try {\r\n this.didChangeDependencies();\r\n } catch (error) {\r\n console.error(`[State] didChangeDependencies failed:`, error);\r\n }\r\n }\r\n\r\n /**\r\n * Internal: Call didMount\r\n */\r\n _didMount() {\r\n if (this._didMount) {\r\n return;\r\n }\r\n\r\n this._didMount = true;\r\n\r\n try {\r\n console.log(`[State] Calling didMount for ${this.constructor.name}`);\r\n this.didMount();\r\n } catch (error) {\r\n console.error(`[State] didMount failed:`, error);\r\n }\r\n }\r\n\r\n /**\r\n * Internal: Dispose state\r\n */\r\n _dispose() {\r\n this._mounted = false;\r\n this._isActive = false;\r\n\r\n try {\r\n console.log(`[State] Calling dispose for ${this.constructor.name}`);\r\n this.dispose();\r\n } catch (error) {\r\n console.error(`[State] dispose failed:`, error);\r\n }\r\n }\r\n\r\n /**\r\n * Internal: Deactivate state\r\n */\r\n _deactivate() {\r\n if (!this._isActive) {\r\n return;\r\n }\r\n\r\n this._isActive = false;\r\n\r\n try {\r\n this.deactivate();\r\n } catch (error) {\r\n console.error(`[State] deactivate failed:`, error);\r\n }\r\n }\r\n\r\n /**\r\n * Internal: Reactivate state\r\n */\r\n _reactivate() {\r\n if (this._isActive) {\r\n return;\r\n }\r\n\r\n this._isActive = true;\r\n\r\n try {\r\n this.activate();\r\n } catch (error) {\r\n console.error(`[State] activate failed:`, error);\r\n }\r\n }\r\n\r\n toStringShort() {\r\n return `${this.constructor.name}`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// WIDGET BASE CLASS\r\n// ============================================================================\r\n\r\nclass Widget extends Diagnosticable {\r\n constructor(key = null) {\r\n super();\r\n if (new.target === Widget) {\r\n throw new Error('Widget is abstract and cannot be instantiated');\r\n }\r\n this.key = key;\r\n }\r\n\r\n /**\r\n * Create an Element for this widget\r\n * Must be implemented in subclasses\r\n */\r\n createElement(parent, runtime) {\r\n throw new Error(\r\n `${this.constructor.name}.createElement() must be implemented`\r\n );\r\n }\r\n\r\n toStringShort() {\r\n return `${this.constructor.name}${this.key ? `(key: ${this.key})` : '(unkeyed)'}`;\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// STATELESS WIDGET\r\n// ============================================================================\r\n\r\nclass StatelessWidget extends Widget {\r\n constructor(key = null) {\r\n super(key);\r\n }\r\n\r\n /**\r\n * Build the widget UI\r\n * MUST be overridden\r\n */\r\n build(context) {\r\n throw new Error(`${this.constructor.name}.build(context) must be implemented`);\r\n }\r\n\r\n /**\r\n * Create element for this widget\r\n */\r\n createElement(parent, runtime) {\r\n return new StatelessElement(this, parent, runtime);\r\n }\r\n}\r\n\r\n// StatelessElement is imported from @flutterjs/runtime\r\n\r\n// ============================================================================\r\n// STATEFUL WIDGET\r\n// ============================================================================\r\n\r\nclass StatefulWidget extends Widget {\r\n constructor(key = null) {\r\n super(key);\r\n }\r\n\r\n /**\r\n * Create the state object\r\n * MUST be overridden\r\n */\r\n createState() {\r\n throw new Error(`${this.constructor.name}.createState() must be implemented`);\r\n }\r\n\r\n /**\r\n * Create element for this widget\r\n */\r\n createElement(parent, runtime) {\r\n return new StatefulElement(this, parent, runtime);\r\n }\r\n}\r\n\r\n// StatefulElement is imported from @flutterjs/runtime\r\n\r\n// ============================================================================\r\n// PROXY WIDGET\r\n// ============================================================================\r\n\r\nclass ProxyWidget extends Widget {\r\n constructor({ key = null, child = null } = {}) {\r\n super(key);\r\n if (new.target === ProxyWidget) {\r\n throw new Error('ProxyWidget is abstract');\r\n }\r\n this.child = child;\r\n }\r\n\r\n createElement(parent, runtime) {\r\n return new ProxyElement(this, parent, runtime);\r\n }\r\n}\r\n\r\n/**\r\n * ProxyElement - Element for proxy widget\r\n */\r\nclass ProxyElement extends Element {\r\n constructor(widget, parent = null, runtime = null) {\r\n super(widget, parent, runtime);\r\n }\r\n\r\n performRebuild() {\r\n if (!this.widget.child) {\r\n return null;\r\n }\r\n\r\n try {\r\n const childElement = this.widget.child.createElement(this, this.runtime);\r\n\r\n if (childElement && typeof childElement.mount === 'function') {\r\n childElement.mount(this);\r\n }\r\n\r\n // \u2705 FIX: Reuse existing VNode if child already built during mount\r\n // ProxyElement creates a NEW element every time, and mount() triggers a build.\r\n // We must not trigger performRebuild() again or we get duplication.\r\n if (childElement && childElement._vnode) {\r\n return childElement._vnode;\r\n }\r\n\r\n if (childElement && typeof childElement.performRebuild === 'function') {\r\n return childElement.performRebuild();\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n console.error(`[ProxyElement] performRebuild failed:`, error);\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// ERROR WIDGET\r\n// ============================================================================\r\n\r\nclass ErrorWidget extends StatelessWidget {\r\n constructor({ message = 'Error', error = null } = {}) {\r\n super();\r\n this.message = message;\r\n this.error = error;\r\n }\r\n\r\n build(context) {\r\n return new VNode({\r\n tag: 'div',\r\n props: {\r\n style: {\r\n backgroundColor: '#ff1744',\r\n color: 'white',\r\n padding: '16px',\r\n borderRadius: '4px',\r\n fontFamily: 'monospace',\r\n fontSize: '12px',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word'\r\n }\r\n },\r\n children: [this.message]\r\n });\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// KEY CLASSES\r\n// ============================================================================\r\n\r\nclass Key {\r\n constructor() {\r\n if (new.target === Key) {\r\n throw new Error('Key is abstract');\r\n }\r\n }\r\n}\r\n\r\nclass ValueKey extends Key {\r\n constructor(value) {\r\n super();\r\n this.value = value;\r\n }\r\n\r\n equals(other) {\r\n return other instanceof ValueKey && this.value === other.value;\r\n }\r\n\r\n toString() {\r\n return `ValueKey(${this.value})`;\r\n }\r\n}\r\n\r\nclass ObjectKey extends Key {\r\n constructor(value) {\r\n super();\r\n this.value = value;\r\n }\r\n\r\n equals(other) {\r\n return other instanceof ObjectKey && this.value === other.value;\r\n }\r\n\r\n toString() {\r\n return `ObjectKey(${this.value})`;\r\n }\r\n}\r\n\r\nclass GlobalKey extends Key {\r\n constructor(debugLabel = null) {\r\n super();\r\n this.debugLabel = debugLabel;\r\n this._currentElement = null;\r\n }\r\n\r\n get currentContext() {\r\n return this._currentElement?.context || null;\r\n }\r\n\r\n get currentWidget() {\r\n return this._currentElement?.widget || null;\r\n }\r\n\r\n get currentState() {\r\n return this._currentElement?.state || null;\r\n }\r\n\r\n equals(other) {\r\n return other instanceof GlobalKey && this === other;\r\n }\r\n\r\n toString() {\r\n return `GlobalKey${this.debugLabel ? `(${this.debugLabel})` : ''}`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n State,\r\n Widget,\r\n StatelessWidget,\r\n StatelessElement,\r\n StatefulWidget,\r\n StatefulElement,\r\n ProxyWidget,\r\n ProxyElement,\r\n ErrorWidget,\r\n Key,\r\n ValueKey,\r\n ObjectKey,\r\n GlobalKey,\r\n Diagnosticable\r\n};"], - "mappings": "AAUA,OAAS,kBAAAA,EAAgB,WAAAC,EAAS,oBAAAC,EAAkB,mBAAAC,MAAuB,6BAC3E,OAAS,SAAAC,MAAa,wBAWtB,MAAMC,UAAcL,CAAe,CACjC,aAAc,CACZ,MAAM,EAGN,KAAK,SAAW,KAChB,KAAK,QAAU,KACf,KAAK,SAAW,GAChB,KAAK,UAAY,GAGjB,KAAK,cAAgB,GACrB,KAAK,UAAY,GACjB,KAAK,UAAY,GAGjB,KAAK,YAAc,CACrB,CAKA,IAAI,QAAS,CACX,OAAO,KAAK,OACd,CAKA,IAAI,SAAU,CACZ,OAAO,KAAK,UAAU,SAAW,IACnC,CAKA,IAAI,SAAU,CACZ,OAAO,KAAK,QACd,CAQA,WAAY,CAEZ,CAMA,gBAAgBM,EAAW,CAE3B,CAKA,uBAAwB,CAExB,CAKA,UAAW,CAEX,CAMA,SAAU,CAEV,CAKA,UAAW,CAEX,CAKA,YAAa,CAEb,CAQA,MAAMC,EAAS,CACb,MAAM,IAAI,MAAM,GAAG,KAAK,YAAY,IAAI,qCAAqC,CAC/E,CAQA,SAASC,EAAU,CACjB,GAAI,CAAC,KAAK,QAAS,CACjB,QAAQ,KAAK,4CAA4C,EACzD,MACF,CAOA,GALI,KAAK,WACP,QAAQ,KAAK,sCAAsC,EAIjD,OAAOA,GAAa,WACtB,GAAI,CACFA,EAAS,KAAK,IAAI,CACpB,OAASC,EAAO,CACd,cAAQ,MAAM,2CAA4CA,CAAK,EACzDA,CACR,MACS,OAAOD,GAAa,UAAYA,IAAa,MACtD,OAAO,OAAO,KAAMA,CAAQ,EAI1B,KAAK,UAAY,OAAO,KAAK,SAAS,gBAAmB,YAC3D,KAAK,SAAS,eAAe,CAEjC,CAQA,OAAQ,CACN,GAAI,MAAK,cAIT,MAAK,cAAgB,GACrB,KAAK,SAAW,GAChB,KAAK,UAAY,GAEjB,GAAI,CACF,QAAQ,IAAI,iCAAiC,KAAK,YAAY,IAAI,EAAE,EACpE,KAAK,UAAU,CACjB,OAASC,EAAO,CACd,cAAQ,MAAM,4BAA6BA,CAAK,EAC1CA,CACR,EACF,CAKA,wBAAyB,CACvB,GAAI,CACF,KAAK,sBAAsB,CAC7B,OAASA,EAAO,CACd,QAAQ,MAAM,wCAAyCA,CAAK,CAC9D,CACF,CAKA,WAAY,CACV,GAAI,MAAK,UAIT,MAAK,UAAY,GAEjB,GAAI,CACF,QAAQ,IAAI,gCAAgC,KAAK,YAAY,IAAI,EAAE,EACnE,KAAK,SAAS,CAChB,OAASA,EAAO,CACd,QAAQ,MAAM,2BAA4BA,CAAK,CACjD,EACF,CAKA,UAAW,CACT,KAAK,SAAW,GAChB,KAAK,UAAY,GAEjB,GAAI,CACF,QAAQ,IAAI,+BAA+B,KAAK,YAAY,IAAI,EAAE,EAClE,KAAK,QAAQ,CACf,OAASA,EAAO,CACd,QAAQ,MAAM,0BAA2BA,CAAK,CAChD,CACF,CAKA,aAAc,CACZ,GAAK,KAAK,UAIV,MAAK,UAAY,GAEjB,GAAI,CACF,KAAK,WAAW,CAClB,OAASA,EAAO,CACd,QAAQ,MAAM,6BAA8BA,CAAK,CACnD,EACF,CAKA,aAAc,CACZ,GAAI,MAAK,UAIT,MAAK,UAAY,GAEjB,GAAI,CACF,KAAK,SAAS,CAChB,OAASA,EAAO,CACd,QAAQ,MAAM,2BAA4BA,CAAK,CACjD,EACF,CAEA,eAAgB,CACd,MAAO,GAAG,KAAK,YAAY,IAAI,EACjC,CACF,CAMA,MAAMC,UAAeV,CAAe,CAClC,YAAYW,EAAM,KAAM,CAEtB,GADA,MAAM,EACF,aAAeD,EACjB,MAAM,IAAI,MAAM,+CAA+C,EAEjE,KAAK,IAAMC,CACb,CAMA,cAAcC,EAAQC,EAAS,CAC7B,MAAM,IAAI,MACR,GAAG,KAAK,YAAY,IAAI,sCAC1B,CACF,CAEA,eAAgB,CACd,MAAO,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,IAAM,SAAS,KAAK,GAAG,IAAM,WAAW,EACjF,CAEA,oBAAoBC,EAAY,CAC9B,MAAM,oBAAoBA,CAAU,CACtC,CACF,CAMA,MAAMC,UAAwBL,CAAO,CACnC,YAAYC,EAAM,KAAM,CACtB,MAAMA,CAAG,CACX,CAMA,MAAMJ,EAAS,CACb,MAAM,IAAI,MAAM,GAAG,KAAK,YAAY,IAAI,qCAAqC,CAC/E,CAKA,cAAcK,EAAQC,EAAS,CAC7B,OAAO,IAAIX,EAAiB,KAAMU,EAAQC,CAAO,CACnD,CACF,CAQA,MAAMG,UAAuBN,CAAO,CAClC,YAAYC,EAAM,KAAM,CACtB,MAAMA,CAAG,CACX,CAMA,aAAc,CACZ,MAAM,IAAI,MAAM,GAAG,KAAK,YAAY,IAAI,oCAAoC,CAC9E,CAKA,cAAcC,EAAQC,EAAS,CAC7B,OAAO,IAAIV,EAAgB,KAAMS,EAAQC,CAAO,CAClD,CACF,CAQA,MAAMI,UAAoBP,CAAO,CAC/B,YAAY,CAAE,IAAAC,EAAM,KAAM,MAAAO,EAAQ,IAAK,EAAI,CAAC,EAAG,CAE7C,GADA,MAAMP,CAAG,EACL,aAAeM,EACjB,MAAM,IAAI,MAAM,yBAAyB,EAE3C,KAAK,MAAQC,CACf,CAEA,cAAcN,EAAQC,EAAS,CAC7B,OAAO,IAAIM,EAAa,KAAMP,EAAQC,CAAO,CAC/C,CACF,CAKA,MAAMM,UAAqBlB,CAAQ,CACjC,YAAYmB,EAAQR,EAAS,KAAMC,EAAU,KAAM,CACjD,MAAMO,EAAQR,EAAQC,CAAO,CAC/B,CAEA,gBAAiB,CACf,GAAI,CAAC,KAAK,OAAO,MACf,OAAO,KAGT,GAAI,CACF,MAAMQ,EAAe,KAAK,OAAO,MAAM,cAAc,KAAM,KAAK,OAAO,EASvE,OAPIA,GAAgB,OAAOA,EAAa,OAAU,YAChDA,EAAa,MAAM,IAAI,EAMrBA,GAAgBA,EAAa,OACxBA,EAAa,OAGlBA,GAAgB,OAAOA,EAAa,gBAAmB,WAClDA,EAAa,eAAe,EAG9B,IACT,OAASZ,EAAO,CACd,cAAQ,MAAM,wCAAyCA,CAAK,EACtDA,CACR,CACF,CACF,CAMA,MAAMa,UAAoBP,CAAgB,CACxC,YAAY,CAAE,QAAAQ,EAAU,QAAS,MAAAd,EAAQ,IAAK,EAAI,CAAC,EAAG,CACpD,MAAM,EACN,KAAK,QAAUc,EACf,KAAK,MAAQd,CACf,CAEA,MAAMF,EAAS,CACb,OAAO,IAAIH,EAAM,CACf,IAAK,MACL,MAAO,CACL,MAAO,CACL,gBAAiB,UACjB,MAAO,QACP,QAAS,OACT,aAAc,MACd,WAAY,YACZ,SAAU,OACV,WAAY,WACZ,UAAW,YACb,CACF,EACA,SAAU,CAAC,KAAK,OAAO,CACzB,CAAC,CACH,CACF,CAMA,MAAMoB,CAAI,CACR,aAAc,CACZ,GAAI,aAAeA,EACjB,MAAM,IAAI,MAAM,iBAAiB,CAErC,CACF,CAEA,MAAMC,UAAiBD,CAAI,CACzB,YAAYE,EAAO,CACjB,MAAM,EACN,KAAK,MAAQA,CACf,CAEA,OAAOC,EAAO,CACZ,OAAOA,aAAiBF,GAAY,KAAK,QAAUE,EAAM,KAC3D,CAEA,UAAW,CACT,MAAO,YAAY,KAAK,KAAK,GAC/B,CACF,CAEA,MAAMC,UAAkBJ,CAAI,CAC1B,YAAYE,EAAO,CACjB,MAAM,EACN,KAAK,MAAQA,CACf,CAEA,OAAOC,EAAO,CACZ,OAAOA,aAAiBC,GAAa,KAAK,QAAUD,EAAM,KAC5D,CAEA,UAAW,CACT,MAAO,aAAa,KAAK,KAAK,GAChC,CACF,CAEA,MAAME,UAAkBL,CAAI,CAC1B,YAAYM,EAAa,KAAM,CAC7B,MAAM,EACN,KAAK,WAAaA,EAClB,KAAK,gBAAkB,IACzB,CAEA,IAAI,gBAAiB,CACnB,OAAO,KAAK,iBAAiB,SAAW,IAC1C,CAEA,IAAI,eAAgB,CAClB,OAAO,KAAK,iBAAiB,QAAU,IACzC,CAEA,IAAI,cAAe,CACjB,OAAO,KAAK,iBAAiB,OAAS,IACxC,CAEA,OAAOH,EAAO,CACZ,OAAOA,aAAiBE,GAAa,OAASF,CAChD,CAEA,UAAW,CACT,MAAO,YAAY,KAAK,WAAa,IAAI,KAAK,UAAU,IAAM,EAAE,EAClE,CACF", - "names": ["Diagnosticable", "Element", "StatelessElement", "StatefulElement", "VNode", "State", "oldWidget", "context", "updateFn", "error", "Widget", "key", "parent", "runtime", "properties", "StatelessWidget", "StatefulWidget", "ProxyWidget", "child", "ProxyElement", "widget", "childElement", "ErrorWidget", "message", "Key", "ValueKey", "value", "other", "ObjectKey", "GlobalKey", "debugLabel"] -} diff --git a/packages/flutterjs_engine/package/material/dist/index.js b/packages/flutterjs_engine/package/material/dist/index.js deleted file mode 100644 index 38fb3e04..00000000 --- a/packages/flutterjs_engine/package/material/dist/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import{BorderRadius as e}from"./utils/geometry.js";import{BuildContext as t,runApp as x}from"@flutterjs/runtime";export*from"./core/core.js";export*from"./material/material.js";export*from"./widgets/widgets.js";export*from"./utils/utils.js";export{e as BorderRadius,t as BuildContext,x as runApp}; -//# sourceMappingURL=index.js.map diff --git a/packages/flutterjs_engine/package/material/dist/index.js.map b/packages/flutterjs_engine/package/material/dist/index.js.map deleted file mode 100644 index 2505b264..00000000 --- a/packages/flutterjs_engine/package/material/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/index.js"], - "sourcesContent": ["export { BorderRadius } from \"./utils/geometry.js\";\r\n\r\n// ============================================================================\r\n// FLUTTERJS UNIFIED EXPORT (Material Layer)\r\n// \r\n// This package acts as the main entry point for FlutterJS apps using Material Design.\r\n// It re-exports the core runtime (@flutterjs/runtime) so developers (and generators)\r\n// only need to import from this single package.\r\n// ============================================================================\r\n\r\n// 1. Re-Export Core Runtime Primitives\r\nexport { BuildContext, runApp } from '@flutterjs/runtime';\r\n\r\n// 2. Export Material Components\r\nexport * from \"./core/core.js\";\r\nexport * from \"./material/material.js\";\r\n\r\nexport * from \"./widgets/widgets.js\";\r\nexport * from \"./utils/utils.js\";\r\n"], - "mappings": "AAAA,OAAS,gBAAAA,MAAoB,sBAW7B,OAAS,gBAAAC,EAAc,UAAAC,MAAc,qBAGrC,WAAc,iBACd,WAAc,yBAEd,WAAc,uBACd,WAAc", - "names": ["BorderRadius", "BuildContext", "runApp"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/color.js b/packages/flutterjs_engine/package/material/dist/material/color.js deleted file mode 100644 index 140fbc20..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/color.js +++ /dev/null @@ -1,2 +0,0 @@ -var D=Object.defineProperty;var u=(i,w,t)=>w in i?D(i,w,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[w]=t;var n=(i,w,t)=>(u(i,typeof w!="symbol"?w+"":w,t),t);class F{constructor(w){this.value=typeof w=="string"?parseInt(w.replace("#",""),16):w}static fromARGB(w,t,a,E){const A=w<<24|t<<16|a<<8|E;return new F(A)}static fromRGBO(w,t,a,E){const A=Math.round(E*255);return F.fromARGB(A,w,t,a)}get alpha(){return this.value>>24&255}get red(){return this.value>>16&255}get green(){return this.value>>8&255}get blue(){return this.value&255}get opacity(){return this.alpha/255}toCSSString(){return`#${this.value.toString(16).padStart(8,"0").slice(2)}`}toCSS(){return`rgba(${this.red}, ${this.green}, ${this.blue}, ${this.opacity})`}withAlpha(w){return F.fromARGB(w,this.red,this.green,this.blue)}withOpacity(w){const t=Math.round(w*255);return F.fromARGB(t,this.red,this.green,this.blue)}static lerp(w,t,a){if(w===null)return t?.withOpacity(t.opacity*a);if(t===null)return w?.withOpacity(w.opacity*(1-a));const E=Math.round(w.alpha*(1-a)+t.alpha*a),A=Math.round(w.red*(1-a)+t.red*a),s=Math.round(w.green*(1-a)+t.green*a),B=Math.round(w.blue*(1-a)+t.blue*a);return F.fromARGB(E,A,s,B)}equals(w){return this.value===w.value}toString(){return`Color(0x${this.value.toString(16).padStart(8,"0").toUpperCase()})`}}class r extends F{constructor(w,t){super(w),this._swatch=t||{}}get(w){return this._swatch[w]}[Symbol.for("get")](w){return this._swatch[w]}}class x extends r{constructor(w,t){super(w,t)}get shade50(){return this._swatch[50]}get shade100(){return this._swatch[100]}get shade200(){return this._swatch[200]}get shade300(){return this._swatch[300]}get shade400(){return this._swatch[400]}get shade500(){return this._swatch[500]}get shade600(){return this._swatch[600]}get shade700(){return this._swatch[700]}get shade800(){return this._swatch[800]}get shade900(){return this._swatch[900]}getShade(w){return this._swatch[w]}}class c extends r{constructor(w,t){super(w,t)}get shade100(){return this._swatch[100]}get shade200(){return this._swatch[200]}get shade400(){return this._swatch[400]}get shade700(){return this._swatch[700]}getShade(w){return this._swatch[w]}}const e=class e{static get primaries(){return[e.red,e.pink,e.purple,e.deepPurple,e.indigo,e.blue,e.lightBlue,e.cyan,e.teal,e.green,e.lightGreen,e.lime,e.yellow,e.amber,e.orange,e.deepOrange,e.brown,e.blueGrey]}static get accents(){return[e.redAccent,e.pinkAccent,e.purpleAccent,e.deepPurpleAccent,e.indigoAccent,e.blueAccent,e.lightBlueAccent,e.cyanAccent,e.tealAccent,e.greenAccent,e.lightGreenAccent,e.limeAccent,e.yellowAccent,e.amberAccent,e.orangeAccent,e.deepOrangeAccent]}};n(e,"transparent",new F(0)),n(e,"black",new F(4278190080)),n(e,"black87",new F(3707764736)),n(e,"black54",new F(2315255808)),n(e,"black45",new F(1929379840)),n(e,"black38",new F(1627389952)),n(e,"black26",new F(1107296256)),n(e,"black12",new F(520093696)),n(e,"white",new F(4294967295)),n(e,"white70",new F(3019898879)),n(e,"white60",new F(2583691263)),n(e,"white54",new F(2332033023)),n(e,"white38",new F(1660944383)),n(e,"white30",new F(1308622847)),n(e,"white24",new F(1040187391)),n(e,"white12",new F(536870911)),n(e,"white10",new F(452984831)),n(e,"red",new x(4294198070,{50:new F(4294962158),100:new F(4294954450),200:new F(4293892762),300:new F(4293227379),400:new F(4293874512),500:new F(4294198070),600:new F(4293212469),700:new F(4292030255),800:new F(4291176488),900:new F(4290190364)})),n(e,"redAccent",new c(4294922834,{100:new F(4294937216),200:new F(4294922834),400:new F(4294907716),700:new F(4292149248)})),n(e,"pink",new x(4293467747,{50:new F(4294763756),100:new F(4294491088),200:new F(4294217649),300:new F(4293943954),400:new F(4293673082),500:new F(4293467747),600:new F(4292352864),700:new F(4290910299),800:new F(4289533015),900:new F(4287106639)})),n(e,"pinkAccent",new c(4294918273,{100:new F(4294934699),200:new F(4294918273),400:new F(4294246487),700:new F(4291105122)})),n(e,"purple",new x(4288423856,{50:new F(4294174197),100:new F(4292984551),200:new F(4291728344),300:new F(4290406600),400:new F(4289415100),500:new F(4288423856),600:new F(4287505578),700:new F(4286259106),800:new F(4285143962),900:new F(4283045004)})),n(e,"purpleAccent",new c(4292886779,{100:new F(4293558524),200:new F(4292886779),400:new F(4292149497),700:new F(4289331455)})),n(e,"deepPurple",new x(4284955319,{50:new F(4293781494),100:new F(4291937513),200:new F(4289961435),300:new F(4287985101),400:new F(4286470082),500:new F(4284955319),600:new F(4284364209),700:new F(4283510184),800:new F(4282722208),900:new F(4281408402)})),n(e,"deepPurpleAccent",new c(4286336511,{100:new F(4289956095),200:new F(4286336511),400:new F(4284817407),700:new F(4284612842)})),n(e,"indigo",new x(4282339765,{50:new F(4293454582),100:new F(4291152617),200:new F(4288653530),300:new F(4286154443),400:new F(4284246976),500:new F(4282339765),600:new F(4281944491),700:new F(4281352095),800:new F(4280825235),900:new F(4279903102)})),n(e,"indigoAccent",new c(4283657726,{100:new F(4287405823),200:new F(4283657726),400:new F(4282211070),700:new F(4281356286)})),n(e,"blue",new x(4280391411,{50:new F(4293128957),100:new F(4290502395),200:new F(4287679225),300:new F(4284790262),400:new F(4282557941),500:new F(4280391411),600:new F(4280191205),700:new F(4279858898),800:new F(4279592384),900:new F(4279060385)})),n(e,"blueAccent",new c(4282682111,{100:new F(4286755327),200:new F(4282682111),400:new F(4280908287),700:new F(4280902399)})),n(e,"lightBlue",new x(4278430196,{50:new F(4292998654),100:new F(4289979900),200:new F(4286698746),300:new F(4283417591),400:new F(4280923894),500:new F(4278430196),600:new F(4278426597),700:new F(4278356177),800:new F(4278351805),900:new F(4278278043)})),n(e,"lightBlueAccent",new c(4282434815,{100:new F(4286634239),200:new F(4282434815),400:new F(4278235391),700:new F(4278227434)})),n(e,"cyan",new x(4278238420,{50:new F(4292933626),100:new F(4289915890),200:new F(4286635754),300:new F(4283289825),400:new F(4280731354),500:new F(4278238420),600:new F(4278234305),700:new F(4278228903),800:new F(4278223759),900:new F(4278214756)})),n(e,"cyanAccent",new c(4279828479,{100:new F(4286906367),200:new F(4279828479),400:new F(4278248959),700:new F(4278237396)})),n(e,"teal",new x(4278228616,{50:new F(4292932337),100:new F(4289912795),200:new F(4286630852),300:new F(4283283116),400:new F(4280723098),500:new F(4278228616),600:new F(4278225275),700:new F(4278221163),800:new F(4278217052),900:new F(4278209856)})),n(e,"tealAccent",new c(4284809178,{100:new F(4289200107),200:new F(4284809178),400:new F(4280150454),700:new F(4278239141)})),n(e,"green",new x(4283215696,{50:new F(4293457385),100:new F(4291356361),200:new F(4289058471),300:new F(4286695300),400:new F(4284922730),500:new F(4283215696),600:new F(4282622023),700:new F(4281896508),800:new F(4281236786),900:new F(4279983648)})),n(e,"greenAccent",new c(4285132974,{100:new F(4290377418),200:new F(4285132974),400:new F(4278249078),700:new F(4278241363)})),n(e,"lightGreen",new x(4287349578,{50:new F(4294047977),100:new F(4292668872),200:new F(4291158437),300:new F(4289648001),400:new F(4288466021),500:new F(4287349578),600:new F(4286362434),700:new F(4285046584),800:new F(4283796271),900:new F(4281559326)})),n(e,"lightGreenAccent",new c(4289920857,{100:new F(4291624848),200:new F(4289920857),400:new F(4285988611),700:new F(4284800279)})),n(e,"lime",new x(4291681337,{50:new F(4294573031),100:new F(4293981379),200:new F(4293324444),300:new F(4292667253),400:new F(4292141399),500:new F(4291681337),600:new F(4290824755),700:new F(4289705003),800:new F(4288584996),900:new F(4286740247)})),n(e,"limeAccent",new c(4293852993,{100:new F(4294246273),200:new F(4293852993),400:new F(4291231488),700:new F(4289653248)})),n(e,"yellow",new x(4294961979,{50:new F(4294966759),100:new F(4294965700),200:new F(4294964637),300:new F(4294963574),400:new F(4294962776),500:new F(4294961979),600:new F(4294826037),700:new F(4294688813),800:new F(4294551589),900:new F(4294278935)})),n(e,"yellowAccent",new c(4294967040,{100:new F(4294967181),200:new F(4294967040),400:new F(4294961664),700:new F(4294956544)})),n(e,"amber",new x(4294951175,{50:new F(4294965473),100:new F(4294962355),200:new F(4294959234),300:new F(4294956367),400:new F(4294953512),500:new F(4294951175),600:new F(4294947584),700:new F(4294942720),800:new F(4294938368),900:new F(4294930176)})),n(e,"amberAccent",new c(4294956864,{100:new F(4294960511),200:new F(4294956864),400:new F(4294951936),700:new F(4294945536)})),n(e,"orange",new x(4294940672,{50:new F(4294964192),100:new F(4294959282),200:new F(4294954112),300:new F(4294948685),400:new F(4294944550),500:new F(4294940672),600:new F(4294675456),700:new F(4294278144),800:new F(4293880832),900:new F(4293284096)})),n(e,"orangeAccent",new c(4294945600,{100:new F(4294955392),200:new F(4294945600),400:new F(4294938880),700:new F(4294929664)})),n(e,"deepOrange",new x(4294924066,{50:new F(4294699495),100:new F(4294954172),200:new F(4294945681),300:new F(4294937189),400:new F(4294930499),500:new F(4294924066),600:new F(4294201630),700:new F(4293282329),800:new F(4292363029),900:new F(4290721292)})),n(e,"deepOrangeAccent",new c(4294929984,{100:new F(4294942336),200:new F(4294929984),400:new F(4294917376),700:new F(4292684800)})),n(e,"brown",new x(4286141768,{50:new F(4293913577),100:new F(4292332744),200:new F(4290554532),300:new F(4288776319),400:new F(4287458915),500:new F(4286141768),600:new F(4285353025),700:new F(4284301367),800:new F(4283315246),900:new F(4282263331)})),n(e,"grey",new x(4288585374,{50:new F(4294638330),100:new F(4294309365),200:new F(4293848814),300:new F(4292927712),350:new F(4292269782),400:new F(4290624957),500:new F(4288585374),600:new F(4285887861),700:new F(4284572001),800:new F(4282532418),850:new F(4281348144),900:new F(4280361249)})),n(e,"blueGrey",new x(4284513675,{50:new F(4293718001),100:new F(4291811548),200:new F(4289773253),300:new F(4287669422),400:new F(4286091420),500:new F(4284513675),600:new F(4283723386),700:new F(4282735204),800:new F(4281812815),900:new F(4280693304)}));let h=e;export{F as Color,r as ColorSwatch,h as Colors,c as MaterialAccentColor,x as MaterialColor}; -//# sourceMappingURL=color.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/color.js.map b/packages/flutterjs_engine/package/material/dist/material/color.js.map deleted file mode 100644 index dd5d716c..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/color.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/color.js"], - "sourcesContent": ["// ============================================================================\r\n// COLOR CLASS\r\n// ============================================================================\r\n\r\nclass Color {\r\n constructor(value) {\r\n // Parse hex value (0xAARRGGBB format)\r\n this.value = typeof value === 'string' ? parseInt(value.replace('#', ''), 16) : value;\r\n }\r\n\r\n /**\r\n * Create color from RGB\r\n */\r\n static fromARGB(alpha, red, green, blue) {\r\n const value = (alpha << 24) | (red << 16) | (green << 8) | blue;\r\n return new Color(value);\r\n }\r\n\r\n /**\r\n * Create color from RGB (alpha = 255)\r\n */\r\n static fromRGBO(red, green, blue, opacity) {\r\n const alpha = Math.round(opacity * 255);\r\n return Color.fromARGB(alpha, red, green, blue);\r\n }\r\n\r\n /**\r\n * Get alpha channel (0-255)\r\n */\r\n get alpha() {\r\n return (this.value >> 24) & 0xFF;\r\n }\r\n\r\n /**\r\n * Get red channel (0-255)\r\n */\r\n get red() {\r\n return (this.value >> 16) & 0xFF;\r\n }\r\n\r\n /**\r\n * Get green channel (0-255)\r\n */\r\n get green() {\r\n return (this.value >> 8) & 0xFF;\r\n }\r\n\r\n /**\r\n * Get blue channel (0-255)\r\n */\r\n get blue() {\r\n return this.value & 0xFF;\r\n }\r\n\r\n /**\r\n * Get opacity (0.0-1.0)\r\n */\r\n get opacity() {\r\n return this.alpha / 255;\r\n }\r\n\r\n /**\r\n * Convert to CSS hex string\r\n */\r\n toCSSString() {\r\n const hex = this.value.toString(16).padStart(8, '0');\r\n return `#${hex.slice(2)}`; // Skip alpha for CSS\r\n }\r\n\r\n /**\r\n * Convert to CSS rgba string\r\n */\r\n toCSS() {\r\n return `rgba(${this.red}, ${this.green}, ${this.blue}, ${this.opacity})`;\r\n }\r\n\r\n /**\r\n * Create a copy with modified alpha\r\n */\r\n withAlpha(alpha) {\r\n return Color.fromARGB(alpha, this.red, this.green, this.blue);\r\n }\r\n\r\n /**\r\n * Create a copy with modified opacity (0.0-1.0)\r\n */\r\n withOpacity(opacity) {\r\n const alpha = Math.round(opacity * 255);\r\n return Color.fromARGB(alpha, this.red, this.green, this.blue);\r\n }\r\n\r\n /**\r\n * Blend two colors\r\n */\r\n static lerp(a, b, t) {\r\n if (a === null) return b?.withOpacity(b.opacity * t);\r\n if (b === null) return a?.withOpacity(a.opacity * (1 - t));\r\n\r\n const alpha = Math.round(a.alpha * (1 - t) + b.alpha * t);\r\n const red = Math.round(a.red * (1 - t) + b.red * t);\r\n const green = Math.round(a.green * (1 - t) + b.green * t);\r\n const blue = Math.round(a.blue * (1 - t) + b.blue * t);\r\n\r\n return Color.fromARGB(alpha, red, green, blue);\r\n }\r\n\r\n /**\r\n * Compare colors\r\n */\r\n equals(other) {\r\n return this.value === other.value;\r\n }\r\n\r\n toString() {\r\n return `Color(0x${this.value.toString(16).padStart(8, '0').toUpperCase()})`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// COLOR SWATCH\r\n// ============================================================================\r\n\r\nclass ColorSwatch extends Color {\r\n constructor(primary, swatch) {\r\n super(primary);\r\n this._swatch = swatch || {};\r\n }\r\n\r\n /**\r\n * Get color by shade number\r\n */\r\n get(shade) {\r\n return this._swatch[shade];\r\n }\r\n\r\n /**\r\n * Direct access via bracket notation\r\n */\r\n [Symbol.for('get')](shade) {\r\n return this._swatch[shade];\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MATERIAL COLOR CLASS\r\n// ============================================================================\r\n\r\nclass MaterialColor extends ColorSwatch {\r\n constructor(primary, swatch) {\r\n super(primary, swatch);\r\n }\r\n\r\n get shade50() { return this._swatch[50]; }\r\n get shade100() { return this._swatch[100]; }\r\n get shade200() { return this._swatch[200]; }\r\n get shade300() { return this._swatch[300]; }\r\n get shade400() { return this._swatch[400]; }\r\n get shade500() { return this._swatch[500]; }\r\n get shade600() { return this._swatch[600]; }\r\n get shade700() { return this._swatch[700]; }\r\n get shade800() { return this._swatch[800]; }\r\n get shade900() { return this._swatch[900]; }\r\n\r\n /**\r\n * Get shade by index\r\n */\r\n getShade(index) {\r\n return this._swatch[index];\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MATERIAL ACCENT COLOR CLASS\r\n// ============================================================================\r\n\r\nclass MaterialAccentColor extends ColorSwatch {\r\n constructor(primary, swatch) {\r\n super(primary, swatch);\r\n }\r\n\r\n get shade100() { return this._swatch[100]; }\r\n get shade200() { return this._swatch[200]; }\r\n get shade400() { return this._swatch[400]; }\r\n get shade700() { return this._swatch[700]; }\r\n\r\n /**\r\n * Get shade by index\r\n */\r\n getShade(index) {\r\n return this._swatch[index];\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MATERIAL COLORS\r\n// ============================================================================\r\n\r\nclass Colors {\r\n // Transparency\r\n static transparent = new Color(0x00000000);\r\n\r\n // Black and White\r\n static black = new Color(0xFF000000);\r\n static black87 = new Color(0xDD000000);\r\n static black54 = new Color(0x8A000000);\r\n static black45 = new Color(0x73000000);\r\n static black38 = new Color(0x61000000);\r\n static black26 = new Color(0x42000000);\r\n static black12 = new Color(0x1F000000);\r\n\r\n static white = new Color(0xFFFFFFFF);\r\n static white70 = new Color(0xB3FFFFFF);\r\n static white60 = new Color(0x99FFFFFF);\r\n static white54 = new Color(0x8AFFFFFF);\r\n static white38 = new Color(0x62FFFFFF);\r\n static white30 = new Color(0x4DFFFFFF);\r\n static white24 = new Color(0x3DFFFFFF);\r\n static white12 = new Color(0x1FFFFFFF);\r\n static white10 = new Color(0x1AFFFFFF);\r\n\r\n // RED\r\n static red = new MaterialColor(0xFFF44336, {\r\n 50: new Color(0xFFFFEBEE),\r\n 100: new Color(0xFFFFCDD2),\r\n 200: new Color(0xFFEF9A9A),\r\n 300: new Color(0xFFE57373),\r\n 400: new Color(0xFFEF5350),\r\n 500: new Color(0xFFF44336),\r\n 600: new Color(0xFFE53935),\r\n 700: new Color(0xFFD32F2F),\r\n 800: new Color(0xFFC62828),\r\n 900: new Color(0xFFB71C1C)\r\n });\r\n\r\n static redAccent = new MaterialAccentColor(0xFFFF5252, {\r\n 100: new Color(0xFFFF8A80),\r\n 200: new Color(0xFFFF5252),\r\n 400: new Color(0xFFFF1744),\r\n 700: new Color(0xFFD50000)\r\n });\r\n\r\n // PINK\r\n static pink = new MaterialColor(0xFFE91E63, {\r\n 50: new Color(0xFFFCE4EC),\r\n 100: new Color(0xFFF8BBD0),\r\n 200: new Color(0xFFF48FB1),\r\n 300: new Color(0xFFF06292),\r\n 400: new Color(0xFFEC407A),\r\n 500: new Color(0xFFE91E63),\r\n 600: new Color(0xFFD81B60),\r\n 700: new Color(0xFFC2185B),\r\n 800: new Color(0xFFAD1457),\r\n 900: new Color(0xFF880E4F)\r\n });\r\n\r\n static pinkAccent = new MaterialAccentColor(0xFFFF4081, {\r\n 100: new Color(0xFFFF80AB),\r\n 200: new Color(0xFFFF4081),\r\n 400: new Color(0xFFF50057),\r\n 700: new Color(0xFFC51162)\r\n });\r\n\r\n // PURPLE\r\n static purple = new MaterialColor(0xFF9C27B0, {\r\n 50: new Color(0xFFF3E5F5),\r\n 100: new Color(0xFFE1BEE7),\r\n 200: new Color(0xFFCE93D8),\r\n 300: new Color(0xFFBA68C8),\r\n 400: new Color(0xFFAB47BC),\r\n 500: new Color(0xFF9C27B0),\r\n 600: new Color(0xFF8E24AA),\r\n 700: new Color(0xFF7B1FA2),\r\n 800: new Color(0xFF6A1B9A),\r\n 900: new Color(0xFF4A148C)\r\n });\r\n\r\n static purpleAccent = new MaterialAccentColor(0xFFE040FB, {\r\n 100: new Color(0xFFEA80FC),\r\n 200: new Color(0xFFE040FB),\r\n 400: new Color(0xFFD500F9),\r\n 700: new Color(0xFFAA00FF)\r\n });\r\n\r\n // DEEP PURPLE\r\n static deepPurple = new MaterialColor(0xFF673AB7, {\r\n 50: new Color(0xFFEDE7F6),\r\n 100: new Color(0xFFD1C4E9),\r\n 200: new Color(0xFFB39DDB),\r\n 300: new Color(0xFF9575CD),\r\n 400: new Color(0xFF7E57C2),\r\n 500: new Color(0xFF673AB7),\r\n 600: new Color(0xFF5E35B1),\r\n 700: new Color(0xFF512DA8),\r\n 800: new Color(0xFF4527A0),\r\n 900: new Color(0xFF311B92)\r\n });\r\n\r\n static deepPurpleAccent = new MaterialAccentColor(0xFF7C4DFF, {\r\n 100: new Color(0xFFB388FF),\r\n 200: new Color(0xFF7C4DFF),\r\n 400: new Color(0xFF651FFF),\r\n 700: new Color(0xFF6200EA)\r\n });\r\n\r\n // INDIGO\r\n static indigo = new MaterialColor(0xFF3F51B5, {\r\n 50: new Color(0xFFE8EAF6),\r\n 100: new Color(0xFFC5CAE9),\r\n 200: new Color(0xFF9FA8DA),\r\n 300: new Color(0xFF7986CB),\r\n 400: new Color(0xFF5C6BC0),\r\n 500: new Color(0xFF3F51B5),\r\n 600: new Color(0xFF3949AB),\r\n 700: new Color(0xFF303F9F),\r\n 800: new Color(0xFF283593),\r\n 900: new Color(0xFF1A237E)\r\n });\r\n\r\n static indigoAccent = new MaterialAccentColor(0xFF536DFE, {\r\n 100: new Color(0xFF8C9EFF),\r\n 200: new Color(0xFF536DFE),\r\n 400: new Color(0xFF3D5AFE),\r\n 700: new Color(0xFF304FFE)\r\n });\r\n\r\n // BLUE\r\n static blue = new MaterialColor(0xFF2196F3, {\r\n 50: new Color(0xFFE3F2FD),\r\n 100: new Color(0xFFBBDEFB),\r\n 200: new Color(0xFF90CAF9),\r\n 300: new Color(0xFF64B5F6),\r\n 400: new Color(0xFF42A5F5),\r\n 500: new Color(0xFF2196F3),\r\n 600: new Color(0xFF1E88E5),\r\n 700: new Color(0xFF1976D2),\r\n 800: new Color(0xFF1565C0),\r\n 900: new Color(0xFF0D47A1)\r\n });\r\n\r\n static blueAccent = new MaterialAccentColor(0xFF448AFF, {\r\n 100: new Color(0xFF82B1FF),\r\n 200: new Color(0xFF448AFF),\r\n 400: new Color(0xFF2979FF),\r\n 700: new Color(0xFF2962FF)\r\n });\r\n\r\n // LIGHT BLUE\r\n static lightBlue = new MaterialColor(0xFF03A9F4, {\r\n 50: new Color(0xFFE1F5FE),\r\n 100: new Color(0xFFB3E5FC),\r\n 200: new Color(0xFF81D4FA),\r\n 300: new Color(0xFF4FC3F7),\r\n 400: new Color(0xFF29B6F6),\r\n 500: new Color(0xFF03A9F4),\r\n 600: new Color(0xFF039BE5),\r\n 700: new Color(0xFF0288D1),\r\n 800: new Color(0xFF0277BD),\r\n 900: new Color(0xFF01579B)\r\n });\r\n\r\n static lightBlueAccent = new MaterialAccentColor(0xFF40C4FF, {\r\n 100: new Color(0xFF80D8FF),\r\n 200: new Color(0xFF40C4FF),\r\n 400: new Color(0xFF00B0FF),\r\n 700: new Color(0xFF0091EA)\r\n });\r\n\r\n // CYAN\r\n static cyan = new MaterialColor(0xFF00BCD4, {\r\n 50: new Color(0xFFE0F7FA),\r\n 100: new Color(0xFFB2EBF2),\r\n 200: new Color(0xFF80DEEA),\r\n 300: new Color(0xFF4DD0E1),\r\n 400: new Color(0xFF26C6DA),\r\n 500: new Color(0xFF00BCD4),\r\n 600: new Color(0xFF00ACC1),\r\n 700: new Color(0xFF0097A7),\r\n 800: new Color(0xFF00838F),\r\n 900: new Color(0xFF006064)\r\n });\r\n\r\n static cyanAccent = new MaterialAccentColor(0xFF18FFFF, {\r\n 100: new Color(0xFF84FFFF),\r\n 200: new Color(0xFF18FFFF),\r\n 400: new Color(0xFF00E5FF),\r\n 700: new Color(0xFF00B8D4)\r\n });\r\n\r\n // TEAL\r\n static teal = new MaterialColor(0xFF009688, {\r\n 50: new Color(0xFFE0F2F1),\r\n 100: new Color(0xFFB2DFDB),\r\n 200: new Color(0xFF80CBC4),\r\n 300: new Color(0xFF4DB6AC),\r\n 400: new Color(0xFF26A69A),\r\n 500: new Color(0xFF009688),\r\n 600: new Color(0xFF00897B),\r\n 700: new Color(0xFF00796B),\r\n 800: new Color(0xFF00695C),\r\n 900: new Color(0xFF004D40)\r\n });\r\n\r\n static tealAccent = new MaterialAccentColor(0xFF64FFDA, {\r\n 100: new Color(0xFFA7FFEB),\r\n 200: new Color(0xFF64FFDA),\r\n 400: new Color(0xFF1DE9B6),\r\n 700: new Color(0xFF00BFA5)\r\n });\r\n\r\n // GREEN\r\n static green = new MaterialColor(0xFF4CAF50, {\r\n 50: new Color(0xFFE8F5E9),\r\n 100: new Color(0xFFC8E6C9),\r\n 200: new Color(0xFFA5D6A7),\r\n 300: new Color(0xFF81C784),\r\n 400: new Color(0xFF66BB6A),\r\n 500: new Color(0xFF4CAF50),\r\n 600: new Color(0xFF43A047),\r\n 700: new Color(0xFF388E3C),\r\n 800: new Color(0xFF2E7D32),\r\n 900: new Color(0xFF1B5E20)\r\n });\r\n\r\n static greenAccent = new MaterialAccentColor(0xFF69F0AE, {\r\n 100: new Color(0xFFB9F6CA),\r\n 200: new Color(0xFF69F0AE),\r\n 400: new Color(0xFF00E676),\r\n 700: new Color(0xFF00C853)\r\n });\r\n\r\n // LIGHT GREEN\r\n static lightGreen = new MaterialColor(0xFF8BC34A, {\r\n 50: new Color(0xFFF1F8E9),\r\n 100: new Color(0xFFDCEDC8),\r\n 200: new Color(0xFFC5E1A5),\r\n 300: new Color(0xFFAED581),\r\n 400: new Color(0xFF9CCC65),\r\n 500: new Color(0xFF8BC34A),\r\n 600: new Color(0xFF7CB342),\r\n 700: new Color(0xFF689F38),\r\n 800: new Color(0xFF558B2F),\r\n 900: new Color(0xFF33691E)\r\n });\r\n\r\n static lightGreenAccent = new MaterialAccentColor(0xFFB2FF59, {\r\n 100: new Color(0xFFCCFF90),\r\n 200: new Color(0xFFB2FF59),\r\n 400: new Color(0xFF76FF03),\r\n 700: new Color(0xFF64DD17)\r\n });\r\n\r\n // LIME\r\n static lime = new MaterialColor(0xFFCDDC39, {\r\n 50: new Color(0xFFF9FBE7),\r\n 100: new Color(0xFFF0F4C3),\r\n 200: new Color(0xFFE6EE9C),\r\n 300: new Color(0xFFDCE775),\r\n 400: new Color(0xFFD4E157),\r\n 500: new Color(0xFFCDDC39),\r\n 600: new Color(0xFFC0CA33),\r\n 700: new Color(0xFFAFB42B),\r\n 800: new Color(0xFF9E9D24),\r\n 900: new Color(0xFF827717)\r\n });\r\n\r\n static limeAccent = new MaterialAccentColor(0xFFEEFF41, {\r\n 100: new Color(0xFFF4FF81),\r\n 200: new Color(0xFFEEFF41),\r\n 400: new Color(0xFFC6FF00),\r\n 700: new Color(0xFFAEEA00)\r\n });\r\n\r\n // YELLOW\r\n static yellow = new MaterialColor(0xFFFFEB3B, {\r\n 50: new Color(0xFFFFFDE7),\r\n 100: new Color(0xFFFFF9C4),\r\n 200: new Color(0xFFFFF59D),\r\n 300: new Color(0xFFFFF176),\r\n 400: new Color(0xFFFFEE58),\r\n 500: new Color(0xFFFFEB3B),\r\n 600: new Color(0xFFFDD835),\r\n 700: new Color(0xFFFBC02D),\r\n 800: new Color(0xFFF9A825),\r\n 900: new Color(0xFFF57F17)\r\n });\r\n\r\n static yellowAccent = new MaterialAccentColor(0xFFFFFF00, {\r\n 100: new Color(0xFFFFFF8D),\r\n 200: new Color(0xFFFFFF00),\r\n 400: new Color(0xFFFFEA00),\r\n 700: new Color(0xFFFFD600)\r\n });\r\n\r\n // AMBER\r\n static amber = new MaterialColor(0xFFFFC107, {\r\n 50: new Color(0xFFFFF8E1),\r\n 100: new Color(0xFFFFECB3),\r\n 200: new Color(0xFFFFE082),\r\n 300: new Color(0xFFFFD54F),\r\n 400: new Color(0xFFFFCA28),\r\n 500: new Color(0xFFFFC107),\r\n 600: new Color(0xFFFFB300),\r\n 700: new Color(0xFFFFA000),\r\n 800: new Color(0xFFFF8F00),\r\n 900: new Color(0xFFFF6F00)\r\n });\r\n\r\n static amberAccent = new MaterialAccentColor(0xFFFFD740, {\r\n 100: new Color(0xFFFFE57F),\r\n 200: new Color(0xFFFFD740),\r\n 400: new Color(0xFFFFC400),\r\n 700: new Color(0xFFFFAB00)\r\n });\r\n\r\n // ORANGE\r\n static orange = new MaterialColor(0xFFFF9800, {\r\n 50: new Color(0xFFFFF3E0),\r\n 100: new Color(0xFFFFE0B2),\r\n 200: new Color(0xFFFFCC80),\r\n 300: new Color(0xFFFFB74D),\r\n 400: new Color(0xFFFFA726),\r\n 500: new Color(0xFFFF9800),\r\n 600: new Color(0xFFFB8C00),\r\n 700: new Color(0xFFF57C00),\r\n 800: new Color(0xFFEF6C00),\r\n 900: new Color(0xFFE65100)\r\n });\r\n\r\n static orangeAccent = new MaterialAccentColor(0xFFFFAB40, {\r\n 100: new Color(0xFFFFD180),\r\n 200: new Color(0xFFFFAB40),\r\n 400: new Color(0xFFFF9100),\r\n 700: new Color(0xFFFF6D00)\r\n });\r\n\r\n // DEEP ORANGE\r\n static deepOrange = new MaterialColor(0xFFFF5722, {\r\n 50: new Color(0xFFFBE9E7),\r\n 100: new Color(0xFFFFCCBC),\r\n 200: new Color(0xFFFFAB91),\r\n 300: new Color(0xFFFF8A65),\r\n 400: new Color(0xFFFF7043),\r\n 500: new Color(0xFFFF5722),\r\n 600: new Color(0xFFF4511E),\r\n 700: new Color(0xFFE64A19),\r\n 800: new Color(0xFFD84315),\r\n 900: new Color(0xFFBF360C)\r\n });\r\n\r\n static deepOrangeAccent = new MaterialAccentColor(0xFFFF6E40, {\r\n 100: new Color(0xFFFF9E80),\r\n 200: new Color(0xFFFF6E40),\r\n 400: new Color(0xFFFF3D00),\r\n 700: new Color(0xFFDD2C00)\r\n });\r\n\r\n // BROWN\r\n static brown = new MaterialColor(0xFF795548, {\r\n 50: new Color(0xFFEFEBE9),\r\n 100: new Color(0xFFD7CCC8),\r\n 200: new Color(0xFFBCAAA4),\r\n 300: new Color(0xFFA1887F),\r\n 400: new Color(0xFF8D6E63),\r\n 500: new Color(0xFF795548),\r\n 600: new Color(0xFF6D4C41),\r\n 700: new Color(0xFF5D4037),\r\n 800: new Color(0xFF4E342E),\r\n 900: new Color(0xFF3E2723)\r\n });\r\n\r\n // GREY\r\n static grey = new MaterialColor(0xFF9E9E9E, {\r\n 50: new Color(0xFFFAFAFA),\r\n 100: new Color(0xFFF5F5F5),\r\n 200: new Color(0xFFEEEEEE),\r\n 300: new Color(0xFFE0E0E0),\r\n 350: new Color(0xFFD6D6D6),\r\n 400: new Color(0xFFBDBDBD),\r\n 500: new Color(0xFF9E9E9E),\r\n 600: new Color(0xFF757575),\r\n 700: new Color(0xFF616161),\r\n 800: new Color(0xFF424242),\r\n 850: new Color(0xFF303030),\r\n 900: new Color(0xFF212121)\r\n });\r\n\r\n // BLUE GREY\r\n static blueGrey = new MaterialColor(0xFF607D8B, {\r\n 50: new Color(0xFFECEFF1),\r\n 100: new Color(0xFFCFD8DC),\r\n 200: new Color(0xFFB0BEC5),\r\n 300: new Color(0xFF90A4AE),\r\n 400: new Color(0xFF78909C),\r\n 500: new Color(0xFF607D8B),\r\n 600: new Color(0xFF546E7A),\r\n 700: new Color(0xFF455A64),\r\n 800: new Color(0xFF37474F),\r\n 900: new Color(0xFF263238)\r\n });\r\n\r\n /**\r\n * All primary material colors\r\n */\r\n static get primaries() {\r\n return [\r\n Colors.red,\r\n Colors.pink,\r\n Colors.purple,\r\n Colors.deepPurple,\r\n Colors.indigo,\r\n Colors.blue,\r\n Colors.lightBlue,\r\n Colors.cyan,\r\n Colors.teal,\r\n Colors.green,\r\n Colors.lightGreen,\r\n Colors.lime,\r\n Colors.yellow,\r\n Colors.amber,\r\n Colors.orange,\r\n Colors.deepOrange,\r\n Colors.brown,\r\n Colors.blueGrey\r\n ];\r\n }\r\n\r\n /**\r\n * All accent colors\r\n */\r\n static get accents() {\r\n return [\r\n Colors.redAccent,\r\n Colors.pinkAccent,\r\n Colors.purpleAccent,\r\n Colors.deepPurpleAccent,\r\n Colors.indigoAccent,\r\n Colors.blueAccent,\r\n Colors.lightBlueAccent,\r\n Colors.cyanAccent,\r\n Colors.tealAccent,\r\n Colors.greenAccent,\r\n Colors.lightGreenAccent,\r\n Colors.limeAccent,\r\n Colors.yellowAccent,\r\n Colors.amberAccent,\r\n Colors.orangeAccent,\r\n Colors.deepOrangeAccent\r\n ];\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n Color,\r\n ColorSwatch,\r\n MaterialColor,\r\n MaterialAccentColor,\r\n Colors\r\n};"], - "mappings": "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", - "names": ["Color", "value", "alpha", "red", "green", "blue", "opacity", "a", "b", "t", "other", "ColorSwatch", "primary", "swatch", "shade", "MaterialColor", "index", "MaterialAccentColor", "_Colors", "__publicField", "Colors"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/color_scheme.js b/packages/flutterjs_engine/package/material/dist/material/color_scheme.js deleted file mode 100644 index 41ccb648..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/color_scheme.js +++ /dev/null @@ -1,2 +0,0 @@ -import"./color.js";class e{constructor({brightness:i,primary:a,onPrimary:o,primaryContainer:t,onPrimaryContainer:s,secondary:u,onSecondary:c,secondaryContainer:l,onSecondaryContainer:F,tertiary:y,onTertiary:C,tertiaryContainer:d,onTertiaryContainer:h,error:E,onError:f,errorContainer:S,onErrorContainer:m,background:D,onBackground:B,surface:g,onSurface:k,surfaceVariant:v,onSurfaceVariant:V,outline:T,outlineVariant:P,shadow:p,scrim:w,inverseSurface:A,onInverseSurface:b,inversePrimary:I,surfaceTint:x}){this.brightness=i,this.primary=a,this.onPrimary=o,this.primaryContainer=t,this.onPrimaryContainer=s,this.secondary=u,this.onSecondary=c,this.secondaryContainer=l,this.onSecondaryContainer=F,this.tertiary=y,this.onTertiary=C,this.tertiaryContainer=d,this.onTertiaryContainer=h,this.error=E,this.onError=f,this.errorContainer=S,this.onErrorContainer=m,this.background=D,this.onBackground=B,this.surface=g,this.onSurface=k,this.surfaceVariant=v,this.onSurfaceVariant=V,this.outline=T,this.outlineVariant=P,this.shadow=p,this.scrim=w,this.inverseSurface=A,this.onInverseSurface=b,this.inversePrimary=I,this.surfaceTint=x}static fromSeed({seedColor:i,brightness:a="light",primary:o=null,onPrimary:t=null,primaryContainer:s=null,onPrimaryContainer:u=null,secondary:c=null,onSecondary:l=null,secondaryContainer:F=null,onSecondaryContainer:y=null,tertiary:C=null,onTertiary:d=null,tertiaryContainer:h=null,onTertiaryContainer:E=null,error:f=null,onError:S=null,errorContainer:m=null,onErrorContainer:D=null,background:B=null,onBackground:g=null,surface:k=null,onSurface:v=null,surfaceVariant:V=null,onSurfaceVariant:T=null,outline:P=null,outlineVariant:p=null,shadow:w=null,scrim:A=null,inverseSurface:b=null,onInverseSurface:I=null,inversePrimary:x=null,surfaceTint:j=null}){const O=a==="dark",r=O?this.dark():this.light(),n=i||r.primary;return new e({brightness:a,primary:o||n,onPrimary:t||(O?"#000000":"#FFFFFF"),primaryContainer:s||n.withOpacity(.2),onPrimaryContainer:u||n,secondary:c||r.secondary,onSecondary:l||r.onSecondary,secondaryContainer:F||r.secondaryContainer,onSecondaryContainer:y||r.onSecondaryContainer,tertiary:C||r.tertiary,onTertiary:d||r.onTertiary,tertiaryContainer:h||r.tertiaryContainer,onTertiaryContainer:E||r.onTertiaryContainer,error:f||r.error,onError:S||r.onError,errorContainer:m||r.errorContainer,onErrorContainer:D||r.onErrorContainer,background:B||r.background,onBackground:g||r.onBackground,surface:k||r.surface,onSurface:v||r.onSurface,surfaceVariant:V||r.surfaceVariant,onSurfaceVariant:T||r.onSurfaceVariant,outline:P||r.outline,outlineVariant:p||r.outlineVariant,shadow:w||r.shadow,scrim:A||r.scrim,inverseSurface:b||r.inverseSurface,onInverseSurface:I||r.onInverseSurface,inversePrimary:x||(O?n:"#D0BCFF"),surfaceTint:j||n})}static light(){return new e({brightness:"light",primary:"#6750A4",onPrimary:"#FFFFFF",primaryContainer:"#EADDFF",onPrimaryContainer:"#21005D",secondary:"#625B71",onSecondary:"#FFFFFF",secondaryContainer:"#E8DEF8",onSecondaryContainer:"#1D192B",tertiary:"#7D5260",onTertiary:"#FFFFFF",tertiaryContainer:"#FFD8E4",onTertiaryContainer:"#31111D",error:"#B3261E",onError:"#FFFFFF",errorContainer:"#F9DEDC",onErrorContainer:"#410E0B",background:"#FFFBFE",onBackground:"#1C1B1F",surface:"#FFFBFE",onSurface:"#1C1B1F",surfaceVariant:"#E7E0EC",onSurfaceVariant:"#49454F",outline:"#79747E",outlineVariant:"#CAC4D0",shadow:"#000000",scrim:"#000000",inverseSurface:"#313033",onInverseSurface:"#F4EFF4",inversePrimary:"#D0BCFF",surfaceTint:"#6750A4"})}static dark(){return new e({brightness:"dark",primary:"#D0BCFF",onPrimary:"#381E72",primaryContainer:"#4F378B",onPrimaryContainer:"#EADDFF",secondary:"#CCC2DC",onSecondary:"#332D41",secondaryContainer:"#4A4458",onSecondaryContainer:"#E8DEF8",tertiary:"#EFB8C8",onTertiary:"#492532",tertiaryContainer:"#633B48",onTertiaryContainer:"#FFD8E4",error:"#F2B8B5",onError:"#601410",errorContainer:"#8C1D18",onErrorContainer:"#F9DEDC",background:"#1C1B1F",onBackground:"#E6E1E5",surface:"#1C1B1F",onSurface:"#E6E1E5",surfaceVariant:"#49454F",onSurfaceVariant:"#CAC4D0",outline:"#938F99",outlineVariant:"#49454F",shadow:"#000000",scrim:"#000000",inverseSurface:"#E6E1E5",onInverseSurface:"#313033",inversePrimary:"#6750A4",surfaceTint:"#D0BCFF"})}}export{e as ColorScheme}; -//# sourceMappingURL=color_scheme.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/color_scheme.js.map b/packages/flutterjs_engine/package/material/dist/material/color_scheme.js.map deleted file mode 100644 index 4936fb0a..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/color_scheme.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/color_scheme.js"], - "sourcesContent": ["\r\nimport { Colors } from './color.js';\r\n\r\n// ============================================================================\r\n// COLOR SCHEME\r\n// ============================================================================\r\n\r\nexport class ColorScheme {\r\n constructor({\r\n brightness,\r\n primary,\r\n onPrimary,\r\n primaryContainer,\r\n onPrimaryContainer,\r\n secondary,\r\n onSecondary,\r\n secondaryContainer,\r\n onSecondaryContainer,\r\n tertiary,\r\n onTertiary,\r\n tertiaryContainer,\r\n onTertiaryContainer,\r\n error,\r\n onError,\r\n errorContainer,\r\n onErrorContainer,\r\n background,\r\n onBackground,\r\n surface,\r\n onSurface,\r\n surfaceVariant,\r\n onSurfaceVariant,\r\n outline,\r\n outlineVariant,\r\n shadow,\r\n scrim,\r\n inverseSurface,\r\n onInverseSurface,\r\n inversePrimary,\r\n surfaceTint,\r\n }) {\r\n this.brightness = brightness;\r\n this.primary = primary;\r\n this.onPrimary = onPrimary;\r\n this.primaryContainer = primaryContainer;\r\n this.onPrimaryContainer = onPrimaryContainer;\r\n this.secondary = secondary;\r\n this.onSecondary = onSecondary;\r\n this.secondaryContainer = secondaryContainer;\r\n this.onSecondaryContainer = onSecondaryContainer;\r\n this.tertiary = tertiary;\r\n this.onTertiary = onTertiary;\r\n this.tertiaryContainer = tertiaryContainer;\r\n this.onTertiaryContainer = onTertiaryContainer;\r\n this.error = error;\r\n this.onError = onError;\r\n this.errorContainer = errorContainer;\r\n this.onErrorContainer = onErrorContainer;\r\n this.background = background;\r\n this.onBackground = onBackground;\r\n this.surface = surface;\r\n this.onSurface = onSurface;\r\n this.surfaceVariant = surfaceVariant;\r\n this.onSurfaceVariant = onSurfaceVariant;\r\n this.outline = outline;\r\n this.outlineVariant = outlineVariant;\r\n this.shadow = shadow;\r\n this.scrim = scrim;\r\n this.inverseSurface = inverseSurface;\r\n this.onInverseSurface = onInverseSurface;\r\n this.inversePrimary = inversePrimary;\r\n this.surfaceTint = surfaceTint;\r\n }\r\n\r\n static fromSeed({\r\n seedColor,\r\n brightness = 'light',\r\n primary = null,\r\n onPrimary = null,\r\n primaryContainer = null,\r\n onPrimaryContainer = null,\r\n secondary = null,\r\n onSecondary = null,\r\n secondaryContainer = null,\r\n onSecondaryContainer = null,\r\n tertiary = null,\r\n onTertiary = null,\r\n tertiaryContainer = null,\r\n onTertiaryContainer = null,\r\n error = null,\r\n onError = null,\r\n errorContainer = null,\r\n onErrorContainer = null,\r\n background = null,\r\n onBackground = null,\r\n surface = null,\r\n onSurface = null,\r\n surfaceVariant = null,\r\n onSurfaceVariant = null,\r\n outline = null,\r\n outlineVariant = null,\r\n shadow = null,\r\n scrim = null,\r\n inverseSurface = null,\r\n onInverseSurface = null,\r\n inversePrimary = null,\r\n surfaceTint = null,\r\n }) {\r\n // simplified implementation of material 3 color generation\r\n const isDark = brightness === 'dark';\r\n\r\n // Core palette generation (mocked for now)\r\n const defaults = isDark ? this.dark() : this.light();\r\n\r\n // If seed color is provided, we should ideally generate palette\r\n // For now we'll just use the seed as primary and derive rough variants\r\n\r\n const derivedPrimary = seedColor || defaults.primary;\r\n\r\n return new ColorScheme({\r\n brightness,\r\n primary: primary || derivedPrimary,\r\n onPrimary: onPrimary || (isDark ? '#000000' : '#FFFFFF'),\r\n primaryContainer: primaryContainer || derivedPrimary.withOpacity(0.2),\r\n onPrimaryContainer: onPrimaryContainer || derivedPrimary,\r\n\r\n secondary: secondary || defaults.secondary,\r\n onSecondary: onSecondary || defaults.onSecondary,\r\n secondaryContainer: secondaryContainer || defaults.secondaryContainer,\r\n onSecondaryContainer: onSecondaryContainer || defaults.onSecondaryContainer,\r\n\r\n tertiary: tertiary || defaults.tertiary,\r\n onTertiary: onTertiary || defaults.onTertiary,\r\n tertiaryContainer: tertiaryContainer || defaults.tertiaryContainer,\r\n onTertiaryContainer: onTertiaryContainer || defaults.onTertiaryContainer,\r\n\r\n error: error || defaults.error,\r\n onError: onError || defaults.onError,\r\n errorContainer: errorContainer || defaults.errorContainer,\r\n onErrorContainer: onErrorContainer || defaults.onErrorContainer,\r\n\r\n background: background || defaults.background,\r\n onBackground: onBackground || defaults.onBackground,\r\n\r\n surface: surface || defaults.surface,\r\n onSurface: onSurface || defaults.onSurface,\r\n surfaceVariant: surfaceVariant || defaults.surfaceVariant,\r\n onSurfaceVariant: onSurfaceVariant || defaults.onSurfaceVariant,\r\n\r\n outline: outline || defaults.outline,\r\n outlineVariant: outlineVariant || defaults.outlineVariant,\r\n\r\n shadow: shadow || defaults.shadow,\r\n scrim: scrim || defaults.scrim,\r\n\r\n inverseSurface: inverseSurface || defaults.inverseSurface,\r\n onInverseSurface: onInverseSurface || defaults.onInverseSurface,\r\n inversePrimary: inversePrimary || (isDark ? derivedPrimary : '#D0BCFF'), // Mock inverse\r\n surfaceTint: surfaceTint || derivedPrimary,\r\n });\r\n }\r\n\r\n static light() {\r\n return new ColorScheme({\r\n brightness: 'light',\r\n primary: '#6750A4',\r\n onPrimary: '#FFFFFF',\r\n primaryContainer: '#EADDFF',\r\n onPrimaryContainer: '#21005D',\r\n secondary: '#625B71',\r\n onSecondary: '#FFFFFF',\r\n secondaryContainer: '#E8DEF8',\r\n onSecondaryContainer: '#1D192B',\r\n tertiary: '#7D5260',\r\n onTertiary: '#FFFFFF',\r\n tertiaryContainer: '#FFD8E4',\r\n onTertiaryContainer: '#31111D',\r\n error: '#B3261E',\r\n onError: '#FFFFFF',\r\n errorContainer: '#F9DEDC',\r\n onErrorContainer: '#410E0B',\r\n background: '#FFFBFE',\r\n onBackground: '#1C1B1F',\r\n surface: '#FFFBFE',\r\n onSurface: '#1C1B1F',\r\n surfaceVariant: '#E7E0EC',\r\n onSurfaceVariant: '#49454F',\r\n outline: '#79747E',\r\n outlineVariant: '#CAC4D0',\r\n shadow: '#000000',\r\n scrim: '#000000',\r\n inverseSurface: '#313033',\r\n onInverseSurface: '#F4EFF4',\r\n inversePrimary: '#D0BCFF',\r\n surfaceTint: '#6750A4',\r\n });\r\n }\r\n\r\n static dark() {\r\n return new ColorScheme({\r\n brightness: 'dark',\r\n primary: '#D0BCFF',\r\n onPrimary: '#381E72',\r\n primaryContainer: '#4F378B',\r\n onPrimaryContainer: '#EADDFF',\r\n secondary: '#CCC2DC',\r\n onSecondary: '#332D41',\r\n secondaryContainer: '#4A4458',\r\n onSecondaryContainer: '#E8DEF8',\r\n tertiary: '#EFB8C8',\r\n onTertiary: '#492532',\r\n tertiaryContainer: '#633B48',\r\n onTertiaryContainer: '#FFD8E4',\r\n error: '#F2B8B5',\r\n onError: '#601410',\r\n errorContainer: '#8C1D18',\r\n onErrorContainer: '#F9DEDC',\r\n background: '#1C1B1F',\r\n onBackground: '#E6E1E5',\r\n surface: '#1C1B1F',\r\n onSurface: '#E6E1E5',\r\n surfaceVariant: '#49454F',\r\n onSurfaceVariant: '#CAC4D0',\r\n outline: '#938F99',\r\n outlineVariant: '#49454F',\r\n shadow: '#000000',\r\n scrim: '#000000',\r\n inverseSurface: '#E6E1E5',\r\n onInverseSurface: '#313033',\r\n inversePrimary: '#6750A4',\r\n surfaceTint: '#D0BCFF',\r\n });\r\n }\r\n}\r\n"], - "mappings": "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", - "names": ["ColorScheme", "brightness", "primary", "onPrimary", "primaryContainer", "onPrimaryContainer", "secondary", "onSecondary", "secondaryContainer", "onSecondaryContainer", "tertiary", "onTertiary", "tertiaryContainer", "onTertiaryContainer", "error", "onError", "errorContainer", "onErrorContainer", "background", "onBackground", "surface", "onSurface", "surfaceVariant", "onSurfaceVariant", "outline", "outlineVariant", "shadow", "scrim", "inverseSurface", "onInverseSurface", "inversePrimary", "surfaceTint", "seedColor", "isDark", "defaults", "derivedPrimary"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/container.js b/packages/flutterjs_engine/package/material/dist/material/container.js deleted file mode 100644 index e0a14a2f..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/container.js +++ /dev/null @@ -1,2 +0,0 @@ -import{Widget as E,StatelessWidget as m}from"../core/widget_element.js";import{Element as k}from"@flutterjs/runtime";import{VNode as C}from"@flutterjs/vdom/vnode";import{Clip as f}from"../utils/utils.js";import{Padding as p}from"../widgets/widgets.js";import{EdgeInsets as P}from"../utils/edge_insets.js";import{BoxConstraints as b}from"../utils/box_constraints.js";import{Align as j}from"../widgets/compoment/center.js";import{ClipPath as I}from"../widgets/compoment/clip.js";import{ConstrainedBox as w,LimitedBox as O}from"../widgets/compoment/sized_box.js";import{Transform as A}from"../widgets/compoment/transform.js";const a={background:"background",foreground:"foreground"};class c{constructor(){if(new.target===c)throw new Error("Decoration is abstract");this.padding=new P(0,0,0,0)}toCSSStyle(){throw new Error("toCSSStyle() must be implemented")}debugAssertIsValid(){return!0}}class x extends c{constructor({color:i=null,image:t=null,border:e=null,borderRadius:n=null,boxShadow:o=[],gradient:s=null,backgroundBlendMode:r=null,shape:d="rectangle"}={}){super(),this.color=i,this.image=t,this.border=e,this.borderRadius=n,this.boxShadow=o,this.gradient=s,this.backgroundBlendMode=r,this.shape=d}toCSSStyle(){const i={};if(this.color&&(i.backgroundColor=this.color),this.borderRadius)if(typeof this.borderRadius=="number")i.borderRadius=`${this.borderRadius}px`;else if(this.borderRadius.all!==void 0)i.borderRadius=`${this.borderRadius.all}px`;else{const{topLeft:t=0,topRight:e=0,bottomLeft:n=0,bottomRight:o=0}=this.borderRadius;i.borderRadius=`${t}px ${e}px ${o}px ${n}px`}if(this.border&&typeof this.border=="object"){const{width:t=1,color:e="black",style:n="solid"}=this.border;i.border=`${t}px ${n} ${e}`}if(this.boxShadow&&this.boxShadow.length>0&&(i.boxShadow=this.boxShadow.map(t=>{const{offsetX:e=0,offsetY:n=0,blurRadius:o=0,spreadRadius:s=0,color:r="rgba(0,0,0,0.5)"}=t;return`${e}px ${n}px ${o}px ${s}px ${r}`}).join(", ")),this.gradient){const{type:t="linear",colors:e=[],stops:n=[]}=this.gradient;if(t==="linear"){const o=e.map((s,r)=>`${s} ${(n[r]||r/e.length)*100}%`).join(", ");i.background=`linear-gradient(135deg, ${o})`}}return this.backgroundBlendMode&&(i.mixBlendMode=this.backgroundBlendMode),i}}class R extends m{constructor({key:i=null,color:t="white",child:e=null}={}){super(i),this.color=t,this.child=e}build(i){return new h({decoration:new x({color:this.color}),child:this.child})}}class S{constructor({decoration:i=null,position:t=a.background,configuration:e={}}={}){this.decoration=i,this.position=t,this.configuration=e}debugInfo(){return{type:"RenderDecoratedBox",position:this.position,hasDecoration:!!this.decoration}}}class h extends E{constructor({key:i=null,decoration:t=null,position:e=a.background,child:n=null}={}){if(super(i),!t)throw new Error("DecoratedBox requires a decoration");this.decoration=t,this.position=e,this.child=n,this._renderObject=null}createRenderObject(i){return new S({decoration:this.decoration,position:this.position,configuration:{}})}updateRenderObject(i,t){t.decoration=this.decoration,t.position=this.position}build(i){this._renderObject?this.updateRenderObject(i,this._renderObject):this._renderObject=this.createRenderObject(i);const t=i.element.getElementId(),e=i.element.getWidgetPath();let n=null;if(this.child){const r=this.child.createElement(i.element,i.element.runtime);r.mount(i.element),n=r.performRebuild()}const s={position:"relative",...this.decoration.toCSSStyle()};return new C({tag:"div",props:{style:s,"data-element-id":t,"data-widget-path":e,"data-widget":"DecoratedBox","data-position":this.position},children:n?[n]:[],key:this.key})}debugFillProperties(i){super.debugFillProperties(i);const t=this.position===a.background?"bg":"fg";i.push({name:t,value:this.decoration})}createElement(i,t){return new v(this,i,t)}}class v extends k{performRebuild(){return this.widget.build(this.context)}}class N extends m{constructor({key:i=null,alignment:t=null,padding:e=null,color:n=null,decoration:o=null,foregroundDecoration:s=null,width:r=null,height:d=null,constraints:g=null,margin:u=null,transform:B=null,transformAlignment:D=null,child:$=null,clipBehavior:y=f.none}={}){if(super(i),e!==null&&!e.isNonNegative)throw new Error("padding must be non-negative");if(u!==null&&!u.isNonNegative)throw new Error("margin must be non-negative");if(n!==null&&o!==null)throw new Error("Cannot provide both color and decoration. Use BoxDecoration(color: color).");if(o!==null&&!o.debugAssertIsValid())throw new Error("decoration is not valid");this.alignment=t,this.padding=e,this.color=n,this.decoration=o,this.foregroundDecoration=s,this.margin=u,this.transform=B,this.transformAlignment=D,this.child=$,this.clipBehavior=y,r!==null||d!==null?this.constraints=g?.tighten({width:r,height:d})||b.tightFor({width:r,height:d}):this.constraints=g}_getPaddingIncludingDecoration(){return this.padding===null?this.decoration?.padding:this.decoration?.padding===null||this.decoration?.padding===void 0?this.padding:this.padding.add(this.decoration.padding)}build(i){let t=this.child;this.child===null&&(this.constraints===null||!this.constraints.isTight)?t=new O({maxWidth:0,maxHeight:0,child:new w({constraints:b.expand()})}):this.alignment!==null&&(t=new j({alignment:this.alignment,child:t}));const e=this._getPaddingIncludingDecoration();return e!=null&&(t=new p({padding:e,child:t})),this.color!==null&&(t=new R({color:this.color,child:t})),this.clipBehavior!==f.none&&this.decoration!==null&&(t=new I({clipBehavior:this.clipBehavior,child:t})),this.decoration!==null&&(t=new h({decoration:this.decoration,child:t})),this.foregroundDecoration!==null&&(t=new h({decoration:this.foregroundDecoration,position:a.foreground,child:t})),this.constraints!==null&&(t=new w({constraints:this.constraints,child:t})),this.margin!==null&&(t=new p({padding:this.margin,child:t})),this.transform!==null&&(t=new A({transform:this.transform,alignment:this.transformAlignment,child:t})),t}debugFillProperties(i){super.debugFillProperties(i),this.alignment!==null&&i.push({name:"alignment",value:this.alignment}),this.padding!==null&&i.push({name:"padding",value:this.padding}),this.color!==null?i.push({name:"bg",value:this.color}):this.decoration!==null&&i.push({name:"bg",value:this.decoration}),this.foregroundDecoration!==null&&i.push({name:"fg",value:this.foregroundDecoration}),this.constraints!==null&&i.push({name:"constraints",value:this.constraints}),this.margin!==null&&i.push({name:"margin",value:this.margin})}}export{x as BoxDecoration,R as ColoredBox,N as Container,h as DecoratedBox,v as DecoratedBoxElement,c as Decoration,a as DecorationPosition,S as RenderDecoratedBox}; -//# sourceMappingURL=container.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/container.js.map b/packages/flutterjs_engine/package/material/dist/material/container.js.map deleted file mode 100644 index f8a374c3..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/container.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/container.js"], - "sourcesContent": ["import { Widget, StatelessWidget } from '../core/widget_element.js';\r\nimport { Element } from \"@flutterjs/runtime\"\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\nimport { Clip, TextDirection, Alignment } from '../utils/utils.js';\r\nimport { Padding } from '../widgets/widgets.js';\r\nimport { EdgeInsets } from '../utils/edge_insets.js';\r\nimport { BoxConstraints } from '../utils/box_constraints.js';\r\nimport { Align } from '../widgets/compoment/center.js'; // Align is exported from center.js based on previous readings\r\nimport { ClipPath } from '../widgets/compoment/clip.js';\r\nimport { ConstrainedBox, LimitedBox } from '../widgets/compoment/sized_box.js';\r\nimport { Transform } from '../widgets/compoment/transform.js';\r\n\r\n\r\n\r\n// ============================================================================\r\n// ENUMS\r\n// ============================================================================\r\n\r\nconst DecorationPosition = {\r\n background: 'background',\r\n foreground: 'foreground'\r\n};\r\n\r\n// ============================================================================\r\n// EDGE INSETS\r\n// ============================================================================\r\n\r\n\r\n\r\n// ============================================================================\r\n// BOX CONSTRAINTS\r\n// ============================================================================\r\n\r\n\r\n\r\n// ============================================================================\r\n// DECORATION\r\n// ============================================================================\r\n\r\nclass Decoration {\r\n constructor() {\r\n if (new.target === Decoration) {\r\n throw new Error('Decoration is abstract');\r\n }\r\n this.padding = new EdgeInsets(0, 0, 0, 0);\r\n }\r\n\r\n /**\r\n * Convert to CSS\r\n */\r\n toCSSStyle() {\r\n throw new Error('toCSSStyle() must be implemented');\r\n }\r\n\r\n /**\r\n * Debug validation\r\n */\r\n debugAssertIsValid() {\r\n return true;\r\n }\r\n}\r\n\r\nclass BoxDecoration extends Decoration {\r\n constructor({\r\n color = null,\r\n image = null,\r\n border = null,\r\n borderRadius = null,\r\n boxShadow = [],\r\n gradient = null,\r\n backgroundBlendMode = null,\r\n shape = 'rectangle'\r\n } = {}) {\r\n super();\r\n\r\n this.color = color;\r\n this.image = image;\r\n this.border = border;\r\n this.borderRadius = borderRadius;\r\n this.boxShadow = boxShadow;\r\n this.gradient = gradient;\r\n this.backgroundBlendMode = backgroundBlendMode;\r\n this.shape = shape;\r\n }\r\n\r\n toCSSStyle() {\r\n const style = {};\r\n\r\n if (this.color) {\r\n style.backgroundColor = this.color;\r\n }\r\n\r\n if (this.borderRadius) {\r\n if (typeof this.borderRadius === 'number') {\r\n style.borderRadius = `${this.borderRadius}px`;\r\n } else if (this.borderRadius.all !== undefined) {\r\n style.borderRadius = `${this.borderRadius.all}px`;\r\n } else {\r\n const { topLeft = 0, topRight = 0, bottomLeft = 0, bottomRight = 0 } = this.borderRadius;\r\n style.borderRadius = `${topLeft}px ${topRight}px ${bottomRight}px ${bottomLeft}px`;\r\n }\r\n }\r\n\r\n if (this.border) {\r\n if (typeof this.border === 'object') {\r\n const { width = 1, color = 'black', style: borderStyle = 'solid' } = this.border;\r\n style.border = `${width}px ${borderStyle} ${color}`;\r\n }\r\n }\r\n\r\n if (this.boxShadow && this.boxShadow.length > 0) {\r\n style.boxShadow = this.boxShadow\r\n .map(shadow => {\r\n const { offsetX = 0, offsetY = 0, blurRadius = 0, spreadRadius = 0, color = 'rgba(0,0,0,0.5)' } = shadow;\r\n return `${offsetX}px ${offsetY}px ${blurRadius}px ${spreadRadius}px ${color}`;\r\n })\r\n .join(', ');\r\n }\r\n\r\n if (this.gradient) {\r\n const { type = 'linear', colors = [], stops = [] } = this.gradient;\r\n if (type === 'linear') {\r\n const colorStops = colors.map((c, i) => `${c} ${(stops[i] || (i / colors.length)) * 100}%`).join(', ');\r\n style.background = `linear-gradient(135deg, ${colorStops})`;\r\n }\r\n }\r\n\r\n if (this.backgroundBlendMode) {\r\n style.mixBlendMode = this.backgroundBlendMode;\r\n }\r\n\r\n return style;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// COLORED BOX WIDGET\r\n// ============================================================================\r\n\r\nclass ColoredBox extends StatelessWidget {\r\n constructor({\r\n key = null,\r\n color = 'white',\r\n child = null\r\n } = {}) {\r\n super(key);\r\n\r\n this.color = color;\r\n this.child = child;\r\n }\r\n\r\n build(context) {\r\n return new DecoratedBox({\r\n decoration: new BoxDecoration({ color: this.color }),\r\n child: this.child\r\n });\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// RENDER DECORATED BOX\r\n// ============================================================================\r\n\r\nclass RenderDecoratedBox {\r\n constructor({\r\n decoration = null,\r\n position = DecorationPosition.background,\r\n configuration = {}\r\n } = {}) {\r\n this.decoration = decoration;\r\n this.position = position;\r\n this.configuration = configuration;\r\n }\r\n\r\n debugInfo() {\r\n return {\r\n type: 'RenderDecoratedBox',\r\n position: this.position,\r\n hasDecoration: !!this.decoration\r\n };\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// DECORATED BOX WIDGET\r\n// ============================================================================\r\n\r\nclass DecoratedBox extends Widget {\r\n constructor({\r\n key = null,\r\n decoration = null,\r\n position = DecorationPosition.background,\r\n child = null\r\n } = {}) {\r\n super(key);\r\n\r\n if (!decoration) {\r\n throw new Error('DecoratedBox requires a decoration');\r\n }\r\n\r\n this.decoration = decoration;\r\n this.position = position;\r\n this.child = child;\r\n this._renderObject = null;\r\n }\r\n\r\n /**\r\n * Create render object\r\n */\r\n createRenderObject(context) {\r\n return new RenderDecoratedBox({\r\n decoration: this.decoration,\r\n position: this.position,\r\n configuration: {}\r\n });\r\n }\r\n\r\n /**\r\n * Update render object\r\n */\r\n updateRenderObject(context, renderObject) {\r\n renderObject.decoration = this.decoration;\r\n renderObject.position = this.position;\r\n }\r\n\r\n /**\r\n * Build widget tree\r\n */\r\n build(context) {\r\n if (!this._renderObject) {\r\n this._renderObject = this.createRenderObject(context);\r\n } else {\r\n this.updateRenderObject(context, this._renderObject);\r\n }\r\n\r\n const elementId = context.element.getElementId();\r\n const widgetPath = context.element.getWidgetPath();\r\n\r\n let childVNode = null;\r\n if (this.child) {\r\n const childElement = this.child.createElement(context.element, context.element.runtime);\r\n childElement.mount(context.element);\r\n childVNode = childElement.performRebuild();\r\n }\r\n\r\n const decorationStyle = this.decoration.toCSSStyle();\r\n\r\n const style = {\r\n position: 'relative',\r\n ...decorationStyle\r\n };\r\n\r\n return new VNode({\r\n tag: 'div',\r\n props: {\r\n style,\r\n 'data-element-id': elementId,\r\n 'data-widget-path': widgetPath,\r\n 'data-widget': 'DecoratedBox',\r\n 'data-position': this.position\r\n },\r\n children: childVNode ? [childVNode] : [],\r\n key: this.key\r\n });\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n const label = this.position === DecorationPosition.background ? 'bg' : 'fg';\r\n properties.push({ name: label, value: this.decoration });\r\n }\r\n\r\n createElement(parent, runtime) {\r\n return new DecoratedBoxElement(this, parent, runtime);\r\n }\r\n}\r\n\r\nclass DecoratedBoxElement extends Element {\r\n performRebuild() {\r\n return this.widget.build(this.context);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// CONTAINER WIDGET\r\n// ============================================================================\r\n\r\nclass Container extends StatelessWidget {\r\n constructor({\r\n key = null,\r\n alignment = null,\r\n padding = null,\r\n color = null,\r\n decoration = null,\r\n foregroundDecoration = null,\r\n width = null,\r\n height = null,\r\n constraints = null,\r\n margin = null,\r\n transform = null,\r\n transformAlignment = null,\r\n child = null,\r\n clipBehavior = Clip.none\r\n } = {}) {\r\n super(key);\r\n\r\n // Validation\r\n if (padding !== null && !padding.isNonNegative) {\r\n throw new Error('padding must be non-negative');\r\n }\r\n if (margin !== null && !margin.isNonNegative) {\r\n throw new Error('margin must be non-negative');\r\n }\r\n if (color !== null && decoration !== null) {\r\n throw new Error('Cannot provide both color and decoration. Use BoxDecoration(color: color).');\r\n }\r\n if (decoration !== null && !decoration.debugAssertIsValid()) {\r\n throw new Error('decoration is not valid');\r\n }\r\n\r\n this.alignment = alignment;\r\n this.padding = padding;\r\n this.color = color;\r\n this.decoration = decoration;\r\n this.foregroundDecoration = foregroundDecoration;\r\n this.margin = margin;\r\n this.transform = transform;\r\n this.transformAlignment = transformAlignment;\r\n this.child = child;\r\n this.clipBehavior = clipBehavior;\r\n\r\n // Apply width/height to constraints\r\n if (width !== null || height !== null) {\r\n this.constraints = constraints?.tighten({ width, height }) ||\r\n BoxConstraints.tightFor({ width, height });\r\n } else {\r\n this.constraints = constraints;\r\n }\r\n }\r\n\r\n /**\r\n * Get effective padding including decoration padding\r\n * @private\r\n */\r\n _getPaddingIncludingDecoration() {\r\n if (this.padding === null) {\r\n return this.decoration?.padding;\r\n }\r\n if (this.decoration?.padding === null || this.decoration?.padding === undefined) {\r\n return this.padding;\r\n }\r\n return this.padding.add(this.decoration.padding);\r\n }\r\n\r\n /**\r\n * Build widget tree\r\n */\r\n build(context) {\r\n let current = this.child;\r\n\r\n // Handle empty container\r\n if (this.child === null && (this.constraints === null || !this.constraints.isTight)) {\r\n current = new LimitedBox({\r\n maxWidth: 0,\r\n maxHeight: 0,\r\n child: new ConstrainedBox({\r\n constraints: BoxConstraints.expand()\r\n })\r\n });\r\n } else if (this.alignment !== null) {\r\n current = new Align({\r\n alignment: this.alignment,\r\n child: current\r\n });\r\n }\r\n\r\n // Apply padding\r\n const effectivePadding = this._getPaddingIncludingDecoration();\r\n if (effectivePadding != null) { // != catches both null and undefined\r\n current = new Padding({\r\n padding: effectivePadding,\r\n child: current\r\n });\r\n }\r\n\r\n // Apply color\r\n if (this.color !== null) {\r\n current = new ColoredBox({\r\n color: this.color,\r\n child: current\r\n });\r\n }\r\n\r\n // Apply clipping\r\n if (this.clipBehavior !== Clip.none && this.decoration !== null) {\r\n current = new ClipPath({\r\n clipBehavior: this.clipBehavior,\r\n child: current\r\n });\r\n }\r\n\r\n // Apply decoration\r\n if (this.decoration !== null) {\r\n current = new DecoratedBox({\r\n decoration: this.decoration,\r\n child: current\r\n });\r\n }\r\n\r\n // Apply foreground decoration\r\n if (this.foregroundDecoration !== null) {\r\n current = new DecoratedBox({\r\n decoration: this.foregroundDecoration,\r\n position: DecorationPosition.foreground,\r\n child: current\r\n });\r\n }\r\n\r\n // Apply constraints\r\n if (this.constraints !== null) {\r\n current = new ConstrainedBox({\r\n constraints: this.constraints,\r\n child: current\r\n });\r\n }\r\n\r\n // Apply margin\r\n if (this.margin !== null) {\r\n current = new Padding({\r\n padding: this.margin,\r\n child: current\r\n });\r\n }\r\n\r\n // Apply transform\r\n if (this.transform !== null) {\r\n current = new Transform({\r\n transform: this.transform,\r\n alignment: this.transformAlignment,\r\n child: current\r\n });\r\n }\r\n\r\n return current;\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n if (this.alignment !== null) properties.push({ name: 'alignment', value: this.alignment });\r\n if (this.padding !== null) properties.push({ name: 'padding', value: this.padding });\r\n if (this.color !== null) {\r\n properties.push({ name: 'bg', value: this.color });\r\n } else if (this.decoration !== null) {\r\n properties.push({ name: 'bg', value: this.decoration });\r\n }\r\n if (this.foregroundDecoration !== null) properties.push({ name: 'fg', value: this.foregroundDecoration });\r\n if (this.constraints !== null) properties.push({ name: 'constraints', value: this.constraints });\r\n if (this.margin !== null) properties.push({ name: 'margin', value: this.margin });\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// SUPPORTING WIDGETS (Placeholder implementations)\r\n// ============================================================================\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n Container,\r\n DecoratedBox,\r\n DecoratedBoxElement,\r\n RenderDecoratedBox,\r\n ColoredBox,\r\n BoxDecoration,\r\n Decoration,\r\n DecorationPosition\r\n};"], - "mappings": "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", - "names": ["Widget", "StatelessWidget", "Element", "VNode", "Clip", "Padding", "EdgeInsets", "BoxConstraints", "Align", "ClipPath", "ConstrainedBox", "LimitedBox", "Transform", "DecorationPosition", "Decoration", "BoxDecoration", "color", "image", "border", "borderRadius", "boxShadow", "gradient", "backgroundBlendMode", "shape", "style", "topLeft", "topRight", "bottomLeft", "bottomRight", "width", "borderStyle", "shadow", "offsetX", "offsetY", "blurRadius", "spreadRadius", "type", "colors", "stops", "colorStops", "c", "i", "ColoredBox", "key", "child", "context", "DecoratedBox", "RenderDecoratedBox", "decoration", "position", "configuration", "renderObject", "elementId", "widgetPath", "childVNode", "childElement", "properties", "label", "parent", "runtime", "DecoratedBoxElement", "Container", "alignment", "padding", "foregroundDecoration", "height", "constraints", "margin", "transform", "transformAlignment", "clipBehavior", "current", "effectivePadding"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/elevated_button.js b/packages/flutterjs_engine/package/material/dist/material/elevated_button.js deleted file mode 100644 index c1d01796..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/elevated_button.js +++ /dev/null @@ -1,2 +0,0 @@ -import{ProxyWidget as r,ProxyElement as d}from"../core/widget_element.js";import"@flutterjs/runtime";import{VNode as l}from"@flutterjs/vdom/vnode";import"./gesture_detector.js";class a extends r{constructor({key:e=null,onPressed:t=null,child:s=null,style:n=null}={}){super({key:e,child:s}),this.onPressed=t,this.style=n}createElement(e,t){return new u(this,e,t)}}class u extends d{performRebuild(){const e=this.getElementId(),t=this.getWidgetPath(),s={display:"inline-flex",alignItems:"center",justifyContent:"center",padding:"10px 24px",borderRadius:"20px",backgroundColor:"#6750A4",color:"#FFFFFF",border:"none",cursor:this.widget.onPressed?"pointer":"default",boxShadow:"0 1px 3px rgba(0,0,0,0.3)",transition:"all 0.2s ease",fontSize:"14px",fontWeight:"500",fontFamily:"inherit",textTransform:"uppercase",outline:"none",userSelect:"none",opacity:this.widget.onPressed?1:.6,...this.widget.style},n=super.performRebuild(),o=new l({tag:"button",props:{style:s,type:"button","data-element-id":e,"data-widget-path":t,"data-widget":"ElevatedButton"},children:n?[n]:[],key:this.widget.key});return this.widget.onPressed&&(o.events||(o.events={}),o.events.onClick=this.widget.onPressed),o}}export{a as ElevatedButton}; -//# sourceMappingURL=elevated_button.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/elevated_button.js.map b/packages/flutterjs_engine/package/material/dist/material/elevated_button.js.map deleted file mode 100644 index 01666011..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/elevated_button.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/elevated_button.js"], - "sourcesContent": ["import { ProxyWidget, ProxyElement, StatelessWidget } from '../core/widget_element.js';\r\nimport { Element } from \"@flutterjs/runtime\"\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\nimport { GestureDetector } from './gesture_detector.js';\r\n\r\n// ============================================================================\r\n// ELEVATED BUTTON\r\n// ============================================================================\r\n\r\nclass ElevatedButton extends ProxyWidget {\r\n constructor({\r\n key = null,\r\n onPressed = null,\r\n child = null,\r\n // TODO: support full ButtonStyle, for now simple overrides\r\n style = null\r\n } = {}) {\r\n super({ key, child });\r\n this.onPressed = onPressed;\r\n this.style = style;\r\n }\r\n\r\n createElement(parent, runtime) {\r\n return new ElevatedButtonElement(this, parent, runtime);\r\n }\r\n}\r\n\r\nclass ElevatedButtonElement extends ProxyElement {\r\n performRebuild() {\r\n const elementId = this.getElementId();\r\n const widgetPath = this.getWidgetPath();\r\n\r\n // Basic Material 3 Elevation/Color styles (approximate)\r\n const baseStyle = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: '10px 24px',\r\n borderRadius: '20px',\r\n backgroundColor: '#6750A4', // Primary default\r\n color: '#FFFFFF',\r\n border: 'none',\r\n cursor: this.widget.onPressed ? 'pointer' : 'default',\r\n boxShadow: '0 1px 3px rgba(0,0,0,0.3)',\r\n transition: 'all 0.2s ease',\r\n fontSize: '14px',\r\n fontWeight: '500',\r\n fontFamily: 'inherit',\r\n textTransform: 'uppercase',\r\n outline: 'none',\r\n userSelect: 'none',\r\n opacity: this.widget.onPressed ? 1 : 0.6,\r\n ...this.widget.style\r\n };\r\n\r\n // Get child VNode from parent class (this handles the widget lifecycle)\r\n const childVNode = super.performRebuild();\r\n\r\n // Wrap child VNode in button element\r\n const buttonVNode = new VNode({\r\n tag: 'button',\r\n props: {\r\n style: baseStyle,\r\n type: 'button',\r\n 'data-element-id': elementId,\r\n 'data-widget-path': widgetPath,\r\n 'data-widget': 'ElevatedButton',\r\n },\r\n children: childVNode ? [childVNode] : [],\r\n key: this.widget.key\r\n });\r\n\r\n // If there's an onPressed handler, wrap in GestureDetector\r\n if (this.widget.onPressed) {\r\n // We need to attach the event handler to the button VNode\r\n if (!buttonVNode.events) {\r\n buttonVNode.events = {};\r\n }\r\n buttonVNode.events.onClick = this.widget.onPressed;\r\n }\r\n\r\n return buttonVNode;\r\n }\r\n}\r\n\r\nexport {\r\n ElevatedButton\r\n};\r\n"], - "mappings": "AAAA,OAAS,eAAAA,EAAa,gBAAAC,MAAqC,4BAC3D,MAAwB,qBACxB,OAAS,SAAAC,MAAa,wBACtB,MAAgC,wBAMhC,MAAMC,UAAuBH,CAAY,CACrC,YAAY,CACR,IAAAI,EAAM,KACN,UAAAC,EAAY,KACZ,MAAAC,EAAQ,KAER,MAAAC,EAAQ,IACZ,EAAI,CAAC,EAAG,CACJ,MAAM,CAAE,IAAAH,EAAK,MAAAE,CAAM,CAAC,EACpB,KAAK,UAAYD,EACjB,KAAK,MAAQE,CACjB,CAEA,cAAcC,EAAQC,EAAS,CAC3B,OAAO,IAAIC,EAAsB,KAAMF,EAAQC,CAAO,CAC1D,CACJ,CAEA,MAAMC,UAA8BT,CAAa,CAC7C,gBAAiB,CACb,MAAMU,EAAY,KAAK,aAAa,EAC9BC,EAAa,KAAK,cAAc,EAGhCC,EAAY,CACd,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,QAAS,YACT,aAAc,OACd,gBAAiB,UACjB,MAAO,UACP,OAAQ,OACR,OAAQ,KAAK,OAAO,UAAY,UAAY,UAC5C,UAAW,4BACX,WAAY,gBACZ,SAAU,OACV,WAAY,MACZ,WAAY,UACZ,cAAe,YACf,QAAS,OACT,WAAY,OACZ,QAAS,KAAK,OAAO,UAAY,EAAI,GACrC,GAAG,KAAK,OAAO,KACnB,EAGMC,EAAa,MAAM,eAAe,EAGlCC,EAAc,IAAIb,EAAM,CAC1B,IAAK,SACL,MAAO,CACH,MAAOW,EACP,KAAM,SACN,kBAAmBF,EACnB,mBAAoBC,EACpB,cAAe,gBACnB,EACA,SAAUE,EAAa,CAACA,CAAU,EAAI,CAAC,EACvC,IAAK,KAAK,OAAO,GACrB,CAAC,EAGD,OAAI,KAAK,OAAO,YAEPC,EAAY,SACbA,EAAY,OAAS,CAAC,GAE1BA,EAAY,OAAO,QAAU,KAAK,OAAO,WAGtCA,CACX,CACJ", - "names": ["ProxyWidget", "ProxyElement", "VNode", "ElevatedButton", "key", "onPressed", "child", "style", "parent", "runtime", "ElevatedButtonElement", "elementId", "widgetPath", "baseStyle", "childVNode", "buttonVNode"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/floating_action_button.js b/packages/flutterjs_engine/package/material/dist/material/floating_action_button.js deleted file mode 100644 index 5733e04b..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/floating_action_button.js +++ /dev/null @@ -1,13 +0,0 @@ -import{StatelessWidget as g}from"../core/widget_element.js";import{Element as S}from"@flutterjs/runtime";import{VNode as r}from"@flutterjs/vdom/vnode";import{GestureDetector as b}from"./gesture_detector.js";class x extends g{constructor({key:e=null,onPressed:n=null,onLongPress:o=null,tooltip:l=null,foregroundColor:a="#FFF",backgroundColor:s=null,focusColor:i=null,hoverColor:t=null,splashColor:u=null,elevation:d=6,highlightElevation:p=12,disabledElevation:c=0,child:m=null,mini:v=!1,shape:C=null,clipBehavior:P="clip",autofocus:w=!1,materialTapTargetSize:_=null,isExtended:F=!1,enableFeedback:k=!0,heroTag:E="FloatingActionButton"}={}){if(super(e),!n)throw new Error("FloatingActionButton requires onPressed callback");this.onPressed=n,this.onLongPress=o,this.tooltip=l,this.foregroundColor=a,this.backgroundColor=s||this._getDefaultBackgroundColor(),this.focusColor=i,this.hoverColor=t,this.splashColor=u,this.elevation=d,this.highlightElevation=p,this.disabledElevation=c,this.child=m,this.mini=v,this.shape=C,this.clipBehavior=P,this.autofocus=w,this.materialTapTargetSize=_,this.isExtended=F,this.enableFeedback=k,this.heroTag=E,this._isHovered=!1,this._isPressed=!1}_getDefaultBackgroundColor(){return typeof window<"u"?(getComputedStyle(document.documentElement).getPropertyValue("--primary-color")||"#2196F3").trim():"#2196F3"}_getButtonSize(){return this.mini?40:56}_getButtonStyle(){const e=this._getButtonSize(),n=this._isPressed?this.highlightElevation:this.elevation;return{position:"relative",width:`${e}px`,height:`${e}px`,borderRadius:"50%",backgroundColor:this.backgroundColor,color:this.foregroundColor,border:"none",cursor:"pointer",display:"flex",justifyContent:"center",alignItems:"center",boxShadow:`0 ${n}px ${n*1.5}px rgba(0, 0, 0, 0.${n})`,transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",outline:"none",fontFamily:"inherit",fontSize:"24px",fontWeight:500,textTransform:"uppercase",letterSpacing:"0.5px",userSelect:"none",WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none"}}_getRippleStyle(){return{position:"absolute",top:0,left:0,right:0,bottom:0,borderRadius:"50%",backgroundColor:this.splashColor||"rgba(255, 255, 255, 0.2)",opacity:0,pointerEvents:"none",animation:this._isPressed?"fab-ripple 0.6s ease-out":"none"}}_handlePress(e){this.enableFeedback&&navigator.vibrate&&navigator.vibrate(10),this.onPressed&&this.onPressed(e)}_handleLongPress(e){this.enableFeedback&&navigator.vibrate&&navigator.vibrate([10,20,10]),this.onLongPress&&this.onLongPress(e)}_handleTapDown(e){this._isPressed=!0}_handleTapUp(e){this._isPressed=!1}_injectKeyframes(){if(typeof document<"u"&&!document.getElementById("fab-keyframes")){const e=document.createElement("style");e.id="fab-keyframes",e.textContent=` - @keyframes fab-ripple { - 0% { - opacity: 1; - transform: scale(1); - } - 100% { - opacity: 0; - transform: scale(2); - } - } - `,document.head.appendChild(e)}}build(e){const n=this._getButtonStyle();let o=null;if(this.child){const t=this.child.createElement?.(e.element,e.element.runtime)||this.child;t.mount&&t.mount(e.element),o=t.performRebuild?.(e.element,e.element.runtime)||null}this._injectKeyframes();const l=new r({tag:"button",props:{style:n,type:"button",title:this.tooltip||"","aria-label":this.tooltip||"Floating Action Button"},children:[new r({tag:"span",props:{style:this._getRippleStyle(),className:"fab-ripple"},children:[]}),new r({tag:"span",props:{style:{position:"relative",zIndex:1,display:"flex",alignItems:"center",justifyContent:"center"}},children:o?[o]:[]})]}),s=new b({onTap:t=>this._handlePress(t),onTapDown:t=>this._handleTapDown(t),onTapUp:t=>this._handleTapUp(t),onLongPress:t=>this._handleLongPress(t),child:new y(l)}).createElement?.(e.element,e.element.runtime);s&&s.mount&&s.mount(e.element);let i=s?.performRebuild?.(e.element,e.element.runtime)||null;return this.tooltip?new r({tag:"div",props:{style:{position:"relative",display:"inline-block"},"data-widget":"FloatingActionButton"},children:[i,new r({tag:"div",props:{style:{visibility:"hidden",backgroundColor:"#333",color:"#fff",textAlign:"center",borderRadius:"4px",padding:"5px 8px",position:"absolute",zIndex:1e3,bottom:"125%",left:"50%",marginLeft:"-40px",opacity:0,transition:"opacity 0.3s",whiteSpace:"nowrap",fontSize:"12px",fontWeight:500,pointerEvents:"none",width:"80px"},className:"fab-tooltip"},children:[this.tooltip]})]}):i}createElement(e,n){return new f(this,e,n)}debugFillProperties(e){super.debugFillProperties(e),e.push({name:"onPressed",value:this.onPressed?"fn":null}),e.push({name:"tooltip",value:this.tooltip}),e.push({name:"backgroundColor",value:this.backgroundColor}),this.mini&&e.push({name:"mini",value:!0})}}class f extends S{performRebuild(e,n){return this.widget.build(this.context)}}class B extends g{constructor({key:e=null,onPressed:n=null,onLongPress:o=null,tooltip:l=null,foregroundColor:a="#FFF",backgroundColor:s=null,icon:i=null,label:t="",elevation:u=6,highlightElevation:d=12,clipBehavior:p="clip",heroTag:c="FloatingActionButton",enableFeedback:m=!0}={}){if(super(e),!n)throw new Error("FloatingActionButtonExtended requires onPressed callback");this.onPressed=n,this.onLongPress=o,this.tooltip=l,this.foregroundColor=a,this.backgroundColor=s||this._getDefaultBackgroundColor(),this.icon=i,this.label=t,this.elevation=u,this.highlightElevation=d,this.clipBehavior=p,this.heroTag=c,this.enableFeedback=m,this._isPressed=!1}_getDefaultBackgroundColor(){return typeof window<"u"?(getComputedStyle(document.documentElement).getPropertyValue("--primary-color")||"#2196F3").trim():"#2196F3"}_handlePress(e){this.enableFeedback&&navigator.vibrate&&navigator.vibrate(10),this.onPressed&&this.onPressed(e)}_handleLongPress(e){this.enableFeedback&&navigator.vibrate&&navigator.vibrate([10,20,10]),this.onLongPress&&this.onLongPress(e)}build(e){const n=this._isPressed?this.highlightElevation:this.elevation,o={display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"8px",padding:"12px 20px",borderRadius:"48px",backgroundColor:this.backgroundColor,color:this.foregroundColor,border:"none",cursor:"pointer",boxShadow:`0 ${n}px ${n*1.5}px rgba(0, 0, 0, 0.${n})`,transition:"all 0.2s cubic-bezier(0.4, 0, 0.2, 1)",fontSize:"14px",fontWeight:500,textTransform:"uppercase",letterSpacing:"0.5px",outline:"none",fontFamily:"inherit",userSelect:"none",WebkitUserSelect:"none",minHeight:"48px"};let l=null;if(this.icon){const t=this.icon.createElement?.(e.element,e.element.runtime)||this.icon;t.mount&&t.mount(e.element),l=t.performRebuild?.(e.element,e.element.runtime)||null}const a=new r({tag:"button",props:{style:o,type:"button",title:this.tooltip||"","aria-label":this.tooltip||this.label},children:[l&&new r({tag:"span",props:{style:{display:"flex",alignItems:"center"}},children:[l]}),new r({tag:"span",props:{},children:[this.label]})]}),i=new b({onTap:t=>this._handlePress(t),onLongPress:t=>this._handleLongPress(t),child:new y(a)}).createElement?.(e.element,e.element.runtime);return i&&i.mount&&i.mount(e.element),i?.performRebuild?.(e.element,e.element.runtime)||null}createElement(e,n){return new f(this,e,n)}}class y extends g{constructor(e){super(),this.content=e}build(e){return this.content}}export{x as FloatingActionButton,f as FloatingActionButtonElement,B as FloatingActionButtonExtended}; -//# sourceMappingURL=floating_action_button.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/floating_action_button.js.map b/packages/flutterjs_engine/package/material/dist/material/floating_action_button.js.map deleted file mode 100644 index ce90e1e5..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/floating_action_button.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/floating_action_button.js"], - "sourcesContent": ["import { Widget, StatelessWidget } from '../core/widget_element.js';\r\nimport { Element } from \"@flutterjs/runtime\"\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\nimport { GestureDetector } from './gesture_detector.js';\r\n\r\n// ============================================================================\r\n// FLOATING ACTION BUTTON\r\n// ============================================================================\r\n\r\nclass FloatingActionButton extends StatelessWidget {\r\n constructor({\r\n key = null,\r\n onPressed = null,\r\n onLongPress = null,\r\n tooltip = null,\r\n foregroundColor = '#FFF',\r\n backgroundColor = null,\r\n focusColor = null,\r\n hoverColor = null,\r\n splashColor = null,\r\n elevation = 6,\r\n highlightElevation = 12,\r\n disabledElevation = 0,\r\n child = null,\r\n mini = false,\r\n shape = null,\r\n clipBehavior = 'clip',\r\n autofocus = false,\r\n materialTapTargetSize = null,\r\n isExtended = false,\r\n enableFeedback = true,\r\n heroTag = 'FloatingActionButton'\r\n } = {}) {\r\n super(key);\r\n\r\n if (!onPressed) {\r\n throw new Error('FloatingActionButton requires onPressed callback');\r\n }\r\n\r\n this.onPressed = onPressed;\r\n this.onLongPress = onLongPress;\r\n this.tooltip = tooltip;\r\n this.foregroundColor = foregroundColor;\r\n this.backgroundColor = backgroundColor || this._getDefaultBackgroundColor();\r\n this.focusColor = focusColor;\r\n this.hoverColor = hoverColor;\r\n this.splashColor = splashColor;\r\n this.elevation = elevation;\r\n this.highlightElevation = highlightElevation;\r\n this.disabledElevation = disabledElevation;\r\n this.child = child;\r\n this.mini = mini;\r\n this.shape = shape;\r\n this.clipBehavior = clipBehavior;\r\n this.autofocus = autofocus;\r\n this.materialTapTargetSize = materialTapTargetSize;\r\n this.isExtended = isExtended;\r\n this.enableFeedback = enableFeedback;\r\n this.heroTag = heroTag;\r\n\r\n this._isHovered = false;\r\n this._isPressed = false;\r\n }\r\n\r\n /**\r\n * Get default background color (primary color from theme)\r\n */\r\n _getDefaultBackgroundColor() {\r\n if (typeof window !== 'undefined') {\r\n const primaryColor = getComputedStyle(document.documentElement).getPropertyValue('--primary-color') || '#2196F3';\r\n return primaryColor.trim();\r\n }\r\n return '#2196F3';\r\n }\r\n\r\n /**\r\n * Get button size based on mini flag\r\n */\r\n _getButtonSize() {\r\n return this.mini ? 40 : 56;\r\n }\r\n\r\n /**\r\n * Get button styles\r\n */\r\n _getButtonStyle() {\r\n const size = this._getButtonSize();\r\n const elevation = this._isPressed ? this.highlightElevation : this.elevation;\r\n\r\n return {\r\n position: 'relative',\r\n width: `${size}px`,\r\n height: `${size}px`,\r\n borderRadius: '50%',\r\n backgroundColor: this.backgroundColor,\r\n color: this.foregroundColor,\r\n border: 'none',\r\n cursor: 'pointer',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n boxShadow: `0 ${elevation}px ${elevation * 1.5}px rgba(0, 0, 0, 0.${elevation})`,\r\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\r\n outline: 'none',\r\n fontFamily: 'inherit',\r\n fontSize: '24px',\r\n fontWeight: 500,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.5px',\r\n userSelect: 'none',\r\n WebkitUserSelect: 'none',\r\n MozUserSelect: 'none',\r\n msUserSelect: 'none'\r\n };\r\n }\r\n\r\n /**\r\n * Get ripple effect styles\r\n */\r\n _getRippleStyle() {\r\n return {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n borderRadius: '50%',\r\n backgroundColor: this.splashColor || 'rgba(255, 255, 255, 0.2)',\r\n opacity: 0,\r\n pointerEvents: 'none',\r\n animation: this._isPressed\r\n ? 'fab-ripple 0.6s ease-out'\r\n : 'none'\r\n };\r\n }\r\n\r\n /**\r\n * Handle press with feedback\r\n */\r\n _handlePress(event) {\r\n if (this.enableFeedback) {\r\n // Haptic feedback (if available)\r\n if (navigator.vibrate) {\r\n navigator.vibrate(10);\r\n }\r\n }\r\n\r\n if (this.onPressed) {\r\n this.onPressed(event);\r\n }\r\n }\r\n\r\n /**\r\n * Handle long press\r\n */\r\n _handleLongPress(event) {\r\n if (this.enableFeedback && navigator.vibrate) {\r\n navigator.vibrate([10, 20, 10]); // Double vibration for long press\r\n }\r\n\r\n if (this.onLongPress) {\r\n this.onLongPress(event);\r\n }\r\n }\r\n\r\n /**\r\n * Handle mouse/touch down\r\n */\r\n _handleTapDown(event) {\r\n this._isPressed = true;\r\n }\r\n\r\n /**\r\n * Handle mouse/touch up\r\n */\r\n _handleTapUp(event) {\r\n this._isPressed = false;\r\n }\r\n\r\n /**\r\n * Inject ripple animation keyframes\r\n */\r\n _injectKeyframes() {\r\n if (typeof document !== 'undefined' && !document.getElementById('fab-keyframes')) {\r\n const style = document.createElement('style');\r\n style.id = 'fab-keyframes';\r\n style.textContent = `\r\n @keyframes fab-ripple {\r\n 0% {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n 100% {\r\n opacity: 0;\r\n transform: scale(2);\r\n }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n }\r\n\r\n build(context) {\r\n const buttonStyle = this._getButtonStyle();\r\n let childVNode = null;\r\n\r\n // Build child element\r\n if (this.child) {\r\n const childElement = this.child.createElement?.(context.element, context.element.runtime) || this.child;\r\n if (childElement.mount) {\r\n childElement.mount(context.element);\r\n }\r\n childVNode = childElement.performRebuild?.(context.element, context.element.runtime) || null;\r\n }\r\n\r\n // Inject ripple animation keyframes\r\n this._injectKeyframes();\r\n\r\n // Create the actual button content (without gesture detection)\r\n const buttonContent = new VNode({\r\n tag: 'button',\r\n props: {\r\n style: buttonStyle,\r\n type: 'button',\r\n title: this.tooltip || '',\r\n 'aria-label': this.tooltip || 'Floating Action Button'\r\n },\r\n children: [\r\n // Ripple effect\r\n new VNode({\r\n tag: 'span',\r\n props: {\r\n style: this._getRippleStyle(),\r\n className: 'fab-ripple'\r\n },\r\n children: []\r\n }),\r\n // Child content (icon)\r\n new VNode({\r\n tag: 'span',\r\n props: {\r\n style: {\r\n position: 'relative',\r\n zIndex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }\r\n },\r\n children: childVNode ? [childVNode] : []\r\n })\r\n ]\r\n });\r\n\r\n // Wrap button with GestureDetector\r\n const fabWidget = new GestureDetector({\r\n onTap: (event) => this._handlePress(event),\r\n onTapDown: (event) => this._handleTapDown(event),\r\n onTapUp: (event) => this._handleTapUp(event),\r\n onLongPress: (event) => this._handleLongPress(event),\r\n child: new _FABContentWrapper(buttonContent)\r\n });\r\n\r\n // Build gesture detector element\r\n const fabElement = fabWidget.createElement?.(context.element, context.element.runtime);\r\n if (fabElement && fabElement.mount) {\r\n fabElement.mount(context.element);\r\n }\r\n let fabVNode = fabElement?.performRebuild?.(context.element, context.element.runtime) || null;\r\n\r\n // Wrap with tooltip if provided\r\n if (this.tooltip) {\r\n return new VNode({\r\n tag: 'div',\r\n props: {\r\n style: {\r\n position: 'relative',\r\n display: 'inline-block'\r\n },\r\n 'data-widget': 'FloatingActionButton'\r\n },\r\n children: [\r\n fabVNode,\r\n new VNode({\r\n tag: 'div',\r\n props: {\r\n style: {\r\n visibility: 'hidden',\r\n backgroundColor: '#333',\r\n color: '#fff',\r\n textAlign: 'center',\r\n borderRadius: '4px',\r\n padding: '5px 8px',\r\n position: 'absolute',\r\n zIndex: 1000,\r\n bottom: '125%',\r\n left: '50%',\r\n marginLeft: '-40px',\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n whiteSpace: 'nowrap',\r\n fontSize: '12px',\r\n fontWeight: 500,\r\n pointerEvents: 'none',\r\n width: '80px'\r\n },\r\n className: 'fab-tooltip'\r\n },\r\n children: [this.tooltip]\r\n })\r\n ]\r\n });\r\n }\r\n\r\n return fabVNode;\r\n }\r\n\r\n createElement(parent, runtime) {\r\n return new FloatingActionButtonElement(this, parent, runtime);\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n properties.push({ name: 'onPressed', value: this.onPressed ? 'fn' : null });\r\n properties.push({ name: 'tooltip', value: this.tooltip });\r\n properties.push({ name: 'backgroundColor', value: this.backgroundColor });\r\n if (this.mini) properties.push({ name: 'mini', value: true });\r\n }\r\n}\r\n\r\nclass FloatingActionButtonElement extends Element {\r\n performRebuild(parent, runtime) {\r\n return this.widget.build(this.context);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXTENDED FLOATING ACTION BUTTON\r\n// ============================================================================\r\n\r\nclass FloatingActionButtonExtended extends StatelessWidget {\r\n constructor({\r\n key = null,\r\n onPressed = null,\r\n onLongPress = null,\r\n tooltip = null,\r\n foregroundColor = '#FFF',\r\n backgroundColor = null,\r\n icon = null,\r\n label = '',\r\n elevation = 6,\r\n highlightElevation = 12,\r\n clipBehavior = 'clip',\r\n heroTag = 'FloatingActionButton',\r\n enableFeedback = true\r\n } = {}) {\r\n super(key);\r\n\r\n if (!onPressed) {\r\n throw new Error('FloatingActionButtonExtended requires onPressed callback');\r\n }\r\n\r\n this.onPressed = onPressed;\r\n this.onLongPress = onLongPress;\r\n this.tooltip = tooltip;\r\n this.foregroundColor = foregroundColor;\r\n this.backgroundColor = backgroundColor || this._getDefaultBackgroundColor();\r\n this.icon = icon;\r\n this.label = label;\r\n this.elevation = elevation;\r\n this.highlightElevation = highlightElevation;\r\n this.clipBehavior = clipBehavior;\r\n this.heroTag = heroTag;\r\n this.enableFeedback = enableFeedback;\r\n\r\n this._isPressed = false;\r\n }\r\n\r\n /**\r\n * Get default background color\r\n */\r\n _getDefaultBackgroundColor() {\r\n if (typeof window !== 'undefined') {\r\n const primaryColor = getComputedStyle(document.documentElement).getPropertyValue('--primary-color') || '#2196F3';\r\n return primaryColor.trim();\r\n }\r\n return '#2196F3';\r\n }\r\n\r\n /**\r\n * Handle press\r\n */\r\n _handlePress(event) {\r\n if (this.enableFeedback && navigator.vibrate) {\r\n navigator.vibrate(10);\r\n }\r\n if (this.onPressed) {\r\n this.onPressed(event);\r\n }\r\n }\r\n\r\n /**\r\n * Handle long press\r\n */\r\n _handleLongPress(event) {\r\n if (this.enableFeedback && navigator.vibrate) {\r\n navigator.vibrate([10, 20, 10]);\r\n }\r\n if (this.onLongPress) {\r\n this.onLongPress(event);\r\n }\r\n }\r\n\r\n build(context) {\r\n const elevation = this._isPressed ? this.highlightElevation : this.elevation;\r\n\r\n const buttonStyle = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: '8px',\r\n padding: '12px 20px',\r\n borderRadius: '48px',\r\n backgroundColor: this.backgroundColor,\r\n color: this.foregroundColor,\r\n border: 'none',\r\n cursor: 'pointer',\r\n boxShadow: `0 ${elevation}px ${elevation * 1.5}px rgba(0, 0, 0, 0.${elevation})`,\r\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.5px',\r\n outline: 'none',\r\n fontFamily: 'inherit',\r\n userSelect: 'none',\r\n WebkitUserSelect: 'none',\r\n minHeight: '48px'\r\n };\r\n\r\n let iconVNode = null;\r\n if (this.icon) {\r\n const iconElement = this.icon.createElement?.(context.element, context.element.runtime) || this.icon;\r\n if (iconElement.mount) {\r\n iconElement.mount(context.element);\r\n }\r\n iconVNode = iconElement.performRebuild?.(context.element, context.element.runtime) || null;\r\n }\r\n\r\n const buttonContent = new VNode({\r\n tag: 'button',\r\n props: {\r\n style: buttonStyle,\r\n type: 'button',\r\n title: this.tooltip || '',\r\n 'aria-label': this.tooltip || this.label\r\n },\r\n children: [\r\n iconVNode && new VNode({\r\n tag: 'span',\r\n props: { style: { display: 'flex', alignItems: 'center' } },\r\n children: [iconVNode]\r\n }),\r\n new VNode({\r\n tag: 'span',\r\n props: {},\r\n children: [this.label]\r\n })\r\n ]\r\n });\r\n\r\n // Wrap with GestureDetector\r\n const fabWidget = new GestureDetector({\r\n onTap: (event) => this._handlePress(event),\r\n onLongPress: (event) => this._handleLongPress(event),\r\n child: new _FABContentWrapper(buttonContent)\r\n });\r\n\r\n const fabElement = fabWidget.createElement?.(context.element, context.element.runtime);\r\n if (fabElement && fabElement.mount) {\r\n fabElement.mount(context.element);\r\n }\r\n return fabElement?.performRebuild?.(context.element, context.element.runtime) || null;\r\n }\r\n\r\n createElement(parent, runtime) {\r\n return new FloatingActionButtonElement(this, parent, runtime);\r\n }\r\n}\r\n\r\nclass _FABContentWrapper extends StatelessWidget {\r\n constructor(content) {\r\n super();\r\n this.content = content;\r\n }\r\n\r\n build(context) {\r\n return this.content;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n FloatingActionButton,\r\n FloatingActionButtonElement,\r\n FloatingActionButtonExtended\r\n};"], - "mappings": "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", - "names": ["StatelessWidget", "Element", "VNode", "GestureDetector", "FloatingActionButton", "key", "onPressed", "onLongPress", "tooltip", "foregroundColor", "backgroundColor", "focusColor", "hoverColor", "splashColor", "elevation", "highlightElevation", "disabledElevation", "child", "mini", "shape", "clipBehavior", "autofocus", "materialTapTargetSize", "isExtended", "enableFeedback", "heroTag", "size", "event", "style", "context", "buttonStyle", "childVNode", "childElement", "buttonContent", "fabElement", "_FABContentWrapper", "fabVNode", "parent", "runtime", "FloatingActionButtonElement", "properties", "FloatingActionButtonExtended", "icon", "label", "iconVNode", "iconElement", "content"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/gesture_detector.js b/packages/flutterjs_engine/package/material/dist/material/gesture_detector.js deleted file mode 100644 index c4dc4e90..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/gesture_detector.js +++ /dev/null @@ -1,2 +0,0 @@ -import{StatelessWidget as b}from"../core/widget_element.js";import{Element as x}from"@flutterjs/runtime";import{VNode as C}from"@flutterjs/vdom/vnode";import{TapRecognizer as s,LongPressRecognizer as y,SwipeRecognizer as I,PanRecognizer as q,ScaleRecognizer as F}from"@flutterjs/runtime";class G extends b{constructor({key:n=null,child:t=null,onTap:e=null,onTapDown:o=null,onTapUp:i=null,onTapCancel:l=null,onDoubleTap:u=null,onLongPress:r=null,onLongPressStart:c=null,onLongPressMoveUpdate:p=null,onLongPressEnd:d=null,onLongPressUp:S=null,onSwipe:m=null,onSwipeLeft:f=null,onSwipeRight:g=null,onSwipeUp:w=null,onSwipeDown:T=null,onPan:E=null,onPanStart:P=null,onPanUpdate:v=null,onPanEnd:_=null,onScale:D=null,onScaleStart:z=null,onScaleUpdate:U=null,onScaleEnd:M=null,behavior:L="opaque",excludeFromSemantics:R=!1}={}){super(n),this.child=t,this.onTap=e,this.onTapDown=o,this.onTapUp=i,this.onTapCancel=l,this.onDoubleTap=u,this.onLongPress=r,this.onLongPressStart=c,this.onLongPressMoveUpdate=p,this.onLongPressEnd=d,this.onLongPressUp=S,this.onSwipe=m,this.onSwipeLeft=f,this.onSwipeRight=g,this.onSwipeUp=w,this.onSwipeDown=T,this.onPan=E,this.onPanStart=P,this.onPanUpdate=v,this.onPanEnd=_,this.onScale=D,this.onScaleStart=z,this.onScaleUpdate=U,this.onScaleEnd=M,this.behavior=L,this.excludeFromSemantics=R,this.recognizers=[],this._elementId=null}build(n){this._elementId=n.element.getElementId();let t=null;if(this.child){const i=this.child.createElement?.(n.element,n.element.runtime)||this.child;i.mount&&i.mount(n.element),t=i.performRebuild?.()||null}const e={position:"relative",userSelect:this.behavior==="opaque"?"none":"auto",WebkitUserSelect:this.behavior==="opaque"?"none":"auto",MozUserSelect:this.behavior==="opaque"?"none":"auto",msUserSelect:this.behavior==="opaque"?"none":"auto",touchAction:"manipulation",cursor:"pointer"},o=this._elementId;return new C({tag:"div",props:{style:e,"data-widget":"GestureDetector","data-element-id":o,onMouseDown:i=>this._handleMouseDown(i,o),onMouseUp:i=>this._handleMouseUp(i,o),onMouseMove:i=>this._handleMouseMove(i,o),onMouseLeave:i=>this._handleMouseLeave(i,o),onTouchStart:i=>this._handleTouchStart(i,o),onTouchEnd:i=>this._handleTouchEnd(i,o),onTouchMove:i=>this._handleTouchMove(i,o),onTouchCancel:i=>this._handleTouchCancel(i,o),onContextMenu:i=>this._handleContextMenu(i,o)},children:t?[t]:[]})}_initializeRecognizers(n){if(!(this.recognizers.length>0)){if(this.onTap||this.onTapDown||this.onTapUp){const t=new s(e=>{this.onTap&&this.onTap(e),this.onTapUp&&this.onTapUp(e)},{maxDuration:300,maxMovement:10});this.recognizers.push(t)}if(this.onDoubleTap){const t=new s(e=>{e.tapCount===2&&this.onDoubleTap(e)},{minTaps:2,maxTaps:2});this.recognizers.push(t)}if(this.onLongPress||this.onLongPressStart||this.onLongPressEnd){const t=new y(e=>{this.onLongPress&&this.onLongPress(e)},{duration:500,maxMovement:10});this.recognizers.push(t)}if(this.onSwipe||this.onSwipeLeft||this.onSwipeRight||this.onSwipeUp||this.onSwipeDown){const t=new I(e=>{this.onSwipe&&this.onSwipe(e),e.direction==="left"&&this.onSwipeLeft?this.onSwipeLeft(e):e.direction==="right"&&this.onSwipeRight?this.onSwipeRight(e):e.direction==="up"&&this.onSwipeUp?this.onSwipeUp(e):e.direction==="down"&&this.onSwipeDown&&this.onSwipeDown(e)},{minDistance:50,maxDuration:300});this.recognizers.push(t)}if(this.onPan||this.onPanStart||this.onPanUpdate||this.onPanEnd){const t=new q(e=>{this.onPan&&this.onPan(e)},{minDistance:10,onStart:e=>{this.onPanStart&&this.onPanStart(e)},onUpdate:e=>{this.onPanUpdate&&this.onPanUpdate(e)},onEnd:e=>{this.onPanEnd&&this.onPanEnd(e)}});this.recognizers.push(t)}if(this.onScale||this.onScaleStart||this.onScaleUpdate||this.onScaleEnd){const t=new F(e=>{this.onScale&&this.onScale(e)},{minScale:.5,maxScale:2,onStart:e=>{this.onScaleStart&&this.onScaleStart(e)},onUpdate:e=>{this.onScaleUpdate&&this.onScaleUpdate(e)},onEnd:e=>{this.onScaleEnd&&this.onScaleEnd(e)}});this.recognizers.push(t)}}}_routeEvent(n,t,e){this._initializeRecognizers(e),this.recognizers.forEach(o=>{o.isDisposed||o.handleEvent(n,t)})}_handleMouseDown(n,t){this._routeEvent("mousedown",n,t),this.onTapDown&&this.onTapDown({type:"tapdown",position:{x:n.clientX,y:n.clientY},nativeEvent:n})}_handleMouseUp(n,t){this._routeEvent("mouseup",n,t)}_handleMouseMove(n,t){this._routeEvent("mousemove",n,t)}_handleMouseLeave(n,t){this.onTapCancel&&this.onTapCancel({type:"tapcancel",nativeEvent:n})}_handleTouchStart(n,t){if(this._routeEvent("touchstart",n,t),this.onTapDown){const e=n.touches[0];this.onTapDown({type:"tapdown",position:{x:e.clientX,y:e.clientY},nativeEvent:n})}}_handleTouchEnd(n,t){this._routeEvent("touchend",n,t)}_handleTouchMove(n,t){this._routeEvent("touchmove",n,t)}_handleTouchCancel(n,t){this._routeEvent("touchcancel",n,t),this.onTapCancel&&this.onTapCancel({type:"tapcancel",nativeEvent:n})}_handleContextMenu(n,t){this.onLongPress&&(n.preventDefault(),this._routeEvent("contextmenu",n,t))}dispose(){this.recognizers.forEach(n=>{n.dispose()}),this.recognizers=[]}createElement(n,t){return new h(this,n,t)}debugFillProperties(n){super.debugFillProperties(n),this.onTap&&n.push({name:"onTap",value:"fn"}),this.onDoubleTap&&n.push({name:"onDoubleTap",value:"fn"}),this.onLongPress&&n.push({name:"onLongPress",value:"fn"}),this.onSwipe&&n.push({name:"onSwipe",value:"fn"}),this.onPan&&n.push({name:"onPan",value:"fn"})}}class h extends x{performRebuild(){return this.widget.build(this.context)}unmount(){this.widget&&this.widget.dispose(),super.unmount()}}export{G as GestureDetector,h as GestureDetectorElement}; -//# sourceMappingURL=gesture_detector.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/gesture_detector.js.map b/packages/flutterjs_engine/package/material/dist/material/gesture_detector.js.map deleted file mode 100644 index bdfa7300..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/gesture_detector.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/gesture_detector.js"], - "sourcesContent": ["import { Widget, StatelessWidget } from '../core/widget_element.js';\r\nimport { Element } from \"@flutterjs/runtime\"\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\nimport {\r\n TapRecognizer,\r\n LongPressRecognizer,\r\n SwipeRecognizer,\r\n PanRecognizer,\r\n ScaleRecognizer\r\n} from '@flutterjs/runtime';\r\n\r\n// ============================================================================\r\n// GESTURE DETECTOR\r\n// ============================================================================\r\n\r\n/**\r\n * GestureDetector Widget\r\n * \r\n * Wraps a child widget and detects various gestures\r\n * Supports: tap, double-tap, long-press, swipe, pan, scale\r\n * Works with both mouse and touch events\r\n */\r\nclass GestureDetector extends StatelessWidget {\r\n constructor({\r\n key = null,\r\n child = null,\r\n // Tap gestures\r\n onTap = null,\r\n onTapDown = null,\r\n onTapUp = null,\r\n onTapCancel = null,\r\n onDoubleTap = null,\r\n // Long press\r\n onLongPress = null,\r\n onLongPressStart = null,\r\n onLongPressMoveUpdate = null,\r\n onLongPressEnd = null,\r\n onLongPressUp = null,\r\n // Swipe\r\n onSwipe = null,\r\n onSwipeLeft = null,\r\n onSwipeRight = null,\r\n onSwipeUp = null,\r\n onSwipeDown = null,\r\n // Pan\r\n onPan = null,\r\n onPanStart = null,\r\n onPanUpdate = null,\r\n onPanEnd = null,\r\n // Scale/Pinch\r\n onScale = null,\r\n onScaleStart = null,\r\n onScaleUpdate = null,\r\n onScaleEnd = null,\r\n // Configuration\r\n behavior = 'opaque',\r\n excludeFromSemantics = false\r\n } = {}) {\r\n super(key);\r\n\r\n this.child = child;\r\n\r\n // Tap callbacks\r\n this.onTap = onTap;\r\n this.onTapDown = onTapDown;\r\n this.onTapUp = onTapUp;\r\n this.onTapCancel = onTapCancel;\r\n this.onDoubleTap = onDoubleTap;\r\n\r\n // Long press callbacks\r\n this.onLongPress = onLongPress;\r\n this.onLongPressStart = onLongPressStart;\r\n this.onLongPressMoveUpdate = onLongPressMoveUpdate;\r\n this.onLongPressEnd = onLongPressEnd;\r\n this.onLongPressUp = onLongPressUp;\r\n\r\n // Swipe callbacks\r\n this.onSwipe = onSwipe;\r\n this.onSwipeLeft = onSwipeLeft;\r\n this.onSwipeRight = onSwipeRight;\r\n this.onSwipeUp = onSwipeUp;\r\n this.onSwipeDown = onSwipeDown;\r\n\r\n // Pan callbacks\r\n this.onPan = onPan;\r\n this.onPanStart = onPanStart;\r\n this.onPanUpdate = onPanUpdate;\r\n this.onPanEnd = onPanEnd;\r\n\r\n // Scale callbacks\r\n this.onScale = onScale;\r\n this.onScaleStart = onScaleStart;\r\n this.onScaleUpdate = onScaleUpdate;\r\n this.onScaleEnd = onScaleEnd;\r\n\r\n // Configuration\r\n this.behavior = behavior;\r\n this.excludeFromSemantics = excludeFromSemantics;\r\n\r\n // Gesture recognizers\r\n this.recognizers = [];\r\n this._elementId = null;\r\n }\r\n\r\n /**\r\n * Build gesture detector with child\r\n */\r\n build(context) {\r\n this._elementId = context.element.getElementId();\r\n\r\n let childVNode = null;\r\n if (this.child) {\r\n const childElement = this.child.createElement?.(context.element, context.element.runtime) || this.child;\r\n if (childElement.mount) {\r\n childElement.mount(context.element);\r\n }\r\n childVNode = childElement.performRebuild?.() || null;\r\n }\r\n\r\n const containerStyle = {\r\n position: 'relative',\r\n userSelect: this.behavior === 'opaque' ? 'none' : 'auto',\r\n WebkitUserSelect: this.behavior === 'opaque' ? 'none' : 'auto',\r\n MozUserSelect: this.behavior === 'opaque' ? 'none' : 'auto',\r\n msUserSelect: this.behavior === 'opaque' ? 'none' : 'auto',\r\n touchAction: 'manipulation',\r\n cursor: 'pointer'\r\n };\r\n\r\n const elementId = this._elementId;\r\n\r\n return new VNode({\r\n tag: 'div',\r\n props: {\r\n style: containerStyle,\r\n 'data-widget': 'GestureDetector',\r\n 'data-element-id': elementId,\r\n onMouseDown: (e) => this._handleMouseDown(e, elementId),\r\n onMouseUp: (e) => this._handleMouseUp(e, elementId),\r\n onMouseMove: (e) => this._handleMouseMove(e, elementId),\r\n onMouseLeave: (e) => this._handleMouseLeave(e, elementId),\r\n onTouchStart: (e) => this._handleTouchStart(e, elementId),\r\n onTouchEnd: (e) => this._handleTouchEnd(e, elementId),\r\n onTouchMove: (e) => this._handleTouchMove(e, elementId),\r\n onTouchCancel: (e) => this._handleTouchCancel(e, elementId),\r\n onContextMenu: (e) => this._handleContextMenu(e, elementId)\r\n },\r\n children: childVNode ? [childVNode] : []\r\n });\r\n }\r\n\r\n /**\r\n * Initialize gesture recognizers on mount\r\n */\r\n _initializeRecognizers(elementId) {\r\n if (this.recognizers.length > 0) return; // Already initialized\r\n\r\n // Tap gesture\r\n if (this.onTap || this.onTapDown || this.onTapUp) {\r\n const tapRecognizer = new TapRecognizer(\r\n (event) => {\r\n if (this.onTap) this.onTap(event);\r\n if (this.onTapUp) this.onTapUp(event);\r\n },\r\n { maxDuration: 300, maxMovement: 10 }\r\n );\r\n this.recognizers.push(tapRecognizer);\r\n }\r\n\r\n // Double tap gesture\r\n if (this.onDoubleTap) {\r\n const doubleTapRecognizer = new TapRecognizer(\r\n (event) => {\r\n if (event.tapCount === 2) {\r\n this.onDoubleTap(event);\r\n }\r\n },\r\n { minTaps: 2, maxTaps: 2 }\r\n );\r\n this.recognizers.push(doubleTapRecognizer);\r\n }\r\n\r\n // Long press gesture\r\n if (this.onLongPress || this.onLongPressStart || this.onLongPressEnd) {\r\n const longPressRecognizer = new LongPressRecognizer(\r\n (event) => {\r\n if (this.onLongPress) this.onLongPress(event);\r\n },\r\n { duration: 500, maxMovement: 10 }\r\n );\r\n this.recognizers.push(longPressRecognizer);\r\n }\r\n\r\n // Swipe gesture\r\n if (this.onSwipe || this.onSwipeLeft || this.onSwipeRight || this.onSwipeUp || this.onSwipeDown) {\r\n const swipeRecognizer = new SwipeRecognizer(\r\n (event) => {\r\n if (this.onSwipe) this.onSwipe(event);\r\n\r\n // Direction-specific callbacks\r\n if (event.direction === 'left' && this.onSwipeLeft) {\r\n this.onSwipeLeft(event);\r\n } else if (event.direction === 'right' && this.onSwipeRight) {\r\n this.onSwipeRight(event);\r\n } else if (event.direction === 'up' && this.onSwipeUp) {\r\n this.onSwipeUp(event);\r\n } else if (event.direction === 'down' && this.onSwipeDown) {\r\n this.onSwipeDown(event);\r\n }\r\n },\r\n { minDistance: 50, maxDuration: 300 }\r\n );\r\n this.recognizers.push(swipeRecognizer);\r\n }\r\n\r\n // Pan gesture\r\n if (this.onPan || this.onPanStart || this.onPanUpdate || this.onPanEnd) {\r\n const panRecognizer = new PanRecognizer(\r\n (event) => {\r\n if (this.onPan) this.onPan(event);\r\n },\r\n {\r\n minDistance: 10,\r\n onStart: (event) => {\r\n if (this.onPanStart) this.onPanStart(event);\r\n },\r\n onUpdate: (event) => {\r\n if (this.onPanUpdate) this.onPanUpdate(event);\r\n },\r\n onEnd: (event) => {\r\n if (this.onPanEnd) this.onPanEnd(event);\r\n }\r\n }\r\n );\r\n this.recognizers.push(panRecognizer);\r\n }\r\n\r\n // Scale gesture (pinch)\r\n if (this.onScale || this.onScaleStart || this.onScaleUpdate || this.onScaleEnd) {\r\n const scaleRecognizer = new ScaleRecognizer(\r\n (event) => {\r\n if (this.onScale) this.onScale(event);\r\n },\r\n {\r\n minScale: 0.5,\r\n maxScale: 2.0,\r\n onStart: (event) => {\r\n if (this.onScaleStart) this.onScaleStart(event);\r\n },\r\n onUpdate: (event) => {\r\n if (this.onScaleUpdate) this.onScaleUpdate(event);\r\n },\r\n onEnd: (event) => {\r\n if (this.onScaleEnd) this.onScaleEnd(event);\r\n }\r\n }\r\n );\r\n this.recognizers.push(scaleRecognizer);\r\n }\r\n }\r\n\r\n /**\r\n * Route events to recognizers\r\n */\r\n _routeEvent(eventType, event, elementId) {\r\n this._initializeRecognizers(elementId);\r\n\r\n this.recognizers.forEach(recognizer => {\r\n if (!recognizer.isDisposed) {\r\n recognizer.handleEvent(eventType, event);\r\n }\r\n });\r\n }\r\n\r\n // ========== MOUSE EVENTS ==========\r\n\r\n _handleMouseDown(e, elementId) {\r\n this._routeEvent('mousedown', e, elementId);\r\n if (this.onTapDown) {\r\n this.onTapDown({\r\n type: 'tapdown',\r\n position: { x: e.clientX, y: e.clientY },\r\n nativeEvent: e\r\n });\r\n }\r\n }\r\n\r\n _handleMouseUp(e, elementId) {\r\n this._routeEvent('mouseup', e, elementId);\r\n }\r\n\r\n _handleMouseMove(e, elementId) {\r\n this._routeEvent('mousemove', e, elementId);\r\n }\r\n\r\n _handleMouseLeave(e, elementId) {\r\n if (this.onTapCancel) {\r\n this.onTapCancel({\r\n type: 'tapcancel',\r\n nativeEvent: e\r\n });\r\n }\r\n }\r\n\r\n // ========== TOUCH EVENTS ==========\r\n\r\n _handleTouchStart(e, elementId) {\r\n this._routeEvent('touchstart', e, elementId);\r\n if (this.onTapDown) {\r\n const touch = e.touches[0];\r\n this.onTapDown({\r\n type: 'tapdown',\r\n position: { x: touch.clientX, y: touch.clientY },\r\n nativeEvent: e\r\n });\r\n }\r\n }\r\n\r\n _handleTouchEnd(e, elementId) {\r\n this._routeEvent('touchend', e, elementId);\r\n }\r\n\r\n _handleTouchMove(e, elementId) {\r\n this._routeEvent('touchmove', e, elementId);\r\n }\r\n\r\n _handleTouchCancel(e, elementId) {\r\n this._routeEvent('touchcancel', e, elementId);\r\n if (this.onTapCancel) {\r\n this.onTapCancel({\r\n type: 'tapcancel',\r\n nativeEvent: e\r\n });\r\n }\r\n }\r\n\r\n // ========== CONTEXT MENU ==========\r\n\r\n _handleContextMenu(e, elementId) {\r\n if (this.onLongPress) {\r\n e.preventDefault();\r\n this._routeEvent('contextmenu', e, elementId);\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup\r\n */\r\n dispose() {\r\n this.recognizers.forEach(recognizer => {\r\n recognizer.dispose();\r\n });\r\n this.recognizers = [];\r\n }\r\n\r\n createElement(parent, runtime) {\r\n return new GestureDetectorElement(this, parent, runtime);\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n if (this.onTap) properties.push({ name: 'onTap', value: 'fn' });\r\n if (this.onDoubleTap) properties.push({ name: 'onDoubleTap', value: 'fn' });\r\n if (this.onLongPress) properties.push({ name: 'onLongPress', value: 'fn' });\r\n if (this.onSwipe) properties.push({ name: 'onSwipe', value: 'fn' });\r\n if (this.onPan) properties.push({ name: 'onPan', value: 'fn' });\r\n }\r\n}\r\n\r\nclass GestureDetectorElement extends Element {\r\n performRebuild() {\r\n return this.widget.build(this.context);\r\n }\r\n\r\n unmount() {\r\n if (this.widget) {\r\n this.widget.dispose();\r\n }\r\n super.unmount();\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n GestureDetector,\r\n GestureDetectorElement\r\n};"], - "mappings": "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", - "names": ["StatelessWidget", "Element", "VNode", "TapRecognizer", "LongPressRecognizer", "SwipeRecognizer", "PanRecognizer", "ScaleRecognizer", "GestureDetector", "key", "child", "onTap", "onTapDown", "onTapUp", "onTapCancel", "onDoubleTap", "onLongPress", "onLongPressStart", "onLongPressMoveUpdate", "onLongPressEnd", "onLongPressUp", "onSwipe", "onSwipeLeft", "onSwipeRight", "onSwipeUp", "onSwipeDown", "onPan", "onPanStart", "onPanUpdate", "onPanEnd", "onScale", "onScaleStart", "onScaleUpdate", "onScaleEnd", "behavior", "excludeFromSemantics", "context", "childVNode", "childElement", "containerStyle", "elementId", "e", "tapRecognizer", "event", "doubleTapRecognizer", "longPressRecognizer", "swipeRecognizer", "panRecognizer", "scaleRecognizer", "eventType", "recognizer", "touch", "parent", "runtime", "GestureDetectorElement", "properties"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/icon.js b/packages/flutterjs_engine/package/material/dist/material/icon.js deleted file mode 100644 index 4d4a4957..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/icon.js +++ /dev/null @@ -1,2 +0,0 @@ -import{StatelessWidget as M}from"../core/widget_element.js";import{VNode as x}from"@flutterjs/vdom/vnode";import{BlendMode as a,TextDirection as g}from"../utils/utils.js";const b=24,D=24,_={[a.srcOver]:"normal",[a.srcIn]:"multiply",[a.srcOut]:"lighten",[a.srcATop]:"screen",[a.dstOver]:"overlay",[a.dstIn]:"darken",[a.dstOut]:"color-dodge",[a.dstATop]:"color-burn",[a.plus]:"lighten",[a.screen]:"screen",[a.overlay]:"overlay",[a.darken]:"darken",[a.lighten]:"lighten",[a.colorDodge]:"color-dodge",[a.colorBurn]:"color-burn",[a.hardLight]:"hard-light",[a.softLight]:"soft-light",[a.difference]:"difference",[a.exclusion]:"exclusion",[a.multiply]:"multiply",[a.hue]:"hue",[a.saturation]:"saturation",[a.color]:"color",[a.luminosity]:"luminosity"};class i{constructor({codePoint:t=0,fontFamily:e="Material Icons",fontPackage:n=null,matchTextDirection:o=!1,fontFamilyFallback:l=null}={}){this.codePoint=t,this.fontFamily=e,this.fontPackage=n,this.matchTextDirection=o,this.fontFamilyFallback=Array.isArray(l)?l:null}getCharacter(){return String.fromCharCode(this.codePoint)}toString(){return`IconData(U+${this.codePoint.toString(16).toUpperCase().padStart(5,"0")})`}equals(t){return!t||!(t instanceof i)?!1:this.codePoint===t.codePoint&&this.fontFamily===t.fontFamily&&this.fontPackage===t.fontPackage&&this.matchTextDirection===t.matchTextDirection&&this._arrayEquals(this.fontFamilyFallback,t.fontFamilyFallback)}_arrayEquals(t,e){return!t&&!e?!0:!t||!e||t.length!==e.length?!1:t.every((n,o)=>n===e[o])}hashCode(){let t=this.codePoint;return t=(t<<5)-t+(this.fontFamily?this.fontFamily.charCodeAt(0):0),t=(t<<5)-t+(this.matchTextDirection?1:0),this.fontFamilyFallback&&this.fontFamilyFallback.forEach(e=>{t=(t<<5)-t+(e?e.charCodeAt(0):0)}),t}}class y{constructor({color:t=null,opacity:e=1,size:n=b,fill:o=null,weight:l=null,grade:s=null,opticalSize:r=null,shadows:c=null,applyTextScaling:d=!1}={}){this.color=t,this.opacity=e,this.size=n,this.fill=o,this.weight=l,this.grade=s,this.opticalSize=r,this.shadows=c,this.applyTextScaling=d}copyWith({color:t,opacity:e,size:n,fill:o,weight:l,grade:s,opticalSize:r,shadows:c,applyTextScaling:d}={}){return new y({color:t!==void 0?t:this.color,opacity:e!==void 0?e:this.opacity,size:n!==void 0?n:this.size,fill:o!==void 0?o:this.fill,weight:l!==void 0?l:this.weight,grade:s!==void 0?s:this.grade,opticalSize:r!==void 0?r:this.opticalSize,shadows:c!==void 0?c:this.shadows,applyTextScaling:d!==void 0?d:this.applyTextScaling})}}class T extends M{constructor(t,e={}){let n=null,o={};t&&(t.constructor?.name==="IconData"||t.codePoint!==void 0)?(n=t,o=e):(o=t||{},n=o.icon);const{key:l=null,size:s=null,fill:r=null,weight:c=null,grade:d=null,opticalSize:u=null,color:w=null,shadows:h=null,semanticLabel:p=null,textDirection:f=null,applyTextScaling:F=null,blendMode:I=null,fontWeight:m=null}=o;if(super(l),r!==null&&(r<0||r>1))throw new Error("fill must be between 0.0 and 1.0");if(c!==null&&c<=0)throw new Error("weight must be greater than 0.0");if(u!==null&&u<=0)throw new Error("opticalSize must be greater than 0.0");this.icon=n,this.size=s,this.fill=r,this.weight=c,this.grade=d,this.opticalSize=u,this.color=w,this.shadows=h,this.semanticLabel=p,this.textDirection=f,this.applyTextScaling=F,this.blendMode=I||a.srcOver,this.fontWeight=m,this._injectFont()}_injectFont(){if(typeof document>"u"||document.getElementById("flutterjs-material-icons"))return;const t=document.createElement("link");t.id="flutterjs-material-icons",t.rel="stylesheet",t.href="https://fonts.googleapis.com/icon?family=Material+Icons",document.head.appendChild(t)}build(t){this._injectFont();const e=this.textDirection||this._getTextDirection(t),n=this._getIconTheme(t)||new y,o=this.applyTextScaling??n.applyTextScaling??!1,l=this.size??n.size??b,s=o?this._scaleTextSize(l,t):l,r=this.fill??n.fill,c=this.weight??n.weight,d=this.grade??n.grade,u=this.opticalSize??n.opticalSize,w=this.shadows??n.shadows,h=this.icon;if(!h||h.codePoint===void 0&&!(h instanceof i))return this._buildEmptyIcon(s);const p=n.opacity??1;let f=this.color??n.color??"#000000";p!==1&&(f=this._applyOpacity(f,p));const F=this._buildFontVariations(r,c,d,u),I=this._buildInlineStyles({color:f,fontSize:s,fontFamily:h.fontFamily,fontWeight:this.fontWeight,fontFamilyFallback:h.fontFamilyFallback,shadows:w,fontVariations:F,blendMode:this.blendMode,textDirection:e});let m=this._buildIconElement(h,I);h.matchTextDirection&&e===g.rtl&&(m=this._mirrorIcon(m,s));const S=t?.element?.getElementId?.()||"icon-"+Math.random().toString(36).substr(2,9),P=t?.element?.getWidgetPath?.()||"Icon";return new x({tag:"span",props:{role:"img","aria-label":this.semanticLabel||"Icon","data-element-id":S,"data-widget-path":P,"data-widget":"Icon","data-icon-codepoint":`U+${h.codePoint.toString(16).toUpperCase()}`,title:this.semanticLabel||"",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:`${s}px`,height:`${s}px`}},children:[m],key:this.key})}_buildEmptyIcon(t){return new x({tag:"span",props:{style:{display:"inline-block",width:`${t}px`,height:`${t}px`}}})}_buildIconElement(t,e){return new x({tag:"span",props:{className:"fjs-icon",style:{...e,display:"inline-flex",alignItems:"center",justifyContent:"center",lineHeight:"1.0",whiteSpace:"nowrap"}},children:[t.getCharacter()]})}_mirrorIcon(t,e){return new x({tag:"span",props:{style:{display:"inline-flex",transform:"scaleX(-1)",transformOrigin:"center",width:`${e}px`,height:`${e}px`,alignItems:"center",justifyContent:"center"}},children:[t]})}_buildInlineStyles({color:t,fontSize:e,fontFamily:n,fontWeight:o,fontFamilyFallback:l,shadows:s,fontVariations:r,blendMode:c,textDirection:d}){const u={fontSize:`${e}px`,fontFamily:this._buildFontFamily(n,l),color:t,fontVariationSettings:r,textShadow:this._buildTextShadow(s),mixBlendMode:_[c]||"normal",direction:d===g.rtl?"rtl":"ltr",lineHeight:"1.0",height:"1em",userSelect:"none",WebkitUserSelect:"none",MozUserSelect:"none"};return o&&(u.fontWeight=this._normalizeFontWeight(o)),u}_buildFontFamily(t,e){if(!t)return"'Material Icons', Arial, sans-serif";const n=[t];return Array.isArray(e)&&e.length>0&&n.push(...e),n.push("Arial","sans-serif"),n.map(o=>`'${o}'`).join(", ")}_buildFontVariations(t,e,n,o){const l=[];return t!=null&&l.push(`'FILL' ${t}`),e!=null&&l.push(`'wght' ${e}`),n!=null&&l.push(`'GRAD' ${n}`),o!=null&&l.push(`'opsz' ${o}`),l.length>0?l.join(", "):"normal"}_buildTextShadow(t){return!t||!Array.isArray(t)?"none":t.map(e=>{const n=e.offsetX??0,o=e.offsetY??0,l=e.blurRadius??0,s=e.color??"rgba(0, 0, 0, 0.25)";return`${n}px ${o}px ${l}px ${s}`}).join(", ")}_normalizeFontWeight(t){const e={thin:"100",extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"};return typeof t=="string"?e[t.toLowerCase()]||t:String(t)}_applyOpacity(t,e){if(!t)return t;if(t.startsWith("#")){const n=t.slice(1),o=parseInt(n.substring(0,2),16),l=parseInt(n.substring(2,4),16),s=parseInt(n.substring(4,6),16);return`rgba(${o}, ${l}, ${s}, ${e})`}return t.startsWith("rgb")?t.replace(/[\d.]+\)/,`${e})`):t}_getTextDirection(t){return typeof document<"u"?(document.documentElement.dir||document.dir||"ltr")==="rtl"?g.rtl:g.ltr:g.ltr}_getIconTheme(t){return new y}_scaleTextSize(t,e){return t}debugFillProperties(t){super.debugFillProperties(t),t.push({name:"icon",value:this.icon}),t.push({name:"size",value:this.size}),t.push({name:"fill",value:this.fill}),t.push({name:"weight",value:this.weight}),t.push({name:"grade",value:this.grade}),t.push({name:"opticalSize",value:this.opticalSize}),t.push({name:"color",value:this.color}),t.push({name:"blendMode",value:this.blendMode}),t.push({name:"semanticLabel",value:this.semanticLabel}),this.shadows&&t.push({name:"shadows",value:this.shadows})}}const z={home:new i({codePoint:59530,fontFamily:"Material Icons"}),settings:new i({codePoint:59576,fontFamily:"Material Icons"}),search:new i({codePoint:59574,fontFamily:"Material Icons"}),favorite:new i({codePoint:59518,fontFamily:"Material Icons"}),favoriteBorder:new i({codePoint:59595,fontFamily:"Material Icons"}),star:new i({codePoint:59448,fontFamily:"Material Icons"}),starBorder:new i({codePoint:59451,fontFamily:"Material Icons"}),close:new i({codePoint:58829,fontFamily:"Material Icons"}),menu:new i({codePoint:58834,fontFamily:"Material Icons"}),arrowBack:new i({codePoint:58848,fontFamily:"Material Icons"}),arrowForward:new i({codePoint:58849,fontFamily:"Material Icons"}),add:new i({codePoint:57669,fontFamily:"Material Icons"}),delete:new i({codePoint:59506,fontFamily:"Material Icons"}),edit:new i({codePoint:58313,fontFamily:"Material Icons"}),check:new i({codePoint:58826,fontFamily:"Material Icons"}),checkCircle:new i({codePoint:59500,fontFamily:"Material Icons"}),error:new i({codePoint:59267,fontFamily:"Material Icons"}),errorOutline:new i({codePoint:57345,fontFamily:"Material Icons"}),info:new i({codePoint:59535,fontFamily:"Material Icons"}),warning:new i({codePoint:57346,fontFamily:"Material Icons"}),download:new i({codePoint:58052,fontFamily:"Material Icons"}),upload:new i({codePoint:58054,fontFamily:"Material Icons"}),refresh:new i({codePoint:58837,fontFamily:"Material Icons"}),moreVert:new i({codePoint:58836,fontFamily:"Material Icons"}),moreHoriz:new i({codePoint:58835,fontFamily:"Material Icons"})};export{T as Icon,i as IconData,y as IconThemeData,z as Icons}; -//# sourceMappingURL=icon.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/icon.js.map b/packages/flutterjs_engine/package/material/dist/material/icon.js.map deleted file mode 100644 index 8a456843..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/icon.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/icon.js"], - "sourcesContent": ["import { StatelessWidget } from '../core/widget_element.js';\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\nimport { BlendMode, TextDirection } from '../utils/utils.js';\r\n\r\nconst DEFAULT_ICON_SIZE = 24;\r\nconst DEFAULT_FONT_SIZE = 24;\r\n\r\nconst BLEND_MODE_MAP = {\r\n [BlendMode.srcOver]: 'normal',\r\n [BlendMode.srcIn]: 'multiply',\r\n [BlendMode.srcOut]: 'lighten',\r\n [BlendMode.srcATop]: 'screen',\r\n [BlendMode.dstOver]: 'overlay',\r\n [BlendMode.dstIn]: 'darken',\r\n [BlendMode.dstOut]: 'color-dodge',\r\n [BlendMode.dstATop]: 'color-burn',\r\n [BlendMode.plus]: 'lighten',\r\n [BlendMode.screen]: 'screen',\r\n [BlendMode.overlay]: 'overlay',\r\n [BlendMode.darken]: 'darken',\r\n [BlendMode.lighten]: 'lighten',\r\n [BlendMode.colorDodge]: 'color-dodge',\r\n [BlendMode.colorBurn]: 'color-burn',\r\n [BlendMode.hardLight]: 'hard-light',\r\n [BlendMode.softLight]: 'soft-light',\r\n [BlendMode.difference]: 'difference',\r\n [BlendMode.exclusion]: 'exclusion',\r\n [BlendMode.multiply]: 'multiply',\r\n [BlendMode.hue]: 'hue',\r\n [BlendMode.saturation]: 'saturation',\r\n [BlendMode.color]: 'color',\r\n [BlendMode.luminosity]: 'luminosity'\r\n};\r\n\r\n/**\r\n * IconData - Represents icon metadata\r\n * Contains codepoint, font family, and display properties\r\n */\r\nclass IconData {\r\n constructor({\r\n codePoint = 0,\r\n fontFamily = 'Material Icons',\r\n fontPackage = null,\r\n matchTextDirection = false,\r\n fontFamilyFallback = null\r\n } = {}) {\r\n this.codePoint = codePoint;\r\n this.fontFamily = fontFamily;\r\n this.fontPackage = fontPackage;\r\n this.matchTextDirection = matchTextDirection;\r\n this.fontFamilyFallback = Array.isArray(fontFamilyFallback) ? fontFamilyFallback : null;\r\n }\r\n\r\n getCharacter() {\r\n return String.fromCharCode(this.codePoint);\r\n }\r\n\r\n toString() {\r\n const hex = this.codePoint.toString(16).toUpperCase().padStart(5, '0');\r\n return `IconData(U+${hex})`;\r\n }\r\n\r\n equals(other) {\r\n if (!other || !(other instanceof IconData)) {\r\n return false;\r\n }\r\n return (\r\n this.codePoint === other.codePoint &&\r\n this.fontFamily === other.fontFamily &&\r\n this.fontPackage === other.fontPackage &&\r\n this.matchTextDirection === other.matchTextDirection &&\r\n this._arrayEquals(this.fontFamilyFallback, other.fontFamilyFallback)\r\n );\r\n }\r\n\r\n _arrayEquals(arr1, arr2) {\r\n if (!arr1 && !arr2) return true;\r\n if (!arr1 || !arr2) return false;\r\n if (arr1.length !== arr2.length) return false;\r\n return arr1.every((val, idx) => val === arr2[idx]);\r\n }\r\n\r\n hashCode() {\r\n let hash = this.codePoint;\r\n hash = ((hash << 5) - hash) + (this.fontFamily ? this.fontFamily.charCodeAt(0) : 0);\r\n hash = ((hash << 5) - hash) + (this.matchTextDirection ? 1 : 0);\r\n if (this.fontFamilyFallback) {\r\n this.fontFamilyFallback.forEach(f => {\r\n hash = ((hash << 5) - hash) + (f ? f.charCodeAt(0) : 0);\r\n });\r\n }\r\n return hash;\r\n }\r\n}\r\n\r\n/**\r\n * IconThemeData - Theme configuration for icons\r\n * Provides default values for icon properties\r\n */\r\nclass IconThemeData {\r\n constructor({\r\n color = null,\r\n opacity = 1.0,\r\n size = DEFAULT_ICON_SIZE,\r\n fill = null,\r\n weight = null,\r\n grade = null,\r\n opticalSize = null,\r\n shadows = null,\r\n applyTextScaling = false\r\n } = {}) {\r\n this.color = color;\r\n this.opacity = opacity;\r\n this.size = size;\r\n this.fill = fill;\r\n this.weight = weight;\r\n this.grade = grade;\r\n this.opticalSize = opticalSize;\r\n this.shadows = shadows;\r\n this.applyTextScaling = applyTextScaling;\r\n }\r\n\r\n copyWith({\r\n color,\r\n opacity,\r\n size,\r\n fill,\r\n weight,\r\n grade,\r\n opticalSize,\r\n shadows,\r\n applyTextScaling\r\n } = {}) {\r\n return new IconThemeData({\r\n color: color !== undefined ? color : this.color,\r\n opacity: opacity !== undefined ? opacity : this.opacity,\r\n size: size !== undefined ? size : this.size,\r\n fill: fill !== undefined ? fill : this.fill,\r\n weight: weight !== undefined ? weight : this.weight,\r\n grade: grade !== undefined ? grade : this.grade,\r\n opticalSize: opticalSize !== undefined ? opticalSize : this.opticalSize,\r\n shadows: shadows !== undefined ? shadows : this.shadows,\r\n applyTextScaling: applyTextScaling !== undefined ? applyTextScaling : this.applyTextScaling\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Icon - StatelessWidget for rendering icons\r\n * Supports Material Design icons and custom icon fonts\r\n */\r\nclass Icon extends StatelessWidget {\r\n constructor(iconOrOptions, options = {}) {\r\n let _icon = null;\r\n let _opts = {};\r\n\r\n if (iconOrOptions && (iconOrOptions.constructor?.name === 'IconData' || iconOrOptions.codePoint !== undefined)) {\r\n _icon = iconOrOptions;\r\n _opts = options;\r\n } else {\r\n _opts = iconOrOptions || {};\r\n _icon = _opts.icon;\r\n }\r\n\r\n const {\r\n key = null,\r\n size = null,\r\n fill = null,\r\n weight = null,\r\n grade = null,\r\n opticalSize = null,\r\n color = null,\r\n shadows = null,\r\n semanticLabel = null,\r\n textDirection = null,\r\n applyTextScaling = null,\r\n blendMode = null,\r\n fontWeight = null\r\n } = _opts;\r\n super(key);\r\n\r\n // Assertions\r\n if (fill !== null && (fill < 0.0 || fill > 1.0)) {\r\n throw new Error('fill must be between 0.0 and 1.0');\r\n }\r\n if (weight !== null && weight <= 0.0) {\r\n throw new Error('weight must be greater than 0.0');\r\n }\r\n if (opticalSize !== null && opticalSize <= 0.0) {\r\n throw new Error('opticalSize must be greater than 0.0');\r\n }\r\n\r\n this.icon = _icon;\r\n this.size = size;\r\n this.fill = fill;\r\n this.weight = weight;\r\n this.grade = grade;\r\n this.opticalSize = opticalSize;\r\n this.color = color;\r\n this.shadows = shadows;\r\n this.semanticLabel = semanticLabel;\r\n this.textDirection = textDirection;\r\n this.applyTextScaling = applyTextScaling;\r\n this.blendMode = blendMode || BlendMode.srcOver;\r\n this.fontWeight = fontWeight;\r\n\r\n this._injectFont();\r\n }\r\n\r\n _injectFont() {\r\n if (typeof document === 'undefined') return;\r\n\r\n // Check if Material Icons is already loaded\r\n if (document.getElementById('flutterjs-material-icons')) return;\r\n\r\n const link = document.createElement('link');\r\n link.id = 'flutterjs-material-icons';\r\n link.rel = 'stylesheet';\r\n link.href = 'https://fonts.googleapis.com/icon?family=Material+Icons';\r\n document.head.appendChild(link);\r\n }\r\n\r\n build(context) {\r\n // Ensure Material Icons font is injected on client-side rendering\r\n this._injectFont();\r\n\r\n // Get resolved text direction\r\n const textDirection = this.textDirection || this._getTextDirection(context);\r\n\r\n // Get icon theme from context\r\n const iconTheme = this._getIconTheme(context) || new IconThemeData();\r\n\r\n // Determine if text scaling should be applied\r\n const applyTextScaling = this.applyTextScaling ?? iconTheme.applyTextScaling ?? false;\r\n\r\n // Calculate icon size\r\n const tentativeIconSize = this.size ?? iconTheme.size ?? DEFAULT_ICON_SIZE;\r\n const iconSize = applyTextScaling\r\n ? this._scaleTextSize(tentativeIconSize, context)\r\n : tentativeIconSize;\r\n\r\n // Resolve icon properties from theme\r\n const iconFill = this.fill ?? iconTheme.fill;\r\n const iconWeight = this.weight ?? iconTheme.weight;\r\n const iconGrade = this.grade ?? iconTheme.grade;\r\n const iconOpticalSize = this.opticalSize ?? iconTheme.opticalSize;\r\n const iconShadows = this.shadows ?? iconTheme.shadows;\r\n\r\n const icon = this.icon;\r\n\r\n // Handle null icon - use duck typing instead of instanceof for bundled code compatibility\r\n if (!icon || (icon.codePoint === undefined && !(icon instanceof IconData))) {\r\n return this._buildEmptyIcon(iconSize);\r\n }\r\n\r\n // Calculate color with opacity\r\n const iconOpacity = iconTheme.opacity ?? 1.0;\r\n let iconColor = this.color ?? iconTheme.color ?? '#000000';\r\n\r\n if (iconOpacity !== 1.0) {\r\n iconColor = this._applyOpacity(iconColor, iconOpacity);\r\n }\r\n\r\n // Build font variations for advanced typography\r\n const fontVariations = this._buildFontVariations(\r\n iconFill,\r\n iconWeight,\r\n iconGrade,\r\n iconOpticalSize\r\n );\r\n\r\n // Build inline styles\r\n const inlineStyles = this._buildInlineStyles({\r\n color: iconColor,\r\n fontSize: iconSize,\r\n fontFamily: icon.fontFamily,\r\n fontWeight: this.fontWeight,\r\n fontFamilyFallback: icon.fontFamilyFallback,\r\n shadows: iconShadows,\r\n fontVariations,\r\n blendMode: this.blendMode,\r\n textDirection\r\n });\r\n\r\n // Build icon element\r\n let iconElement = this._buildIconElement(icon, inlineStyles);\r\n\r\n // Apply text direction transform if needed\r\n if (icon.matchTextDirection && textDirection === TextDirection.rtl) {\r\n iconElement = this._mirrorIcon(iconElement, iconSize);\r\n }\r\n\r\n // Wrap with semantics\r\n const elementId = context?.element?.getElementId?.() || 'icon-' + Math.random().toString(36).substr(2, 9);\r\n const widgetPath = context?.element?.getWidgetPath?.() || 'Icon';\r\n\r\n return new VNode({\r\n tag: 'span',\r\n props: {\r\n role: 'img',\r\n 'aria-label': this.semanticLabel || 'Icon',\r\n 'data-element-id': elementId,\r\n 'data-widget-path': widgetPath,\r\n 'data-widget': 'Icon',\r\n 'data-icon-codepoint': `U+${icon.codePoint.toString(16).toUpperCase()}`,\r\n title: this.semanticLabel || '',\r\n style: {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: `${iconSize}px`,\r\n height: `${iconSize}px`\r\n }\r\n },\r\n children: [iconElement],\r\n key: this.key\r\n });\r\n }\r\n\r\n _buildEmptyIcon(size) {\r\n return new VNode({\r\n tag: 'span',\r\n props: {\r\n style: {\r\n display: 'inline-block',\r\n width: `${size}px`,\r\n height: `${size}px`\r\n }\r\n }\r\n });\r\n }\r\n\r\n _buildIconElement(icon, styles) {\r\n return new VNode({\r\n tag: 'span',\r\n props: {\r\n className: 'fjs-icon',\r\n style: {\r\n ...styles,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n lineHeight: '1.0',\r\n whiteSpace: 'nowrap'\r\n }\r\n },\r\n children: [icon.getCharacter()]\r\n });\r\n }\r\n\r\n _mirrorIcon(iconElement, size) {\r\n return new VNode({\r\n tag: 'span',\r\n props: {\r\n style: {\r\n display: 'inline-flex',\r\n transform: 'scaleX(-1)',\r\n transformOrigin: 'center',\r\n width: `${size}px`,\r\n height: `${size}px`,\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n }\r\n },\r\n children: [iconElement]\r\n });\r\n }\r\n\r\n _buildInlineStyles({\r\n color,\r\n fontSize,\r\n fontFamily,\r\n fontWeight,\r\n fontFamilyFallback,\r\n shadows,\r\n fontVariations,\r\n blendMode,\r\n textDirection\r\n }) {\r\n const styles = {\r\n fontSize: `${fontSize}px`,\r\n fontFamily: this._buildFontFamily(fontFamily, fontFamilyFallback),\r\n color: color,\r\n fontVariationSettings: fontVariations,\r\n textShadow: this._buildTextShadow(shadows),\r\n mixBlendMode: BLEND_MODE_MAP[blendMode] || 'normal',\r\n direction: textDirection === TextDirection.rtl ? 'rtl' : 'ltr',\r\n lineHeight: '1.0',\r\n height: '1em',\r\n userSelect: 'none',\r\n WebkitUserSelect: 'none',\r\n MozUserSelect: 'none'\r\n };\r\n\r\n if (fontWeight) {\r\n styles.fontWeight = this._normalizeFontWeight(fontWeight);\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n _buildFontFamily(primary, fallback) {\r\n if (!primary) return \"'Material Icons', Arial, sans-serif\";\r\n\r\n const families = [primary];\r\n\r\n if (Array.isArray(fallback) && fallback.length > 0) {\r\n families.push(...fallback);\r\n }\r\n\r\n families.push('Arial', 'sans-serif');\r\n return families.map(f => `'${f}'`).join(', ');\r\n }\r\n\r\n _buildFontVariations(fill, weight, grade, opticalSize) {\r\n const variations = [];\r\n\r\n if (fill !== null && fill !== undefined) {\r\n variations.push(`'FILL' ${fill}`);\r\n }\r\n if (weight !== null && weight !== undefined) {\r\n variations.push(`'wght' ${weight}`);\r\n }\r\n if (grade !== null && grade !== undefined) {\r\n variations.push(`'GRAD' ${grade}`);\r\n }\r\n if (opticalSize !== null && opticalSize !== undefined) {\r\n variations.push(`'opsz' ${opticalSize}`);\r\n }\r\n\r\n return variations.length > 0 ? variations.join(', ') : 'normal';\r\n }\r\n\r\n _buildTextShadow(shadows) {\r\n if (!shadows || !Array.isArray(shadows)) {\r\n return 'none';\r\n }\r\n\r\n return shadows\r\n .map(shadow => {\r\n const offsetX = shadow.offsetX ?? 0;\r\n const offsetY = shadow.offsetY ?? 0;\r\n const blurRadius = shadow.blurRadius ?? 0;\r\n const color = shadow.color ?? 'rgba(0, 0, 0, 0.25)';\r\n return `${offsetX}px ${offsetY}px ${blurRadius}px ${color}`;\r\n })\r\n .join(', ');\r\n }\r\n\r\n _normalizeFontWeight(weight) {\r\n const weightMap = {\r\n thin: '100',\r\n extralight: '200',\r\n light: '300',\r\n normal: '400',\r\n regular: '400',\r\n medium: '500',\r\n semibold: '600',\r\n bold: '700',\r\n extrabold: '800',\r\n black: '900'\r\n };\r\n\r\n if (typeof weight === 'string') {\r\n return weightMap[weight.toLowerCase()] || weight;\r\n }\r\n\r\n return String(weight);\r\n }\r\n\r\n _applyOpacity(color, opacity) {\r\n if (!color) return color;\r\n\r\n // Handle hex color\r\n if (color.startsWith('#')) {\r\n const hex = color.slice(1);\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\r\n }\r\n\r\n // Handle rgb/rgba\r\n if (color.startsWith('rgb')) {\r\n return color.replace(/[\\d.]+\\)/, `${opacity})`);\r\n }\r\n\r\n return color;\r\n }\r\n\r\n _getTextDirection(context) {\r\n // Try to get from document or context\r\n if (typeof document !== 'undefined') {\r\n const dir = document.documentElement.dir || document.dir || 'ltr';\r\n return dir === 'rtl' ? TextDirection.rtl : TextDirection.ltr;\r\n }\r\n return TextDirection.ltr;\r\n }\r\n\r\n _getIconTheme(context) {\r\n // This would typically come from theme context\r\n // For now, return default\r\n return new IconThemeData();\r\n }\r\n\r\n _scaleTextSize(size, context) {\r\n // Apply text scaling factor from context (typically 1.0 - 2.0)\r\n // For now, return unchanged\r\n return size;\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n properties.push({ name: 'icon', value: this.icon });\r\n properties.push({ name: 'size', value: this.size });\r\n properties.push({ name: 'fill', value: this.fill });\r\n properties.push({ name: 'weight', value: this.weight });\r\n properties.push({ name: 'grade', value: this.grade });\r\n properties.push({ name: 'opticalSize', value: this.opticalSize });\r\n properties.push({ name: 'color', value: this.color });\r\n properties.push({ name: 'blendMode', value: this.blendMode });\r\n properties.push({ name: 'semanticLabel', value: this.semanticLabel });\r\n if (this.shadows) {\r\n properties.push({ name: 'shadows', value: this.shadows });\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Material Design Icons - Pre-defined icon data\r\n */\r\nconst Icons = {\r\n // Common icons\r\n home: new IconData({ codePoint: 0xe88a, fontFamily: 'Material Icons' }),\r\n settings: new IconData({ codePoint: 0xe8b8, fontFamily: 'Material Icons' }),\r\n search: new IconData({ codePoint: 0xe8b6, fontFamily: 'Material Icons' }),\r\n favorite: new IconData({ codePoint: 0xe87e, fontFamily: 'Material Icons' }),\r\n favoriteBorder: new IconData({ codePoint: 0xe8cb, fontFamily: 'Material Icons' }),\r\n star: new IconData({ codePoint: 0xe838, fontFamily: 'Material Icons' }),\r\n starBorder: new IconData({ codePoint: 0xe83b, fontFamily: 'Material Icons' }),\r\n close: new IconData({ codePoint: 0xe5cd, fontFamily: 'Material Icons' }),\r\n menu: new IconData({ codePoint: 0xe5d2, fontFamily: 'Material Icons' }),\r\n arrowBack: new IconData({ codePoint: 0xe5e0, fontFamily: 'Material Icons' }),\r\n arrowForward: new IconData({ codePoint: 0xe5e1, fontFamily: 'Material Icons' }),\r\n add: new IconData({ codePoint: 0xe145, fontFamily: 'Material Icons' }),\r\n delete: new IconData({ codePoint: 0xe872, fontFamily: 'Material Icons' }),\r\n edit: new IconData({ codePoint: 0xe3c9, fontFamily: 'Material Icons' }),\r\n check: new IconData({ codePoint: 0xe5ca, fontFamily: 'Material Icons' }),\r\n checkCircle: new IconData({ codePoint: 0xe86c, fontFamily: 'Material Icons' }),\r\n error: new IconData({ codePoint: 0xe783, fontFamily: 'Material Icons' }),\r\n errorOutline: new IconData({ codePoint: 0xe001, fontFamily: 'Material Icons' }),\r\n info: new IconData({ codePoint: 0xe88f, fontFamily: 'Material Icons' }),\r\n warning: new IconData({ codePoint: 0xe002, fontFamily: 'Material Icons' }),\r\n download: new IconData({ codePoint: 0xe2c4, fontFamily: 'Material Icons' }),\r\n upload: new IconData({ codePoint: 0xe2c6, fontFamily: 'Material Icons' }),\r\n refresh: new IconData({ codePoint: 0xe5d5, fontFamily: 'Material Icons' }),\r\n moreVert: new IconData({ codePoint: 0xe5d4, fontFamily: 'Material Icons' }),\r\n moreHoriz: new IconData({ codePoint: 0xe5d3, fontFamily: 'Material Icons' })\r\n};\r\n\r\nexport { Icon, IconData, IconThemeData, Icons };"], - "mappings": "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", - "names": ["StatelessWidget", "VNode", "BlendMode", "TextDirection", "DEFAULT_ICON_SIZE", "DEFAULT_FONT_SIZE", "BLEND_MODE_MAP", "IconData", "codePoint", "fontFamily", "fontPackage", "matchTextDirection", "fontFamilyFallback", "other", "arr1", "arr2", "val", "idx", "hash", "f", "IconThemeData", "color", "opacity", "size", "fill", "weight", "grade", "opticalSize", "shadows", "applyTextScaling", "Icon", "iconOrOptions", "options", "_icon", "_opts", "key", "semanticLabel", "textDirection", "blendMode", "fontWeight", "link", "context", "iconTheme", "tentativeIconSize", "iconSize", "iconFill", "iconWeight", "iconGrade", "iconOpticalSize", "iconShadows", "icon", "iconOpacity", "iconColor", "fontVariations", "inlineStyles", "iconElement", "elementId", "widgetPath", "styles", "fontSize", "primary", "fallback", "families", "variations", "shadow", "offsetX", "offsetY", "blurRadius", "weightMap", "hex", "r", "g", "b", "properties", "Icons"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/image.js b/packages/flutterjs_engine/package/material/dist/material/image.js deleted file mode 100644 index fe6558d2..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/image.js +++ /dev/null @@ -1,2 +0,0 @@ -import{StatefulWidget as H}from"../core/widget_element.js";import{VNode as f}from"@flutterjs/vdom/vnode";import{BoxFit as d,BlendMode as a,FilterQuality as w,Clip as $}from"../utils/utils.js";const m={network:"network",asset:"asset",memory:"memory",file:"file"},p={[a.normal]:"normal",[a.multiply]:"multiply",[a.screen]:"screen",[a.overlay]:"overlay",[a.darken]:"darken",[a.lighten]:"lighten",[a.colorDodge]:"color-dodge",[a.colorBurn]:"color-burn",[a.hardLight]:"hard-light",[a.softLight]:"soft-light",[a.difference]:"difference",[a.exclusion]:"exclusion",[a.hue]:"hue",[a.saturation]:"saturation",[a.color]:"color",[a.luminosity]:"luminosity"},U={[d.fill]:"fill",[d.contain]:"contain",[d.cover]:"cover",[d.fitWidth]:"scale-down",[d.fitHeight]:"scale-down",[d.none]:"none",[d.scaleDown]:"scale-down"},y={none:"visible",hardEdge:"hidden",antiAlias:"hidden",antiAliasWithSaveLayer:"hidden"};class N{constructor(e){this.completer=e,this.isAlive=!0}dispose(){this.isAlive=!1}keepAlive(){return this}}class u{constructor(e){this.imageProvider=e,this.listeners=new Set,this.imageInfo=null,this.error=null,this.completer=null}addListener(e){this.listeners.add(e),this.imageInfo&&e.onImage(this.imageInfo)}removeListener(e){this.listeners.delete(e)}notifyListeners(e){this.imageInfo=e,this.listeners.forEach(t=>{t.onImage&&t.onImage(e)})}notifyError(e,t){this.error=e,this.listeners.forEach(i=>{i.onError&&i.onError(e,t)})}notifyChunk(e){this.listeners.forEach(t=>{t.onChunk&&t.onChunk(e)})}}class R{constructor({cumulativeBytesLoaded:e=0,expectedTotalBytes:t=null}={}){this.cumulativeBytesLoaded=e,this.expectedTotalBytes=t}get progress(){return this.expectedTotalBytes?this.cumulativeBytesLoaded/this.expectedTotalBytes:0}}class g{constructor(e=m.network){this.sourceType=e,this.key=Math.random().toString(36).substr(2,9)}resolve(e={}){return new u(this)}async load(){throw new Error("load() must be implemented")}getUrl(){throw new Error("getUrl() must be implemented")}}class I extends g{constructor(e,{scale:t=1,headers:i=null,timeout:s=1e4,onProgress:r=null}={}){super(m.network),this.src=e,this.scale=t,this.headers=i||{},this.timeout=s,this.onProgress=r}resolve(e={}){const t=new u(this);return this._loadWithStream(t,e),t}async _loadWithStream(e,t){try{const i=await this._loadImage();e.notifyListeners({image:i.element,width:i.width,height:i.height,scale:this.scale,src:this.src})}catch(i){e.notifyError(i,new Error().stack)}}_loadImage(){return new Promise((e,t)=>{const i=setTimeout(()=>{t(new Error(`Network image timeout: ${this.src}`))},this.timeout),s=new XMLHttpRequest;s.addEventListener("progress",r=>{r.lengthComputable&&this.onProgress&&this.onProgress({cumulativeBytesLoaded:r.loaded,expectedTotalBytes:r.total})}),s.addEventListener("load",()=>{if(clearTimeout(i),s.status>=200&&s.status<300){const r=s.response,n=new l;n.onload=()=>{e({element:n,width:n.naturalWidth,height:n.naturalHeight,scale:this.scale})},n.onerror=()=>{t(new Error(`Failed to load network image: ${this.src}`))},n.src=URL.createObjectURL(r)}else t(new Error(`HTTP ${s.status}: ${this.src}`))}),s.addEventListener("error",()=>{clearTimeout(i),t(new Error(`Network error loading: ${this.src}`))}),s.responseType="blob",s.open("GET",this.src,!0),Object.entries(this.headers).forEach(([r,n])=>{s.setRequestHeader(r,n)}),s.send()})}async load(){return this._loadImage()}getUrl(){return this.src}}class S extends g{constructor(e,{packages:t=null,scale:i=1}={}){super(m.asset),this.assetPath=e,this.packages=t,this.scale=i,this.key=`asset:${t}:${e}:${i}`}resolve(e={}){const t=new u(this);return this._loadWithStream(t,e),t}async _loadWithStream(e,t){try{const i=await this.load();e.notifyListeners({image:i.element,width:i.width,height:i.height,scale:this.scale,src:i.src})}catch(i){e.notifyError(i,new Error().stack)}}async load(){return new Promise((e,t)=>{const i=this._resolveAssetPath(),s=new l;s.onload=()=>{e({element:s,src:i,width:s.naturalWidth,height:s.naturalHeight,scale:this.scale})},s.onerror=()=>{t(new Error(`Failed to load asset image: ${this.assetPath}`))},s.src=i})}_resolveAssetPath(){return`${this.packages?`/packages/${this.packages}`:"/assets"}/${this.assetPath}`}getUrl(){return this._resolveAssetPath()}}class b extends g{constructor(e,{scale:t=1}={}){super(m.memory),this.bytes=e,this.scale=t,this.key=`memory:${this.bytes.length}:${t}`}resolve(e={}){const t=new u(this);return this._loadWithStream(t,e),t}async _loadWithStream(e,t){try{const i=await this.load();e.notifyListeners({image:i.element,width:i.width,height:i.height,scale:this.scale,src:i.src})}catch(i){e.notifyError(i,new Error().stack)}}async load(){return new Promise((e,t)=>{try{let i;if(this.bytes instanceof Uint8Array){const r=String.fromCharCode.apply(null,this.bytes);i="data:image/png;base64,"+btoa(r)}else if(typeof this.bytes=="string")i=this.bytes.startsWith("data:")?this.bytes:`data:image/png;base64,${this.bytes}`;else throw new Error("Invalid image data");const s=new l;s.onload=()=>{e({element:s,src:i,width:s.naturalWidth,height:s.naturalHeight,scale:this.scale})},s.onerror=()=>{t(new Error("Failed to load memory image"))},s.src=i}catch(i){t(i)}})}getUrl(){if(this.bytes instanceof Uint8Array){const e=String.fromCharCode.apply(null,this.bytes);return"data:image/png;base64,"+btoa(e)}return this.bytes}}class v extends g{constructor(e,{scale:t=1}={}){super(m.file),this.filePath=e,this.scale=t}async load(){throw typeof window<"u"?new Error("FileImage is not supported in web environments. Use Image.asset or Image.network instead."):new Error("FileImage requires Node.js file system implementation")}getUrl(){return this.filePath}}class l extends H{constructor({key:e=null,image:t=null,width:i=null,height:s=null,color:r=null,opacity:n=null,colorBlendMode:o=a.normal,fit:c=d.contain,alignment:_="center",repeat:L="no-repeat",centerSlice:k=null,matchTextDirection:E=!1,gaplessPlayback:P=!1,isAntiAlias:B=!1,filterQuality:T=w.medium,frameBuilder:C=null,loadingBuilder:A=null,errorBuilder:F=null,semanticLabel:x=null,excludeFromSemantics:M=!1,clipBehavior:W=$.hardEdge}={}){if(super(e),!t||!(t instanceof g))throw new Error("Image requires a valid ImageProvider");this.image=t,this.width=i,this.height=s,this.color=r,this.opacity=n,this.colorBlendMode=o,this.fit=c,this.alignment=_,this.repeat=L,this.centerSlice=k,this.matchTextDirection=E,this.gaplessPlayback=P,this.isAntiAlias=B,this.filterQuality=T,this.frameBuilder=C,this.loadingBuilder=A,this.errorBuilder=F,this.semanticLabel=x,this.excludeFromSemantics=M,this.clipBehavior=W}static network(e,{key:t=null,scale:i=1,headers:s=null,cacheWidth:r=null,cacheHeight:n=null,...o}={}){const c=new I(e,{scale:i,headers:s});return new l({key:t,image:c,...o})}static asset(e,{key:t=null,scale:i=null,packages:s=null,cacheWidth:r=null,cacheHeight:n=null,...o}={}){const c=new S(e,{packages:s,scale:i||1});return new l({key:t,image:c,...o})}static memory(e,{key:t=null,scale:i=1,cacheWidth:s=null,cacheHeight:r=null,...n}={}){const o=new b(e,{scale:i});return new l({key:t,image:o,...n})}static file(e,{key:t=null,scale:i=1,cacheWidth:s=null,cacheHeight:r=null,...n}={}){if(typeof window<"u")throw new Error("Image.file is not supported on Flutter Web. Consider using either Image.asset or Image.network instead.");const o=new v(e,{scale:i});return new l({key:t,image:o,...n})}createState(){return new D}debugFillProperties(e){super.debugFillProperties(e),e.push({name:"image",value:this.image}),e.push({name:"width",value:this.width}),e.push({name:"height",value:this.height}),e.push({name:"color",value:this.color}),e.push({name:"colorBlendMode",value:this.colorBlendMode}),e.push({name:"fit",value:this.fit}),e.push({name:"alignment",value:this.alignment}),e.push({name:"gaplessPlayback",value:this.gaplessPlayback}),e.push({name:"filterQuality",value:this.filterQuality})}}class D{constructor(e){this.widget=e,this.imageStream=null,this.imageInfo=null,this.loadingProgress=null,this.isListeningToStream=!1,this.error=null,this.errorStack=null,this.frameNumber=null,this.wasSynchronouslyLoaded=!1,this.completerHandle=null,this.lastImageProvider=null}initState(){}didChangeDependencies(){this._resolveImage(),this._listenToStream()}didUpdateWidget(e){this.isListeningToStream&&this.widget.loadingBuilder==null!=(e.loadingBuilder==null)&&this._updateStreamListener(),this.widget.image!==e.image&&this._resolveImage()}dispose(){this._stopListeningToStream(),this.completerHandle?.dispose()}_resolveImage(){const e=this.widget.image.resolve({});e.imageProvider.key!==this.lastImageProvider?.key&&(this._updateSourceStream(e),this.lastImageProvider=e.imageProvider)}_updateSourceStream(e){this.imageStream?.imageProvider.key!==e.imageProvider.key&&(this.isListeningToStream&&this._removeImageStreamListener(),this.widget.gaplessPlayback||this._replaceImage(null),this.loadingProgress=null,this.frameNumber=null,this.wasSynchronouslyLoaded=!1,this.imageStream=e,this.isListeningToStream&&this._addImageStreamListener())}_listenToStream(){this.isListeningToStream||(this._addImageStreamListener(),this.isListeningToStream=!0)}_stopListeningToStream(){this.isListeningToStream&&(this.completerHandle==null&&this.imageStream?.completer&&(this.completerHandle=this.imageStream.completer.keepAlive()),this._removeImageStreamListener(),this.isListeningToStream=!1)}_addImageStreamListener(){this.imageStream?.addListener({onImage:e=>this._handleImageFrame(e),onError:(e,t)=>this._handleImageError(e,t),onChunk:e=>this._handleImageChunk(e)})}_removeImageStreamListener(){this.imageStream?.removeListener({onImage:e=>this._handleImageFrame(e),onError:(e,t)=>this._handleImageError(e,t),onChunk:e=>this._handleImageChunk(e)})}_updateStreamListener(){this._removeImageStreamListener(),this._addImageStreamListener()}_handleImageFrame(e){this.imageInfo=e,this.loadingProgress=null,this.error=null,this.errorStack=null,this.frameNumber=(this.frameNumber||0)+1,this.wasSynchronouslyLoaded=!0}_handleImageChunk(e){this.widget.loadingBuilder&&(this.loadingProgress=e)}_handleImageError(e,t){this.error=e,this.errorStack=t,this.widget.errorBuilder}_replaceImage(e){this.imageInfo=e}build(e){const t=e.element.getElementId(),i=e.element.getWidgetPath(),s=this._getInlineStyles();if(this.error)return this.widget.errorBuilder?this.widget.errorBuilder(e,this.error,this.errorStack):new f({tag:"div",props:{className:"fjs-image-error",style:{...s,backgroundColor:"#f0f0f0",display:"flex",alignItems:"center",justifyContent:"center",color:"#999",overflow:y[this.widget.clipBehavior]||"hidden"},"data-element-id":t,"data-widget-path":i,title:this.error.message},children:["\u26A0 Image failed to load"]});if(!this.imageInfo&&this.widget.loadingBuilder)return this.widget.loadingBuilder(e,null,this.loadingProgress);let r=this._buildImageElement(t,i,s);return this.widget.frameBuilder&&(r=this.widget.frameBuilder(e,r,this.frameNumber,this.wasSynchronouslyLoaded)),this.widget.loadingBuilder&&(r=this.widget.loadingBuilder(e,r,this.loadingProgress)),this.widget.excludeFromSemantics||(r=new f({tag:"figure",props:{role:"img","aria-label":this.widget.semanticLabel||"Image",style:{margin:0}},children:[r]})),r}_buildImageElement(e,t,i){const s={className:"fjs-image",style:i,"data-element-id":e,"data-widget-path":t,"data-widget":"Image","data-source-type":this.widget.image.sourceType,alt:this.widget.semanticLabel||"Image"};return this.imageInfo&&(s.src=this.imageInfo.src),new f({tag:"img",props:s,key:this.widget.key})}_getInlineStyles(){const e={width:this.widget.width?`${this.widget.width}px`:"auto",height:this.widget.height?`${this.widget.height}px`:"auto",objectFit:U[this.widget.fit]||"contain",objectPosition:this._mapAlignment(),backgroundRepeat:this.widget.repeat,overflow:y[this.widget.clipBehavior]||"hidden",filter:this._buildFilterStyles()};return this.widget.color&&this.widget.colorBlendMode&&(e.mixBlendMode=p[this.widget.colorBlendMode]||"normal",e.backgroundColor=this.widget.color,e.backgroundBlendMode=p[this.widget.colorBlendMode]),this.widget.opacity!==null&&this.widget.opacity!==void 0&&(e.opacity=this.widget.opacity),this.widget.isAntiAlias?e.imageRendering="smooth":e.imageRendering="pixelated",this.widget.matchTextDirection&&(e.direction=document.dir||"ltr"),e}_mapAlignment(){return{center:"center",topLeft:"top left",topCenter:"top center",topRight:"top right",centerLeft:"center left",centerRight:"center right",bottomLeft:"bottom left",bottomCenter:"bottom center",bottomRight:"bottom right"}[this.widget.alignment]||"center"}_buildFilterStyles(){const e=[];return this.widget.filterQuality===w.high?e.push("contrast(1.1) saturate(1.05)"):this.widget.filterQuality===w.low&&e.push("blur(0.5px)"),e.length>0?e.join(" "):"none"}}export{S as AssetImage,v as FileImage,m as IMAGE_SOURCE_TYPES,l as Image,R as ImageChunkEvent,g as ImageProvider,u as ImageStream,N as ImageStreamCompleterHandle,b as MemoryImage,I as NetworkImage}; -//# sourceMappingURL=image.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/image.js.map b/packages/flutterjs_engine/package/material/dist/material/image.js.map deleted file mode 100644 index 7b1cb9df..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/image.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/image.js"], - "sourcesContent": ["\r\nimport { StatefulWidget } from '../core/widget_element.js';\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\nimport { BoxFit, BlendMode, FilterQuality, Clip } from '../utils/utils.js';\r\n\r\nconst IMAGE_SOURCE_TYPES = {\r\n network: 'network',\r\n asset: 'asset',\r\n memory: 'memory',\r\n file: 'file'\r\n};\r\n\r\nconst BLEND_MODE_MAP = {\r\n [BlendMode.normal]: 'normal',\r\n [BlendMode.multiply]: 'multiply',\r\n [BlendMode.screen]: 'screen',\r\n [BlendMode.overlay]: 'overlay',\r\n [BlendMode.darken]: 'darken',\r\n [BlendMode.lighten]: 'lighten',\r\n [BlendMode.colorDodge]: 'color-dodge',\r\n [BlendMode.colorBurn]: 'color-burn',\r\n [BlendMode.hardLight]: 'hard-light',\r\n [BlendMode.softLight]: 'soft-light',\r\n [BlendMode.difference]: 'difference',\r\n [BlendMode.exclusion]: 'exclusion',\r\n [BlendMode.hue]: 'hue',\r\n [BlendMode.saturation]: 'saturation',\r\n [BlendMode.color]: 'color',\r\n [BlendMode.luminosity]: 'luminosity'\r\n};\r\n\r\nconst BOX_FIT_MAP = {\r\n [BoxFit.fill]: 'fill',\r\n [BoxFit.contain]: 'contain',\r\n [BoxFit.cover]: 'cover',\r\n [BoxFit.fitWidth]: 'scale-down',\r\n [BoxFit.fitHeight]: 'scale-down',\r\n [BoxFit.none]: 'none',\r\n [BoxFit.scaleDown]: 'scale-down'\r\n};\r\n\r\nconst CLIP_BEHAVIOR_MAP = {\r\n none: 'visible',\r\n hardEdge: 'hidden',\r\n antiAlias: 'hidden',\r\n antiAliasWithSaveLayer: 'hidden'\r\n};\r\n\r\n/**\r\n * ImageStreamCompleterHandle - Manages stream lifecycle and memory\r\n */\r\nclass ImageStreamCompleterHandle {\r\n constructor(completer) {\r\n this.completer = completer;\r\n this.isAlive = true;\r\n }\r\n\r\n dispose() {\r\n this.isAlive = false;\r\n }\r\n\r\n keepAlive() {\r\n return this;\r\n }\r\n}\r\n\r\n/**\r\n * ImageStream - Handles image loading state and listeners\r\n */\r\nclass ImageStream {\r\n constructor(imageProvider) {\r\n this.imageProvider = imageProvider;\r\n this.listeners = new Set();\r\n this.imageInfo = null;\r\n this.error = null;\r\n this.completer = null;\r\n }\r\n\r\n addListener(listener) {\r\n this.listeners.add(listener);\r\n if (this.imageInfo) {\r\n listener.onImage(this.imageInfo);\r\n }\r\n }\r\n\r\n removeListener(listener) {\r\n this.listeners.delete(listener);\r\n }\r\n\r\n notifyListeners(imageInfo) {\r\n this.imageInfo = imageInfo;\r\n this.listeners.forEach(listener => {\r\n if (listener.onImage) listener.onImage(imageInfo);\r\n });\r\n }\r\n\r\n notifyError(error, stackTrace) {\r\n this.error = error;\r\n this.listeners.forEach(listener => {\r\n if (listener.onError) listener.onError(error, stackTrace);\r\n });\r\n }\r\n\r\n notifyChunk(event) {\r\n this.listeners.forEach(listener => {\r\n if (listener.onChunk) listener.onChunk(event);\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * ImageChunkEvent - Tracks image loading progress\r\n */\r\nclass ImageChunkEvent {\r\n constructor({ cumulativeBytesLoaded = 0, expectedTotalBytes = null } = {}) {\r\n this.cumulativeBytesLoaded = cumulativeBytesLoaded;\r\n this.expectedTotalBytes = expectedTotalBytes;\r\n }\r\n\r\n get progress() {\r\n if (!this.expectedTotalBytes) return 0;\r\n return this.cumulativeBytesLoaded / this.expectedTotalBytes;\r\n }\r\n}\r\n\r\n/**\r\n * ImageProvider - Base class for different image sources\r\n */\r\nclass ImageProvider {\r\n constructor(sourceType = IMAGE_SOURCE_TYPES.network) {\r\n this.sourceType = sourceType;\r\n this.key = Math.random().toString(36).substr(2, 9);\r\n }\r\n\r\n resolve(config = {}) {\r\n return new ImageStream(this);\r\n }\r\n\r\n async load() {\r\n throw new Error('load() must be implemented');\r\n }\r\n\r\n getUrl() {\r\n throw new Error('getUrl() must be implemented');\r\n }\r\n}\r\n\r\n/**\r\n * NetworkImage - Load images from network URLs with progress tracking\r\n */\r\nclass NetworkImage extends ImageProvider {\r\n constructor(src, { scale = 1.0, headers = null, timeout = 10000, onProgress = null } = {}) {\r\n super(IMAGE_SOURCE_TYPES.network);\r\n this.src = src;\r\n this.scale = scale;\r\n this.headers = headers || {};\r\n this.timeout = timeout;\r\n this.onProgress = onProgress;\r\n }\r\n\r\n resolve(config = {}) {\r\n const stream = new ImageStream(this);\r\n this._loadWithStream(stream, config);\r\n return stream;\r\n }\r\n\r\n async _loadWithStream(stream, config) {\r\n try {\r\n const result = await this._loadImage();\r\n stream.notifyListeners({\r\n image: result.element,\r\n width: result.width,\r\n height: result.height,\r\n scale: this.scale,\r\n src: this.src\r\n });\r\n } catch (error) {\r\n stream.notifyError(error, new Error().stack);\r\n }\r\n }\r\n\r\n _loadImage() {\r\n return new Promise((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n reject(new Error(`Network image timeout: ${this.src}`));\r\n }, this.timeout);\r\n\r\n const xhr = new XMLHttpRequest();\r\n \r\n xhr.addEventListener('progress', (e) => {\r\n if (e.lengthComputable && this.onProgress) {\r\n this.onProgress({\r\n cumulativeBytesLoaded: e.loaded,\r\n expectedTotalBytes: e.total\r\n });\r\n }\r\n });\r\n\r\n xhr.addEventListener('load', () => {\r\n clearTimeout(timer);\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n const blob = xhr.response;\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n resolve({\r\n element: img,\r\n width: img.naturalWidth,\r\n height: img.naturalHeight,\r\n scale: this.scale\r\n });\r\n };\r\n\r\n img.onerror = () => {\r\n reject(new Error(`Failed to load network image: ${this.src}`));\r\n };\r\n\r\n img.src = URL.createObjectURL(blob);\r\n } else {\r\n reject(new Error(`HTTP ${xhr.status}: ${this.src}`));\r\n }\r\n });\r\n\r\n xhr.addEventListener('error', () => {\r\n clearTimeout(timer);\r\n reject(new Error(`Network error loading: ${this.src}`));\r\n });\r\n\r\n xhr.responseType = 'blob';\r\n xhr.open('GET', this.src, true);\r\n \r\n Object.entries(this.headers).forEach(([key, value]) => {\r\n xhr.setRequestHeader(key, value);\r\n });\r\n\r\n xhr.send();\r\n });\r\n }\r\n\r\n async load() {\r\n return this._loadImage();\r\n }\r\n\r\n getUrl() {\r\n return this.src;\r\n }\r\n}\r\n\r\n/**\r\n * AssetImage - Load images from project assets\r\n */\r\nclass AssetImage extends ImageProvider {\r\n constructor(assetPath, { packages = null, scale = 1.0 } = {}) {\r\n super(IMAGE_SOURCE_TYPES.asset);\r\n this.assetPath = assetPath;\r\n this.packages = packages;\r\n this.scale = scale;\r\n this.key = `asset:${packages}:${assetPath}:${scale}`;\r\n }\r\n\r\n resolve(config = {}) {\r\n const stream = new ImageStream(this);\r\n this._loadWithStream(stream, config);\r\n return stream;\r\n }\r\n\r\n async _loadWithStream(stream, config) {\r\n try {\r\n const result = await this.load();\r\n stream.notifyListeners({\r\n image: result.element,\r\n width: result.width,\r\n height: result.height,\r\n scale: this.scale,\r\n src: result.src\r\n });\r\n } catch (error) {\r\n stream.notifyError(error, new Error().stack);\r\n }\r\n }\r\n\r\n async load() {\r\n return new Promise((resolve, reject) => {\r\n const assetUrl = this._resolveAssetPath();\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n resolve({\r\n element: img,\r\n src: assetUrl,\r\n width: img.naturalWidth,\r\n height: img.naturalHeight,\r\n scale: this.scale\r\n });\r\n };\r\n\r\n img.onerror = () => {\r\n reject(new Error(`Failed to load asset image: ${this.assetPath}`));\r\n };\r\n\r\n img.src = assetUrl;\r\n });\r\n }\r\n\r\n _resolveAssetPath() {\r\n const basePath = this.packages ? `/packages/${this.packages}` : '/assets';\r\n return `${basePath}/${this.assetPath}`;\r\n }\r\n\r\n getUrl() {\r\n return this._resolveAssetPath();\r\n }\r\n}\r\n\r\n/**\r\n * MemoryImage - Load images from Uint8Array or base64 encoded data\r\n */\r\nclass MemoryImage extends ImageProvider {\r\n constructor(bytes, { scale = 1.0 } = {}) {\r\n super(IMAGE_SOURCE_TYPES.memory);\r\n this.bytes = bytes;\r\n this.scale = scale;\r\n this.key = `memory:${this.bytes.length}:${scale}`;\r\n }\r\n\r\n resolve(config = {}) {\r\n const stream = new ImageStream(this);\r\n this._loadWithStream(stream, config);\r\n return stream;\r\n }\r\n\r\n async _loadWithStream(stream, config) {\r\n try {\r\n const result = await this.load();\r\n stream.notifyListeners({\r\n image: result.element,\r\n width: result.width,\r\n height: result.height,\r\n scale: this.scale,\r\n src: result.src\r\n });\r\n } catch (error) {\r\n stream.notifyError(error, new Error().stack);\r\n }\r\n }\r\n\r\n async load() {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n let dataUrl;\r\n\r\n if (this.bytes instanceof Uint8Array) {\r\n const binary = String.fromCharCode.apply(null, this.bytes);\r\n dataUrl = 'data:image/png;base64,' + btoa(binary);\r\n } else if (typeof this.bytes === 'string') {\r\n dataUrl = this.bytes.startsWith('data:') ? this.bytes : `data:image/png;base64,${this.bytes}`;\r\n } else {\r\n throw new Error('Invalid image data');\r\n }\r\n\r\n const img = new Image();\r\n img.onload = () => {\r\n resolve({\r\n element: img,\r\n src: dataUrl,\r\n width: img.naturalWidth,\r\n height: img.naturalHeight,\r\n scale: this.scale\r\n });\r\n };\r\n\r\n img.onerror = () => {\r\n reject(new Error('Failed to load memory image'));\r\n };\r\n\r\n img.src = dataUrl;\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n getUrl() {\r\n if (this.bytes instanceof Uint8Array) {\r\n const binary = String.fromCharCode.apply(null, this.bytes);\r\n return 'data:image/png;base64,' + btoa(binary);\r\n }\r\n return this.bytes;\r\n }\r\n}\r\n\r\n/**\r\n * FileImage - Load images from file system (Node.js environment)\r\n */\r\nclass FileImage extends ImageProvider {\r\n constructor(filePath, { scale = 1.0 } = {}) {\r\n super(IMAGE_SOURCE_TYPES.file);\r\n this.filePath = filePath;\r\n this.scale = scale;\r\n }\r\n\r\n async load() {\r\n if (typeof window !== 'undefined') {\r\n throw new Error('FileImage is not supported in web environments. Use Image.asset or Image.network instead.');\r\n }\r\n throw new Error('FileImage requires Node.js file system implementation');\r\n }\r\n\r\n getUrl() {\r\n return this.filePath;\r\n }\r\n}\r\n\r\n/**\r\n * Image - StatefulWidget for rendering images with various sources\r\n * Mirrors Flutter's Image widget API and behavior\r\n */\r\nclass Image extends StatefulWidget {\r\n constructor({\r\n key = null,\r\n image = null,\r\n width = null,\r\n height = null,\r\n color = null,\r\n opacity = null,\r\n colorBlendMode = BlendMode.normal,\r\n fit = BoxFit.contain,\r\n alignment = 'center',\r\n repeat = 'no-repeat',\r\n centerSlice = null,\r\n matchTextDirection = false,\r\n gaplessPlayback = false,\r\n isAntiAlias = false,\r\n filterQuality = FilterQuality.medium,\r\n frameBuilder = null,\r\n loadingBuilder = null,\r\n errorBuilder = null,\r\n semanticLabel = null,\r\n excludeFromSemantics = false,\r\n clipBehavior = Clip.hardEdge\r\n } = {}) {\r\n super(key);\r\n \r\n if (!image || !(image instanceof ImageProvider)) {\r\n throw new Error('Image requires a valid ImageProvider');\r\n }\r\n\r\n this.image = image;\r\n this.width = width;\r\n this.height = height;\r\n this.color = color;\r\n this.opacity = opacity;\r\n this.colorBlendMode = colorBlendMode;\r\n this.fit = fit;\r\n this.alignment = alignment;\r\n this.repeat = repeat;\r\n this.centerSlice = centerSlice;\r\n this.matchTextDirection = matchTextDirection;\r\n this.gaplessPlayback = gaplessPlayback;\r\n this.isAntiAlias = isAntiAlias;\r\n this.filterQuality = filterQuality;\r\n this.frameBuilder = frameBuilder;\r\n this.loadingBuilder = loadingBuilder;\r\n this.errorBuilder = errorBuilder;\r\n this.semanticLabel = semanticLabel;\r\n this.excludeFromSemantics = excludeFromSemantics;\r\n this.clipBehavior = clipBehavior;\r\n }\r\n\r\n static network(src, {\r\n key = null,\r\n scale = 1.0,\r\n headers = null,\r\n cacheWidth = null,\r\n cacheHeight = null,\r\n ...otherOptions\r\n } = {}) {\r\n const provider = new NetworkImage(src, { scale, headers });\r\n return new Image({ key, image: provider, ...otherOptions });\r\n }\r\n\r\n static asset(assetPath, {\r\n key = null,\r\n scale = null,\r\n packages = null,\r\n cacheWidth = null,\r\n cacheHeight = null,\r\n ...otherOptions\r\n } = {}) {\r\n const provider = new AssetImage(assetPath, { packages, scale: scale || 1.0 });\r\n return new Image({ key, image: provider, ...otherOptions });\r\n }\r\n\r\n static memory(bytes, {\r\n key = null,\r\n scale = 1.0,\r\n cacheWidth = null,\r\n cacheHeight = null,\r\n ...otherOptions\r\n } = {}) {\r\n const provider = new MemoryImage(bytes, { scale });\r\n return new Image({ key, image: provider, ...otherOptions });\r\n }\r\n\r\n static file(filePath, {\r\n key = null,\r\n scale = 1.0,\r\n cacheWidth = null,\r\n cacheHeight = null,\r\n ...otherOptions\r\n } = {}) {\r\n if (typeof window !== 'undefined') {\r\n throw new Error('Image.file is not supported on Flutter Web. Consider using either Image.asset or Image.network instead.');\r\n }\r\n const provider = new FileImage(filePath, { scale });\r\n return new Image({ key, image: provider, ...otherOptions });\r\n }\r\n\r\n createState() {\r\n return new _ImageState();\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n properties.push({ name: 'image', value: this.image });\r\n properties.push({ name: 'width', value: this.width });\r\n properties.push({ name: 'height', value: this.height });\r\n properties.push({ name: 'color', value: this.color });\r\n properties.push({ name: 'colorBlendMode', value: this.colorBlendMode });\r\n properties.push({ name: 'fit', value: this.fit });\r\n properties.push({ name: 'alignment', value: this.alignment });\r\n properties.push({ name: 'gaplessPlayback', value: this.gaplessPlayback });\r\n properties.push({ name: 'filterQuality', value: this.filterQuality });\r\n }\r\n}\r\n\r\n/**\r\n * _ImageState - State management for Image widget\r\n * Handles loading, caching, error recovery, and lifecycle\r\n */\r\nclass _ImageState {\r\n constructor(widget) {\r\n this.widget = widget;\r\n this.imageStream = null;\r\n this.imageInfo = null;\r\n this.loadingProgress = null;\r\n this.isListeningToStream = false;\r\n this.error = null;\r\n this.errorStack = null;\r\n this.frameNumber = null;\r\n this.wasSynchronouslyLoaded = false;\r\n this.completerHandle = null;\r\n this.lastImageProvider = null;\r\n }\r\n\r\n initState() {\r\n // Initialize state\r\n }\r\n\r\n didChangeDependencies() {\r\n this._resolveImage();\r\n this._listenToStream();\r\n }\r\n\r\n didUpdateWidget(oldWidget) {\r\n if (this.isListeningToStream && \r\n (this.widget.loadingBuilder == null) !== (oldWidget.loadingBuilder == null)) {\r\n this._updateStreamListener();\r\n }\r\n\r\n if (this.widget.image !== oldWidget.image) {\r\n this._resolveImage();\r\n }\r\n }\r\n\r\n dispose() {\r\n this._stopListeningToStream();\r\n this.completerHandle?.dispose();\r\n }\r\n\r\n _resolveImage() {\r\n const newStream = this.widget.image.resolve({});\r\n\r\n if (newStream.imageProvider.key !== this.lastImageProvider?.key) {\r\n this._updateSourceStream(newStream);\r\n this.lastImageProvider = newStream.imageProvider;\r\n }\r\n }\r\n\r\n _updateSourceStream(newStream) {\r\n if (this.imageStream?.imageProvider.key === newStream.imageProvider.key) {\r\n return;\r\n }\r\n\r\n if (this.isListeningToStream) {\r\n this._removeImageStreamListener();\r\n }\r\n\r\n if (!this.widget.gaplessPlayback) {\r\n this._replaceImage(null);\r\n }\r\n\r\n this.loadingProgress = null;\r\n this.frameNumber = null;\r\n this.wasSynchronouslyLoaded = false;\r\n this.imageStream = newStream;\r\n\r\n if (this.isListeningToStream) {\r\n this._addImageStreamListener();\r\n }\r\n }\r\n\r\n _listenToStream() {\r\n if (this.isListeningToStream) return;\r\n\r\n this._addImageStreamListener();\r\n this.isListeningToStream = true;\r\n }\r\n\r\n _stopListeningToStream() {\r\n if (!this.isListeningToStream) return;\r\n\r\n if (this.completerHandle == null && this.imageStream?.completer) {\r\n this.completerHandle = this.imageStream.completer.keepAlive();\r\n }\r\n\r\n this._removeImageStreamListener();\r\n this.isListeningToStream = false;\r\n }\r\n\r\n _addImageStreamListener() {\r\n this.imageStream?.addListener({\r\n onImage: (imageInfo) => this._handleImageFrame(imageInfo),\r\n onError: (error, stackTrace) => this._handleImageError(error, stackTrace),\r\n onChunk: (event) => this._handleImageChunk(event)\r\n });\r\n }\r\n\r\n _removeImageStreamListener() {\r\n this.imageStream?.removeListener({\r\n onImage: (imageInfo) => this._handleImageFrame(imageInfo),\r\n onError: (error, stackTrace) => this._handleImageError(error, stackTrace),\r\n onChunk: (event) => this._handleImageChunk(event)\r\n });\r\n }\r\n\r\n _updateStreamListener() {\r\n this._removeImageStreamListener();\r\n this._addImageStreamListener();\r\n }\r\n\r\n _handleImageFrame(imageInfo) {\r\n this.imageInfo = imageInfo;\r\n this.loadingProgress = null;\r\n this.error = null;\r\n this.errorStack = null;\r\n this.frameNumber = (this.frameNumber || 0) + 1;\r\n this.wasSynchronouslyLoaded = true;\r\n }\r\n\r\n _handleImageChunk(event) {\r\n if (this.widget.loadingBuilder) {\r\n this.loadingProgress = event;\r\n }\r\n }\r\n\r\n _handleImageError(error, stackTrace) {\r\n this.error = error;\r\n this.errorStack = stackTrace;\r\n if (this.widget.errorBuilder) {\r\n // Trigger rebuild through parent context\r\n }\r\n }\r\n\r\n _replaceImage(imageInfo) {\r\n this.imageInfo = imageInfo;\r\n }\r\n\r\n build(context) {\r\n const elementId = context.element.getElementId();\r\n const widgetPath = context.element.getWidgetPath();\r\n const inlineStyles = this._getInlineStyles();\r\n\r\n // Handle error state\r\n if (this.error) {\r\n if (this.widget.errorBuilder) {\r\n return this.widget.errorBuilder(context, this.error, this.errorStack);\r\n }\r\n return new VNode({\r\n tag: 'div',\r\n props: {\r\n className: 'fjs-image-error',\r\n style: {\r\n ...inlineStyles,\r\n backgroundColor: '#f0f0f0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n color: '#999',\r\n overflow: CLIP_BEHAVIOR_MAP[this.widget.clipBehavior] || 'hidden'\r\n },\r\n 'data-element-id': elementId,\r\n 'data-widget-path': widgetPath,\r\n title: this.error.message\r\n },\r\n children: ['\u26A0 Image failed to load']\r\n });\r\n }\r\n\r\n // Handle loading state\r\n if (!this.imageInfo && this.widget.loadingBuilder) {\r\n return this.widget.loadingBuilder(context, null, this.loadingProgress);\r\n }\r\n\r\n let result = this._buildImageElement(elementId, widgetPath, inlineStyles);\r\n\r\n // Apply frame builder\r\n if (this.widget.frameBuilder) {\r\n result = this.widget.frameBuilder(\r\n context,\r\n result,\r\n this.frameNumber,\r\n this.wasSynchronouslyLoaded\r\n );\r\n }\r\n\r\n // Apply loading builder wrapper\r\n if (this.widget.loadingBuilder) {\r\n result = this.widget.loadingBuilder(context, result, this.loadingProgress);\r\n }\r\n\r\n // Apply semantics\r\n if (!this.widget.excludeFromSemantics) {\r\n result = new VNode({\r\n tag: 'figure',\r\n props: {\r\n role: 'img',\r\n 'aria-label': this.widget.semanticLabel || 'Image',\r\n style: { margin: 0 }\r\n },\r\n children: [result]\r\n });\r\n }\r\n\r\n return result;\r\n }\r\n\r\n _buildImageElement(elementId, widgetPath, inlineStyles) {\r\n const imgProps = {\r\n className: 'fjs-image',\r\n style: inlineStyles,\r\n 'data-element-id': elementId,\r\n 'data-widget-path': widgetPath,\r\n 'data-widget': 'Image',\r\n 'data-source-type': this.widget.image.sourceType,\r\n alt: this.widget.semanticLabel || 'Image'\r\n };\r\n\r\n if (this.imageInfo) {\r\n imgProps.src = this.imageInfo.src;\r\n }\r\n\r\n return new VNode({\r\n tag: 'img',\r\n props: imgProps,\r\n key: this.widget.key\r\n });\r\n }\r\n\r\n _getInlineStyles() {\r\n const styles = {\r\n width: this.widget.width ? `${this.widget.width}px` : 'auto',\r\n height: this.widget.height ? `${this.widget.height}px` : 'auto',\r\n objectFit: BOX_FIT_MAP[this.widget.fit] || 'contain',\r\n objectPosition: this._mapAlignment(),\r\n backgroundRepeat: this.widget.repeat,\r\n overflow: CLIP_BEHAVIOR_MAP[this.widget.clipBehavior] || 'hidden',\r\n filter: this._buildFilterStyles()\r\n };\r\n\r\n // Apply color blend mode\r\n if (this.widget.color && this.widget.colorBlendMode) {\r\n styles.mixBlendMode = BLEND_MODE_MAP[this.widget.colorBlendMode] || 'normal';\r\n // Create color overlay\r\n styles.backgroundColor = this.widget.color;\r\n styles.backgroundBlendMode = BLEND_MODE_MAP[this.widget.colorBlendMode];\r\n }\r\n\r\n // Apply opacity\r\n if (this.widget.opacity !== null && this.widget.opacity !== undefined) {\r\n styles.opacity = this.widget.opacity;\r\n }\r\n\r\n // Apply anti-alias\r\n if (this.widget.isAntiAlias) {\r\n styles.imageRendering = 'smooth';\r\n } else {\r\n styles.imageRendering = 'pixelated';\r\n }\r\n\r\n // Text direction\r\n if (this.widget.matchTextDirection) {\r\n styles.direction = document.dir || 'ltr';\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n _mapAlignment() {\r\n const alignmentMap = {\r\n 'center': 'center',\r\n 'topLeft': 'top left',\r\n 'topCenter': 'top center',\r\n 'topRight': 'top right',\r\n 'centerLeft': 'center left',\r\n 'centerRight': 'center right',\r\n 'bottomLeft': 'bottom left',\r\n 'bottomCenter': 'bottom center',\r\n 'bottomRight': 'bottom right'\r\n };\r\n return alignmentMap[this.widget.alignment] || 'center';\r\n }\r\n\r\n _buildFilterStyles() {\r\n const filters = [];\r\n\r\n if (this.widget.filterQuality === FilterQuality.high) {\r\n filters.push('contrast(1.1) saturate(1.05)');\r\n } else if (this.widget.filterQuality === FilterQuality.low) {\r\n filters.push('blur(0.5px)');\r\n }\r\n\r\n return filters.length > 0 ? filters.join(' ') : 'none';\r\n }\r\n}\r\n\r\nexport { \r\n Image, \r\n ImageProvider, \r\n NetworkImage, \r\n AssetImage, \r\n MemoryImage, \r\n FileImage, \r\n ImageStream,\r\n ImageChunkEvent,\r\n ImageStreamCompleterHandle,\r\n IMAGE_SOURCE_TYPES \r\n};"], - "mappings": "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", - "names": ["StatefulWidget", "VNode", "BoxFit", "BlendMode", "FilterQuality", "Clip", "IMAGE_SOURCE_TYPES", "BLEND_MODE_MAP", "BOX_FIT_MAP", "CLIP_BEHAVIOR_MAP", "ImageStreamCompleterHandle", "completer", "ImageStream", "imageProvider", "listener", "imageInfo", "error", "stackTrace", "event", "ImageChunkEvent", "cumulativeBytesLoaded", "expectedTotalBytes", "ImageProvider", "sourceType", "config", "NetworkImage", "src", "scale", "headers", "timeout", "onProgress", "stream", "result", "resolve", "reject", "timer", "xhr", "e", "blob", "img", "Image", "key", "value", "AssetImage", "assetPath", "packages", "assetUrl", "MemoryImage", "bytes", "dataUrl", "binary", "FileImage", "filePath", "image", "width", "height", "color", "opacity", "colorBlendMode", "fit", "alignment", "repeat", "centerSlice", "matchTextDirection", "gaplessPlayback", "isAntiAlias", "filterQuality", "frameBuilder", "loadingBuilder", "errorBuilder", "semanticLabel", "excludeFromSemantics", "clipBehavior", "cacheWidth", "cacheHeight", "otherOptions", "provider", "_ImageState", "properties", "widget", "oldWidget", "newStream", "context", "elementId", "widgetPath", "inlineStyles", "imgProps", "styles", "filters"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/list_view.js b/packages/flutterjs_engine/package/material/dist/material/list_view.js deleted file mode 100644 index f96adf64..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/list_view.js +++ /dev/null @@ -1,2 +0,0 @@ -import{StatelessWidget as E}from"../core/widget_element.js";import{Container as I}from"./container.js";import{Column as S}from"../widgets/compoment/multi_child_view.js";import"../utils/edge_insets.js";class w extends E{constructor({key:r,scrollDirection:n="vertical",reverse:a=!1,controller:d,primary:h,physics:u,shrinkWrap:p=!1,padding:f,itemExtent:o,prototypeItem:l,addAutomaticKeepAlives:t=!0,addRepaintBoundaries:m=!0,addSemanticIndexes:x=!0,cacheExtent:C,children:c=[],semanticChildCount:e,dragStartBehavior:g,keyboardDismissBehavior:s,restorationId:y,clipBehavior:i}={}){super(r),this.key=r,this.scrollDirection=n,this.reverse=a,this.controller=d,this.primary=h,this.physics=u,this.shrinkWrap=p,this.padding=f,this.itemExtent=o,this.prototypeItem=l,this.addAutomaticKeepAlives=t,this.addRepaintBoundaries=m,this.addSemanticIndexes=x,this.cacheExtent=C,this.children=c,this.semanticChildCount=e,this.dragStartBehavior=g,this.keyboardDismissBehavior=s,this.restorationId=y,this.clipBehavior=i}static builder({key:r,scrollDirection:n="vertical",reverse:a=!1,controller:d,primary:h,physics:u,shrinkWrap:p=!1,padding:f,itemExtent:o,prototypeItem:l,addAutomaticKeepAlives:t=!0,addRepaintBoundaries:m=!0,addSemanticIndexes:x=!0,cacheExtent:C,itemBuilder:c,itemCount:e,findChildIndexCallback:g,dragStartBehavior:s,keyboardDismissBehavior:y,restorationId:i,clipBehavior:b}={}){const A=[];if(e!==void 0&&c){console.log("[ListView.builder] Creating",e,"children");for(let v=0;vv?.constructor?.name))}return new w({key:r,scrollDirection:n,reverse:a,controller:d,primary:h,physics:u,shrinkWrap:p,padding:f,itemExtent:o,prototypeItem:l,addAutomaticKeepAlives:t,addRepaintBoundaries:m,addSemanticIndexes:x,cacheExtent:C,children:A,semanticChildCount:e,dragStartBehavior:s,keyboardDismissBehavior:y,restorationId:i,clipBehavior:b})}static separated({key:r,scrollDirection:n="vertical",reverse:a=!1,controller:d,primary:h,physics:u,shrinkWrap:p=!1,padding:f,itemBuilder:o,separatorBuilder:l,itemCount:t,addAutomaticKeepAlives:m=!0,addRepaintBoundaries:x=!0,addSemanticIndexes:C=!0,cacheExtent:c,dragStartBehavior:e,keyboardDismissBehavior:g,restorationId:s,clipBehavior:y}={}){const i=[];if(t!==void 0&&o&&l)for(let b=0;b c?.constructor?.name));\r\n }\r\n\r\n return new ListView({\r\n key,\r\n scrollDirection,\r\n reverse,\r\n controller,\r\n primary,\r\n physics,\r\n shrinkWrap,\r\n padding,\r\n itemExtent,\r\n prototypeItem,\r\n addAutomaticKeepAlives,\r\n addRepaintBoundaries,\r\n addSemanticIndexes,\r\n cacheExtent,\r\n children,\r\n semanticChildCount: itemCount,\r\n dragStartBehavior,\r\n keyboardDismissBehavior,\r\n restorationId,\r\n clipBehavior,\r\n });\r\n\r\n console.log('[ListView.builder] Returning ListView instance:', result.constructor.name, 'extends StatelessWidget:', result instanceof StatelessWidget);\r\n return result;\r\n }\r\n\r\n static separated({\r\n key,\r\n scrollDirection = \"vertical\",\r\n reverse = false,\r\n controller,\r\n primary,\r\n physics,\r\n shrinkWrap = false,\r\n padding,\r\n itemBuilder,\r\n separatorBuilder,\r\n itemCount,\r\n addAutomaticKeepAlives = true,\r\n addRepaintBoundaries = true,\r\n addSemanticIndexes = true,\r\n cacheExtent,\r\n dragStartBehavior,\r\n keyboardDismissBehavior,\r\n restorationId,\r\n clipBehavior,\r\n } = {}) {\r\n const children = [];\r\n if (itemCount !== undefined && itemBuilder && separatorBuilder) {\r\n for (let i = 0; i < itemCount; i++) {\r\n children.push(itemBuilder({ type: 'BuildContext' }, i));\r\n if (i < itemCount - 1) {\r\n children.push(separatorBuilder({ type: 'BuildContext' }, i));\r\n }\r\n }\r\n }\r\n\r\n return new ListView({\r\n key,\r\n scrollDirection,\r\n reverse,\r\n controller,\r\n primary,\r\n physics,\r\n shrinkWrap,\r\n padding,\r\n addAutomaticKeepAlives,\r\n addRepaintBoundaries,\r\n addSemanticIndexes,\r\n cacheExtent,\r\n children,\r\n semanticChildCount: itemCount, // Approximation\r\n dragStartBehavior,\r\n keyboardDismissBehavior,\r\n restorationId,\r\n clipBehavior,\r\n });\r\n }\r\n\r\n static custom({\r\n key,\r\n scrollDirection = \"vertical\",\r\n reverse = false,\r\n controller,\r\n primary,\r\n physics,\r\n shrinkWrap = false,\r\n padding,\r\n itemExtent,\r\n prototypeItem,\r\n childrenDelegate,\r\n cacheExtent,\r\n semanticChildCount,\r\n dragStartBehavior,\r\n keyboardDismissBehavior,\r\n restorationId,\r\n clipBehavior,\r\n } = {}) {\r\n // Basic support for SliverChildListDelegate (static list)\r\n // Dynamic delegates (SliverChildBuilderDelegate) would need runtime expansion\r\n let children = [];\r\n if (childrenDelegate && Array.isArray(childrenDelegate.children)) {\r\n children = childrenDelegate.children;\r\n } else if (childrenDelegate && typeof childrenDelegate.builder === 'function') {\r\n // Best effort for builder delegate if count is provided\r\n // This mimics the builder constructor logic\r\n const count = childrenDelegate.childCount || 0;\r\n for (let i = 0; i < count; i++) {\r\n children.push(childrenDelegate.builder({ type: 'BuildContext' }, i));\r\n }\r\n }\r\n\r\n return new ListView({\r\n key,\r\n scrollDirection,\r\n reverse,\r\n controller,\r\n primary,\r\n physics,\r\n shrinkWrap,\r\n padding,\r\n itemExtent,\r\n prototypeItem,\r\n cacheExtent,\r\n children,\r\n semanticChildCount: semanticChildCount || children.length,\r\n dragStartBehavior,\r\n keyboardDismissBehavior,\r\n restorationId,\r\n clipBehavior,\r\n });\r\n }\r\n\r\n build(context) {\r\n const isHorizontal = this.scrollDirection === \"horizontal\";\r\n\r\n // Create a scrollable container\r\n // Note: Don't pass string CSS values (like '100%') to Container's width/height\r\n // as they become invalid BoxConstraints. Use flexbox layout instead.\r\n return new Container({\r\n padding: this.padding,\r\n // Removed width/height - CSS flexbox handles sizing via the parent Column/Flex\r\n child: new Column({\r\n children: this.children,\r\n mainAxisSize: this.shrinkWrap ? \"min\" : \"max\",\r\n crossAxisAlignment: isHorizontal ? \"center\" : \"stretch\",\r\n // TODO: Handle 'reverse' by reversing children array or CSS direction\r\n })\r\n });\r\n }\r\n}\r\n"], - "mappings": "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", - "names": ["StatelessWidget", "Container", "Column", "ListView", "key", "scrollDirection", "reverse", "controller", "primary", "physics", "shrinkWrap", "padding", "itemExtent", "prototypeItem", "addAutomaticKeepAlives", "addRepaintBoundaries", "addSemanticIndexes", "cacheExtent", "children", "semanticChildCount", "dragStartBehavior", "keyboardDismissBehavior", "restorationId", "clipBehavior", "itemBuilder", "itemCount", "findChildIndexCallback", "i", "child", "c", "separatorBuilder", "childrenDelegate", "count", "context", "isHorizontal"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/material.js b/packages/flutterjs_engine/package/material/dist/material/material.js deleted file mode 100644 index 78003342..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/material.js +++ /dev/null @@ -1,2 +0,0 @@ -import{Color as t,ColorSwatch as r,MaterialColor as a,MaterialAccentColor as n,Colors as l}from"./color.js";import{Container as i,DecoratedBox as m,DecoratedBoxElement as f,RenderDecoratedBox as x,ColoredBox as p,BoxDecoration as d,Decoration as B,DecorationPosition as D}from"./container.js";import{Icon as S,IconData as u,IconThemeData as s,Icons as A}from"./icon.js";import{Scaffold as E,ScaffoldState as h,ScaffoldElement as F,SnackBar as T,SnackBarClosedReason as I,ScaffoldFeatureController as v,FloatingActionButtonLocation as w,DrawerAlignment as M,AppBar as R}from"./scffold_basic.js";export*from"../utils/utils.js";import{Text as L,TextStyle as y}from"./text.js";import{MaterialApp as P,ThemeData as V,Theme as b,Navigator as j,Route as q}from"./material_app.js";import{ColorScheme as H}from"./color_scheme.js";import{FloatingActionButton as K,FloatingActionButtonElement as O,FloatingActionButtonExtended as Q}from"./floating_action_button.js";import{GestureDetector as W,GestureDetectorElement as X}from"./gesture_detector.js";import{Card as Z}from"../widgets/compoment/card.js";import{Divider as $}from"../widgets/compoment/divider.js";import{ElevatedButton as eo}from"./elevated_button.js";import{ListView as ro}from"./list_view.js";export{R as AppBar,d as BoxDecoration,Z as Card,t as Color,H as ColorScheme,r as ColorSwatch,p as ColoredBox,l as Colors,i as Container,m as DecoratedBox,f as DecoratedBoxElement,B as Decoration,D as DecorationPosition,$ as Divider,M as DrawerAlignment,eo as ElevatedButton,K as FloatingActionButton,O as FloatingActionButtonElement,Q as FloatingActionButtonExtended,w as FloatingActionButtonLocation,W as GestureDetector,X as GestureDetectorElement,S as Icon,u as IconData,s as IconThemeData,A as Icons,ro as ListView,n as MaterialAccentColor,P as MaterialApp,a as MaterialColor,j as Navigator,x as RenderDecoratedBox,q as Route,E as Scaffold,F as ScaffoldElement,v as ScaffoldFeatureController,h as ScaffoldState,T as SnackBar,I as SnackBarClosedReason,L as Text,y as TextStyle,b as Theme,V as ThemeData}; -//# sourceMappingURL=material.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/material.js.map b/packages/flutterjs_engine/package/material/dist/material/material.js.map deleted file mode 100644 index 819593b9..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/material.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/material.js"], - "sourcesContent": ["export {\r\n Color,\r\n ColorSwatch,\r\n MaterialColor,\r\n MaterialAccentColor,\r\n Colors\r\n} from \"./color.js\";\r\n\r\nexport {\r\n Container,\r\n DecoratedBox,\r\n DecoratedBoxElement,\r\n RenderDecoratedBox,\r\n ColoredBox,\r\n BoxDecoration,\r\n Decoration,\r\n DecorationPosition\r\n} from \"./container.js\";\r\n\r\nexport { Icon, IconData, IconThemeData, Icons } from \"./icon.js\";\r\n\r\nexport {\r\n Scaffold,\r\n ScaffoldState,\r\n ScaffoldElement,\r\n SnackBar,\r\n SnackBarClosedReason,\r\n ScaffoldFeatureController,\r\n FloatingActionButtonLocation,\r\n DrawerAlignment,\r\n AppBar\r\n} from \"./scffold_basic.js\";\r\n\r\n// \u2705 Export all utility classes (EdgeInsets, BorderRadius, etc.)\r\nexport * from \"../utils/utils.js\";\r\n\r\nexport {\r\n Text, TextStyle\r\n} from \"./text.js\";\r\n\r\nexport {\r\n MaterialApp,\r\n ThemeData,\r\n Theme,\r\n Navigator,\r\n Route\r\n} from \"./material_app.js\";\r\n\r\nexport { ColorScheme } from \"./color_scheme.js\";\r\n\r\nexport {\r\n FloatingActionButton,\r\n FloatingActionButtonElement,\r\n FloatingActionButtonExtended\r\n} from \"./floating_action_button.js\";\r\n\r\nexport {\r\n GestureDetector,\r\n GestureDetectorElement\r\n} from \"./gesture_detector.js\";\r\n\r\n\r\n\r\nexport {\r\n Card\r\n} from \"../widgets/compoment/card.js\";\r\n\r\nexport {\r\n Divider\r\n} from \"../widgets/compoment/divider.js\";\r\n\r\nexport {\r\n ElevatedButton\r\n} from \"./elevated_button.js\";\r\n\r\nexport {\r\n ListView\r\n} from \"./list_view.js\";\r\n"], - "mappings": "AAAA,OACI,SAAAA,EACA,eAAAC,EACA,iBAAAC,EACA,uBAAAC,EACA,UAAAC,MACG,aAEP,OACI,aAAAC,EACA,gBAAAC,EACA,uBAAAC,EACA,sBAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,sBAAAC,MACG,iBAEP,OAAS,QAAAC,EAAM,YAAAC,EAAU,iBAAAC,EAAe,SAAAC,MAAa,YAErD,OACI,YAAAC,EACA,iBAAAC,EACA,mBAAAC,EACA,YAAAC,EACA,wBAAAC,EACA,6BAAAC,EACA,gCAAAC,EACA,mBAAAC,EACA,UAAAC,MACG,qBAGP,WAAc,oBAEd,OACI,QAAAC,EAAM,aAAAC,MACH,YAEP,OACI,eAAAC,EACA,aAAAC,EACA,SAAAC,EACA,aAAAC,EACA,SAAAC,MACG,oBAEP,OAAS,eAAAC,MAAmB,oBAE5B,OACI,wBAAAC,EACA,+BAAAC,EACA,gCAAAC,MACG,8BAEP,OACI,mBAAAC,EACA,0BAAAC,MACG,wBAIP,OACI,QAAAC,MACG,+BAEP,OACI,WAAAC,MACG,kCAEP,OACI,kBAAAC,OACG,uBAEP,OACI,YAAAC,OACG", - "names": ["Color", "ColorSwatch", "MaterialColor", "MaterialAccentColor", "Colors", "Container", "DecoratedBox", "DecoratedBoxElement", "RenderDecoratedBox", "ColoredBox", "BoxDecoration", "Decoration", "DecorationPosition", "Icon", "IconData", "IconThemeData", "Icons", "Scaffold", "ScaffoldState", "ScaffoldElement", "SnackBar", "SnackBarClosedReason", "ScaffoldFeatureController", "FloatingActionButtonLocation", "DrawerAlignment", "AppBar", "Text", "TextStyle", "MaterialApp", "ThemeData", "Theme", "Navigator", "Route", "ColorScheme", "FloatingActionButton", "FloatingActionButtonElement", "FloatingActionButtonExtended", "GestureDetector", "GestureDetectorElement", "Card", "Divider", "ElevatedButton", "ListView"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/material_app.js b/packages/flutterjs_engine/package/material/dist/material/material_app.js deleted file mode 100644 index de09638f..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/material_app.js +++ /dev/null @@ -1,2 +0,0 @@ -import{StatefulWidget as C,State as W}from"../core/widget_element.js";import"@flutterjs/vdom/vnode";import{InheritedWidget as z}from"@flutterjs/runtime";import{Navigator as S,Route as P}from"../widgets/navigator.js";import{ColorScheme as h}from"./color_scheme.js";class a{constructor({brightness:t="light",primaryColor:o="#2196F3",primarySwatch:n=null,colorScheme:l=null,accentColor:d="#FF4081",scaffoldBackgroundColor:s="#FAFAFA",canvasColor:c="#FFF",cardColor:e="#FFF",dividerColor:m="rgba(0, 0, 0, 0.12)",highlightColor:y="rgba(0, 0, 0, 0.05)",splashColor:g="rgba(0, 0, 0, 0.2)",selectedRowColor:F="#F5F5F5",unselectedWidgetColor:p="rgba(0, 0, 0, 0.54)",disabledColor:w="rgba(0, 0, 0, 0.38)",textTheme:u=null,fontFamily:r='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI"',appBarTheme:b=null}={}){this.brightness=t,this.primaryColor=o,this.primarySwatch=n,this.accentColor=d,this.scaffoldBackgroundColor=s,this.canvasColor=c,this.cardColor=e,this.dividerColor=m,this.highlightColor=y,this.splashColor=g,this.selectedRowColor=F,this.unselectedWidgetColor=p,this.disabledColor=w,this.textTheme=u,this.fontFamily=r,this.appBarTheme=b,l?(this.colorScheme=l,o||(this.primaryColor=l.primary),s||(this.scaffoldBackgroundColor=l.background),e||(this.cardColor=l.surface)):(this.colorScheme=t==="dark"?h.dark():h.light(),o&&o!=="#2196F3"&&(this.colorScheme=h.fromSeed({seedColor:o,brightness:t})));const i=t==="dark"?"#FFFFFF":"#000000";this.textTheme=u||{displayLarge:{fontFamily:r,fontSize:57,fontWeight:"400",color:i},displayMedium:{fontFamily:r,fontSize:45,fontWeight:"400",color:i},displaySmall:{fontFamily:r,fontSize:36,fontWeight:"400",color:i},headlineLarge:{fontFamily:r,fontSize:32,fontWeight:"400",color:i},headlineMedium:{fontFamily:r,fontSize:28,fontWeight:"400",color:i},headlineSmall:{fontFamily:r,fontSize:24,fontWeight:"400",color:i},titleLarge:{fontFamily:r,fontSize:22,fontWeight:"400",color:i},titleMedium:{fontFamily:r,fontSize:16,fontWeight:"500",color:i},titleSmall:{fontFamily:r,fontSize:14,fontWeight:"500",color:i},bodyLarge:{fontFamily:r,fontSize:16,fontWeight:"400",color:i},bodyMedium:{fontFamily:r,fontSize:14,fontWeight:"400",color:i},bodySmall:{fontFamily:r,fontSize:12,fontWeight:"400",color:i},labelLarge:{fontFamily:r,fontSize:14,fontWeight:"500",color:i},labelMedium:{fontFamily:r,fontSize:12,fontWeight:"500",color:i},labelSmall:{fontFamily:r,fontSize:11,fontWeight:"500",color:i}}}static dark(){return new a({brightness:"dark",colorScheme:h.dark(),primaryColor:"#1F1F1F",scaffoldBackgroundColor:"#121212",canvasColor:"#1E1E1E",cardColor:"#2C2C2C",dividerColor:"rgba(255, 255, 255, 0.12)",unselectedWidgetColor:"rgba(255, 255, 255, 0.70)"})}static light(){return new a({brightness:"light",colorScheme:h.light(),primaryColor:"#2196F3",scaffoldBackgroundColor:"#FAFAFA",canvasColor:"#FFF",cardColor:"#FFF"})}}class f extends z{constructor({data:t,child:o,key:n}={}){super({child:o,key:n}),this.data=t}updateShouldNotify(t){return this.data!==t.data}static of(t){if(!t||!t.dependOnInheritedWidgetOfExactType)return console.warn("Theme.of() called with invalid context"),new a;const o=t.dependOnInheritedWidgetOfExactType(f);return o?o.data:new a}}class M extends C{constructor({key:t=null,title:o="",theme:n=null,darkTheme:l=null,themeMode:d="system",home:s=null,routes:c={},initialRoute:e="/",onGenerateRoute:m=null,onUnknownRoute:y=null,navigatorObservers:g=[],localizationsDelegates:F=[],supportedLocales:p=[{language:"en"}],locale:w=null,builder:u=null,color:r=null}={}){super(t),this.title=o,this.theme=n||a.light(),this.darkTheme=l||a.dark(),this.themeMode=d,this.color=r,this.home=s,this.routes=c,this.initialRoute=e,this.onGenerateRoute=m,this.onUnknownRoute=y,this.navigatorObservers=g,this.localizationsDelegates=F,this.supportedLocales=p,this.locale=w,this.builder=u,typeof window<"u"&&window.location&&window.location.pathname&&e==="/"&&window.location.pathname!=="/"&&(this.initialRoute=window.location.pathname),this.home&&!this.routes["/"]&&(this.routes["/"]=b=>this.home),typeof document<"u"&&(document.title=this.title)}createState(){return new v}}class v extends W{_getTheme(){const t=this.widget;return t.themeMode==="dark"?t.darkTheme:t.themeMode==="light"?t.theme:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?t.darkTheme:t.theme}_applyTheme(t){if(typeof document>"u")return;const o=t.primaryColor||"#2196F3",n=t.cardColor||"#FFFFFF",l=t.scaffoldBackgroundColor||"#FAFAFA",d="#FFFFFF",s=t.brightness==="dark"?"#FFFFFF":"#000000",c=t.brightness==="dark"?"#FFFFFF":"#000000",e=document.documentElement;e.style.setProperty("--primary-color",o),e.style.setProperty("--accent-color",t.accentColor||"#FF4081"),e.style.setProperty("--scaffold-bg",l),e.style.setProperty("--card-color",n),e.style.setProperty("--divider-color",t.dividerColor),e.style.setProperty("--font-family",t.fontFamily),e.style.setProperty("--text-color",s),e.style.setProperty("--md-sys-color-primary",o),e.style.setProperty("--md-sys-color-on-primary",d),e.style.setProperty("--md-sys-color-surface",n),e.style.setProperty("--md-sys-color-on-surface",s),e.style.setProperty("--md-sys-color-background",l),e.style.setProperty("--md-sys-color-on-background",c),document.body.style.backgroundColor=l,document.body.style.fontFamily=t.fontFamily,document.body.style.color=s,e.style.height="100%",e.style.width="100%",e.style.margin="0",e.style.padding="0",document.body.style.height="100%",document.body.style.width="100%",document.body.style.margin="0",document.body.style.padding="0",document.body.style.overflow="hidden"}build(t){const o=this._getTheme();return this._applyTheme(o),new f({data:o,child:new S({initialRoute:this.widget.initialRoute,routes:this.widget.routes,onGenerateRoute:this.widget.onGenerateRoute,onUnknownRoute:this.widget.onUnknownRoute})})}}export{M as MaterialApp,S as Navigator,P as Route,f as Theme,a as ThemeData}; -//# sourceMappingURL=material_app.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/material_app.js.map b/packages/flutterjs_engine/package/material/dist/material/material_app.js.map deleted file mode 100644 index 588a6117..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/material_app.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/material_app.js"], - "sourcesContent": ["/**\r\n * ============================================================================\r\n * FIXED MaterialApp - Properly Handles StatefulWidget \u2192 State Connection\r\n * ============================================================================\r\n */\r\n\r\nimport { StatelessWidget, ErrorWidget, StatefulWidget, State } from '../core/widget_element.js';\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\nimport { StatefulElement, StatelessElement, InheritedWidget } from '@flutterjs/runtime';\r\nimport { Navigator, Route } from '../widgets/navigator.js';\r\n\r\n// ============================================================================\r\n// THEME DATA\r\n// ============================================================================\r\n\r\nimport { ColorScheme } from './color_scheme.js';\r\n\r\nclass ThemeData {\r\n constructor({\r\n brightness = 'light',\r\n primaryColor = '#2196F3',\r\n primarySwatch = null,\r\n colorScheme = null,\r\n accentColor = '#FF4081',\r\n scaffoldBackgroundColor = '#FAFAFA',\r\n canvasColor = '#FFF',\r\n cardColor = '#FFF',\r\n dividerColor = 'rgba(0, 0, 0, 0.12)',\r\n highlightColor = 'rgba(0, 0, 0, 0.05)',\r\n splashColor = 'rgba(0, 0, 0, 0.2)',\r\n selectedRowColor = '#F5F5F5',\r\n unselectedWidgetColor = 'rgba(0, 0, 0, 0.54)',\r\n disabledColor = 'rgba(0, 0, 0, 0.38)',\r\n textTheme = null,\r\n fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\"',\r\n appBarTheme = null\r\n } = {}) {\r\n // console.log('\uD83C\uDFA8 ThemeData constructor called', { primaryColor, primarySwatch });\r\n this.brightness = brightness;\r\n\r\n // Legacy support\r\n this.primaryColor = primaryColor;\r\n this.primarySwatch = primarySwatch;\r\n this.accentColor = accentColor;\r\n this.scaffoldBackgroundColor = scaffoldBackgroundColor;\r\n this.canvasColor = canvasColor;\r\n this.cardColor = cardColor;\r\n this.dividerColor = dividerColor;\r\n this.highlightColor = highlightColor;\r\n this.splashColor = splashColor;\r\n this.selectedRowColor = selectedRowColor;\r\n this.unselectedWidgetColor = unselectedWidgetColor;\r\n this.disabledColor = disabledColor;\r\n this.textTheme = textTheme;\r\n this.fontFamily = fontFamily;\r\n this.appBarTheme = appBarTheme;\r\n\r\n // ColorScheme support\r\n if (colorScheme) {\r\n this.colorScheme = colorScheme;\r\n // Sync legacy properties if not explicitly provided\r\n if (!primaryColor) this.primaryColor = colorScheme.primary;\r\n if (!scaffoldBackgroundColor) this.scaffoldBackgroundColor = colorScheme.background;\r\n if (!cardColor) this.cardColor = colorScheme.surface;\r\n } else {\r\n // Create default color scheme based on brightness and primary color\r\n this.colorScheme = brightness === 'dark'\r\n ? ColorScheme.dark()\r\n : ColorScheme.light();\r\n\r\n // Override primary if provided\r\n if (primaryColor && primaryColor !== '#2196F3') { // Check if different from default\r\n this.colorScheme = ColorScheme.fromSeed({\r\n seedColor: primaryColor,\r\n brightness: brightness\r\n });\r\n }\r\n }\r\n\r\n // Initialize default TextTheme if not provided\r\n const isDark = brightness === 'dark';\r\n const baseColor = isDark ? '#FFFFFF' : '#000000';\r\n\r\n this.textTheme = textTheme || {\r\n displayLarge: { fontFamily: fontFamily, fontSize: 57, fontWeight: '400', color: baseColor },\r\n displayMedium: { fontFamily: fontFamily, fontSize: 45, fontWeight: '400', color: baseColor },\r\n displaySmall: { fontFamily: fontFamily, fontSize: 36, fontWeight: '400', color: baseColor },\r\n headlineLarge: { fontFamily: fontFamily, fontSize: 32, fontWeight: '400', color: baseColor },\r\n headlineMedium: { fontFamily: fontFamily, fontSize: 28, fontWeight: '400', color: baseColor },\r\n headlineSmall: { fontFamily: fontFamily, fontSize: 24, fontWeight: '400', color: baseColor },\r\n titleLarge: { fontFamily: fontFamily, fontSize: 22, fontWeight: '400', color: baseColor },\r\n titleMedium: { fontFamily: fontFamily, fontSize: 16, fontWeight: '500', color: baseColor },\r\n titleSmall: { fontFamily: fontFamily, fontSize: 14, fontWeight: '500', color: baseColor },\r\n bodyLarge: { fontFamily: fontFamily, fontSize: 16, fontWeight: '400', color: baseColor },\r\n bodyMedium: { fontFamily: fontFamily, fontSize: 14, fontWeight: '400', color: baseColor },\r\n bodySmall: { fontFamily: fontFamily, fontSize: 12, fontWeight: '400', color: baseColor },\r\n labelLarge: { fontFamily: fontFamily, fontSize: 14, fontWeight: '500', color: baseColor },\r\n labelMedium: { fontFamily: fontFamily, fontSize: 12, fontWeight: '500', color: baseColor },\r\n labelSmall: { fontFamily: fontFamily, fontSize: 11, fontWeight: '500', color: baseColor },\r\n };\r\n }\r\n\r\n static dark() {\r\n return new ThemeData({\r\n brightness: 'dark',\r\n colorScheme: ColorScheme.dark(),\r\n primaryColor: '#1F1F1F',\r\n scaffoldBackgroundColor: '#121212',\r\n canvasColor: '#1E1E1E',\r\n cardColor: '#2C2C2C',\r\n dividerColor: 'rgba(255, 255, 255, 0.12)',\r\n unselectedWidgetColor: 'rgba(255, 255, 255, 0.70)'\r\n });\r\n }\r\n\r\n static light() {\r\n return new ThemeData({\r\n brightness: 'light',\r\n colorScheme: ColorScheme.light(),\r\n primaryColor: '#2196F3',\r\n scaffoldBackgroundColor: '#FAFAFA',\r\n canvasColor: '#FFF',\r\n cardColor: '#FFF'\r\n });\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// THEME INHERITED WIDGET\r\n// ============================================================================\r\n\r\nclass Theme extends InheritedWidget {\r\n constructor({ data, child, key } = {}) {\r\n super({ child, key });\r\n this.data = data;\r\n }\r\n\r\n updateShouldNotify(oldWidget) {\r\n return this.data !== oldWidget.data;\r\n }\r\n\r\n static of(context) {\r\n if (!context || !context.dependOnInheritedWidgetOfExactType) {\r\n console.warn('Theme.of() called with invalid context');\r\n return new ThemeData();\r\n }\r\n const widget = context.dependOnInheritedWidgetOfExactType(Theme);\r\n return widget ? widget.data : new ThemeData();\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MATERIAL APP - FIXED VERSION\r\n// ============================================================================\r\n\r\nclass MaterialApp extends StatefulWidget {\r\n constructor({\r\n key = null,\r\n title = '',\r\n theme = null,\r\n darkTheme = null,\r\n themeMode = 'system',\r\n home = null,\r\n routes = {},\r\n initialRoute = '/',\r\n onGenerateRoute = null,\r\n onUnknownRoute = null,\r\n navigatorObservers = [],\r\n localizationsDelegates = [],\r\n supportedLocales = [{ language: 'en' }],\r\n locale = null,\r\n builder = null,\r\n color = null\r\n } = {}) {\r\n super(key);\r\n\r\n this.title = title;\r\n this.theme = theme || ThemeData.light();\r\n this.darkTheme = darkTheme || ThemeData.dark();\r\n this.themeMode = themeMode;\r\n this.color = color;\r\n this.home = home;\r\n this.routes = routes;\r\n this.initialRoute = initialRoute;\r\n this.onGenerateRoute = onGenerateRoute;\r\n this.onUnknownRoute = onUnknownRoute;\r\n this.navigatorObservers = navigatorObservers;\r\n this.localizationsDelegates = localizationsDelegates;\r\n this.supportedLocales = supportedLocales;\r\n this.locale = locale;\r\n this.builder = builder;\r\n\r\n // Deep linking support: If in browser, use current URL as initial route\r\n if (typeof window !== 'undefined' && window.location && window.location.pathname) {\r\n if (initialRoute === '/' && window.location.pathname !== '/') {\r\n this.initialRoute = window.location.pathname;\r\n }\r\n }\r\n\r\n // Normalize routes\r\n if (this.home && !this.routes['/']) {\r\n this.routes['/'] = (context) => this.home;\r\n }\r\n\r\n if (typeof document !== 'undefined') {\r\n document.title = this.title;\r\n }\r\n }\r\n\r\n createState() {\r\n return new MaterialAppState();\r\n }\r\n}\r\n\r\nclass MaterialAppState extends State {\r\n _getTheme() {\r\n const wm = this.widget;\r\n if (wm.themeMode === 'dark') {\r\n return wm.darkTheme;\r\n }\r\n if (wm.themeMode === 'light') {\r\n return wm.theme;\r\n }\r\n if (typeof window !== 'undefined' && window.matchMedia) {\r\n const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n return isDark ? wm.darkTheme : wm.theme;\r\n }\r\n return wm.theme;\r\n }\r\n\r\n _applyTheme(theme) {\r\n if (typeof document === 'undefined') return;\r\n\r\n // Safeguards for undefined theme properties\r\n const primary = theme.primaryColor || '#2196F3'; // Default blue\r\n const surface = theme.cardColor || '#FFFFFF';\r\n const background = theme.scaffoldBackgroundColor || '#FAFAFA';\r\n const onPrimary = '#FFFFFF';\r\n const onSurface = (theme.brightness === 'dark') ? '#FFFFFF' : '#000000';\r\n const onBackground = (theme.brightness === 'dark') ? '#FFFFFF' : '#000000';\r\n\r\n const root = document.documentElement;\r\n root.style.setProperty('--primary-color', primary);\r\n root.style.setProperty('--accent-color', theme.accentColor || '#FF4081');\r\n root.style.setProperty('--scaffold-bg', background);\r\n root.style.setProperty('--card-color', surface);\r\n root.style.setProperty('--divider-color', theme.dividerColor);\r\n root.style.setProperty('--font-family', theme.fontFamily);\r\n root.style.setProperty('--text-color', onSurface);\r\n\r\n // MD3 System Colors (Mapped from Legacy Theme with Fallbacks)\r\n root.style.setProperty('--md-sys-color-primary', primary);\r\n root.style.setProperty('--md-sys-color-on-primary', onPrimary);\r\n root.style.setProperty('--md-sys-color-surface', surface);\r\n root.style.setProperty('--md-sys-color-on-surface', onSurface);\r\n root.style.setProperty('--md-sys-color-background', background);\r\n root.style.setProperty('--md-sys-color-on-background', onBackground);\r\n\r\n document.body.style.backgroundColor = background;\r\n document.body.style.fontFamily = theme.fontFamily;\r\n document.body.style.color = onSurface;\r\n\r\n // \u2705 Ensure full screen layout\r\n root.style.height = '100%';\r\n root.style.width = '100%';\r\n root.style.margin = '0';\r\n root.style.padding = '0';\r\n\r\n document.body.style.height = '100%';\r\n document.body.style.width = '100%';\r\n document.body.style.margin = '0';\r\n document.body.style.padding = '0';\r\n document.body.style.overflow = 'hidden'; // Prevent body scroll, Scaffold handles it\r\n }\r\n\r\n build(context) {\r\n const currentTheme = this._getTheme();\r\n this._applyTheme(currentTheme);\r\n\r\n return new Theme({\r\n data: currentTheme,\r\n child: new Navigator({\r\n initialRoute: this.widget.initialRoute,\r\n routes: this.widget.routes,\r\n onGenerateRoute: this.widget.onGenerateRoute,\r\n onUnknownRoute: this.widget.onUnknownRoute\r\n })\r\n });\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n MaterialApp,\r\n ThemeData,\r\n Navigator,\r\n Route,\r\n Theme\r\n};"], - "mappings": "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", - "names": ["StatefulWidget", "State", "InheritedWidget", "Navigator", "Route", "ColorScheme", "ThemeData", "brightness", "primaryColor", "primarySwatch", "colorScheme", "accentColor", "scaffoldBackgroundColor", "canvasColor", "cardColor", "dividerColor", "highlightColor", "splashColor", "selectedRowColor", "unselectedWidgetColor", "disabledColor", "textTheme", "fontFamily", "appBarTheme", "baseColor", "Theme", "data", "child", "key", "oldWidget", "context", "widget", "MaterialApp", "title", "theme", "darkTheme", "themeMode", "home", "routes", "initialRoute", "onGenerateRoute", "onUnknownRoute", "navigatorObservers", "localizationsDelegates", "supportedLocales", "locale", "builder", "color", "MaterialAppState", "wm", "primary", "surface", "background", "onPrimary", "onSurface", "onBackground", "root", "currentTheme"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/scffold_basic.js b/packages/flutterjs_engine/package/material/dist/material/scffold_basic.js deleted file mode 100644 index c551c51a..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/scffold_basic.js +++ /dev/null @@ -1,2 +0,0 @@ -import{StatelessWidget as N,Widget as T}from"../core/widget_element.js";import{Element as E}from"@flutterjs/runtime";import{VNode as a}from"@flutterjs/vdom/vnode";const s={endFloat:"endFloat",endDocked:"endDocked",endTop:"endTop",startFloat:"startFloat",startDocked:"startDocked",startTop:"startTop",centerFloat:"centerFloat",centerDocked:"centerDocked",centerTop:"centerTop"},F={start:"start",end:"end"},w={hide:"hide",remove:"remove",timeout:"timeout",dismiss:"dismiss"};class _{constructor(e,t,n){this._widget=e,this._completer=t,this._close=n}get widget(){return this._widget}get closed(){return this._completer.promise}close(){this._completer.completed||this._completer.resolve(w.dismiss),this._close?.()}}class O{constructor({key:e=null,content:t=null,backgroundColor:n=null,elevation:r=6,margin:o=null,padding:l=null,width:d=null,shape:h=null,behavior:p="fixed",action:u=null,duration:m=4e3,animation:c=null,onVisible:g=null}={}){this.key=e,this.content=t,this.backgroundColor=n||"#323232",this.elevation=r,this.margin=o,this.padding=l,this.width=d,this.shape=h,this.behavior=p,this.action=u,this.duration=m,this.animation=c,this.onVisible=g}build(e){const t={backgroundColor:this.backgroundColor,padding:this.padding?`${this.padding}px`:"12px 16px",borderRadius:"4px",boxShadow:`0 ${this.elevation}px 16px rgba(0,0,0,0.12), 0 ${this.elevation}px 16px rgba(0,0,0,0.24)`,display:"flex",alignItems:"center",justifyContent:"space-between",gap:"16px",color:"white",fontSize:"14px",minHeight:"48px",maxWidth:this.width?`${this.width}px`:"568px",position:this.behavior==="floating"?"fixed":"relative",zIndex:1e3};this.margin&&(t.margin=`${this.margin}px`);const r=[this.content?.createElement?.(e.element,e.element.runtime)?this.content.createElement(e.element,e.element.runtime).performRebuild():new a({tag:"span",children:[String(this.content)]})];if(this.action){const o={color:"#2196F3",cursor:"pointer",border:"none",background:"none",padding:"8px",fontSize:"14px",fontWeight:"bold"};r.push(new a({tag:"button",props:{style:o,onClick:this.action.onPressed},children:[this.action.label]}))}return new a({tag:"div",props:{style:t,"data-widget":"SnackBar"},children:r})}}class b extends E{constructor(e,t=null,n=null){super(e,t,n),this._snackBars=[],this._currentSnackBar=null,this._snackBarTimer=null,this._drawerOpen=!1,this._endDrawerOpen=!1,this._fabVisible=!0}showSnackBar(e){this._snackBarTimer&&(clearTimeout(this._snackBarTimer),this._snackBarTimer=null);const t={resolve:null,reject:null,completed:!1,promise:new Promise((r,o)=>{t.resolve=l=>{t.completed=!0,r(l)},t.reject=o})},n=new _(e,t,()=>this._hideSnackBar());return this._currentSnackBar=n,this._snackBars.push(n),this._snackBarTimer=setTimeout(()=>{t.completed||t.resolve(w.timeout),this._hideSnackBar()},e.duration),this.markNeedsBuild(),n}_hideSnackBar(){this._snackBarTimer&&(clearTimeout(this._snackBarTimer),this._snackBarTimer=null),this._snackBars.shift(),this._currentSnackBar=this._snackBars.length>0?this._snackBars[0]:null,this.markNeedsBuild()}closeSnackBar(){this._currentSnackBar&&this._currentSnackBar.close()}openDrawer(){this._drawerOpen=!0,this.markNeedsBuild()}closeDrawer(){this._drawerOpen=!1,this.markNeedsBuild()}toggleDrawer(){this._drawerOpen=!this._drawerOpen,this.markNeedsBuild()}openEndDrawer(){this._endDrawerOpen=!0,this.markNeedsBuild()}closeEndDrawer(){this._endDrawerOpen=!1,this.markNeedsBuild()}get isDrawerOpen(){return this._drawerOpen}get isEndDrawerOpen(){return this._endDrawerOpen}showFloatingActionButton(){this._fabVisible=!0,this.markNeedsBuild()}hideFloatingActionButton(){this._fabVisible=!1,this.markNeedsBuild()}performRebuild(){return this.widget.build(this.context)}}class $ extends T{constructor({key:e=null,appBar:t=null,body:n=null,floatingActionButton:r=null,floatingActionButtonLocation:o=s.endFloat,drawer:l=null,endDrawer:d=null,bottomNavigationBar:h=null,backgroundColor:p=null,resizeToAvoidBottomInset:u=!0,extendBody:m=!1,extendBodyBehindAppBar:c=!1,primary:g=!0}={}){super(e),this.appBar=t,this.body=n,this.floatingActionButton=r,this.floatingActionButtonLocation=o,this.drawer=l,this.endDrawer=d,this.bottomNavigationBar=h,this.backgroundColor=p||"#ffffff",this.resizeToAvoidBottomInset=u,this.extendBody=m,this.extendBodyBehindAppBar=c,this.primary=g}static of(e){const t=e.findAncestorStateOfType?.(b);if(!t)throw new Error("Scaffold.of() called with a context that does not contain a Scaffold");return t}static maybeOf(e){return e?.findAncestorStateOfType?.(b)}build(e){const t=e.element.getElementId(),n=e.element.getWidgetPath();let r=this.appBar?56:0,o=r,l=this.bottomNavigationBar?56:0;this.extendBodyBehindAppBar&&(o=0);let d=null;if(this.appBar){let i=this.appBar.createElement(e.element,e.element.runtime);e.element.addChild(i),i.mount(),d=i.vnode}let h=null;if(this.body){let i=this.body.createElement(e.element,e.element.runtime);e.element.addChild(i),i.mount(),h=i.vnode}let p=null;if(this.bottomNavigationBar){let i=this.bottomNavigationBar.createElement(e.element,e.element.runtime);e.element.addChild(i),i.mount(),p=i.vnode}let u=null;if(this.floatingActionButton){let i=this.floatingActionButton.createElement(e.element,e.element.runtime);e.element.addChild(i),i.mount(),u=i.vnode}let m=null;if(this.drawer){let i=this.drawer.createElement(e.element,e.element.runtime);e.element.addChild(i),i.mount(),m=i.vnode}let c=null;if(this.endDrawer){let i=this.endDrawer.createElement(e.element,e.element.runtime);e.element.addChild(i),i.mount(),c=i.vnode}const g={display:"flex",flexDirection:"column",width:"100%",minHeight:"100vh",height:"100%",position:"relative",backgroundColor:this.backgroundColor,boxSizing:"border-box",margin:0,padding:0},S={position:"fixed",top:0,left:0,right:0,height:`${r}px`,zIndex:100},x={flex:1,position:"relative",marginTop:`${o}px`,marginBottom:`${l}px`,overflowY:this.resizeToAvoidBottomInset?"auto":"visible",overflowX:"hidden",width:"100%",display:"flex",flexDirection:"column"},y={position:"fixed",bottom:0,left:0,right:0,height:`${l}px`,backgroundColor:"#fff",borderTop:"1px solid #e0e0e0",zIndex:50},D=this._getFabContainerStyle(),B={position:"fixed",left:0,top:0,bottom:0,width:"256px",backgroundColor:"#fff",boxShadow:"0 8px 16px rgba(0,0,0,0.12)",zIndex:200,transform:"translateX(-100%)",transition:"transform 0.3s ease-out",display:this.drawer&&e.element?.state?._drawerOpen?"block":"none"};e.element?.state?._drawerOpen&&(B.transform="translateX(0)");const k={position:"fixed",right:0,top:0,bottom:0,width:"256px",backgroundColor:"#fff",boxShadow:"0 8px 16px rgba(0,0,0,0.12)",zIndex:200,transform:"translateX(100%)",transition:"transform 0.3s ease-out",display:this.endDrawer&&e.element?.state?._endDrawerOpen?"block":"none"};e.element?.state?._endDrawerOpen&&(k.transform="translateX(0)");const C={position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(0,0,0,0.5)",zIndex:150,display:e.element?.state?._drawerOpen||e.element?.state?._endDrawerOpen?"block":"none",cursor:"pointer",onClick:()=>{e.element?.state?._drawerOpen&&e.element.state.closeDrawer(),e.element?.state?._endDrawerOpen&&e.element.state.closeEndDrawer()}};return new a({tag:"div",props:{style:g,"data-element-id":t,"data-widget-path":n,"data-widget":"Scaffold"},children:[...d?[new a({tag:"div",props:{style:S},children:[d]})]:[],...h?[new a({tag:"div",props:{style:x},children:[h]})]:[],...p?[new a({tag:"div",props:{style:y},children:[p]})]:[],...u?[new a({tag:"div",props:{style:D},children:[u]})]:[],new a({tag:"div",props:{style:C}}),...m?[new a({tag:"div",props:{style:B},children:[m]})]:[],...c?[new a({tag:"div",props:{style:k},children:[c]})]:[],...e.element?.state?._currentSnackBar?[new a({tag:"div",props:{style:{position:"fixed",bottom:"16px",left:"16px",right:"auto",zIndex:300,animation:"slideUp 0.3s ease-out"}},children:[e.element.state._currentSnackBar.widget.build(e)]})]:[]],key:this.key})}_getFabContainerStyle(){const e={position:"absolute",zIndex:250},t=16;switch(this.floatingActionButtonLocation){case s.endFloat:return{...e,bottom:`${t}px`,right:`${t}px`};case s.endDocked:return{...e,bottom:"72px",right:`${t}px`};case s.endTop:return{...e,top:"80px",right:`${t}px`};case s.startFloat:return{...e,bottom:`${t}px`,left:`${t}px`};case s.startDocked:return{...e,bottom:"72px",left:`${t}px`};case s.startTop:return{...e,top:"80px",left:`${t}px`};case s.centerFloat:return{...e,bottom:`${t}px`,left:"50%",transform:"translateX(-50%)"};case s.centerDocked:return{...e,bottom:"72px",left:"50%",transform:"translateX(-50%)"};case s.centerTop:return{...e,top:"80px",left:"50%",transform:"translateX(-50%)"};default:return{...e,bottom:`${t}px`,right:`${t}px`}}}debugFillProperties(e){super.debugFillProperties(e),e.push({name:"appBar",value:this.appBar?"AppBar":"null"}),e.push({name:"body",value:this.body?"Widget":"null"}),e.push({name:"floatingActionButton",value:this.floatingActionButton?"FAB":"null"}),e.push({name:"drawer",value:this.drawer?"Drawer":"null"}),e.push({name:"bottomNavigationBar",value:this.bottomNavigationBar?"BottomNav":"null"})}createElement(e,t){return new v(this,e,t)}}class v extends b{constructor(e,t,n){super(e,t,n)}mount(e=null){this._context={element:this,runtime:this.runtime,parent:e||this.parent,findAncestorStateOfType:t=>{let n=e||this.parent;for(;n;){if(n instanceof t)return n;n=n.parent}return null}},super.mount(e)}getElementId(){return this._elementId||(this._elementId=`scaffold-${Date.now()}-${Math.random().toString(36).substr(2,9)}`)}getWidgetPath(){const e=[];let t=this;for(;t;)t.widget&&e.unshift(t.widget.constructor.name),t=t.parent;return e.join("/")}performRebuild(){return this.mounted||this.mount(),this.context||(this._context={element:this,runtime:this.runtime,parent:this.parent}),this.widget.build(this.context)}build(e){return e&&(this._context=e),this.performRebuild()}markNeedsBuild(){this.runtime&&this.runtime.update&&this.runtime.update()}}class A extends N{constructor({title:e,backgroundColor:t,leading:n,actions:r}={}){super(),this.title=e,this.backgroundColor=t,this.leading=n,this.actions=r}build(e){let t=null;if(this.title)if(this.title.createElement){let r=this.title.createElement(e.element,e.element.runtime);e.element.addChild(r),r.mount(),t=r.vnode}else t=new a({tag:"span",children:[String(this.title)]});let n=this.backgroundColor;return n&&typeof n.toCSSString=="function"?n=n.toCSSString():n&&typeof n=="object"&&n.value&&(n=`#${n.value.toString(16).padStart(8,"0").slice(2)}`),new a({tag:"div",props:{className:"flutter-appbar","data-widget":"AppBar"},style:{backgroundColor:n||"var(--md-sys-color-primary)",color:"#FFFFFF",padding:"16px",fontSize:"20px",fontWeight:"bold",display:"flex",alignItems:"center",minHeight:"56px"},children:t?[t]:[]})}}export{A as AppBar,F as DrawerAlignment,s as FloatingActionButtonLocation,$ as Scaffold,v as ScaffoldElement,_ as ScaffoldFeatureController,b as ScaffoldState,O as SnackBar,w as SnackBarClosedReason}; -//# sourceMappingURL=scffold_basic.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/scffold_basic.js.map b/packages/flutterjs_engine/package/material/dist/material/scffold_basic.js.map deleted file mode 100644 index 76d64136..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/scffold_basic.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/scffold_basic.js"], - "sourcesContent": ["import { StatefulWidget, StatelessWidget, Widget } from '../core/widget_element.js';\r\nimport { Element } from \"@flutterjs/runtime\"\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\n\r\n// ============================================================================\r\n// ENUMS\r\n// ============================================================================\r\n\r\nconst FloatingActionButtonLocation = {\r\n endFloat: 'endFloat',\r\n endDocked: 'endDocked',\r\n endTop: 'endTop',\r\n startFloat: 'startFloat',\r\n startDocked: 'startDocked',\r\n startTop: 'startTop',\r\n centerFloat: 'centerFloat',\r\n centerDocked: 'centerDocked',\r\n centerTop: 'centerTop'\r\n};\r\n\r\nconst DrawerAlignment = {\r\n start: 'start',\r\n end: 'end'\r\n};\r\n\r\n// ============================================================================\r\n// SNACK BAR CLOSED REASON\r\n// ============================================================================\r\n\r\nconst SnackBarClosedReason = {\r\n hide: 'hide',\r\n remove: 'remove',\r\n timeout: 'timeout',\r\n dismiss: 'dismiss'\r\n};\r\n\r\n// ============================================================================\r\n// SCAFFOLD FEATURE CONTROLLER\r\n// ============================================================================\r\n\r\nclass ScaffoldFeatureController {\r\n constructor(widget, completer, closeCallback) {\r\n this._widget = widget;\r\n this._completer = completer;\r\n this._close = closeCallback;\r\n }\r\n\r\n get widget() {\r\n return this._widget;\r\n }\r\n\r\n get closed() {\r\n return this._completer.promise;\r\n }\r\n\r\n close() {\r\n if (!this._completer.completed) {\r\n this._completer.resolve(SnackBarClosedReason.dismiss);\r\n }\r\n this._close?.();\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// SNACK BAR WIDGET\r\n// ============================================================================\r\n\r\nclass SnackBar {\r\n constructor({\r\n key = null,\r\n content = null,\r\n backgroundColor = null,\r\n elevation = 6,\r\n margin = null,\r\n padding = null,\r\n width = null,\r\n shape = null,\r\n behavior = 'fixed',\r\n action = null,\r\n duration = 4000,\r\n animation = null,\r\n onVisible = null\r\n } = {}) {\r\n this.key = key;\r\n this.content = content;\r\n this.backgroundColor = backgroundColor || '#323232';\r\n this.elevation = elevation;\r\n this.margin = margin;\r\n this.padding = padding;\r\n this.width = width;\r\n this.shape = shape;\r\n this.behavior = behavior;\r\n this.action = action;\r\n this.duration = duration;\r\n this.animation = animation;\r\n this.onVisible = onVisible;\r\n }\r\n\r\n build(context) {\r\n const style = {\r\n backgroundColor: this.backgroundColor,\r\n padding: this.padding ? `${this.padding}px` : '12px 16px',\r\n borderRadius: '4px',\r\n boxShadow: `0 ${this.elevation}px 16px rgba(0,0,0,0.12), 0 ${this.elevation}px 16px rgba(0,0,0,0.24)`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: '16px',\r\n color: 'white',\r\n fontSize: '14px',\r\n minHeight: '48px',\r\n maxWidth: this.width ? `${this.width}px` : '568px',\r\n position: this.behavior === 'floating' ? 'fixed' : 'relative',\r\n zIndex: 1000\r\n };\r\n\r\n if (this.margin) {\r\n style.margin = `${this.margin}px`;\r\n }\r\n\r\n const contentVNode = this.content?.createElement?.(context.element, context.element.runtime)\r\n ? this.content.createElement(context.element, context.element.runtime).performRebuild()\r\n : new VNode({ tag: 'span', children: [String(this.content)] });\r\n\r\n const children = [contentVNode];\r\n\r\n if (this.action) {\r\n const actionStyle = {\r\n color: '#2196F3',\r\n cursor: 'pointer',\r\n border: 'none',\r\n background: 'none',\r\n padding: '8px',\r\n fontSize: '14px',\r\n fontWeight: 'bold'\r\n };\r\n\r\n children.push(\r\n new VNode({\r\n tag: 'button',\r\n props: {\r\n style: actionStyle,\r\n onClick: this.action.onPressed\r\n },\r\n children: [this.action.label]\r\n })\r\n );\r\n }\r\n\r\n return new VNode({\r\n tag: 'div',\r\n props: {\r\n style,\r\n 'data-widget': 'SnackBar'\r\n },\r\n children\r\n });\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// SCAFFOLD STATE\r\n// ============================================================================\r\n\r\nclass ScaffoldState extends Element {\r\n constructor(widget, parent = null, runtime = null) {\r\n super(widget, parent, runtime);\r\n this._snackBars = [];\r\n this._currentSnackBar = null;\r\n this._snackBarTimer = null;\r\n this._drawerOpen = false;\r\n this._endDrawerOpen = false;\r\n this._fabVisible = true;\r\n }\r\n\r\n /**\r\n * Show snack bar\r\n */\r\n showSnackBar(snackBar) {\r\n // Clear previous snack bar timer\r\n if (this._snackBarTimer) {\r\n clearTimeout(this._snackBarTimer);\r\n this._snackBarTimer = null;\r\n }\r\n\r\n const completer = {\r\n resolve: null,\r\n reject: null,\r\n completed: false,\r\n promise: new Promise((resolve, reject) => {\r\n completer.resolve = (value) => {\r\n completer.completed = true;\r\n resolve(value);\r\n };\r\n completer.reject = reject;\r\n })\r\n };\r\n\r\n const controller = new ScaffoldFeatureController(\r\n snackBar,\r\n completer,\r\n () => this._hideSnackBar()\r\n );\r\n\r\n this._currentSnackBar = controller;\r\n this._snackBars.push(controller);\r\n\r\n // Auto-hide after duration\r\n this._snackBarTimer = setTimeout(() => {\r\n if (!completer.completed) {\r\n completer.resolve(SnackBarClosedReason.timeout);\r\n }\r\n this._hideSnackBar();\r\n }, snackBar.duration);\r\n\r\n this.markNeedsBuild();\r\n\r\n return controller;\r\n }\r\n\r\n /**\r\n * Hide current snack bar\r\n */\r\n _hideSnackBar() {\r\n if (this._snackBarTimer) {\r\n clearTimeout(this._snackBarTimer);\r\n this._snackBarTimer = null;\r\n }\r\n\r\n this._snackBars.shift();\r\n this._currentSnackBar = this._snackBars.length > 0 ? this._snackBars[0] : null;\r\n\r\n this.markNeedsBuild();\r\n }\r\n\r\n /**\r\n * Close snack bar\r\n */\r\n closeSnackBar() {\r\n if (this._currentSnackBar) {\r\n this._currentSnackBar.close();\r\n }\r\n }\r\n\r\n /**\r\n * Open drawer\r\n */\r\n openDrawer() {\r\n this._drawerOpen = true;\r\n this.markNeedsBuild();\r\n }\r\n\r\n /**\r\n * Close drawer\r\n */\r\n closeDrawer() {\r\n this._drawerOpen = false;\r\n this.markNeedsBuild();\r\n }\r\n\r\n /**\r\n * Toggle drawer\r\n */\r\n toggleDrawer() {\r\n this._drawerOpen = !this._drawerOpen;\r\n this.markNeedsBuild();\r\n }\r\n\r\n /**\r\n * Open end drawer\r\n */\r\n openEndDrawer() {\r\n this._endDrawerOpen = true;\r\n this.markNeedsBuild();\r\n }\r\n\r\n /**\r\n * Close end drawer\r\n */\r\n closeEndDrawer() {\r\n this._endDrawerOpen = false;\r\n this.markNeedsBuild();\r\n }\r\n\r\n /**\r\n * Check if drawer is open\r\n */\r\n get isDrawerOpen() {\r\n return this._drawerOpen;\r\n }\r\n\r\n /**\r\n * Check if end drawer is open\r\n */\r\n get isEndDrawerOpen() {\r\n return this._endDrawerOpen;\r\n }\r\n\r\n /**\r\n * Show FAB\r\n */\r\n showFloatingActionButton() {\r\n this._fabVisible = true;\r\n this.markNeedsBuild();\r\n }\r\n\r\n /**\r\n * Hide FAB\r\n */\r\n hideFloatingActionButton() {\r\n this._fabVisible = false;\r\n this.markNeedsBuild();\r\n }\r\n\r\n performRebuild() {\r\n return this.widget.build(this.context);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// SCAFFOLD WIDGET\r\n// ============================================================================\r\n\r\nclass Scaffold extends Widget {\r\n constructor({\r\n key = null,\r\n appBar = null,\r\n body = null,\r\n floatingActionButton = null,\r\n floatingActionButtonLocation = FloatingActionButtonLocation.endFloat,\r\n drawer = null,\r\n endDrawer = null,\r\n bottomNavigationBar = null,\r\n backgroundColor = null,\r\n resizeToAvoidBottomInset = true,\r\n extendBody = false,\r\n extendBodyBehindAppBar = false,\r\n primary = true\r\n } = {}) {\r\n super(key);\r\n\r\n this.appBar = appBar;\r\n this.body = body;\r\n this.floatingActionButton = floatingActionButton;\r\n this.floatingActionButtonLocation = floatingActionButtonLocation;\r\n this.drawer = drawer;\r\n this.endDrawer = endDrawer;\r\n this.bottomNavigationBar = bottomNavigationBar;\r\n this.backgroundColor = backgroundColor || '#ffffff';\r\n this.resizeToAvoidBottomInset = resizeToAvoidBottomInset;\r\n this.extendBody = extendBody;\r\n this.extendBodyBehindAppBar = extendBodyBehindAppBar;\r\n this.primary = primary;\r\n }\r\n\r\n /**\r\n * Get scaffold state from context\r\n */\r\n static of(context) {\r\n const state = context.findAncestorStateOfType?.(ScaffoldState);\r\n if (!state) {\r\n throw new Error('Scaffold.of() called with a context that does not contain a Scaffold');\r\n }\r\n return state;\r\n }\r\n\r\n /**\r\n * Maybe get scaffold state\r\n */\r\n static maybeOf(context) {\r\n return context?.findAncestorStateOfType?.(ScaffoldState);\r\n }\r\n\r\n build(context) {\r\n const elementId = context.element.getElementId();\r\n const widgetPath = context.element.getWidgetPath();\r\n\r\n let appBarHeight = this.appBar ? 56 : 0;\r\n let bodyTop = appBarHeight;\r\n let bodyBottom = this.bottomNavigationBar ? 56 : 0;\r\n\r\n if (this.extendBodyBehindAppBar) {\r\n bodyTop = 0;\r\n }\r\n\r\n // Build app bar\r\n let appBarVNode = null;\r\n if (this.appBar) {\r\n let appBarElement = this.appBar.createElement(context.element, context.element.runtime);\r\n context.element.addChild(appBarElement);\r\n appBarElement.mount();\r\n appBarVNode = appBarElement.vnode;\r\n }\r\n\r\n // Build body\r\n let bodyVNode = null;\r\n if (this.body) {\r\n let bodyElement = this.body.createElement(context.element, context.element.runtime);\r\n context.element.addChild(bodyElement);\r\n bodyElement.mount();\r\n bodyVNode = bodyElement.vnode;\r\n }\r\n\r\n // Build bottom navigation bar\r\n let bottomNavVNode = null;\r\n if (this.bottomNavigationBar) {\r\n let bottomNavElement = this.bottomNavigationBar.createElement(context.element, context.element.runtime);\r\n context.element.addChild(bottomNavElement);\r\n bottomNavElement.mount();\r\n bottomNavVNode = bottomNavElement.vnode;\r\n }\r\n\r\n // Build floating action button\r\n let fabVNode = null;\r\n if (this.floatingActionButton) {\r\n let fabElement = this.floatingActionButton.createElement(context.element, context.element.runtime);\r\n context.element.addChild(fabElement);\r\n fabElement.mount();\r\n fabVNode = fabElement.vnode;\r\n }\r\n\r\n // Build drawer\r\n let drawerVNode = null;\r\n if (this.drawer) {\r\n let drawerElement = this.drawer.createElement(context.element, context.element.runtime);\r\n context.element.addChild(drawerElement);\r\n drawerElement.mount();\r\n drawerVNode = drawerElement.vnode;\r\n }\r\n\r\n // Build end drawer\r\n let endDrawerVNode = null;\r\n if (this.endDrawer) {\r\n let endDrawerElement = this.endDrawer.createElement(context.element, context.element.runtime);\r\n context.element.addChild(endDrawerElement);\r\n endDrawerElement.mount();\r\n endDrawerVNode = endDrawerElement.vnode;\r\n }\r\n\r\n const scaffoldStyle = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n minHeight: '100vh', // \u2705 Force full viewport height\r\n height: '100%', // Fallback\r\n position: 'relative',\r\n backgroundColor: this.backgroundColor,\r\n boxSizing: 'border-box',\r\n margin: 0,\r\n padding: 0\r\n };\r\n\r\n const appBarContainerStyle = {\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n height: `${appBarHeight}px`,\r\n zIndex: 100\r\n };\r\n\r\n const bodyContainerStyle = {\r\n flex: 1,\r\n position: 'relative',\r\n marginTop: `${bodyTop}px`,\r\n marginBottom: `${bodyBottom}px`,\r\n overflowY: this.resizeToAvoidBottomInset ? 'auto' : 'visible',\r\n overflowX: 'hidden',\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n };\r\n\r\n const bottomNavContainerStyle = {\r\n position: 'fixed',\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n height: `${bodyBottom}px`,\r\n backgroundColor: '#fff',\r\n borderTop: '1px solid #e0e0e0',\r\n zIndex: 50\r\n };\r\n\r\n const fabContainerStyle = this._getFabContainerStyle();\r\n\r\n const drawerContainerStyle = {\r\n position: 'fixed',\r\n left: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: '256px',\r\n backgroundColor: '#fff',\r\n boxShadow: '0 8px 16px rgba(0,0,0,0.12)',\r\n zIndex: 200,\r\n transform: 'translateX(-100%)',\r\n transition: 'transform 0.3s ease-out',\r\n display: this.drawer && (context.element?.state?._drawerOpen || false) ? 'block' : 'none'\r\n };\r\n\r\n if (context.element?.state?._drawerOpen) {\r\n drawerContainerStyle.transform = 'translateX(0)';\r\n }\r\n\r\n const endDrawerContainerStyle = {\r\n position: 'fixed',\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: '256px',\r\n backgroundColor: '#fff',\r\n boxShadow: '0 8px 16px rgba(0,0,0,0.12)',\r\n zIndex: 200,\r\n transform: 'translateX(100%)',\r\n transition: 'transform 0.3s ease-out',\r\n display: this.endDrawer && (context.element?.state?._endDrawerOpen || false) ? 'block' : 'none'\r\n };\r\n\r\n if (context.element?.state?._endDrawerOpen) {\r\n endDrawerContainerStyle.transform = 'translateX(0)';\r\n }\r\n\r\n const scrimStyle = {\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n backgroundColor: 'rgba(0,0,0,0.5)',\r\n zIndex: 150,\r\n display: (context.element?.state?._drawerOpen || context.element?.state?._endDrawerOpen) ? 'block' : 'none',\r\n cursor: 'pointer',\r\n onClick: () => {\r\n if (context.element?.state?._drawerOpen) {\r\n context.element.state.closeDrawer();\r\n }\r\n if (context.element?.state?._endDrawerOpen) {\r\n context.element.state.closeEndDrawer();\r\n }\r\n }\r\n };\r\n\r\n return new VNode({\r\n tag: 'div',\r\n props: {\r\n style: scaffoldStyle,\r\n 'data-element-id': elementId,\r\n 'data-widget-path': widgetPath,\r\n 'data-widget': 'Scaffold'\r\n },\r\n children: [\r\n // App bar\r\n ...(appBarVNode ? [new VNode({\r\n tag: 'div',\r\n props: { style: appBarContainerStyle },\r\n children: [appBarVNode]\r\n })] : []),\r\n\r\n // Body\r\n ...(bodyVNode ? [new VNode({\r\n tag: 'div',\r\n props: { style: bodyContainerStyle },\r\n children: [bodyVNode]\r\n })] : []),\r\n\r\n // Bottom navigation bar\r\n ...(bottomNavVNode ? [new VNode({\r\n tag: 'div',\r\n props: { style: bottomNavContainerStyle },\r\n children: [bottomNavVNode]\r\n })] : []),\r\n\r\n // Floating action button\r\n ...(fabVNode ? [new VNode({\r\n tag: 'div',\r\n props: { style: fabContainerStyle },\r\n children: [fabVNode]\r\n })] : []),\r\n\r\n // Drawer scrim\r\n new VNode({\r\n tag: 'div',\r\n props: { style: scrimStyle }\r\n }),\r\n\r\n // Drawer\r\n ...(drawerVNode ? [new VNode({\r\n tag: 'div',\r\n props: { style: drawerContainerStyle },\r\n children: [drawerVNode]\r\n })] : []),\r\n\r\n // End drawer\r\n ...(endDrawerVNode ? [new VNode({\r\n tag: 'div',\r\n props: { style: endDrawerContainerStyle },\r\n children: [endDrawerVNode]\r\n })] : []),\r\n\r\n // Snack bar\r\n ...(context.element?.state?._currentSnackBar ? [\r\n new VNode({\r\n tag: 'div',\r\n props: {\r\n style: {\r\n position: 'fixed',\r\n bottom: '16px',\r\n left: '16px',\r\n right: 'auto',\r\n zIndex: 300,\r\n animation: 'slideUp 0.3s ease-out'\r\n }\r\n },\r\n children: [context.element.state._currentSnackBar.widget.build(context)]\r\n })\r\n ] : [])\r\n ],\r\n key: this.key\r\n });\r\n }\r\n\r\n /**\r\n * Get FAB container style based on location\r\n * @private\r\n */\r\n _getFabContainerStyle() {\r\n const baseStyle = {\r\n position: 'absolute',\r\n zIndex: 250\r\n };\r\n\r\n const spacing = 16;\r\n\r\n switch (this.floatingActionButtonLocation) {\r\n case FloatingActionButtonLocation.endFloat:\r\n return { ...baseStyle, bottom: `${spacing}px`, right: `${spacing}px` };\r\n case FloatingActionButtonLocation.endDocked:\r\n return { ...baseStyle, bottom: '72px', right: `${spacing}px` };\r\n case FloatingActionButtonLocation.endTop:\r\n return { ...baseStyle, top: '80px', right: `${spacing}px` };\r\n case FloatingActionButtonLocation.startFloat:\r\n return { ...baseStyle, bottom: `${spacing}px`, left: `${spacing}px` };\r\n case FloatingActionButtonLocation.startDocked:\r\n return { ...baseStyle, bottom: '72px', left: `${spacing}px` };\r\n case FloatingActionButtonLocation.startTop:\r\n return { ...baseStyle, top: '80px', left: `${spacing}px` };\r\n case FloatingActionButtonLocation.centerFloat:\r\n return { ...baseStyle, bottom: `${spacing}px`, left: '50%', transform: 'translateX(-50%)' };\r\n case FloatingActionButtonLocation.centerDocked:\r\n return { ...baseStyle, bottom: '72px', left: '50%', transform: 'translateX(-50%)' };\r\n case FloatingActionButtonLocation.centerTop:\r\n return { ...baseStyle, top: '80px', left: '50%', transform: 'translateX(-50%)' };\r\n default:\r\n return { ...baseStyle, bottom: `${spacing}px`, right: `${spacing}px` };\r\n }\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n properties.push({ name: 'appBar', value: this.appBar ? 'AppBar' : 'null' });\r\n properties.push({ name: 'body', value: this.body ? 'Widget' : 'null' });\r\n properties.push({ name: 'floatingActionButton', value: this.floatingActionButton ? 'FAB' : 'null' });\r\n properties.push({ name: 'drawer', value: this.drawer ? 'Drawer' : 'null' });\r\n properties.push({ name: 'bottomNavigationBar', value: this.bottomNavigationBar ? 'BottomNav' : 'null' });\r\n }\r\n\r\n createElement(parent, runtime) {\r\n return new ScaffoldElement(this, parent, runtime);\r\n }\r\n}\r\n\r\nclass ScaffoldElement extends ScaffoldState {\r\n constructor(widget, parent, runtime) {\r\n super(widget, parent, runtime);\r\n }\r\n\r\n mount(parent = null) {\r\n // Setup context first so it's available for performRebuild\r\n this._context = {\r\n element: this,\r\n runtime: this.runtime,\r\n parent: parent || this.parent,\r\n findAncestorStateOfType: (stateType) => {\r\n let current = parent || this.parent;\r\n while (current) {\r\n if (current instanceof stateType) {\r\n return current;\r\n }\r\n current = current.parent;\r\n }\r\n return null;\r\n }\r\n };\r\n\r\n // Delegate to base Element to handle _mounted, _parent, and performRebuild\r\n super.mount(parent);\r\n }\r\n\r\n getElementId() {\r\n return this._elementId || (this._elementId = `scaffold-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`);\r\n }\r\n\r\n getWidgetPath() {\r\n const parts = [];\r\n let current = this;\r\n while (current) {\r\n if (current.widget) {\r\n parts.unshift(current.widget.constructor.name);\r\n }\r\n current = current.parent;\r\n }\r\n return parts.join('/');\r\n }\r\n\r\n performRebuild() {\r\n if (!this.mounted) {\r\n this.mount();\r\n }\r\n\r\n // \u2705 CRITICAL: Make sure context exists before calling build\r\n if (!this.context) {\r\n this._context = {\r\n element: this,\r\n runtime: this.runtime,\r\n parent: this.parent\r\n };\r\n }\r\n\r\n // Call widget.build() with proper context\r\n return this.widget.build(this.context);\r\n }\r\n\r\n build(context) {\r\n // Ensure context is set\r\n if (context) {\r\n this._context = context;\r\n }\r\n return this.performRebuild();\r\n }\r\n\r\n markNeedsBuild() {\r\n // Trigger rebuild through runtime\r\n if (this.runtime && this.runtime.update) {\r\n this.runtime.update();\r\n }\r\n }\r\n}\r\n\r\nclass AppBar extends StatelessWidget {\r\n constructor({ title, backgroundColor, leading, actions } = {}) {\r\n super();\r\n this.title = title;\r\n this.backgroundColor = backgroundColor;\r\n this.leading = leading;\r\n this.actions = actions;\r\n }\r\n\r\n build(context) {\r\n // \u2705 FIX: Build title as VNode if it's a widget\r\n let titleVNode = null;\r\n if (this.title) {\r\n if (this.title.createElement) {\r\n // It's a widget - build it\r\n let titleElement = this.title.createElement(context.element, context.element.runtime);\r\n context.element.addChild(titleElement);\r\n titleElement.mount();\r\n titleVNode = titleElement.vnode;\r\n } else {\r\n // It's a string - wrap in VNode\r\n titleVNode = new VNode({\r\n tag: 'span',\r\n children: [String(this.title)]\r\n });\r\n }\r\n }\r\n\r\n // \u2705 FIX: Resolve background color\r\n let bgColor = this.backgroundColor;\r\n if (bgColor && typeof bgColor.toCSSString === 'function') {\r\n bgColor = bgColor.toCSSString();\r\n } else if (bgColor && typeof bgColor === 'object' && bgColor.value) {\r\n // Fallback for Color objects without toCSSString (shouldn't happen but safe)\r\n const value = bgColor.value;\r\n const hex = value.toString(16).padStart(8, '0');\r\n bgColor = `#${hex.slice(2)}`;\r\n }\r\n\r\n // \u2705 FIX: Use VNode constructor correctly with OBJECT parameter\r\n return new VNode({\r\n tag: 'div', // \u2705 CORRECT: tag is inside the config object\r\n props: {\r\n className: 'flutter-appbar',\r\n 'data-widget': 'AppBar'\r\n },\r\n style: {\r\n backgroundColor: bgColor || 'var(--md-sys-color-primary)',\r\n color: '#FFFFFF',\r\n padding: '16px',\r\n fontSize: '20px',\r\n fontWeight: 'bold',\r\n display: 'flex',\r\n alignItems: 'center',\r\n minHeight: '56px'\r\n },\r\n children: titleVNode ? [titleVNode] : []\r\n });\r\n }\r\n}\r\n\r\n\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\nexport {\r\n Scaffold,\r\n ScaffoldState,\r\n ScaffoldElement,\r\n SnackBar,\r\n SnackBarClosedReason,\r\n ScaffoldFeatureController,\r\n FloatingActionButtonLocation,\r\n DrawerAlignment,\r\n AppBar\r\n};"], - "mappings": "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", - "names": ["StatelessWidget", "Widget", "Element", "VNode", "FloatingActionButtonLocation", "DrawerAlignment", "SnackBarClosedReason", "ScaffoldFeatureController", "widget", "completer", "closeCallback", "SnackBar", "key", "content", "backgroundColor", "elevation", "margin", "padding", "width", "shape", "behavior", "action", "duration", "animation", "onVisible", "context", "style", "children", "actionStyle", "ScaffoldState", "parent", "runtime", "snackBar", "resolve", "reject", "value", "controller", "Scaffold", "appBar", "body", "floatingActionButton", "floatingActionButtonLocation", "drawer", "endDrawer", "bottomNavigationBar", "resizeToAvoidBottomInset", "extendBody", "extendBodyBehindAppBar", "primary", "state", "elementId", "widgetPath", "appBarHeight", "bodyTop", "bodyBottom", "appBarVNode", "appBarElement", "bodyVNode", "bodyElement", "bottomNavVNode", "bottomNavElement", "fabVNode", "fabElement", "drawerVNode", "drawerElement", "endDrawerVNode", "endDrawerElement", "scaffoldStyle", "appBarContainerStyle", "bodyContainerStyle", "bottomNavContainerStyle", "fabContainerStyle", "drawerContainerStyle", "endDrawerContainerStyle", "scrimStyle", "baseStyle", "spacing", "properties", "ScaffoldElement", "stateType", "current", "parts", "AppBar", "title", "leading", "actions", "titleVNode", "titleElement", "bgColor"] -} diff --git a/packages/flutterjs_engine/package/material/dist/material/text.js b/packages/flutterjs_engine/package/material/dist/material/text.js deleted file mode 100644 index 52aa4800..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/text.js +++ /dev/null @@ -1,2 +0,0 @@ -var F=Object.defineProperty;var L=(h,t,e)=>t in h?F(h,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):h[t]=e;var y=(h,t,e)=>(L(h,typeof t!="symbol"?t+"":t,e),e);import{StatelessWidget as I}from"../core/widget_element.js";import{VNode as M}from"@flutterjs/vdom/vnode";import{TextAlign as O,TextOverflow as T,TextDirection as $}from"../utils/utils.js";const o=class o{constructor({color:t="#000000",fontSize:e=14,fontWeight:s="400",fontStyle:i="normal",fontFamily:n="Roboto",height:l=1.5,letterSpacing:a=0,wordSpacing:c=0,decoration:d="none",decorationColor:g=null,decorationStyle:f="solid",decorationThickness:u=1,shadows:p=null,backgroundColor:S=null,backgroundOpacity:m=1,googleFont:b=null,fontVariant:w="normal",textTransform:x="none",opacity:k=1,strikethrough:v=!1,underline:W=!1,overline:C=!1,gradient:z=null}={}){this.color=t,this.fontSize=e,this.fontWeight=s,this.fontStyle=i,this.fontFamily=n,this.height=l,this.letterSpacing=a,this.wordSpacing=c,this.decoration=d,this.decorationColor=g,this.decorationStyle=f,this.decorationThickness=u,this.shadows=p,this.backgroundColor=S,this.backgroundOpacity=m,this.googleFont=b,this.fontVariant=w,this.textTransform=x,this.opacity=k,this.strikethrough=v,this.underline=W,this.overline=C,this.gradient=z,this.googleFont&&this._loadGoogleFont(this.googleFont)}_loadGoogleFont(t){if(typeof document>"u")return;const e=t.replace(/\s+/g,"+"),s=`google-font-${t.replace(/\s+/g,"-")}`;if(document.getElementById(s))return;const i=document.createElement("link");i.id=s,i.href=`https://fonts.googleapis.com/css2?family=${e}:wght@100;200;300;400;500;600;700;800;900&display=swap`,i.rel="stylesheet",i.crossOrigin="anonymous",document.head.appendChild(i)}copyWith({color:t,fontSize:e,fontWeight:s,fontStyle:i,fontFamily:n,height:l,letterSpacing:a,wordSpacing:c,decoration:d,decorationColor:g,decorationStyle:f,decorationThickness:u,shadows:p,backgroundColor:S,backgroundOpacity:m,googleFont:b,fontVariant:w,textTransform:x,opacity:k,strikethrough:v,underline:W,overline:C,gradient:z}={}){return new o({color:t??this.color,fontSize:e??this.fontSize,fontWeight:s??this.fontWeight,fontStyle:i??this.fontStyle,fontFamily:n??this.fontFamily,height:l??this.height,letterSpacing:a??this.letterSpacing,wordSpacing:c??this.wordSpacing,decoration:d??this.decoration,decorationColor:g??this.decorationColor,decorationStyle:f??this.decorationStyle,decorationThickness:u??this.decorationThickness,shadows:p??this.shadows,backgroundColor:S??this.backgroundColor,backgroundOpacity:m??this.backgroundOpacity,googleFont:b??this.googleFont,fontVariant:w??this.fontVariant,textTransform:x??this.textTransform,opacity:k??this.opacity,strikethrough:v??this.strikethrough,underline:W??this.underline,overline:C??this.overline,gradient:z??this.gradient})}merge(t){return t?this.copyWith(t):this}_buildTextDecoration(){const t=[];return this.underline&&t.push("underline"),this.overline&&t.push("overline"),this.strikethrough&&t.push("line-through"),t.length>0?t.join(" "):this.decoration}_buildTextShadow(){return!this.shadows||!Array.isArray(this.shadows)?"none":this.shadows.map(t=>{const e=t.offsetX??0,s=t.offsetY??0,i=t.blurRadius??0,n=t.color??"rgba(0,0,0,0.3)";return`${e}px ${s}px ${i}px ${n}`}).join(", ")}_buildBackground(){if(this.gradient)return this.gradient;if(!this.backgroundColor)return"transparent";if(this.backgroundOpacity<1){const t=this._hexToRgb(this.backgroundColor);return t?`rgba(${t.r}, ${t.g}, ${t.b}, ${this.backgroundOpacity})`:this.backgroundColor}return this.backgroundColor}_hexToRgb(t){const e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null}toCSSString(){const t=this._buildTextDecoration();return{color:this.color,fontSize:`${this.fontSize}px`,fontWeight:this.fontWeight,fontStyle:this.fontStyle,fontFamily:this.fontFamily,lineHeight:this.height,letterSpacing:`${this.letterSpacing}px`,wordSpacing:`${this.wordSpacing}px`,textDecoration:t,textDecorationColor:this.decorationColor||"currentColor",textDecorationStyle:this.decorationStyle,textDecorationThickness:`${this.decorationThickness}px`,backgroundColor:this._buildBackground(),fontVariant:this.fontVariant,textTransform:this.textTransform,opacity:this.opacity,textShadow:this._buildTextShadow()}}toCSSObject(){return this.toCSSString()}toFlutterString(){return`TextStyle(color: ${this.color}, size: ${this.fontSize}, family: ${this.fontFamily}, weight: ${this.fontWeight})`}toString(){return`TextStyle(color: ${this.color}, size: ${this.fontSize}px, family: ${this.fontFamily}, weight: ${this.fontWeight})`}};y(o,"preset",{h1:new o({fontSize:32,fontWeight:"700",height:1.2}),h2:new o({fontSize:28,fontWeight:"700",height:1.3}),h3:new o({fontSize:24,fontWeight:"600",height:1.4}),h4:new o({fontSize:20,fontWeight:"600",height:1.4}),h5:new o({fontSize:16,fontWeight:"600",height:1.5}),h6:new o({fontSize:14,fontWeight:"600",height:1.5}),body1:new o({fontSize:16,fontWeight:"400",height:1.5}),body2:new o({fontSize:14,fontWeight:"400",height:1.5}),caption:new o({fontSize:12,fontWeight:"400",height:1.4,opacity:.7}),button:new o({fontSize:14,fontWeight:"600",textTransform:"uppercase"}),code:new o({fontSize:13,fontFamily:"monospace",fontWeight:"400"})}),y(o,"availableGoogleFonts",["Roboto","Open Sans","Lato","Montserrat","Raleway","Poppins","Inter","Playfair Display","Bebas Neue","Pacifico","Merriweather","Ubuntu","Quicksand","Source Code Pro","IBM Plex Mono","Fira Sans","Oswald","Crimson Text","Nunito","Chakra Petch","JetBrains Mono","Space Mono","Inconsolata","Roboto Mono","Cabin","Work Sans"]),y(o,"fontWeights",{thin:"100",extralight:"200",light:"300",normal:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"}),y(o,"textDecorations",{none:"none",underline:"underline",overline:"overline",lineThrough:"line-through",underlineOverline:"underline overline"});let r=o;class A extends I{constructor(t,e={}){let s="",i={};typeof t=="string"?(s=t,i=e):(i=t||{},s=i.data||"");const{key:n=null,style:l=new r,textAlign:a=O.left,textDirection:c=$.ltr,overflow:d=T.clip,maxLines:g=null,softWrap:f=!0,semanticsLabel:u=null,selectable:p=!0,selectionColor:S=null,onSelectionChanged:m=null}=i;super(n),this.data=s,this.style=l instanceof r?l:new r(l),this.textAlign=a,this.textDirection=c,this.overflow=d,this.maxLines=g,this.softWrap=f,this.semanticsLabel=u,this.selectable=p,this.selectionColor=S||"#b3d9ff",this.onSelectionChanged=m}build(t){const e=this._getInlineStyles(),s=t.element.getElementId(),i=t.element.getWidgetPath(),n={style:e,"data-element-id":s,"data-widget-path":i,"data-identification":t.element.getIdentificationStrategy(),"data-widget":"Text","data-text-align":this.textAlign,"data-overflow":this.overflow,"data-max-lines":this.maxLines,title:this.semanticsLabel||this.data};this.selectable?(n.className+=" fjs-text-selectable",n.style.userSelect="text",n.style.WebkitUserSelect="text",n.style.MozUserSelect="text",this.selectionColor&&(n.style["--selection-color"]=this.selectionColor)):(n.style.userSelect="none",n.style.WebkitUserSelect="none",n.style.MozUserSelect="none");const l={};return this.selectable&&this.onSelectionChanged&&(l.onselectionchange=()=>{const a=window.getSelection?window.getSelection().toString():"";this.onSelectionChanged(a)}),new M({tag:"span",props:n,children:[this.data],key:this.key,events:l})}_getInlineStyles(){const t={display:"inline-block",textAlign:this._mapTextAlign(),direction:this.textDirection===$.rtl?"rtl":"ltr",whiteSpace:this.softWrap?"normal":"nowrap",overflow:this._mapOverflow(),textOverflow:this.overflow===T.ellipsis?"ellipsis":"clip",boxSizing:"border-box"};return this.maxLines===1?(t.overflow="hidden",t.textOverflow="ellipsis",t.whiteSpace="nowrap"):this.maxLines&&this.maxLines>1&&(t.display="-webkit-box",t.WebkitLineClamp=this.maxLines,t.WebkitBoxOrient="vertical",t.overflow="hidden"),this.style&&this.style instanceof r&&Object.assign(t,this.style.toCSSString()),t}_mapTextAlign(){return{left:"left",right:"right",center:"center",justify:"justify",start:"start",end:"end"}[this.textAlign]??"left"}_mapOverflow(){return{clip:"hidden",fade:"hidden",ellipsis:"hidden",visible:"visible"}[this.overflow]??"hidden"}debugFillProperties(t){super.debugFillProperties(t),t.push({name:"data",value:this.data}),t.push({name:"textAlign",value:this.textAlign}),t.push({name:"overflow",value:this.overflow}),t.push({name:"maxLines",value:this.maxLines}),t.push({name:"softWrap",value:this.softWrap}),t.push({name:"selectable",value:this.selectable}),this.style&&this.style instanceof r&&t.push({name:"style",value:this.style.toString()})}}export{A as Text,r as TextStyle}; -//# sourceMappingURL=text.js.map diff --git a/packages/flutterjs_engine/package/material/dist/material/text.js.map b/packages/flutterjs_engine/package/material/dist/material/text.js.map deleted file mode 100644 index 161bacd7..00000000 --- a/packages/flutterjs_engine/package/material/dist/material/text.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/material/text.js"], - "sourcesContent": ["import { StatelessWidget } from '../core/widget_element.js';\r\nimport { VNode } from '@flutterjs/vdom/vnode';\r\nimport { TextAlign, TextOverflow, TextDirection } from '../utils/utils.js';\r\n\r\n/**\r\n * TextStyle - Comprehensive text styling class with Flutter-like API\r\n * Supports Google Fonts, text decorations, shadows, and advanced typography\r\n */\r\nclass TextStyle {\r\n constructor({\r\n color = '#000000',\r\n fontSize = 14,\r\n fontWeight = '400',\r\n fontStyle = 'normal',\r\n fontFamily = 'Roboto',\r\n height = 1.5,\r\n letterSpacing = 0,\r\n wordSpacing = 0,\r\n decoration = 'none',\r\n decorationColor = null,\r\n decorationStyle = 'solid',\r\n decorationThickness = 1,\r\n shadows = null,\r\n backgroundColor = null,\r\n backgroundOpacity = 1,\r\n googleFont = null,\r\n fontVariant = 'normal',\r\n textTransform = 'none',\r\n opacity = 1,\r\n strikethrough = false,\r\n underline = false,\r\n overline = false,\r\n gradient = null\r\n } = {}) {\r\n this.color = color;\r\n this.fontSize = fontSize;\r\n this.fontWeight = fontWeight;\r\n this.fontStyle = fontStyle;\r\n this.fontFamily = fontFamily;\r\n this.height = height;\r\n this.letterSpacing = letterSpacing;\r\n this.wordSpacing = wordSpacing;\r\n this.decoration = decoration;\r\n this.decorationColor = decorationColor;\r\n this.decorationStyle = decorationStyle;\r\n this.decorationThickness = decorationThickness;\r\n this.shadows = shadows;\r\n this.backgroundColor = backgroundColor;\r\n this.backgroundOpacity = backgroundOpacity;\r\n this.googleFont = googleFont;\r\n this.fontVariant = fontVariant;\r\n this.textTransform = textTransform;\r\n this.opacity = opacity;\r\n this.strikethrough = strikethrough;\r\n this.underline = underline;\r\n this.overline = overline;\r\n this.gradient = gradient;\r\n\r\n if (this.googleFont) {\r\n this._loadGoogleFont(this.googleFont);\r\n }\r\n }\r\n\r\n // Static presets for common text styles\r\n static preset = {\r\n h1: new TextStyle({ fontSize: 32, fontWeight: '700', height: 1.2 }),\r\n h2: new TextStyle({ fontSize: 28, fontWeight: '700', height: 1.3 }),\r\n h3: new TextStyle({ fontSize: 24, fontWeight: '600', height: 1.4 }),\r\n h4: new TextStyle({ fontSize: 20, fontWeight: '600', height: 1.4 }),\r\n h5: new TextStyle({ fontSize: 16, fontWeight: '600', height: 1.5 }),\r\n h6: new TextStyle({ fontSize: 14, fontWeight: '600', height: 1.5 }),\r\n body1: new TextStyle({ fontSize: 16, fontWeight: '400', height: 1.5 }),\r\n body2: new TextStyle({ fontSize: 14, fontWeight: '400', height: 1.5 }),\r\n caption: new TextStyle({ fontSize: 12, fontWeight: '400', height: 1.4, opacity: 0.7 }),\r\n button: new TextStyle({ fontSize: 14, fontWeight: '600', textTransform: 'uppercase' }),\r\n code: new TextStyle({ fontSize: 13, fontFamily: 'monospace', fontWeight: '400' })\r\n };\r\n\r\n static availableGoogleFonts = [\r\n 'Roboto', 'Open Sans', 'Lato', 'Montserrat', 'Raleway', 'Poppins',\r\n 'Inter', 'Playfair Display', 'Bebas Neue', 'Pacifico', 'Merriweather',\r\n 'Ubuntu', 'Quicksand', 'Source Code Pro', 'IBM Plex Mono', 'Fira Sans',\r\n 'Oswald', 'Crimson Text', 'Nunito', 'Chakra Petch', 'JetBrains Mono',\r\n 'Space Mono', 'Inconsolata', 'Roboto Mono', 'Cabin', 'Work Sans'\r\n ];\r\n\r\n static fontWeights = {\r\n thin: '100',\r\n extralight: '200',\r\n light: '300',\r\n normal: '400',\r\n medium: '500',\r\n semibold: '600',\r\n bold: '700',\r\n extrabold: '800',\r\n black: '900'\r\n };\r\n\r\n static textDecorations = {\r\n none: 'none',\r\n underline: 'underline',\r\n overline: 'overline',\r\n lineThrough: 'line-through',\r\n underlineOverline: 'underline overline'\r\n };\r\n\r\n _loadGoogleFont(fontName) {\r\n if (typeof document === 'undefined') return;\r\n\r\n const formattedName = fontName.replace(/\\s+/g, '+');\r\n const linkId = `google-font-${fontName.replace(/\\s+/g, '-')}`;\r\n\r\n if (document.getElementById(linkId)) return;\r\n\r\n const link = document.createElement('link');\r\n link.id = linkId;\r\n link.href = `https://fonts.googleapis.com/css2?family=${formattedName}:wght@100;200;300;400;500;600;700;800;900&display=swap`;\r\n link.rel = 'stylesheet';\r\n link.crossOrigin = 'anonymous';\r\n document.head.appendChild(link);\r\n }\r\n\r\n copyWith({\r\n color,\r\n fontSize,\r\n fontWeight,\r\n fontStyle,\r\n fontFamily,\r\n height,\r\n letterSpacing,\r\n wordSpacing,\r\n decoration,\r\n decorationColor,\r\n decorationStyle,\r\n decorationThickness,\r\n shadows,\r\n backgroundColor,\r\n backgroundOpacity,\r\n googleFont,\r\n fontVariant,\r\n textTransform,\r\n opacity,\r\n strikethrough,\r\n underline,\r\n overline,\r\n gradient\r\n } = {}) {\r\n return new TextStyle({\r\n color: color ?? this.color,\r\n fontSize: fontSize ?? this.fontSize,\r\n fontWeight: fontWeight ?? this.fontWeight,\r\n fontStyle: fontStyle ?? this.fontStyle,\r\n fontFamily: fontFamily ?? this.fontFamily,\r\n height: height ?? this.height,\r\n letterSpacing: letterSpacing ?? this.letterSpacing,\r\n wordSpacing: wordSpacing ?? this.wordSpacing,\r\n decoration: decoration ?? this.decoration,\r\n decorationColor: decorationColor ?? this.decorationColor,\r\n decorationStyle: decorationStyle ?? this.decorationStyle,\r\n decorationThickness: decorationThickness ?? this.decorationThickness,\r\n shadows: shadows ?? this.shadows,\r\n backgroundColor: backgroundColor ?? this.backgroundColor,\r\n backgroundOpacity: backgroundOpacity ?? this.backgroundOpacity,\r\n googleFont: googleFont ?? this.googleFont,\r\n fontVariant: fontVariant ?? this.fontVariant,\r\n textTransform: textTransform ?? this.textTransform,\r\n opacity: opacity ?? this.opacity,\r\n strikethrough: strikethrough ?? this.strikethrough,\r\n underline: underline ?? this.underline,\r\n overline: overline ?? this.overline,\r\n gradient: gradient ?? this.gradient\r\n });\r\n }\r\n\r\n merge(other) {\r\n if (!other) return this;\r\n return this.copyWith(other);\r\n }\r\n\r\n _buildTextDecoration() {\r\n const decorations = [];\r\n if (this.underline) decorations.push('underline');\r\n if (this.overline) decorations.push('overline');\r\n if (this.strikethrough) decorations.push('line-through');\r\n return decorations.length > 0 ? decorations.join(' ') : this.decoration;\r\n }\r\n\r\n _buildTextShadow() {\r\n if (!this.shadows || !Array.isArray(this.shadows)) return 'none';\r\n return this.shadows\r\n .map(s => {\r\n const offsetX = s.offsetX ?? 0;\r\n const offsetY = s.offsetY ?? 0;\r\n const blurRadius = s.blurRadius ?? 0;\r\n const color = s.color ?? 'rgba(0,0,0,0.3)';\r\n return `${offsetX}px ${offsetY}px ${blurRadius}px ${color}`;\r\n })\r\n .join(', ');\r\n }\r\n\r\n _buildBackground() {\r\n if (this.gradient) {\r\n return this.gradient;\r\n }\r\n\r\n if (!this.backgroundColor) return 'transparent';\r\n\r\n if (this.backgroundOpacity < 1) {\r\n const rgb = this._hexToRgb(this.backgroundColor);\r\n return rgb ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${this.backgroundOpacity})` : this.backgroundColor;\r\n }\r\n\r\n return this.backgroundColor;\r\n }\r\n\r\n _hexToRgb(hex) {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : null;\r\n }\r\n\r\n toCSSString() {\r\n const decorationStyle = this._buildTextDecoration();\r\n\r\n return {\r\n color: this.color,\r\n fontSize: `${this.fontSize}px`,\r\n fontWeight: this.fontWeight,\r\n fontStyle: this.fontStyle,\r\n fontFamily: this.fontFamily,\r\n lineHeight: this.height,\r\n letterSpacing: `${this.letterSpacing}px`,\r\n wordSpacing: `${this.wordSpacing}px`,\r\n textDecoration: decorationStyle,\r\n textDecorationColor: this.decorationColor || 'currentColor',\r\n textDecorationStyle: this.decorationStyle,\r\n textDecorationThickness: `${this.decorationThickness}px`,\r\n backgroundColor: this._buildBackground(),\r\n fontVariant: this.fontVariant,\r\n textTransform: this.textTransform,\r\n opacity: this.opacity,\r\n textShadow: this._buildTextShadow()\r\n };\r\n }\r\n\r\n toCSSObject() {\r\n return this.toCSSString();\r\n }\r\n\r\n toFlutterString() {\r\n return `TextStyle(color: ${this.color}, size: ${this.fontSize}, family: ${this.fontFamily}, weight: ${this.fontWeight})`;\r\n }\r\n\r\n toString() {\r\n return `TextStyle(color: ${this.color}, size: ${this.fontSize}px, family: ${this.fontFamily}, weight: ${this.fontWeight})`;\r\n }\r\n}\r\n\r\n/**\r\n * Text - StatelessWidget for rendering text with comprehensive styling\r\n * Supports selection, overflow handling, max lines, and text alignment\r\n */\r\nclass Text extends StatelessWidget {\r\n constructor(dataOrOptions, options = {}) {\r\n let _data = '';\r\n let _opts = {};\r\n\r\n if (typeof dataOrOptions === 'string') {\r\n _data = dataOrOptions;\r\n _opts = options;\r\n } else {\r\n _opts = dataOrOptions || {};\r\n _data = _opts.data || '';\r\n }\r\n\r\n const {\r\n key = null,\r\n style = new TextStyle(),\r\n textAlign = TextAlign.left,\r\n textDirection = TextDirection.ltr,\r\n overflow = TextOverflow.clip,\r\n maxLines = null,\r\n softWrap = true,\r\n semanticsLabel = null,\r\n selectable = true,\r\n selectionColor = null,\r\n onSelectionChanged = null\r\n } = _opts;\r\n\r\n super(key);\r\n this.data = _data;\r\n this.style = style instanceof TextStyle ? style : new TextStyle(style);\r\n this.textAlign = textAlign;\r\n this.textDirection = textDirection;\r\n this.overflow = overflow;\r\n this.maxLines = maxLines;\r\n this.softWrap = softWrap;\r\n this.semanticsLabel = semanticsLabel;\r\n this.selectable = selectable;\r\n this.selectionColor = selectionColor || '#b3d9ff';\r\n this.onSelectionChanged = onSelectionChanged;\r\n }\r\n\r\n build(context) {\r\n const inlineStyles = this._getInlineStyles();\r\n const elementId = context.element.getElementId();\r\n const widgetPath = context.element.getWidgetPath();\r\n\r\n const props = {\r\n // className: 'fjs-text',\r\n style: inlineStyles,\r\n 'data-element-id': elementId,\r\n 'data-widget-path': widgetPath,\r\n 'data-identification': context.element.getIdentificationStrategy(),\r\n 'data-widget': 'Text',\r\n 'data-text-align': this.textAlign,\r\n 'data-overflow': this.overflow,\r\n 'data-max-lines': this.maxLines,\r\n title: this.semanticsLabel || this.data\r\n };\r\n\r\n if (this.selectable) {\r\n props.className += ' fjs-text-selectable';\r\n props.style.userSelect = 'text';\r\n props.style.WebkitUserSelect = 'text';\r\n props.style.MozUserSelect = 'text';\r\n if (this.selectionColor) {\r\n props.style['--selection-color'] = this.selectionColor;\r\n }\r\n } else {\r\n props.style.userSelect = 'none';\r\n props.style.WebkitUserSelect = 'none';\r\n props.style.MozUserSelect = 'none';\r\n }\r\n\r\n const events = {};\r\n if (this.selectable && this.onSelectionChanged) {\r\n events.onselectionchange = () => {\r\n const selected = window.getSelection ? window.getSelection().toString() : '';\r\n this.onSelectionChanged(selected);\r\n };\r\n }\r\n\r\n return new VNode({\r\n tag: 'span',\r\n props,\r\n children: [this.data],\r\n key: this.key,\r\n events\r\n });\r\n }\r\n\r\n _getInlineStyles() {\r\n const styles = {\r\n display: 'inline-block',\r\n textAlign: this._mapTextAlign(),\r\n direction: this.textDirection === TextDirection.rtl ? 'rtl' : 'ltr',\r\n whiteSpace: this.softWrap ? 'normal' : 'nowrap',\r\n overflow: this._mapOverflow(),\r\n textOverflow: this.overflow === TextOverflow.ellipsis ? 'ellipsis' : 'clip',\r\n boxSizing: 'border-box'\r\n };\r\n\r\n // Handle max lines\r\n if (this.maxLines === 1) {\r\n styles.overflow = 'hidden';\r\n styles.textOverflow = 'ellipsis';\r\n styles.whiteSpace = 'nowrap';\r\n } else if (this.maxLines && this.maxLines > 1) {\r\n styles.display = '-webkit-box';\r\n styles.WebkitLineClamp = this.maxLines;\r\n styles.WebkitBoxOrient = 'vertical';\r\n styles.overflow = 'hidden';\r\n }\r\n\r\n // Merge text style\r\n if (this.style && this.style instanceof TextStyle) {\r\n Object.assign(styles, this.style.toCSSString());\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n _mapTextAlign() {\r\n const alignMap = {\r\n left: 'left',\r\n right: 'right',\r\n center: 'center',\r\n justify: 'justify',\r\n start: 'start',\r\n end: 'end'\r\n };\r\n return alignMap[this.textAlign] ?? 'left';\r\n }\r\n\r\n _mapOverflow() {\r\n const overflowMap = {\r\n clip: 'hidden',\r\n fade: 'hidden',\r\n ellipsis: 'hidden',\r\n visible: 'visible'\r\n };\r\n return overflowMap[this.overflow] ?? 'hidden';\r\n }\r\n\r\n debugFillProperties(properties) {\r\n super.debugFillProperties(properties);\r\n properties.push({ name: 'data', value: this.data });\r\n properties.push({ name: 'textAlign', value: this.textAlign });\r\n properties.push({ name: 'overflow', value: this.overflow });\r\n properties.push({ name: 'maxLines', value: this.maxLines });\r\n properties.push({ name: 'softWrap', value: this.softWrap });\r\n properties.push({ name: 'selectable', value: this.selectable });\r\n if (this.style && this.style instanceof TextStyle) {\r\n properties.push({ name: 'style', value: this.style.toString() });\r\n }\r\n }\r\n}\r\n\r\nexport { Text, TextStyle };"], - "mappings": "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", - "names": ["StatelessWidget", "VNode", "TextAlign", "TextOverflow", "TextDirection", "_TextStyle", "color", "fontSize", "fontWeight", "fontStyle", "fontFamily", "height", "letterSpacing", "wordSpacing", "decoration", "decorationColor", "decorationStyle", "decorationThickness", "shadows", "backgroundColor", "backgroundOpacity", "googleFont", "fontVariant", "textTransform", "opacity", "strikethrough", "underline", "overline", "gradient", "fontName", "formattedName", "linkId", "link", "other", "decorations", "s", "offsetX", "offsetY", "blurRadius", "rgb", "hex", "result", "__publicField", "TextStyle", "Text", "dataOrOptions", "options", "_data", "_opts", "key", "style", "textAlign", "textDirection", "overflow", "maxLines", "softWrap", "semanticsLabel", "selectable", "selectionColor", "onSelectionChanged", "context", "inlineStyles", "elementId", "widgetPath", "props", "events", "selected", "styles", "properties"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/badge_theme.js b/packages/flutterjs_engine/package/material/dist/utils/badge_theme.js deleted file mode 100644 index 6b2b3138..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/badge_theme.js +++ /dev/null @@ -1,2 +0,0 @@ -class p{constructor({backgroundColor:t,textColor:o,smallSize:i=6,largeSize:e=24,padding:r=4,alignment:l="topEnd",offset:a,textStyle:s,textScaleFactor:n=.75,border:d,borderRadius:g=12,elevation:h=4,shadowColor:S="#000000"}={}){this.backgroundColor=t,this.textColor=o,this.smallSize=i,this.largeSize=e,this.padding=r,this.alignment=l,this.offset=a,this.textStyle=s,this.textScaleFactor=n,this.border=d,this.borderRadius=g,this.elevation=h,this.shadowColor=S}getSmallBadgeStyle(t={}){return{width:`${this.smallSize}px`,height:`${this.smallSize}px`,borderRadius:"50%",backgroundColor:this.backgroundColor||t.error||"#B3261E",position:"absolute",top:`-${this.smallSize/2}px`,right:`-${this.smallSize/2}px`,border:this.border?`2px solid ${this.border}`:"none",boxShadow:`0 2px 4px ${this.shadowColor}40`,zIndex:1e3}}getLargeBadgeStyle(t={}){return{minWidth:`${this.largeSize}px`,height:`${this.largeSize}px`,borderRadius:`${this.borderRadius}px`,backgroundColor:this.backgroundColor||t.error||"#B3261E",color:this.textColor||t.onError||"#FFFFFF",padding:`0 ${this.padding}px`,display:"inline-flex",alignItems:"center",justifyContent:"center",fontSize:"12px",fontWeight:"bold",position:"absolute",top:`-${this.largeSize/2}px`,right:`-${this.largeSize/2}px`,border:this.border?`2px solid ${this.border}`:"none",boxShadow:`0 ${this.elevation}px ${this.elevation*2}px ${this.shadowColor}40`,zIndex:1e3}}getBadgeTextStyle(t={}){return{fontSize:"12px",fontWeight:"bold",color:this.textColor||t.onError||"#FFFFFF",lineHeight:1,userSelect:"none"}}getAlignmentStyle(){const t={topStart:{top:`-${this.largeSize/2}px`,left:`-${this.largeSize/2}px`},topEnd:{top:`-${this.largeSize/2}px`,right:`-${this.largeSize/2}px`},bottomStart:{bottom:`-${this.largeSize/2}px`,left:`-${this.largeSize/2}px`},bottomEnd:{bottom:`-${this.largeSize/2}px`,right:`-${this.largeSize/2}px`}};return t[this.alignment]||t.topEnd}getContainerStyle(){return{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center"}}getVisibilityStyle(t=!0){return{opacity:t?1:0,transform:t?"scale(1)":"scale(0)",transition:"all 0.3s ease",pointerEvents:t?"auto":"none"}}getAnimationStyle(){return{transition:"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)"}}getResponsiveStyle(t="medium",o={}){const i={small:{largeSize:18,padding:2,fontSize:"10px"},medium:{largeSize:24,padding:4,fontSize:"12px"},large:{largeSize:28,padding:6,fontSize:"14px"}},e=i[t]||i.medium;return{...this.getLargeBadgeStyle(o),minWidth:`${e.largeSize}px`,height:`${e.largeSize}px`,padding:`0 ${e.padding}px`,fontSize:e.fontSize}}copyWith({backgroundColor:t,textColor:o,smallSize:i,largeSize:e,padding:r,alignment:l,offset:a,textStyle:s,textScaleFactor:n,border:d,borderRadius:g,elevation:h,shadowColor:S}={}){return new p({backgroundColor:t??this.backgroundColor,textColor:o??this.textColor,smallSize:i??this.smallSize,largeSize:e??this.largeSize,padding:r??this.padding,alignment:l??this.alignment,offset:a??this.offset,textStyle:s??this.textStyle,textScaleFactor:n??this.textScaleFactor,border:d??this.border,borderRadius:g??this.borderRadius,elevation:h??this.elevation,shadowColor:S??this.shadowColor})}merge(t){return t?this.copyWith({backgroundColor:t.backgroundColor,textColor:t.textColor,smallSize:t.smallSize,largeSize:t.largeSize,padding:t.padding,alignment:t.alignment,offset:t.offset,textStyle:t.textStyle,textScaleFactor:t.textScaleFactor,border:t.border,borderRadius:t.borderRadius,elevation:t.elevation,shadowColor:t.shadowColor}):this}toString(){return`BadgeTheme(backgroundColor: ${this.backgroundColor}, largeSize: ${this.largeSize}px)`}}export{p as BadgeTheme}; -//# sourceMappingURL=badge_theme.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/badge_theme.js.map b/packages/flutterjs_engine/package/material/dist/utils/badge_theme.js.map deleted file mode 100644 index 7382d21d..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/badge_theme.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/badge_theme.js"], - "sourcesContent": ["/**\r\n * Material Design 3 Badge Theme\r\n * Defines the visual properties of Badge widgets\r\n * Follows Flutter Material Design 3 specification\r\n * \r\n * Flutter Reference: https://api.flutter.dev/flutter/material/BadgeThemeData-class.html\r\n */\r\nexport class BadgeTheme {\r\n constructor({\r\n // Colors\r\n backgroundColor,\r\n textColor,\r\n \r\n // Size & Padding\r\n smallSize = 6,\r\n largeSize = 24,\r\n padding = 4,\r\n \r\n // Position\r\n alignment = 'topEnd',\r\n offset,\r\n \r\n // Text & Font\r\n textStyle,\r\n textScaleFactor = 0.75,\r\n \r\n // Border & Shadow\r\n border,\r\n borderRadius = 12,\r\n elevation = 4,\r\n shadowColor = '#000000'\r\n } = {}) {\r\n this.backgroundColor = backgroundColor;\r\n this.textColor = textColor;\r\n this.smallSize = smallSize;\r\n this.largeSize = largeSize;\r\n this.padding = padding;\r\n this.alignment = alignment;\r\n this.offset = offset;\r\n this.textStyle = textStyle;\r\n this.textScaleFactor = textScaleFactor;\r\n this.border = border;\r\n this.borderRadius = borderRadius;\r\n this.elevation = elevation;\r\n this.shadowColor = shadowColor;\r\n }\r\n\r\n /**\r\n * Get small badge CSS (indicator only, no text)\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getSmallBadgeStyle(themeColors = {}) {\r\n return {\r\n width: `${this.smallSize}px`,\r\n height: `${this.smallSize}px`,\r\n borderRadius: '50%',\r\n backgroundColor: this.backgroundColor || themeColors.error || '#B3261E',\r\n position: 'absolute',\r\n top: `-${this.smallSize / 2}px`,\r\n right: `-${this.smallSize / 2}px`,\r\n border: this.border ? `2px solid ${this.border}` : 'none',\r\n boxShadow: `0 2px 4px ${this.shadowColor}40`,\r\n zIndex: 1000\r\n };\r\n }\r\n\r\n /**\r\n * Get large badge CSS (with text/number)\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getLargeBadgeStyle(themeColors = {}) {\r\n return {\r\n minWidth: `${this.largeSize}px`,\r\n height: `${this.largeSize}px`,\r\n borderRadius: `${this.borderRadius}px`,\r\n backgroundColor: this.backgroundColor || themeColors.error || '#B3261E',\r\n color: this.textColor || themeColors.onError || '#FFFFFF',\r\n padding: `0 ${this.padding}px`,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n fontSize: '12px',\r\n fontWeight: 'bold',\r\n position: 'absolute',\r\n top: `-${this.largeSize / 2}px`,\r\n right: `-${this.largeSize / 2}px`,\r\n border: this.border ? `2px solid ${this.border}` : 'none',\r\n boxShadow: `0 ${this.elevation}px ${this.elevation * 2}px ${this.shadowColor}40`,\r\n zIndex: 1000\r\n };\r\n }\r\n\r\n /**\r\n * Get badge text CSS\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getBadgeTextStyle(themeColors = {}) {\r\n return {\r\n fontSize: '12px',\r\n fontWeight: 'bold',\r\n color: this.textColor || themeColors.onError || '#FFFFFF',\r\n lineHeight: 1,\r\n userSelect: 'none'\r\n };\r\n }\r\n\r\n /**\r\n * Get alignment position CSS\r\n * @returns {Object} CSS positioning properties\r\n */\r\n getAlignmentStyle() {\r\n const alignments = {\r\n topStart: { top: `-${this.largeSize / 2}px`, left: `-${this.largeSize / 2}px` },\r\n topEnd: { top: `-${this.largeSize / 2}px`, right: `-${this.largeSize / 2}px` },\r\n bottomStart: { bottom: `-${this.largeSize / 2}px`, left: `-${this.largeSize / 2}px` },\r\n bottomEnd: { bottom: `-${this.largeSize / 2}px`, right: `-${this.largeSize / 2}px` }\r\n };\r\n return alignments[this.alignment] || alignments.topEnd;\r\n }\r\n\r\n /**\r\n * Get badge container wrapper CSS\r\n * @returns {Object} CSS properties\r\n */\r\n getContainerStyle() {\r\n return {\r\n position: 'relative',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n };\r\n }\r\n\r\n /**\r\n * Get badge visibility CSS\r\n * @param {boolean} visible - Whether badge should be visible\r\n * @returns {Object} CSS properties\r\n */\r\n getVisibilityStyle(visible = true) {\r\n return {\r\n opacity: visible ? 1 : 0,\r\n transform: visible ? 'scale(1)' : 'scale(0)',\r\n transition: 'all 0.3s ease',\r\n pointerEvents: visible ? 'auto' : 'none'\r\n };\r\n }\r\n\r\n /**\r\n * Get badge animation CSS\r\n * @returns {Object} CSS animation properties\r\n */\r\n getAnimationStyle() {\r\n return {\r\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'\r\n };\r\n }\r\n\r\n /**\r\n * Get responsive badge CSS (scales on small screens)\r\n * @param {string} screenSize - 'small', 'medium', 'large'\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getResponsiveStyle(screenSize = 'medium', themeColors = {}) {\r\n const sizes = {\r\n small: {\r\n largeSize: 18,\r\n padding: 2,\r\n fontSize: '10px'\r\n },\r\n medium: {\r\n largeSize: 24,\r\n padding: 4,\r\n fontSize: '12px'\r\n },\r\n large: {\r\n largeSize: 28,\r\n padding: 6,\r\n fontSize: '14px'\r\n }\r\n };\r\n\r\n const size = sizes[screenSize] || sizes.medium;\r\n return {\r\n ...this.getLargeBadgeStyle(themeColors),\r\n minWidth: `${size.largeSize}px`,\r\n height: `${size.largeSize}px`,\r\n padding: `0 ${size.padding}px`,\r\n fontSize: size.fontSize\r\n };\r\n }\r\n\r\n /**\r\n * Copy this theme with updated properties\r\n * @param {Object} properties - Properties to override\r\n * @returns {BadgeTheme} New theme instance\r\n */\r\n copyWith({\r\n backgroundColor,\r\n textColor,\r\n smallSize,\r\n largeSize,\r\n padding,\r\n alignment,\r\n offset,\r\n textStyle,\r\n textScaleFactor,\r\n border,\r\n borderRadius,\r\n elevation,\r\n shadowColor\r\n } = {}) {\r\n return new BadgeTheme({\r\n backgroundColor: backgroundColor ?? this.backgroundColor,\r\n textColor: textColor ?? this.textColor,\r\n smallSize: smallSize ?? this.smallSize,\r\n largeSize: largeSize ?? this.largeSize,\r\n padding: padding ?? this.padding,\r\n alignment: alignment ?? this.alignment,\r\n offset: offset ?? this.offset,\r\n textStyle: textStyle ?? this.textStyle,\r\n textScaleFactor: textScaleFactor ?? this.textScaleFactor,\r\n border: border ?? this.border,\r\n borderRadius: borderRadius ?? this.borderRadius,\r\n elevation: elevation ?? this.elevation,\r\n shadowColor: shadowColor ?? this.shadowColor\r\n });\r\n }\r\n\r\n /**\r\n * Merge with another BadgeTheme\r\n * @param {BadgeTheme} other - Theme to merge with\r\n * @returns {BadgeTheme} Merged theme\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return this.copyWith({\r\n backgroundColor: other.backgroundColor,\r\n textColor: other.textColor,\r\n smallSize: other.smallSize,\r\n largeSize: other.largeSize,\r\n padding: other.padding,\r\n alignment: other.alignment,\r\n offset: other.offset,\r\n textStyle: other.textStyle,\r\n textScaleFactor: other.textScaleFactor,\r\n border: other.border,\r\n borderRadius: other.borderRadius,\r\n elevation: other.elevation,\r\n shadowColor: other.shadowColor\r\n });\r\n }\r\n\r\n toString() {\r\n return `BadgeTheme(backgroundColor: ${this.backgroundColor}, largeSize: ${this.largeSize}px)`;\r\n }\r\n}"], - "mappings": "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", - "names": ["BadgeTheme", "backgroundColor", "textColor", "smallSize", "largeSize", "padding", "alignment", "offset", "textStyle", "textScaleFactor", "border", "borderRadius", "elevation", "shadowColor", "themeColors", "alignments", "visible", "screenSize", "sizes", "size", "other"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/border.js b/packages/flutterjs_engine/package/material/dist/utils/border.js deleted file mode 100644 index f77a864b..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/border.js +++ /dev/null @@ -1,2 +0,0 @@ -class s{constructor({top:t=null,right:o=null,bottom:i=null,left:l=null}={}){this.top=t||{width:0,color:"#000000",style:"solid"},this.right=o||{width:0,color:"#000000",style:"solid"},this.bottom=i||{width:0,color:"#000000",style:"solid"},this.left=l||{width:0,color:"#000000",style:"solid"}}static all({width:t=1,color:o="#000000",style:i="solid"}={}){const l={width:t,color:o,style:i};return new s({top:l,right:l,bottom:l,left:l})}static symmetric({vertical:t=null,horizontal:o=null}={}){return new s({top:t,bottom:t,left:o,right:o})}toCSSString(){const{width:t,color:o,style:i}=this.bottom;return t>0?`${t}px ${i} ${o}`:"none"}toString(){return`Border(top: ${this.top.width}px, right: ${this.right.width}px)`}}export{s as Border}; -//# sourceMappingURL=border.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/border.js.map b/packages/flutterjs_engine/package/material/dist/utils/border.js.map deleted file mode 100644 index df7265d3..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/border.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/border.js"], - "sourcesContent": ["export class Border {\r\n constructor({\r\n top = null,\r\n right = null,\r\n bottom = null,\r\n left = null\r\n } = {}) {\r\n this.top = top || { width: 0, color: '#000000', style: 'solid' };\r\n this.right = right || { width: 0, color: '#000000', style: 'solid' };\r\n this.bottom = bottom || { width: 0, color: '#000000', style: 'solid' };\r\n this.left = left || { width: 0, color: '#000000', style: 'solid' };\r\n }\r\n\r\n static all({ width = 1, color = '#000000', style = 'solid' } = {}) {\r\n const side = { width, color, style };\r\n return new Border({ top: side, right: side, bottom: side, left: side });\r\n }\r\n\r\n static symmetric({ vertical = null, horizontal = null } = {}) {\r\n return new Border({\r\n top: vertical,\r\n bottom: vertical,\r\n left: horizontal,\r\n right: horizontal\r\n });\r\n }\r\n\r\n toCSSString() {\r\n const { width, color, style } = this.bottom;\r\n return width > 0 ? `${width}px ${style} ${color}` : 'none';\r\n }\r\n\r\n toString() {\r\n return `Border(top: ${this.top.width}px, right: ${this.right.width}px)`;\r\n }\r\n}"], - "mappings": "AAAO,MAAMA,CAAO,CAClB,YAAY,CACV,IAAAC,EAAM,KACN,MAAAC,EAAQ,KACR,OAAAC,EAAS,KACT,KAAAC,EAAO,IACT,EAAI,CAAC,EAAG,CACN,KAAK,IAAMH,GAAO,CAAE,MAAO,EAAG,MAAO,UAAW,MAAO,OAAQ,EAC/D,KAAK,MAAQC,GAAS,CAAE,MAAO,EAAG,MAAO,UAAW,MAAO,OAAQ,EACnE,KAAK,OAASC,GAAU,CAAE,MAAO,EAAG,MAAO,UAAW,MAAO,OAAQ,EACrE,KAAK,KAAOC,GAAQ,CAAE,MAAO,EAAG,MAAO,UAAW,MAAO,OAAQ,CACnE,CAEA,OAAO,IAAI,CAAE,MAAAC,EAAQ,EAAG,MAAAC,EAAQ,UAAW,MAAAC,EAAQ,OAAQ,EAAI,CAAC,EAAG,CACjE,MAAMC,EAAO,CAAE,MAAAH,EAAO,MAAAC,EAAO,MAAAC,CAAM,EACnC,OAAO,IAAIP,EAAO,CAAE,IAAKQ,EAAM,MAAOA,EAAM,OAAQA,EAAM,KAAMA,CAAK,CAAC,CACxE,CAEA,OAAO,UAAU,CAAE,SAAAC,EAAW,KAAM,WAAAC,EAAa,IAAK,EAAI,CAAC,EAAG,CAC5D,OAAO,IAAIV,EAAO,CAChB,IAAKS,EACL,OAAQA,EACR,KAAMC,EACN,MAAOA,CACT,CAAC,CACH,CAEA,aAAc,CACZ,KAAM,CAAE,MAAAL,EAAO,MAAAC,EAAO,MAAAC,CAAM,EAAI,KAAK,OACrC,OAAOF,EAAQ,EAAI,GAAGA,CAAK,MAAME,CAAK,IAAID,CAAK,GAAK,MACtD,CAEA,UAAW,CACT,MAAO,eAAe,KAAK,IAAI,KAAK,cAAc,KAAK,MAAM,KAAK,KACpE,CACF", - "names": ["Border", "top", "right", "bottom", "left", "width", "color", "style", "side", "vertical", "horizontal"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/border_radius.js b/packages/flutterjs_engine/package/material/dist/utils/border_radius.js deleted file mode 100644 index d2430199..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/border_radius.js +++ /dev/null @@ -1,2 +0,0 @@ -class e{constructor(t,o){this.x=t,this.y=o||t}static circular(t){return new e(t)}static elliptical(t,o){return new e(t,o)}static get zero(){return new e(0)}}class r{constructor({topLeft:t=e.zero,topRight:o=e.zero,bottomLeft:i=e.zero,bottomRight:c=e.zero}={}){this.topLeft=t,this.topRight=o,this.bottomLeft=i,this.bottomRight=c}static all(t){const o=typeof t=="number"?e.circular(t):t;return new r({topLeft:o,topRight:o,bottomLeft:o,bottomRight:o})}static circular(t){return r.all(e.circular(t))}static only({topLeft:t=e.zero,topRight:o=e.zero,bottomLeft:i=e.zero,bottomRight:c=e.zero}={}){return new r({topLeft:t,topRight:o,bottomLeft:i,bottomRight:c})}static horizontal({left:t=e.zero,right:o=e.zero}={}){return new r({topLeft:t,topRight:o,bottomLeft:t,bottomRight:o})}static vertical({top:t=e.zero,bottom:o=e.zero}={}){return new r({topLeft:t,topRight:t,bottomLeft:o,bottomRight:o})}toCSS(){const t=o=>`${o.x}px`;return`${t(this.topLeft)} ${t(this.topRight)} ${t(this.bottomRight)} ${t(this.bottomLeft)}`}}export{r as BorderRadius}; -//# sourceMappingURL=border_radius.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/border_radius.js.map b/packages/flutterjs_engine/package/material/dist/utils/border_radius.js.map deleted file mode 100644 index 4125b892..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/border_radius.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/border_radius.js"], - "sourcesContent": ["/**\r\n * Radius class\r\n * Represents a radius for corners\r\n */\r\nclass Radius {\r\n constructor(x, y) {\r\n this.x = x;\r\n this.y = y || x;\r\n }\r\n\r\n static circular(radius) {\r\n return new Radius(radius);\r\n }\r\n\r\n static elliptical(x, y) {\r\n return new Radius(x, y);\r\n }\r\n\r\n static get zero() {\r\n return new Radius(0);\r\n }\r\n}\r\n\r\n/**\r\n * BorderRadius class\r\n * Represents border radii for all four corners\r\n */\r\nclass BorderRadius {\r\n constructor({\r\n topLeft = Radius.zero,\r\n topRight = Radius.zero,\r\n bottomLeft = Radius.zero,\r\n bottomRight = Radius.zero\r\n } = {}) {\r\n this.topLeft = topLeft;\r\n this.topRight = topRight;\r\n this.bottomLeft = bottomLeft;\r\n this.bottomRight = bottomRight;\r\n }\r\n\r\n /**\r\n * Create uniform radius\r\n */\r\n static all(radius) {\r\n // If radius is a number, convert to Radius.circular\r\n const r = typeof radius === 'number' ? Radius.circular(radius) : radius;\r\n return new BorderRadius({\r\n topLeft: r,\r\n topRight: r,\r\n bottomLeft: r,\r\n bottomRight: r\r\n });\r\n }\r\n\r\n /**\r\n * Create circular radius for all corners\r\n */\r\n static circular(radius) {\r\n return BorderRadius.all(Radius.circular(radius));\r\n }\r\n\r\n /**\r\n * Create for specific corners\r\n */\r\n static only({\r\n topLeft = Radius.zero,\r\n topRight = Radius.zero,\r\n bottomLeft = Radius.zero,\r\n bottomRight = Radius.zero\r\n } = {}) {\r\n return new BorderRadius({ topLeft, topRight, bottomLeft, bottomRight });\r\n }\r\n\r\n /**\r\n * Create horizontal\r\n */\r\n static horizontal({ left = Radius.zero, right = Radius.zero } = {}) {\r\n return new BorderRadius({\r\n topLeft: left,\r\n topRight: right,\r\n bottomLeft: left,\r\n bottomRight: right\r\n });\r\n }\r\n\r\n /**\r\n * Create vertical\r\n */\r\n static vertical({ top = Radius.zero, bottom = Radius.zero } = {}) {\r\n return new BorderRadius({\r\n topLeft: top,\r\n topRight: top,\r\n bottomLeft: bottom,\r\n bottomRight: bottom\r\n });\r\n }\r\n\r\n toCSS() {\r\n // Helper to get value\r\n const val = (r) => `${r.x}px`;\r\n\r\n return `${val(this.topLeft)} ${val(this.topRight)} ${val(this.bottomRight)} ${val(this.bottomLeft)}`;\r\n }\r\n}\r\n\r\nexport { BorderRadius };\r\n"], - "mappings": "AAIA,MAAMA,CAAO,CACT,YAAYC,EAAGC,EAAG,CACd,KAAK,EAAID,EACT,KAAK,EAAIC,GAAKD,CAClB,CAEA,OAAO,SAASE,EAAQ,CACpB,OAAO,IAAIH,EAAOG,CAAM,CAC5B,CAEA,OAAO,WAAWF,EAAGC,EAAG,CACpB,OAAO,IAAIF,EAAOC,EAAGC,CAAC,CAC1B,CAEA,WAAW,MAAO,CACd,OAAO,IAAIF,EAAO,CAAC,CACvB,CACJ,CAMA,MAAMI,CAAa,CACf,YAAY,CACR,QAAAC,EAAUL,EAAO,KACjB,SAAAM,EAAWN,EAAO,KAClB,WAAAO,EAAaP,EAAO,KACpB,YAAAQ,EAAcR,EAAO,IACzB,EAAI,CAAC,EAAG,CACJ,KAAK,QAAUK,EACf,KAAK,SAAWC,EAChB,KAAK,WAAaC,EAClB,KAAK,YAAcC,CACvB,CAKA,OAAO,IAAIL,EAAQ,CAEf,MAAMM,EAAI,OAAON,GAAW,SAAWH,EAAO,SAASG,CAAM,EAAIA,EACjE,OAAO,IAAIC,EAAa,CACpB,QAASK,EACT,SAAUA,EACV,WAAYA,EACZ,YAAaA,CACjB,CAAC,CACL,CAKA,OAAO,SAASN,EAAQ,CACpB,OAAOC,EAAa,IAAIJ,EAAO,SAASG,CAAM,CAAC,CACnD,CAKA,OAAO,KAAK,CACR,QAAAE,EAAUL,EAAO,KACjB,SAAAM,EAAWN,EAAO,KAClB,WAAAO,EAAaP,EAAO,KACpB,YAAAQ,EAAcR,EAAO,IACzB,EAAI,CAAC,EAAG,CACJ,OAAO,IAAII,EAAa,CAAE,QAAAC,EAAS,SAAAC,EAAU,WAAAC,EAAY,YAAAC,CAAY,CAAC,CAC1E,CAKA,OAAO,WAAW,CAAE,KAAAE,EAAOV,EAAO,KAAM,MAAAW,EAAQX,EAAO,IAAK,EAAI,CAAC,EAAG,CAChE,OAAO,IAAII,EAAa,CACpB,QAASM,EACT,SAAUC,EACV,WAAYD,EACZ,YAAaC,CACjB,CAAC,CACL,CAKA,OAAO,SAAS,CAAE,IAAAC,EAAMZ,EAAO,KAAM,OAAAa,EAASb,EAAO,IAAK,EAAI,CAAC,EAAG,CAC9D,OAAO,IAAII,EAAa,CACpB,QAASQ,EACT,SAAUA,EACV,WAAYC,EACZ,YAAaA,CACjB,CAAC,CACL,CAEA,OAAQ,CAEJ,MAAMC,EAAOL,GAAM,GAAGA,EAAE,CAAC,KAEzB,MAAO,GAAGK,EAAI,KAAK,OAAO,CAAC,IAAIA,EAAI,KAAK,QAAQ,CAAC,IAAIA,EAAI,KAAK,WAAW,CAAC,IAAIA,EAAI,KAAK,UAAU,CAAC,EACtG,CACJ", - "names": ["Radius", "x", "y", "radius", "BorderRadius", "topLeft", "topRight", "bottomLeft", "bottomRight", "r", "left", "right", "top", "bottom", "val"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/box_constraints.js b/packages/flutterjs_engine/package/material/dist/utils/box_constraints.js deleted file mode 100644 index a3241cf8..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/box_constraints.js +++ /dev/null @@ -1,2 +0,0 @@ -import{Size as e}from"./size.js";class h{constructor(i=0,t=1/0,n=0,m=1/0){this.minWidth=i,this.maxWidth=t,this.minHeight=n,this.maxHeight=m}static tight(i){return new h(i.width,i.width,i.height,i.height)}static loose(i){return new h(0,i.width,0,i.height)}static expand({width:i=1/0,height:t=1/0}={}){return new h(0,i,0,t)}static tightFor({width:i=null,height:t=null}={}){return new h(i??0,i??1/0,t??0,t??1/0)}get isTight(){return this.minWidth===this.maxWidth&&this.minHeight===this.maxHeight}get isNormalized(){return this.minWidth<=this.maxWidth&&this.minHeight<=this.maxHeight}debugAssertIsValid(){if(!(this.minWidth>=0&&this.maxWidth>=this.minWidth&&this.minHeight>=0&&this.maxHeight>=this.minHeight))throw new Error(`Invalid BoxConstraints: ${this.minWidth}..${this.maxWidth}, ${this.minHeight}..${this.maxHeight}`);return!0}constrain(i){return new e(Math.max(this.minWidth,Math.min(this.maxWidth,i.width)),Math.max(this.minHeight,Math.min(this.maxHeight,i.height)))}enforce(i){return i?new h(Math.max(this.minWidth,i.minWidth),Math.min(this.maxWidth,i.maxWidth),Math.max(this.minHeight,i.minHeight),Math.min(this.maxHeight,i.maxHeight)):this}widthConstraints(){return new h(this.minWidth,this.maxWidth,0,1/0)}heightConstraints(){return new h(0,1/0,this.minHeight,this.maxHeight)}tighten({width:i=null,height:t=null}={}){return new h(i!==null?Math.max(this.minWidth,i):this.minWidth,i!==null?Math.min(this.maxWidth,i):this.maxWidth,t!==null?Math.max(this.minHeight,t):this.minHeight,t!==null?Math.min(this.maxHeight,t):this.maxHeight)}copyWith({minWidth:i,maxWidth:t,minHeight:n,maxHeight:m}={}){return new h(i??this.minWidth,t??this.maxWidth,n??this.minHeight,m??this.maxHeight)}toString(){return`BoxConstraints(${this.minWidth}..${this.maxWidth}, ${this.minHeight}..${this.maxHeight})`}}export{h as BoxConstraints}; -//# sourceMappingURL=box_constraints.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/box_constraints.js.map b/packages/flutterjs_engine/package/material/dist/utils/box_constraints.js.map deleted file mode 100644 index b879093c..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/box_constraints.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/box_constraints.js"], - "sourcesContent": ["import { Size } from \"./size.js\";\r\n\r\nexport class BoxConstraints {\r\n constructor(minWidth = 0, maxWidth = Infinity, minHeight = 0, maxHeight = Infinity) {\r\n this.minWidth = minWidth;\r\n this.maxWidth = maxWidth;\r\n this.minHeight = minHeight;\r\n this.maxHeight = maxHeight;\r\n }\r\n\r\n static tight(size) {\r\n return new BoxConstraints(size.width, size.width, size.height, size.height);\r\n }\r\n\r\n static loose(size) {\r\n return new BoxConstraints(0, size.width, 0, size.height);\r\n }\r\n\r\n static expand({ width = Infinity, height = Infinity } = {}) {\r\n return new BoxConstraints(0, width, 0, height);\r\n }\r\n\r\n static tightFor({ width = null, height = null } = {}) {\r\n return new BoxConstraints(\r\n width ?? 0,\r\n width ?? Infinity,\r\n height ?? 0,\r\n height ?? Infinity\r\n );\r\n }\r\n\r\n get isTight() {\r\n return this.minWidth === this.maxWidth && this.minHeight === this.maxHeight;\r\n }\r\n\r\n get isNormalized() {\r\n return this.minWidth <= this.maxWidth && this.minHeight <= this.maxHeight;\r\n }\r\n\r\n debugAssertIsValid() {\r\n if (!(this.minWidth >= 0 && this.maxWidth >= this.minWidth &&\r\n this.minHeight >= 0 && this.maxHeight >= this.minHeight)) {\r\n throw new Error(\r\n `Invalid BoxConstraints: ${this.minWidth}..${this.maxWidth}, ${this.minHeight}..${this.maxHeight}`\r\n );\r\n }\r\n return true;\r\n }\r\n\r\n constrain(size) {\r\n return new Size(\r\n Math.max(this.minWidth, Math.min(this.maxWidth, size.width)),\r\n Math.max(this.minHeight, Math.min(this.maxHeight, size.height))\r\n );\r\n }\r\n\r\n /**\r\n * Returns a new BoxConstraints that respects the given constraints while being \r\n * as close as possible to the original constraints.\r\n */\r\n enforce(constraints) {\r\n if (!constraints) return this;\r\n\r\n return new BoxConstraints(\r\n Math.max(this.minWidth, constraints.minWidth),\r\n Math.min(this.maxWidth, constraints.maxWidth),\r\n Math.max(this.minHeight, constraints.minHeight),\r\n Math.min(this.maxHeight, constraints.maxHeight)\r\n );\r\n }\r\n\r\n widthConstraints() {\r\n return new BoxConstraints(this.minWidth, this.maxWidth, 0, Infinity);\r\n }\r\n\r\n heightConstraints() {\r\n return new BoxConstraints(0, Infinity, this.minHeight, this.maxHeight);\r\n }\r\n\r\n tighten({ width = null, height = null } = {}) {\r\n return new BoxConstraints(\r\n width !== null ? Math.max(this.minWidth, width) : this.minWidth,\r\n width !== null ? Math.min(this.maxWidth, width) : this.maxWidth,\r\n height !== null ? Math.max(this.minHeight, height) : this.minHeight,\r\n height !== null ? Math.min(this.maxHeight, height) : this.maxHeight\r\n );\r\n }\r\n\r\n copyWith({ minWidth, maxWidth, minHeight, maxHeight } = {}) {\r\n return new BoxConstraints(\r\n minWidth ?? this.minWidth,\r\n maxWidth ?? this.maxWidth,\r\n minHeight ?? this.minHeight,\r\n maxHeight ?? this.maxHeight\r\n );\r\n }\r\n\r\n toString() {\r\n return `BoxConstraints(${this.minWidth}..${this.maxWidth}, ${this.minHeight}..${this.maxHeight})`;\r\n }\r\n}\r\n"], - "mappings": "AAAA,OAAS,QAAAA,MAAY,YAEd,MAAMC,CAAe,CACxB,YAAYC,EAAW,EAAGC,EAAW,IAAUC,EAAY,EAAGC,EAAY,IAAU,CAChF,KAAK,SAAWH,EAChB,KAAK,SAAWC,EAChB,KAAK,UAAYC,EACjB,KAAK,UAAYC,CACrB,CAEA,OAAO,MAAMC,EAAM,CACf,OAAO,IAAIL,EAAeK,EAAK,MAAOA,EAAK,MAAOA,EAAK,OAAQA,EAAK,MAAM,CAC9E,CAEA,OAAO,MAAMA,EAAM,CACf,OAAO,IAAIL,EAAe,EAAGK,EAAK,MAAO,EAAGA,EAAK,MAAM,CAC3D,CAEA,OAAO,OAAO,CAAE,MAAAC,EAAQ,IAAU,OAAAC,EAAS,GAAS,EAAI,CAAC,EAAG,CACxD,OAAO,IAAIP,EAAe,EAAGM,EAAO,EAAGC,CAAM,CACjD,CAEA,OAAO,SAAS,CAAE,MAAAD,EAAQ,KAAM,OAAAC,EAAS,IAAK,EAAI,CAAC,EAAG,CAClD,OAAO,IAAIP,EACPM,GAAS,EACTA,GAAS,IACTC,GAAU,EACVA,GAAU,GACd,CACJ,CAEA,IAAI,SAAU,CACV,OAAO,KAAK,WAAa,KAAK,UAAY,KAAK,YAAc,KAAK,SACtE,CAEA,IAAI,cAAe,CACf,OAAO,KAAK,UAAY,KAAK,UAAY,KAAK,WAAa,KAAK,SACpE,CAEA,oBAAqB,CACjB,GAAI,EAAE,KAAK,UAAY,GAAK,KAAK,UAAY,KAAK,UAC9C,KAAK,WAAa,GAAK,KAAK,WAAa,KAAK,WAC9C,MAAM,IAAI,MACN,2BAA2B,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,KAAK,SAAS,KAAK,KAAK,SAAS,EACpG,EAEJ,MAAO,EACX,CAEA,UAAUF,EAAM,CACZ,OAAO,IAAIN,EACP,KAAK,IAAI,KAAK,SAAU,KAAK,IAAI,KAAK,SAAUM,EAAK,KAAK,CAAC,EAC3D,KAAK,IAAI,KAAK,UAAW,KAAK,IAAI,KAAK,UAAWA,EAAK,MAAM,CAAC,CAClE,CACJ,CAMA,QAAQG,EAAa,CACjB,OAAKA,EAEE,IAAIR,EACP,KAAK,IAAI,KAAK,SAAUQ,EAAY,QAAQ,EAC5C,KAAK,IAAI,KAAK,SAAUA,EAAY,QAAQ,EAC5C,KAAK,IAAI,KAAK,UAAWA,EAAY,SAAS,EAC9C,KAAK,IAAI,KAAK,UAAWA,EAAY,SAAS,CAClD,EAPyB,IAQ7B,CAEA,kBAAmB,CACf,OAAO,IAAIR,EAAe,KAAK,SAAU,KAAK,SAAU,EAAG,GAAQ,CACvE,CAEA,mBAAoB,CAChB,OAAO,IAAIA,EAAe,EAAG,IAAU,KAAK,UAAW,KAAK,SAAS,CACzE,CAEA,QAAQ,CAAE,MAAAM,EAAQ,KAAM,OAAAC,EAAS,IAAK,EAAI,CAAC,EAAG,CAC1C,OAAO,IAAIP,EACPM,IAAU,KAAO,KAAK,IAAI,KAAK,SAAUA,CAAK,EAAI,KAAK,SACvDA,IAAU,KAAO,KAAK,IAAI,KAAK,SAAUA,CAAK,EAAI,KAAK,SACvDC,IAAW,KAAO,KAAK,IAAI,KAAK,UAAWA,CAAM,EAAI,KAAK,UAC1DA,IAAW,KAAO,KAAK,IAAI,KAAK,UAAWA,CAAM,EAAI,KAAK,SAC9D,CACJ,CAEA,SAAS,CAAE,SAAAN,EAAU,SAAAC,EAAU,UAAAC,EAAW,UAAAC,CAAU,EAAI,CAAC,EAAG,CACxD,OAAO,IAAIJ,EACPC,GAAY,KAAK,SACjBC,GAAY,KAAK,SACjBC,GAAa,KAAK,UAClBC,GAAa,KAAK,SACtB,CACJ,CAEA,UAAW,CACP,MAAO,kBAAkB,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,KAAK,SAAS,KAAK,KAAK,SAAS,GAClG,CACJ", - "names": ["Size", "BoxConstraints", "minWidth", "maxWidth", "minHeight", "maxHeight", "size", "width", "height", "constraints"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/box_shadow.js b/packages/flutterjs_engine/package/material/dist/utils/box_shadow.js deleted file mode 100644 index e07096f4..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/box_shadow.js +++ /dev/null @@ -1,2 +0,0 @@ -import{Offset as o}from"./geometry.js";class u{constructor({color:t="#000000",offset:s=o.zero(),blurRadius:r=0,spreadRadius:i=0}={}){this.color=typeof t=="string"?t:t.hex,this.offset=s,this.blurRadius=r,this.spreadRadius=i}toCSSString(){return`${this.offset.dx}px ${this.offset.dy}px ${this.blurRadius}px ${this.spreadRadius}px ${this.color}`}toString(){return`BoxShadow(color: ${this.color}, blur: ${this.blurRadius})`}}export{u as BoxShadow}; -//# sourceMappingURL=box_shadow.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/box_shadow.js.map b/packages/flutterjs_engine/package/material/dist/utils/box_shadow.js.map deleted file mode 100644 index 0c19bf12..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/box_shadow.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/box_shadow.js"], - "sourcesContent": ["import { Offset } from './geometry.js';\r\nexport class BoxShadow {\r\n constructor({\r\n color = '#000000',\r\n offset = Offset.zero(),\r\n blurRadius = 0,\r\n spreadRadius = 0\r\n } = {}) {\r\n this.color = typeof color === 'string' ? color : color.hex;\r\n this.offset = offset;\r\n this.blurRadius = blurRadius;\r\n this.spreadRadius = spreadRadius;\r\n }\r\n\r\n toCSSString() {\r\n return `${this.offset.dx}px ${this.offset.dy}px ${this.blurRadius}px ${this.spreadRadius}px ${this.color}`;\r\n }\r\n\r\n toString() {\r\n return `BoxShadow(color: ${this.color}, blur: ${this.blurRadius})`;\r\n }\r\n}"], - "mappings": "AAAA,OAAS,UAAAA,MAAc,gBAChB,MAAMC,CAAU,CACrB,YAAY,CACV,MAAAC,EAAQ,UACR,OAAAC,EAASH,EAAO,KAAK,EACrB,WAAAI,EAAa,EACb,aAAAC,EAAe,CACjB,EAAI,CAAC,EAAG,CACN,KAAK,MAAQ,OAAOH,GAAU,SAAWA,EAAQA,EAAM,IACvD,KAAK,OAASC,EACd,KAAK,WAAaC,EAClB,KAAK,aAAeC,CACtB,CAEA,aAAc,CACZ,MAAO,GAAG,KAAK,OAAO,EAAE,MAAM,KAAK,OAAO,EAAE,MAAM,KAAK,UAAU,MAAM,KAAK,YAAY,MAAM,KAAK,KAAK,EAC1G,CAEA,UAAW,CACT,MAAO,oBAAoB,KAAK,KAAK,WAAW,KAAK,UAAU,GACjE,CACF", - "names": ["Offset", "BoxShadow", "color", "offset", "blurRadius", "spreadRadius"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/checkbox_theme.js b/packages/flutterjs_engine/package/material/dist/utils/checkbox_theme.js deleted file mode 100644 index ba4e322e..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/checkbox_theme.js +++ /dev/null @@ -1,2 +0,0 @@ -import"./edge_insets.js";class d{constructor({fillColor:o,checkColor:e,hoverColor:r,overlayColor:i,focusColor:t,materialTapTargetSize:s="padded",visualDensity:l,side:a,shape:n,mouseCursor:h,splashRadius:u,enableFeedback:C=!0,animationDuration:c=200}={}){this.fillColor=o,this.checkColor=e,this.hoverColor=r,this.overlayColor=i,this.focusColor=t,this.materialTapTargetSize=s,this.visualDensity=l,this.side=a,this.shape=n,this.mouseCursor=h,this.splashRadius=u??20,this.enableFeedback=C,this.animationDuration=c}getCheckboxSize(){return this.materialTapTargetSize==="padded"?48:40}toCSSObject(){return{width:"20px",height:"20px",cursor:this.mouseCursor||"pointer",borderRadius:"2px",transition:`all ${this.animationDuration}ms ease`,display:"inline-flex",alignItems:"center",justifyContent:"center"}}getFillColor(o={}){return this.fillColor||o.primary||"#6750A4"}getCheckColor(o={}){return this.checkColor||o.onPrimary||"#FFFFFF"}getHoverColor(o={}){return this.hoverColor||o.primary+"14"||"#6750A414"}getFocusColor(o={}){return this.focusColor||o.primary+"24"||"#6750A424"}getUncheckedStyle(o={}){return{...this.toCSSObject(),border:`2px solid ${o.onSurfaceVariant||"#79747E"}`,backgroundColor:"transparent"}}getCheckedStyle(o={}){return{...this.toCSSObject(),backgroundColor:this.getFillColor(o),border:`2px solid ${this.getFillColor(o)}`}}getDisabledStyle(o={}){return{...this.toCSSObject(),opacity:.38,cursor:"not-allowed",pointerEvents:"none"}}getHoverStyle(o={}){return{backgroundColor:this.getHoverColor(o)}}getFocusStyle(o={}){return{outline:"none",boxShadow:`0 0 0 ${this.splashRadius}px ${this.getFocusColor(o)}`}}copyWith({fillColor:o,checkColor:e,hoverColor:r,overlayColor:i,focusColor:t,materialTapTargetSize:s,visualDensity:l,side:a,shape:n,mouseCursor:h,splashRadius:u,enableFeedback:C,animationDuration:c}={}){return new d({fillColor:o??this.fillColor,checkColor:e??this.checkColor,hoverColor:r??this.hoverColor,overlayColor:i??this.overlayColor,focusColor:t??this.focusColor,materialTapTargetSize:s??this.materialTapTargetSize,visualDensity:l??this.visualDensity,side:a??this.side,shape:n??this.shape,mouseCursor:h??this.mouseCursor,splashRadius:u??this.splashRadius,enableFeedback:C??this.enableFeedback,animationDuration:c??this.animationDuration})}merge(o){return o?this.copyWith({fillColor:o.fillColor,checkColor:o.checkColor,hoverColor:o.hoverColor,overlayColor:o.overlayColor,focusColor:o.focusColor,materialTapTargetSize:o.materialTapTargetSize,visualDensity:o.visualDensity,side:o.side,shape:o.shape,mouseCursor:o.mouseCursor,splashRadius:o.splashRadius,enableFeedback:o.enableFeedback,animationDuration:o.animationDuration}):this}toString(){return`CheckboxTheme(fillColor: ${this.fillColor}, checkColor: ${this.checkColor})`}}export{d as CheckboxTheme}; -//# sourceMappingURL=checkbox_theme.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/checkbox_theme.js.map b/packages/flutterjs_engine/package/material/dist/utils/checkbox_theme.js.map deleted file mode 100644 index ca7f4bcd..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/checkbox_theme.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/checkbox_theme.js"], - "sourcesContent": ["import { EdgeInsets } from './edge_insets.js';\r\n\r\n/**\r\n * Material Design 3 Checkbox Theme\r\n * Defines the visual properties of Checkbox widgets\r\n * Follows Flutter Material Design 3 specification\r\n * \r\n * Flutter Reference: https://api.flutter.dev/flutter/material/CheckboxThemeData-class.html\r\n */\r\nexport class CheckboxTheme {\r\n constructor({\r\n // Colors\r\n fillColor,\r\n checkColor,\r\n hoverColor,\r\n overlayColor,\r\n focusColor,\r\n \r\n // Size & Padding\r\n materialTapTargetSize = 'padded',\r\n visualDensity,\r\n side,\r\n shape,\r\n mouseCursor,\r\n \r\n // States\r\n splashRadius,\r\n \r\n // Interaction\r\n enableFeedback = true,\r\n animationDuration = 200\r\n } = {}) {\r\n this.fillColor = fillColor;\r\n this.checkColor = checkColor;\r\n this.hoverColor = hoverColor;\r\n this.overlayColor = overlayColor;\r\n this.focusColor = focusColor;\r\n this.materialTapTargetSize = materialTapTargetSize;\r\n this.visualDensity = visualDensity;\r\n this.side = side;\r\n this.shape = shape;\r\n this.mouseCursor = mouseCursor;\r\n this.splashRadius = splashRadius ?? 20;\r\n this.enableFeedback = enableFeedback;\r\n this.animationDuration = animationDuration;\r\n }\r\n\r\n /**\r\n * Get checkbox size based on tap target\r\n * @returns {number} Size in pixels\r\n */\r\n getCheckboxSize() {\r\n return this.materialTapTargetSize === 'padded' ? 48 : 40;\r\n }\r\n\r\n /**\r\n * Convert to CSS object for DOM rendering\r\n * @returns {Object} CSS style object\r\n */\r\n toCSSObject() {\r\n return {\r\n width: '20px',\r\n height: '20px',\r\n cursor: this.mouseCursor || 'pointer',\r\n borderRadius: '2px',\r\n transition: `all ${this.animationDuration}ms ease`,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n };\r\n }\r\n\r\n /**\r\n * Get fill color for checked state\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {string} Hex color value\r\n */\r\n getFillColor(themeColors = {}) {\r\n return this.fillColor || themeColors.primary || '#6750A4';\r\n }\r\n\r\n /**\r\n * Get check icon color\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {string} Hex color value\r\n */\r\n getCheckColor(themeColors = {}) {\r\n return this.checkColor || themeColors.onPrimary || '#FFFFFF';\r\n }\r\n\r\n /**\r\n * Get hover color\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {string} Hex color value\r\n */\r\n getHoverColor(themeColors = {}) {\r\n return this.hoverColor || themeColors.primary + '14' || '#6750A414';\r\n }\r\n\r\n /**\r\n * Get focus color\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {string} Hex color value\r\n */\r\n getFocusColor(themeColors = {}) {\r\n return this.focusColor || themeColors.primary + '24' || '#6750A424';\r\n }\r\n\r\n /**\r\n * Get unchecked state CSS object\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getUncheckedStyle(themeColors = {}) {\r\n return {\r\n ...this.toCSSObject(),\r\n border: `2px solid ${themeColors.onSurfaceVariant || '#79747E'}`,\r\n backgroundColor: 'transparent'\r\n };\r\n }\r\n\r\n /**\r\n * Get checked state CSS object\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getCheckedStyle(themeColors = {}) {\r\n return {\r\n ...this.toCSSObject(),\r\n backgroundColor: this.getFillColor(themeColors),\r\n border: `2px solid ${this.getFillColor(themeColors)}`\r\n };\r\n }\r\n\r\n /**\r\n * Get disabled state CSS object\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getDisabledStyle(themeColors = {}) {\r\n return {\r\n ...this.toCSSObject(),\r\n opacity: 0.38,\r\n cursor: 'not-allowed',\r\n pointerEvents: 'none'\r\n };\r\n }\r\n\r\n /**\r\n * Get hover state CSS object\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getHoverStyle(themeColors = {}) {\r\n return {\r\n backgroundColor: this.getHoverColor(themeColors)\r\n };\r\n }\r\n\r\n /**\r\n * Get focus state CSS object\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getFocusStyle(themeColors = {}) {\r\n return {\r\n outline: 'none',\r\n boxShadow: `0 0 0 ${this.splashRadius}px ${this.getFocusColor(themeColors)}`\r\n };\r\n }\r\n\r\n /**\r\n * Copy this theme with updated properties\r\n * @param {Object} properties - Properties to override\r\n * @returns {CheckboxTheme} New theme instance\r\n */\r\n copyWith({\r\n fillColor,\r\n checkColor,\r\n hoverColor,\r\n overlayColor,\r\n focusColor,\r\n materialTapTargetSize,\r\n visualDensity,\r\n side,\r\n shape,\r\n mouseCursor,\r\n splashRadius,\r\n enableFeedback,\r\n animationDuration\r\n } = {}) {\r\n return new CheckboxTheme({\r\n fillColor: fillColor ?? this.fillColor,\r\n checkColor: checkColor ?? this.checkColor,\r\n hoverColor: hoverColor ?? this.hoverColor,\r\n overlayColor: overlayColor ?? this.overlayColor,\r\n focusColor: focusColor ?? this.focusColor,\r\n materialTapTargetSize: materialTapTargetSize ?? this.materialTapTargetSize,\r\n visualDensity: visualDensity ?? this.visualDensity,\r\n side: side ?? this.side,\r\n shape: shape ?? this.shape,\r\n mouseCursor: mouseCursor ?? this.mouseCursor,\r\n splashRadius: splashRadius ?? this.splashRadius,\r\n enableFeedback: enableFeedback ?? this.enableFeedback,\r\n animationDuration: animationDuration ?? this.animationDuration\r\n });\r\n }\r\n\r\n /**\r\n * Merge with another CheckboxTheme\r\n * @param {CheckboxTheme} other - Theme to merge with\r\n * @returns {CheckboxTheme} Merged theme\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return this.copyWith({\r\n fillColor: other.fillColor,\r\n checkColor: other.checkColor,\r\n hoverColor: other.hoverColor,\r\n overlayColor: other.overlayColor,\r\n focusColor: other.focusColor,\r\n materialTapTargetSize: other.materialTapTargetSize,\r\n visualDensity: other.visualDensity,\r\n side: other.side,\r\n shape: other.shape,\r\n mouseCursor: other.mouseCursor,\r\n splashRadius: other.splashRadius,\r\n enableFeedback: other.enableFeedback,\r\n animationDuration: other.animationDuration\r\n });\r\n }\r\n\r\n toString() {\r\n return `CheckboxTheme(fillColor: ${this.fillColor}, checkColor: ${this.checkColor})`;\r\n }\r\n}"], - "mappings": "AAAA,MAA2B,mBASpB,MAAMA,CAAc,CACzB,YAAY,CAEV,UAAAC,EACA,WAAAC,EACA,WAAAC,EACA,aAAAC,EACA,WAAAC,EAGA,sBAAAC,EAAwB,SACxB,cAAAC,EACA,KAAAC,EACA,MAAAC,EACA,YAAAC,EAGA,aAAAC,EAGA,eAAAC,EAAiB,GACjB,kBAAAC,EAAoB,GACtB,EAAI,CAAC,EAAG,CACN,KAAK,UAAYZ,EACjB,KAAK,WAAaC,EAClB,KAAK,WAAaC,EAClB,KAAK,aAAeC,EACpB,KAAK,WAAaC,EAClB,KAAK,sBAAwBC,EAC7B,KAAK,cAAgBC,EACrB,KAAK,KAAOC,EACZ,KAAK,MAAQC,EACb,KAAK,YAAcC,EACnB,KAAK,aAAeC,GAAgB,GACpC,KAAK,eAAiBC,EACtB,KAAK,kBAAoBC,CAC3B,CAMA,iBAAkB,CAChB,OAAO,KAAK,wBAA0B,SAAW,GAAK,EACxD,CAMA,aAAc,CACZ,MAAO,CACL,MAAO,OACP,OAAQ,OACR,OAAQ,KAAK,aAAe,UAC5B,aAAc,MACd,WAAY,OAAO,KAAK,iBAAiB,UACzC,QAAS,cACT,WAAY,SACZ,eAAgB,QAClB,CACF,CAOA,aAAaC,EAAc,CAAC,EAAG,CAC7B,OAAO,KAAK,WAAaA,EAAY,SAAW,SAClD,CAOA,cAAcA,EAAc,CAAC,EAAG,CAC9B,OAAO,KAAK,YAAcA,EAAY,WAAa,SACrD,CAOA,cAAcA,EAAc,CAAC,EAAG,CAC9B,OAAO,KAAK,YAAcA,EAAY,QAAU,MAAQ,WAC1D,CAOA,cAAcA,EAAc,CAAC,EAAG,CAC9B,OAAO,KAAK,YAAcA,EAAY,QAAU,MAAQ,WAC1D,CAOA,kBAAkBA,EAAc,CAAC,EAAG,CAClC,MAAO,CACL,GAAG,KAAK,YAAY,EACpB,OAAQ,aAAaA,EAAY,kBAAoB,SAAS,GAC9D,gBAAiB,aACnB,CACF,CAOA,gBAAgBA,EAAc,CAAC,EAAG,CAChC,MAAO,CACL,GAAG,KAAK,YAAY,EACpB,gBAAiB,KAAK,aAAaA,CAAW,EAC9C,OAAQ,aAAa,KAAK,aAAaA,CAAW,CAAC,EACrD,CACF,CAOA,iBAAiBA,EAAc,CAAC,EAAG,CACjC,MAAO,CACL,GAAG,KAAK,YAAY,EACpB,QAAS,IACT,OAAQ,cACR,cAAe,MACjB,CACF,CAOA,cAAcA,EAAc,CAAC,EAAG,CAC9B,MAAO,CACL,gBAAiB,KAAK,cAAcA,CAAW,CACjD,CACF,CAOA,cAAcA,EAAc,CAAC,EAAG,CAC9B,MAAO,CACL,QAAS,OACT,UAAW,SAAS,KAAK,YAAY,MAAM,KAAK,cAAcA,CAAW,CAAC,EAC5E,CACF,CAOA,SAAS,CACP,UAAAb,EACA,WAAAC,EACA,WAAAC,EACA,aAAAC,EACA,WAAAC,EACA,sBAAAC,EACA,cAAAC,EACA,KAAAC,EACA,MAAAC,EACA,YAAAC,EACA,aAAAC,EACA,eAAAC,EACA,kBAAAC,CACF,EAAI,CAAC,EAAG,CACN,OAAO,IAAIb,EAAc,CACvB,UAAWC,GAAa,KAAK,UAC7B,WAAYC,GAAc,KAAK,WAC/B,WAAYC,GAAc,KAAK,WAC/B,aAAcC,GAAgB,KAAK,aACnC,WAAYC,GAAc,KAAK,WAC/B,sBAAuBC,GAAyB,KAAK,sBACrD,cAAeC,GAAiB,KAAK,cACrC,KAAMC,GAAQ,KAAK,KACnB,MAAOC,GAAS,KAAK,MACrB,YAAaC,GAAe,KAAK,YACjC,aAAcC,GAAgB,KAAK,aACnC,eAAgBC,GAAkB,KAAK,eACvC,kBAAmBC,GAAqB,KAAK,iBAC/C,CAAC,CACH,CAOA,MAAME,EAAO,CACX,OAAKA,EACE,KAAK,SAAS,CACnB,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,WAAYA,EAAM,WAClB,aAAcA,EAAM,aACpB,WAAYA,EAAM,WAClB,sBAAuBA,EAAM,sBAC7B,cAAeA,EAAM,cACrB,KAAMA,EAAM,KACZ,MAAOA,EAAM,MACb,YAAaA,EAAM,YACnB,aAAcA,EAAM,aACpB,eAAgBA,EAAM,eACtB,kBAAmBA,EAAM,iBAC3B,CAAC,EAfkB,IAgBrB,CAEA,UAAW,CACT,MAAO,4BAA4B,KAAK,SAAS,iBAAiB,KAAK,UAAU,GACnF,CACF", - "names": ["CheckboxTheme", "fillColor", "checkColor", "hoverColor", "overlayColor", "focusColor", "materialTapTargetSize", "visualDensity", "side", "shape", "mouseCursor", "splashRadius", "enableFeedback", "animationDuration", "themeColors", "other"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/color.js b/packages/flutterjs_engine/package/material/dist/utils/color.js deleted file mode 100644 index 98122bbf..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/color.js +++ /dev/null @@ -1,2 +0,0 @@ -class a{constructor(t){if(typeof t=="string"){const r=t.replace("#",""),e=parseInt(r,16);if(r.length===6)this._value=255<<24|e;else if(r.length===8)this._value=e;else throw new Error("Invalid hex color string");this._css=t.length===7?`${t}FF`:t.toUpperCase()}else if(typeof t=="number"){this._value=t>>>0;const r=this._value>>24&255,e=this._value>>16&255,n=this._value>>8&255,s=this._value&255;this._css=r===255?`#${e.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}`.toUpperCase():`#${r.toString(16).padStart(2,"0")}${e.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}`.toUpperCase()}else throw new Error("Color value must be a hex string or integer")}static fromARGB(t,r,e,n){const s=(t&255)<<24|(r&255)<<16|(e&255)<<8|n&255;return new a(s)}static fromRGBO(t,r,e,n){if(n<0||n>1)throw new Error("Opacity must be between 0.0 and 1.0");const s=Math.round(n*255);return a.fromARGB(s,t,r,e)}static fromHex(t){if(!/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(t))throw new Error("Invalid hex color format. Use #RRGGBB or #AARRGGBB");return new a(t)}withAlpha(t){if(t<0||t>255)throw new Error("Alpha must be between 0 and 255");const r=this.red,e=this.green,n=this.blue;return a.fromARGB(t,r,e,n)}withOpacity(t){if(t<0||t>1)throw new Error("Opacity must be between 0.0 and 1.0");const r=Math.round(t*255);return this.withAlpha(r)}get red(){return this._value>>16&255}get green(){return this._value>>8&255}get blue(){return this._value&255}get alpha(){return this._value>>24&255}get opacity(){return this.alpha/255}get value(){return this._value}get hex(){const t=this.alpha.toString(16).padStart(2,"0"),r=this.red.toString(16).padStart(2,"0"),e=this.green.toString(16).padStart(2,"0"),n=this.blue.toString(16).padStart(2,"0");return`#${t}${r}${e}${n}`.toUpperCase()}toCSSString(){if(this.alpha===255)return this.hex.slice(0,7);{const t=this.red,r=this.green,e=this.blue,n=(this.alpha/255).toFixed(4).replace(/\.?0+$/,"");return`rgba(${t}, ${r}, ${e}, ${n})`}}toString(){return this.toCSSString()}}export{a as Color}; -//# sourceMappingURL=color.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/color.js.map b/packages/flutterjs_engine/package/material/dist/utils/color.js.map deleted file mode 100644 index db722937..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/color.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/color.js"], - "sourcesContent": [" class Color {\r\n constructor(value) {\r\n if (typeof value === 'string') {\r\n // Handle hex strings: #RRGGBB or #AARRGGBB\r\n const hex = value.replace('#', '');\r\n const num = parseInt(hex, 16);\r\n if (hex.length === 6) {\r\n this._value = (0xFF << 24) | num; // Opaque by default\r\n } else if (hex.length === 8) {\r\n this._value = num;\r\n } else {\r\n throw new Error('Invalid hex color string');\r\n }\r\n this._css = value.length === 7 ? `${value}FF` : value.toUpperCase();\r\n } else if (typeof value === 'number') {\r\n this._value = value >>> 0; // Ensure unsigned 32-bit\r\n const a = (this._value >> 24) & 0xFF;\r\n const r = (this._value >> 16) & 0xFF;\r\n const g = (this._value >> 8) & 0xFF;\r\n const b = this._value & 0xFF;\r\n this._css = a === 255\r\n ? `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`.toUpperCase()\r\n : `#${a.toString(16).padStart(2, '0')}${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`.toUpperCase();\r\n } else {\r\n throw new Error('Color value must be a hex string or integer');\r\n }\r\n }\r\n\r\n // --- Static Constructors ---\r\n\r\n static fromARGB(a, r, g, b) {\r\n const value = ((a & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);\r\n return new Color(value);\r\n }\r\n\r\n static fromRGBO(r, g, b, opacity) {\r\n if (opacity < 0 || opacity > 1) {\r\n throw new Error('Opacity must be between 0.0 and 1.0');\r\n }\r\n const a = Math.round(opacity * 255);\r\n return Color.fromARGB(a, r, g, b);\r\n }\r\n\r\n static fromHex(hex) {\r\n if (!/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/.test(hex)) {\r\n throw new Error('Invalid hex color format. Use #RRGGBB or #AARRGGBB');\r\n }\r\n return new Color(hex);\r\n }\r\n\r\n // --- Instance Methods ---\r\n\r\n withAlpha(alpha) {\r\n if (alpha < 0 || alpha > 255) {\r\n throw new Error('Alpha must be between 0 and 255');\r\n }\r\n const r = this.red;\r\n const g = this.green;\r\n const b = this.blue;\r\n return Color.fromARGB(alpha, r, g, b);\r\n }\r\n\r\n withOpacity(opacity) {\r\n if (opacity < 0 || opacity > 1) {\r\n throw new Error('Opacity must be between 0.0 and 1.0');\r\n }\r\n const alpha = Math.round(opacity * 255);\r\n return this.withAlpha(alpha);\r\n }\r\n\r\n // --- Getters ---\r\n\r\n get red() {\r\n return (this._value >> 16) & 0xFF;\r\n }\r\n\r\n get green() {\r\n return (this._value >> 8) & 0xFF;\r\n }\r\n\r\n get blue() {\r\n return this._value & 0xFF;\r\n }\r\n\r\n get alpha() {\r\n return (this._value >> 24) & 0xFF;\r\n }\r\n\r\n get opacity() {\r\n return this.alpha / 255;\r\n }\r\n\r\n get value() {\r\n return this._value;\r\n }\r\n\r\n get hex() {\r\n const a = this.alpha.toString(16).padStart(2, '0');\r\n const r = this.red.toString(16).padStart(2, '0');\r\n const g = this.green.toString(16).padStart(2, '0');\r\n const b = this.blue.toString(16).padStart(2, '0');\r\n return `#${a}${r}${g}${b}`.toUpperCase();\r\n }\r\n\r\n // --- Output ---\r\n\r\n toCSSString() {\r\n if (this.alpha === 255) {\r\n return this.hex.slice(0, 7); // #RRGGBB\r\n } else {\r\n const r = this.red;\r\n const g = this.green;\r\n const b = this.blue;\r\n const a = (this.alpha / 255).toFixed(4).replace(/\\.?0+$/, '');\r\n return `rgba(${r}, ${g}, ${b}, ${a})`;\r\n }\r\n }\r\n\r\n toString() {\r\n return this.toCSSString();\r\n }\r\n\r\n // Optional: Match Flutter's `computeLuminance()`, etc. can be added later\r\n}\r\n\r\nexport { Color };"], - "mappings": "AAAC,MAAMA,CAAM,CACX,YAAYC,EAAO,CACjB,GAAI,OAAOA,GAAU,SAAU,CAE7B,MAAMC,EAAMD,EAAM,QAAQ,IAAK,EAAE,EAC3BE,EAAM,SAASD,EAAK,EAAE,EAC5B,GAAIA,EAAI,SAAW,EACjB,KAAK,OAAU,KAAQ,GAAMC,UACpBD,EAAI,SAAW,EACxB,KAAK,OAASC,MAEd,OAAM,IAAI,MAAM,0BAA0B,EAE5C,KAAK,KAAOF,EAAM,SAAW,EAAI,GAAGA,CAAK,KAAOA,EAAM,YAAY,CACpE,SAAW,OAAOA,GAAU,SAAU,CACpC,KAAK,OAASA,IAAU,EACxB,MAAMG,EAAK,KAAK,QAAU,GAAM,IAC1BC,EAAK,KAAK,QAAU,GAAM,IAC1BC,EAAK,KAAK,QAAU,EAAK,IACzBC,EAAI,KAAK,OAAS,IACxB,KAAK,KAAOH,IAAM,IACd,IAAIC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAGC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAGC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAG,YAAY,EACtH,IAAIH,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAGC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAGC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAGC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GAAG,YAAY,CAC9J,KACE,OAAM,IAAI,MAAM,6CAA6C,CAEjE,CAIA,OAAO,SAASH,EAAG,EAAGE,EAAGC,EAAG,CAC1B,MAAMN,GAAUG,EAAI,MAAS,IAAQ,EAAI,MAAS,IAAQE,EAAI,MAAS,EAAMC,EAAI,IACjF,OAAO,IAAIP,EAAMC,CAAK,CACxB,CAEA,OAAO,SAASI,EAAGC,EAAGC,EAAGC,EAAS,CAChC,GAAIA,EAAU,GAAKA,EAAU,EAC3B,MAAM,IAAI,MAAM,qCAAqC,EAEvD,MAAMJ,EAAI,KAAK,MAAMI,EAAU,GAAG,EAClC,OAAOR,EAAM,SAASI,EAAGC,EAAGC,EAAGC,CAAC,CAClC,CAEA,OAAO,QAAQL,EAAK,CAClB,GAAI,CAAC,qCAAqC,KAAKA,CAAG,EAChD,MAAM,IAAI,MAAM,oDAAoD,EAEtE,OAAO,IAAIF,EAAME,CAAG,CACtB,CAIA,UAAUO,EAAO,CACf,GAAIA,EAAQ,GAAKA,EAAQ,IACvB,MAAM,IAAI,MAAM,iCAAiC,EAEnD,MAAM,EAAI,KAAK,IACTH,EAAI,KAAK,MACTC,EAAI,KAAK,KACf,OAAOP,EAAM,SAASS,EAAO,EAAGH,EAAGC,CAAC,CACtC,CAEA,YAAYC,EAAS,CACnB,GAAIA,EAAU,GAAKA,EAAU,EAC3B,MAAM,IAAI,MAAM,qCAAqC,EAEvD,MAAMC,EAAQ,KAAK,MAAMD,EAAU,GAAG,EACtC,OAAO,KAAK,UAAUC,CAAK,CAC7B,CAIA,IAAI,KAAM,CACR,OAAQ,KAAK,QAAU,GAAM,GAC/B,CAEA,IAAI,OAAQ,CACV,OAAQ,KAAK,QAAU,EAAK,GAC9B,CAEA,IAAI,MAAO,CACT,OAAO,KAAK,OAAS,GACvB,CAEA,IAAI,OAAQ,CACV,OAAQ,KAAK,QAAU,GAAM,GAC/B,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,MAAQ,GACtB,CAEA,IAAI,OAAQ,CACV,OAAO,KAAK,MACd,CAEA,IAAI,KAAM,CACR,MAAML,EAAI,KAAK,MAAM,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAC3C,EAAI,KAAK,IAAI,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EACzCE,EAAI,KAAK,MAAM,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAC3CC,EAAI,KAAK,KAAK,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAChD,MAAO,IAAIH,CAAC,GAAG,CAAC,GAAGE,CAAC,GAAGC,CAAC,GAAG,YAAY,CACzC,CAIA,aAAc,CACZ,GAAI,KAAK,QAAU,IACjB,OAAO,KAAK,IAAI,MAAM,EAAG,CAAC,EACrB,CACL,MAAMF,EAAI,KAAK,IACTC,EAAI,KAAK,MACTC,EAAI,KAAK,KACTH,GAAK,KAAK,MAAQ,KAAK,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAE,EAC5D,MAAO,QAAQC,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKH,CAAC,GACpC,CACF,CAEA,UAAW,CACT,OAAO,KAAK,YAAY,CAC1B,CAGF", - "names": ["Color", "value", "hex", "num", "a", "r", "g", "b", "opacity", "alpha"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/colors_theme.js b/packages/flutterjs_engine/package/material/dist/utils/colors_theme.js deleted file mode 100644 index 109fbe0e..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/colors_theme.js +++ /dev/null @@ -1,4 +0,0 @@ -import{Color as e}from"../material/color.js";class o{constructor(){this.primary="#6750A4",this.onPrimary="#FFFFFF",this.primaryContainer="#EADDFF",this.onPrimaryContainer="#21005E",this.secondary="#625B71",this.onSecondary="#FFFFFF",this.secondaryContainer="#E8DEF8",this.onSecondaryContainer="#1D192B",this.tertiary="#7D5260",this.onTertiary="#FFFFFF",this.tertiaryContainer="#FFD8E4",this.onTertiaryContainer="#31111D",this.error="#B3261E",this.onError="#FFFFFF",this.errorContainer="#F9DEDC",this.onErrorContainer="#410E0B",this.background="#FFFBFE",this.onBackground="#1C1B1F",this.surface="#FFFBFE",this.onSurface="#1C1B1F",this.surfaceVariant="#E7E0EC",this.onSurfaceVariant="#49454E",this.outline="#79747E",this.outlineVariant="#CAC7D0",this.scrim="#000000",this.inverseSurface="#313033",this.inverseOnSurface="#F4EFF4",this.inversePrimary="#D0BCFF",this.shadow="#000000"}static light(r={}){const n=new o;return Object.assign(n,r)}static dark(r={}){const n=new o,t={primary:"#D0BCFF",onPrimary:"#371E55",primaryContainer:"#4F378B",onPrimaryContainer:"#EADDFF",secondary:"#CCC7D8",onSecondary:"#332D41",secondaryContainer:"#4A4458",onSecondaryContainer:"#E8DEF8",tertiary:"#FFB8C8",onTertiary:"#492532",tertiaryContainer:"#633B48",onTertiaryContainer:"#FFD8E4",error:"#F2B8B5",onError:"#601410",errorContainer:"#8C1D18",onErrorContainer:"#F9DEDC",background:"#1C1B1F",onBackground:"#E7E1E6",surface:"#1C1B1F",onSurface:"#E7E1E6",surfaceVariant:"#49454E",onSurfaceVariant:"#CAC7D0",outline:"#938F99",outlineVariant:"#49454E",inverseSurface:"#E7E1E6",inverseOnSurface:"#313033",inversePrimary:"#6750A4",...r};return Object.assign(n,t)}static highContrast(r={}){const n=new o,t={primary:"#000000",onPrimary:"#FFFFFF",primaryContainer:"#000000",onPrimaryContainer:"#FFFFFF",secondary:"#000000",onSecondary:"#FFFFFF",secondaryContainer:"#000000",onSecondaryContainer:"#FFFFFF",tertiary:"#000000",onTertiary:"#FFFFFF",tertiaryContainer:"#000000",onTertiaryContainer:"#FFFFFF",error:"#990000",onError:"#FFFFFF",errorContainer:"#990000",onErrorContainer:"#FFFFFF",background:"#FFFFFF",onBackground:"#000000",surface:"#FFFFFF",onSurface:"#000000",surfaceVariant:"#FFFFFF",onSurfaceVariant:"#000000",outline:"#000000",outlineVariant:"#000000",...r};return Object.assign(n,t)}static fromPrimary(r,n={}){const t=new o,i=new e(r);return Object.assign(t,{primary:r,onPrimary:"#FFFFFF",primaryContainer:`${r}20`,onPrimaryContainer:"#1C1B1F",...n})}getColor(r){return this[r]??null}getAllColors(){return{primary:this.primary,onPrimary:this.onPrimary,primaryContainer:this.primaryContainer,onPrimaryContainer:this.onPrimaryContainer,secondary:this.secondary,onSecondary:this.onSecondary,secondaryContainer:this.secondaryContainer,onSecondaryContainer:this.onSecondaryContainer,tertiary:this.tertiary,onTertiary:this.onTertiary,tertiaryContainer:this.tertiaryContainer,onTertiaryContainer:this.onTertiaryContainer,error:this.error,onError:this.onError,errorContainer:this.errorContainer,onErrorContainer:this.onErrorContainer,background:this.background,onBackground:this.onBackground,surface:this.surface,onSurface:this.onSurface,surfaceVariant:this.surfaceVariant,onSurfaceVariant:this.onSurfaceVariant,outline:this.outline,outlineVariant:this.outlineVariant,inverseSurface:this.inverseSurface,inverseOnSurface:this.inverseOnSurface,inversePrimary:this.inversePrimary,shadow:this.shadow,scrim:this.scrim}}toCSSVariables(){const r=this.getAllColors();let n=`:root { -`;for(const[t,i]of Object.entries(r)){const a=`--color-${t.replace(/([A-Z])/g,"-$1").toLowerCase()}`;n+=` ${a}: ${i}; -`}return n+="}",n}withOpacity(r,n){const t=this.getColor(r);if(!t)return null;const i=new e(t),a=i.red,s=i.green,F=i.blue;return`rgba(${a}, ${s}, ${F}, ${n})`}copyWith(r={}){return Object.assign(new o,this,r)}merge(r){return r?this.copyWith(r.getAllColors()):this}toString(){return`ColorsTheme(primary: ${this.primary}, secondary: ${this.secondary})`}}export{o as ColorsTheme}; -//# sourceMappingURL=colors_theme.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/colors_theme.js.map b/packages/flutterjs_engine/package/material/dist/utils/colors_theme.js.map deleted file mode 100644 index a64f025f..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/colors_theme.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/colors_theme.js"], - "sourcesContent": ["import { Color } from '../material/color.js';\r\n\r\n/**\r\n * Material Design 3 Color Theme System\r\n * Defines all colors used throughout the Material Design system\r\n * Follows Flutter Material Design 3 specification\r\n * \r\n * Flutter Reference: https://api.flutter.dev/flutter/material/Colors-class.html\r\n */\r\nexport class ColorsTheme {\r\n constructor() {\r\n // ========== PRIMARY COLOR SYSTEM ==========\r\n this.primary = '#6750A4';\r\n this.onPrimary = '#FFFFFF';\r\n this.primaryContainer = '#EADDFF';\r\n this.onPrimaryContainer = '#21005E';\r\n \r\n // ========== SECONDARY COLOR SYSTEM ==========\r\n this.secondary = '#625B71';\r\n this.onSecondary = '#FFFFFF';\r\n this.secondaryContainer = '#E8DEF8';\r\n this.onSecondaryContainer = '#1D192B';\r\n \r\n // ========== TERTIARY COLOR SYSTEM ==========\r\n this.tertiary = '#7D5260';\r\n this.onTertiary = '#FFFFFF';\r\n this.tertiaryContainer = '#FFD8E4';\r\n this.onTertiaryContainer = '#31111D';\r\n \r\n // ========== ERROR COLOR SYSTEM ==========\r\n this.error = '#B3261E';\r\n this.onError = '#FFFFFF';\r\n this.errorContainer = '#F9DEDC';\r\n this.onErrorContainer = '#410E0B';\r\n \r\n // ========== NEUTRAL COLOR SYSTEM ==========\r\n this.background = '#FFFBFE';\r\n this.onBackground = '#1C1B1F';\r\n this.surface = '#FFFBFE';\r\n this.onSurface = '#1C1B1F';\r\n this.surfaceVariant = '#E7E0EC';\r\n this.onSurfaceVariant = '#49454E';\r\n this.outline = '#79747E';\r\n this.outlineVariant = '#CAC7D0';\r\n this.scrim = '#000000';\r\n \r\n // ========== INVERSE COLORS ==========\r\n this.inverseSurface = '#313033';\r\n this.inverseOnSurface = '#F4EFF4';\r\n this.inversePrimary = '#D0BCFF';\r\n \r\n // ========== SHADOW COLOR ==========\r\n this.shadow = '#000000';\r\n }\r\n\r\n /**\r\n * Create a light theme color scheme\r\n * @param {Object} config - Color overrides\r\n * @returns {ColorsTheme} Light theme instance\r\n * \r\n * @example\r\n * const lightTheme = ColorsTheme.light({\r\n * primary: '#FF6B6B'\r\n * });\r\n */\r\n static light(config = {}) {\r\n const colors = new ColorsTheme();\r\n return Object.assign(colors, config);\r\n }\r\n\r\n /**\r\n * Create a dark theme color scheme\r\n * @param {Object} config - Color overrides\r\n * @returns {ColorsTheme} Dark theme instance\r\n * \r\n * @example\r\n * const darkTheme = ColorsTheme.dark({\r\n * primary: '#D0BCFF'\r\n * });\r\n */\r\n static dark(config = {}) {\r\n const colors = new ColorsTheme();\r\n const darkConfig = {\r\n // Primary (inverted for dark)\r\n primary: '#D0BCFF',\r\n onPrimary: '#371E55',\r\n primaryContainer: '#4F378B',\r\n onPrimaryContainer: '#EADDFF',\r\n \r\n // Secondary (inverted for dark)\r\n secondary: '#CCC7D8',\r\n onSecondary: '#332D41',\r\n secondaryContainer: '#4A4458',\r\n onSecondaryContainer: '#E8DEF8',\r\n \r\n // Tertiary (inverted for dark)\r\n tertiary: '#FFB8C8',\r\n onTertiary: '#492532',\r\n tertiaryContainer: '#633B48',\r\n onTertiaryContainer: '#FFD8E4',\r\n \r\n // Error (stays similar)\r\n error: '#F2B8B5',\r\n onError: '#601410',\r\n errorContainer: '#8C1D18',\r\n onErrorContainer: '#F9DEDC',\r\n \r\n // Neutral (inverted)\r\n background: '#1C1B1F',\r\n onBackground: '#E7E1E6',\r\n surface: '#1C1B1F',\r\n onSurface: '#E7E1E6',\r\n surfaceVariant: '#49454E',\r\n onSurfaceVariant: '#CAC7D0',\r\n outline: '#938F99',\r\n outlineVariant: '#49454E',\r\n \r\n // Inverse\r\n inverseSurface: '#E7E1E6',\r\n inverseOnSurface: '#313033',\r\n inversePrimary: '#6750A4',\r\n \r\n ...config\r\n };\r\n \r\n return Object.assign(colors, darkConfig);\r\n }\r\n\r\n /**\r\n * Create high contrast theme\r\n * @param {Object} config - Color overrides\r\n * @returns {ColorsTheme} High contrast theme instance\r\n */\r\n static highContrast(config = {}) {\r\n const colors = new ColorsTheme();\r\n const highContrastConfig = {\r\n primary: '#000000',\r\n onPrimary: '#FFFFFF',\r\n primaryContainer: '#000000',\r\n onPrimaryContainer: '#FFFFFF',\r\n \r\n secondary: '#000000',\r\n onSecondary: '#FFFFFF',\r\n secondaryContainer: '#000000',\r\n onSecondaryContainer: '#FFFFFF',\r\n \r\n tertiary: '#000000',\r\n onTertiary: '#FFFFFF',\r\n tertiaryContainer: '#000000',\r\n onTertiaryContainer: '#FFFFFF',\r\n \r\n error: '#990000',\r\n onError: '#FFFFFF',\r\n errorContainer: '#990000',\r\n onErrorContainer: '#FFFFFF',\r\n \r\n background: '#FFFFFF',\r\n onBackground: '#000000',\r\n surface: '#FFFFFF',\r\n onSurface: '#000000',\r\n surfaceVariant: '#FFFFFF',\r\n onSurfaceVariant: '#000000',\r\n outline: '#000000',\r\n outlineVariant: '#000000',\r\n \r\n ...config\r\n };\r\n \r\n return Object.assign(colors, highContrastConfig);\r\n }\r\n\r\n /**\r\n * Create custom theme from primary color\r\n * Generates complementary colors automatically\r\n * @param {string} primaryColor - Primary hex color\r\n * @param {Object} config - Additional overrides\r\n * @returns {ColorsTheme} Custom theme instance\r\n * \r\n * @example\r\n * const customTheme = ColorsTheme.fromPrimary('#FF6B6B');\r\n */\r\n static fromPrimary(primaryColor, config = {}) {\r\n const colors = new ColorsTheme();\r\n const color = new Color(primaryColor);\r\n \r\n return Object.assign(colors, {\r\n primary: primaryColor,\r\n onPrimary: '#FFFFFF',\r\n primaryContainer: `${primaryColor}20`, // 20% opacity\r\n onPrimaryContainer: '#1C1B1F',\r\n ...config\r\n });\r\n }\r\n\r\n /**\r\n * Get color by name\r\n * @param {string} name - Color name\r\n * @returns {string} Hex color value\r\n * \r\n * @example\r\n * theme.getColor('primary') // '#6750A4'\r\n */\r\n getColor(name) {\r\n return this[name] ?? null;\r\n }\r\n\r\n /**\r\n * Get all colors as object\r\n * @returns {Object} All theme colors\r\n */\r\n getAllColors() {\r\n return {\r\n // Primary\r\n primary: this.primary,\r\n onPrimary: this.onPrimary,\r\n primaryContainer: this.primaryContainer,\r\n onPrimaryContainer: this.onPrimaryContainer,\r\n \r\n // Secondary\r\n secondary: this.secondary,\r\n onSecondary: this.onSecondary,\r\n secondaryContainer: this.secondaryContainer,\r\n onSecondaryContainer: this.onSecondaryContainer,\r\n \r\n // Tertiary\r\n tertiary: this.tertiary,\r\n onTertiary: this.onTertiary,\r\n tertiaryContainer: this.tertiaryContainer,\r\n onTertiaryContainer: this.onTertiaryContainer,\r\n \r\n // Error\r\n error: this.error,\r\n onError: this.onError,\r\n errorContainer: this.errorContainer,\r\n onErrorContainer: this.onErrorContainer,\r\n \r\n // Neutral\r\n background: this.background,\r\n onBackground: this.onBackground,\r\n surface: this.surface,\r\n onSurface: this.onSurface,\r\n surfaceVariant: this.surfaceVariant,\r\n onSurfaceVariant: this.onSurfaceVariant,\r\n outline: this.outline,\r\n outlineVariant: this.outlineVariant,\r\n \r\n // Inverse\r\n inverseSurface: this.inverseSurface,\r\n inverseOnSurface: this.inverseOnSurface,\r\n inversePrimary: this.inversePrimary,\r\n \r\n // Shadow\r\n shadow: this.shadow,\r\n scrim: this.scrim\r\n };\r\n }\r\n\r\n /**\r\n * Generate CSS variables for all colors\r\n * @returns {string} CSS variable declarations\r\n * \r\n * @example\r\n * const css = theme.toCSSVariables();\r\n * // Output: --color-primary: #6750A4; ...\r\n */\r\n toCSSVariables() {\r\n const colors = this.getAllColors();\r\n let css = ':root {\\n';\r\n \r\n for (const [name, value] of Object.entries(colors)) {\r\n const cssVarName = `--color-${name.replace(/([A-Z])/g, '-$1').toLowerCase()}`;\r\n css += ` ${cssVarName}: ${value};\\n`;\r\n }\r\n \r\n css += '}';\r\n return css;\r\n }\r\n\r\n /**\r\n * Get color with opacity applied\r\n * @param {string} colorName - Name of color\r\n * @param {number} opacity - Opacity value (0.0 to 1.0)\r\n * @returns {string} RGBA color value\r\n * \r\n * @example\r\n * theme.withOpacity('primary', 0.5) // 'rgba(103, 80, 164, 0.5)'\r\n */\r\n withOpacity(colorName, opacity) {\r\n const hex = this.getColor(colorName);\r\n if (!hex) return null;\r\n \r\n const color = new Color(hex);\r\n const r = color.red;\r\n const g = color.green;\r\n const b = color.blue;\r\n \r\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\r\n }\r\n\r\n /**\r\n * Copy this theme with updated colors\r\n * @param {Object} colors - Colors to override\r\n * @returns {ColorsTheme} New theme instance\r\n */\r\n copyWith(colors = {}) {\r\n return Object.assign(new ColorsTheme(), this, colors);\r\n }\r\n\r\n /**\r\n * Merge with another color theme\r\n * @param {ColorsTheme} other - Theme to merge with\r\n * @returns {ColorsTheme} Merged theme\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return this.copyWith(other.getAllColors());\r\n }\r\n\r\n toString() {\r\n return `ColorsTheme(primary: ${this.primary}, secondary: ${this.secondary})`;\r\n }\r\n}"], - "mappings": "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", - "names": ["Color", "ColorsTheme", "config", "colors", "darkConfig", "highContrastConfig", "primaryColor", "color", "name", "css", "value", "cssVarName", "colorName", "opacity", "hex", "r", "g", "b", "other"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/decoration/decoration.js b/packages/flutterjs_engine/package/material/dist/utils/decoration/decoration.js deleted file mode 100644 index d35c0968..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/decoration/decoration.js +++ /dev/null @@ -1,2 +0,0 @@ -import{Offset as b,Alignment as p}from"../utils.js";import{Colors as c}from"../../material/color.js";class r{constructor({width:t=1,color:e=c.outline,style:s="solid"}={}){this.width=t,this.color=typeof e=="string"?e:e.hex,this.style=s}static none(){return new r({width:0,style:"none"})}merge(t){return t?new r({width:t.width??this.width,color:t.color??this.color,style:t.style??this.style}):this}toCSSString(){return this.width===0||this.style==="none"?"none":`${this.width}px ${this.style} ${this.color}`}toString(){return`BorderSide(width: ${this.width}, color: ${this.color}, style: ${this.style})`}}class d{constructor({top:t=new r,right:e=new r,bottom:s=new r,left:i=new r}={}){this.top=t,this.right=e,this.bottom=s,this.left=i}static all({width:t=1,color:e=c.outline,style:s="solid"}={}){const i=new r({width:t,color:e,style:s});return new d({top:i,right:i,bottom:i,left:i})}static none(){const t=r.none();return new d({top:t,right:t,bottom:t,left:t})}static symmetric({vertical:t=new r,horizontal:e=new r}={}){return new d({top:t,bottom:t,left:e,right:e})}static only({top:t=null,right:e=null,bottom:s=null,left:i=null}={}){return new d({top:t||r.none(),right:e||r.none(),bottom:s||r.none(),left:i||r.none()})}merge(t){return t?new d({top:this.top.merge(t.top),right:this.right.merge(t.right),bottom:this.bottom.merge(t.bottom),left:this.left.merge(t.left)}):this}toCSSString(){return this.bottom.toCSSString()}toCSSObject(){return{borderTop:this.top.toCSSString(),borderRight:this.right.toCSSString(),borderBottom:this.bottom.toCSSString(),borderLeft:this.left.toCSSString()}}toString(){return`Border(top: ${this.top}, right: ${this.right}, bottom: ${this.bottom}, left: ${this.left})`}}class o{constructor(t=0,e=0){this.x=t,this.y=e||t}static circular(t){return new o(t,t)}static elliptical(t,e){return new o(t,e)}toString(){return`Radius(${this.x}, ${this.y})`}}class a{constructor(t=0,e=0,s=0,i=0){this.topLeft=t instanceof o?t:new o(t),this.topRight=e instanceof o?e:new o(e),this.bottomRight=s instanceof o?s:new o(s),this.bottomLeft=i instanceof o?i:new o(i)}static all(t){return new a(t,t,t,t)}static circular(t){return a.all(t)}static only({topLeft:t=0,topRight:e=0,bottomRight:s=0,bottomLeft:i=0}={}){return new a(t,e,s,i)}static vertical({top:t=0,bottom:e=0}={}){return new a(t,t,e,e)}static horizontal({left:t=0,right:e=0}={}){return new a(t,e,e,t)}merge(t){return t?new a(t.topLeft??this.topLeft,t.topRight??this.topRight,t.bottomRight??this.bottomRight,t.bottomLeft??this.bottomLeft):this}toCSSString(){const t=this.topLeft instanceof o?this.topLeft.x:this.topLeft,e=this.topRight instanceof o?this.topRight.x:this.topRight,s=this.bottomRight instanceof o?this.bottomRight.x:this.bottomRight,i=this.bottomLeft instanceof o?this.bottomLeft.x:this.bottomLeft;return`${t}px ${e}px ${s}px ${i}px`}toCSSObject(){return{borderTopLeftRadius:`${this.topLeft instanceof o?this.topLeft.x:this.topLeft}px`,borderTopRightRadius:`${this.topRight instanceof o?this.topRight.x:this.topRight}px`,borderBottomRightRadius:`${this.bottomRight instanceof o?this.bottomRight.x:this.bottomRight}px`,borderBottomLeftRadius:`${this.bottomLeft instanceof o?this.bottomLeft.x:this.bottomLeft}px`}}toString(){return`BorderRadius(${this.topLeft}, ${this.topRight}, ${this.bottomRight}, ${this.bottomLeft})`}}class h{constructor({color:t=c.black54,offset:e=new b(0,0),blurRadius:s=0,spreadRadius:i=0}={}){this.color=typeof t=="string"?t:t.hex,this.offset=e,this.blurRadius=s,this.spreadRadius=i}static none(){return new h({blurRadius:0,spreadRadius:0})}static elevation1(){return new h({color:c.black12,offset:new b(0,1),blurRadius:3,spreadRadius:0})}static elevation2(){return new h({color:c.black26,offset:new b(0,3),blurRadius:6,spreadRadius:0})}static elevation3(){return new h({color:c.black38,offset:new b(0,10),blurRadius:20,spreadRadius:0})}static elevation4(){return new h({color:c.black45,offset:new b(0,15),blurRadius:25,spreadRadius:0})}static elevation5(){return new h({color:c.black54,offset:new b(0,20),blurRadius:40,spreadRadius:0})}toCSSString(){const{dx:t,dy:e}=this.offset;return`${t}px ${e}px ${this.blurRadius}px ${this.spreadRadius}px ${this.color}`}toString(){return`BoxShadow(color: ${this.color}, offset: ${this.offset}, blur: ${this.blurRadius})`}}class m{constructor(t=[]){this.shadows=t}toCSSString(){return this.shadows.map(t=>t.toCSSString()).join(", ")}toString(){return`BoxShadows(${this.shadows.length} shadows)`}}class f{constructor({begin:t=p.topLeft,end:e=p.bottomRight,colors:s=[],stops:i=null,tileMode:l="clamp"}={}){this.begin=t,this.end=e,this.colors=s.map(n=>typeof n=="string"?n:n.hex),this.stops=i||s.map((n,g)=>g/(s.length-1||1)),this.tileMode=l}getAngle(){const t=this.end.x-this.begin.x,e=this.end.y-this.begin.y;return Math.atan2(e,t)*(180/Math.PI)}toCSSString(){const t=this.getAngle(),e=this.colors.map((s,i)=>`${s} ${(this.stops[i]*100).toFixed(2)}%`).join(", ");return`linear-gradient(${t}deg, ${e})`}toString(){return`LinearGradient(colors: ${this.colors.length}, from: ${this.begin} to: ${this.end})`}}class ${constructor({center:t=p.center,radius:e=.5,colors:s=[],stops:i=null,tileMode:l="clamp"}={}){this.center=t,this.radius=e,this.colors=s.map(n=>typeof n=="string"?n:n.hex),this.stops=i||s.map((n,g)=>g/(s.length-1||1)),this.tileMode=l}toCSSString(){const t=(this.center.x+1)/2*100,e=(this.center.y+1)/2*100,s=this.colors.map((i,l)=>`${i} ${(this.stops[l]*100).toFixed(2)}%`).join(", ");return`radial-gradient(circle at ${t}% ${e}%, ${s})`}toString(){return`RadialGradient(colors: ${this.colors.length}, center: ${this.center})`}}class x{constructor({center:t=p.center,startAngle:e=0,endAngle:s=360,colors:i=[],stops:l=null}={}){this.center=t,this.startAngle=e,this.endAngle=s,this.colors=i.map(n=>typeof n=="string"?n:n.hex),this.stops=l||i.map((n,g)=>g/(i.length-1||1))}toCSSString(){const t=(this.center.x+1)/2*100,e=(this.center.y+1)/2*100,s=this.colors.map((i,l)=>`${i} ${(this.stops[l]*360).toFixed(2)}deg`).join(", ");return`conic-gradient(from 0deg at ${t}% ${e}%, ${s})`}toString(){return`SweepGradient(colors: ${this.colors.length}, center: ${this.center})`}}class u{constructor({color:t=null,gradient:e=null,image:s=null,border:i=new d,borderRadius:l=new a,boxShadow:n=new h,boxShadows:g=[],backgroundBlendMode:w="normal"}={}){this.color=typeof t=="string"?t:t?.hex||null,this.gradient=e,this.image=s,this.border=i,this.borderRadius=l,this.boxShadow=n,this.boxShadows=g.length>0?g:n?[n]:[],this.backgroundBlendMode=w}static color({color:t=c.primary,borderRadius:e=new a}={}){return new u({color:t,borderRadius:e})}static gradient({gradient:t=new f,borderRadius:e=new a}={}){return new u({gradient:t,borderRadius:e})}static border({border:t=d.all(),borderRadius:e=new a}={}){return new u({border:t,borderRadius:e})}static shadow({color:t=null,boxShadow:e=h.elevation2(),borderRadius:s=new a}={}){return new u({color:t,boxShadow:e,borderRadius:s})}static card({color:t=c.surface,elevation:e=1,borderRadius:s=a.circular(12)}={}){let i;switch(e){case 1:i=h.elevation1();break;case 2:i=h.elevation2();break;case 3:i=h.elevation3();break;case 4:i=h.elevation4();break;case 5:i=h.elevation5();break;default:i=h.none()}return new u({color:t,boxShadow:i,borderRadius:s})}merge(t){return t?new u({color:t.color??this.color,gradient:t.gradient??this.gradient,image:t.image??this.image,border:this.border.merge(t.border),borderRadius:this.borderRadius.merge(t.borderRadius),boxShadow:t.boxShadow??this.boxShadow,boxShadows:t.boxShadows.length>0?t.boxShadows:this.boxShadows,backgroundBlendMode:t.backgroundBlendMode??this.backgroundBlendMode}):this}toCSSObject(){const t={};this.gradient?t.background=this.gradient.toCSSString():this.color&&(t.backgroundColor=this.color);const e=this.border.toCSSObject();Object.assign(t,e);const s=this.borderRadius.toCSSObject();return Object.assign(t,s),this.boxShadows.length>0?t.boxShadow=this.boxShadows.map(i=>i.toCSSString()).join(", "):this.boxShadow&&(t.boxShadow=this.boxShadow.toCSSString()),this.backgroundBlendMode!=="normal"&&(t.mixBlendMode=this.backgroundBlendMode),t}applyToElement(t){const e=this.toCSSObject();Object.assign(t.style,e)}toString(){const t=[];return this.color&&t.push(`color: ${this.color}`),this.gradient&&t.push(`gradient: ${this.gradient}`),this.boxShadow&&t.push(`shadow: ${this.boxShadow}`),`BoxDecoration(${t.join(", ")})`}}var C={BorderSide:r,Border:d,Radius:o,BorderRadius:a,BoxShadow:h,BoxShadows:m,LinearGradient:f,RadialGradient:$,SweepGradient:x,BoxDecoration:u};export{d as Border,r as BorderSide,u as BoxDecoration,h as BoxShadow,m as BoxShadows,f as LinearGradient,$ as RadialGradient,o as Radius,x as SweepGradient,C as default}; -//# sourceMappingURL=decoration.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/decoration/decoration.js.map b/packages/flutterjs_engine/package/material/dist/utils/decoration/decoration.js.map deleted file mode 100644 index 3836316c..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/decoration/decoration.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../src/utils/decoration/decoration.js"], - "sourcesContent": ["// ============================================================================\r\n// FLUTTER.JS DECORATION LAYER\r\n// Border, Shadow, Gradient, and BoxDecoration classes\r\n// Layer: DECORATION (uses utils, constants, styles)\r\n// ============================================================================\r\n\r\nimport { \r\n Offset, \r\n\r\n Alignment\r\n} from '../utils.js';\r\n\r\nimport { Colors, } from '../../material/color.js';\r\n\r\n// ============================================================================\r\n// 1. BORDER.JS - Border styling configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a single border side with width, color, and style\r\n */\r\nexport class BorderSide {\r\n constructor({\r\n width = 1,\r\n color = Colors.outline,\r\n style = 'solid'\r\n } = {}) {\r\n this.width = width;\r\n this.color = typeof color === 'string' ? color : color.hex;\r\n this.style = style; // 'solid', 'dashed', 'dotted', 'double', 'none'\r\n }\r\n\r\n /**\r\n * Creates a border side with no width (invisible)\r\n */\r\n static none() {\r\n return new BorderSide({ width: 0, style: 'none' });\r\n }\r\n\r\n /**\r\n * Merges two border sides, preferring the new one\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return new BorderSide({\r\n width: other.width ?? this.width,\r\n color: other.color ?? this.color,\r\n style: other.style ?? this.style\r\n });\r\n }\r\n\r\n /**\r\n * Converts to CSS border string\r\n */\r\n toCSSString() {\r\n if (this.width === 0 || this.style === 'none') return 'none';\r\n return `${this.width}px ${this.style} ${this.color}`;\r\n }\r\n\r\n toString() {\r\n return `BorderSide(width: ${this.width}, color: ${this.color}, style: ${this.style})`;\r\n }\r\n}\r\n\r\n/**\r\n * Represents all four borders of a box\r\n */\r\nexport class Border {\r\n constructor({\r\n top = new BorderSide(),\r\n right = new BorderSide(),\r\n bottom = new BorderSide(),\r\n left = new BorderSide()\r\n } = {}) {\r\n this.top = top;\r\n this.right = right;\r\n this.bottom = bottom;\r\n this.left = left;\r\n }\r\n\r\n /**\r\n * Creates a border with all sides the same\r\n */\r\n static all({\r\n width = 1,\r\n color = Colors.outline,\r\n style = 'solid'\r\n } = {}) {\r\n const side = new BorderSide({ width, color, style });\r\n return new Border({ top: side, right: side, bottom: side, left: side });\r\n }\r\n\r\n /**\r\n * Creates a border with no sides\r\n */\r\n static none() {\r\n const side = BorderSide.none();\r\n return new Border({ top: side, right: side, bottom: side, left: side });\r\n }\r\n\r\n /**\r\n * Creates a symmetric border (vertical and horizontal)\r\n */\r\n static symmetric({\r\n vertical = new BorderSide(),\r\n horizontal = new BorderSide()\r\n } = {}) {\r\n return new Border({\r\n top: vertical,\r\n bottom: vertical,\r\n left: horizontal,\r\n right: horizontal\r\n });\r\n }\r\n\r\n /**\r\n * Creates a border with only specific sides\r\n */\r\n static only({\r\n top = null,\r\n right = null,\r\n bottom = null,\r\n left = null\r\n } = {}) {\r\n return new Border({\r\n top: top || BorderSide.none(),\r\n right: right || BorderSide.none(),\r\n bottom: bottom || BorderSide.none(),\r\n left: left || BorderSide.none()\r\n });\r\n }\r\n\r\n /**\r\n * Merges two borders\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return new Border({\r\n top: this.top.merge(other.top),\r\n right: this.right.merge(other.right),\r\n bottom: this.bottom.merge(other.bottom),\r\n left: this.left.merge(other.left)\r\n });\r\n }\r\n\r\n /**\r\n * Converts to CSS border string (uses bottom for general border)\r\n */\r\n toCSSString() {\r\n return this.bottom.toCSSString();\r\n }\r\n\r\n /**\r\n * Converts to individual CSS border properties\r\n */\r\n toCSSObject() {\r\n return {\r\n borderTop: this.top.toCSSString(),\r\n borderRight: this.right.toCSSString(),\r\n borderBottom: this.bottom.toCSSString(),\r\n borderLeft: this.left.toCSSString()\r\n };\r\n }\r\n\r\n toString() {\r\n return `Border(top: ${this.top}, right: ${this.right}, bottom: ${this.bottom}, left: ${this.left})`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 2. BORDER-RADIUS.JS - Rounded corners configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a single corner radius\r\n */\r\nexport class Radius {\r\n constructor(x = 0, y = 0) {\r\n this.x = x;\r\n this.y = y || x;\r\n }\r\n\r\n static circular(radius) {\r\n return new Radius(radius, radius);\r\n }\r\n\r\n static elliptical(x, y) {\r\n return new Radius(x, y);\r\n }\r\n\r\n toString() {\r\n return `Radius(${this.x}, ${this.y})`;\r\n }\r\n}\r\n\r\n/**\r\n * Represents border radius for all four corners\r\n */\r\n class BorderRadius {\r\n constructor(\r\n topLeft = 0,\r\n topRight = 0,\r\n bottomRight = 0,\r\n bottomLeft = 0\r\n ) {\r\n this.topLeft = topLeft instanceof Radius ? topLeft : new Radius(topLeft);\r\n this.topRight = topRight instanceof Radius ? topRight : new Radius(topRight);\r\n this.bottomRight = bottomRight instanceof Radius ? bottomRight : new Radius(bottomRight);\r\n this.bottomLeft = bottomLeft instanceof Radius ? bottomLeft : new Radius(bottomLeft);\r\n }\r\n\r\n /**\r\n * Creates all corners with same radius\r\n */\r\n static all(radius) {\r\n return new BorderRadius(radius, radius, radius, radius);\r\n }\r\n\r\n /**\r\n * Creates all corners circular\r\n */\r\n static circular(radius) {\r\n return BorderRadius.all(radius);\r\n }\r\n\r\n /**\r\n * Creates specific corners only\r\n */\r\n static only({\r\n topLeft = 0,\r\n topRight = 0,\r\n bottomRight = 0,\r\n bottomLeft = 0\r\n } = {}) {\r\n return new BorderRadius(topLeft, topRight, bottomRight, bottomLeft);\r\n }\r\n\r\n /**\r\n * Creates vertical (top/bottom) and horizontal (left/right) symmetry\r\n */\r\n static vertical({\r\n top = 0,\r\n bottom = 0\r\n } = {}) {\r\n return new BorderRadius(top, top, bottom, bottom);\r\n }\r\n\r\n /**\r\n * Creates horizontal (left/right) and vertical (top/bottom) symmetry\r\n */\r\n static horizontal({\r\n left = 0,\r\n right = 0\r\n } = {}) {\r\n return new BorderRadius(left, right, right, left);\r\n }\r\n\r\n /**\r\n * Merges two BorderRadius values\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return new BorderRadius(\r\n other.topLeft ?? this.topLeft,\r\n other.topRight ?? this.topRight,\r\n other.bottomRight ?? this.bottomRight,\r\n other.bottomLeft ?? this.bottomLeft\r\n );\r\n }\r\n\r\n /**\r\n * Converts to CSS border-radius string\r\n */\r\n toCSSString() {\r\n const tl = this.topLeft instanceof Radius ? this.topLeft.x : this.topLeft;\r\n const tr = this.topRight instanceof Radius ? this.topRight.x : this.topRight;\r\n const br = this.bottomRight instanceof Radius ? this.bottomRight.x : this.bottomRight;\r\n const bl = this.bottomLeft instanceof Radius ? this.bottomLeft.x : this.bottomLeft;\r\n return `${tl}px ${tr}px ${br}px ${bl}px`;\r\n }\r\n\r\n /**\r\n * Converts to CSS border-radius object\r\n */\r\n toCSSObject() {\r\n return {\r\n borderTopLeftRadius: `${this.topLeft instanceof Radius ? this.topLeft.x : this.topLeft}px`,\r\n borderTopRightRadius: `${this.topRight instanceof Radius ? this.topRight.x : this.topRight}px`,\r\n borderBottomRightRadius: `${this.bottomRight instanceof Radius ? this.bottomRight.x : this.bottomRight}px`,\r\n borderBottomLeftRadius: `${this.bottomLeft instanceof Radius ? this.bottomLeft.x : this.bottomLeft}px`\r\n };\r\n }\r\n\r\n toString() {\r\n return `BorderRadius(${this.topLeft}, ${this.topRight}, ${this.bottomRight}, ${this.bottomLeft})`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 3. BOX-SHADOW.JS - Shadow effects configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Represents a single shadow effect\r\n */\r\nexport class BoxShadow {\r\n constructor({\r\n color = Colors.black54,\r\n offset = new Offset(0, 0),\r\n blurRadius = 0,\r\n spreadRadius = 0\r\n } = {}) {\r\n this.color = typeof color === 'string' ? color : color.hex;\r\n this.offset = offset;\r\n this.blurRadius = blurRadius;\r\n this.spreadRadius = spreadRadius;\r\n }\r\n\r\n /**\r\n * Creates a shadow with no spread (no visible shadow)\r\n */\r\n static none() {\r\n return new BoxShadow({\r\n blurRadius: 0,\r\n spreadRadius: 0\r\n });\r\n }\r\n\r\n /**\r\n * Material Design 3 Elevation 1\r\n */\r\n static elevation1() {\r\n return new BoxShadow({\r\n color: Colors.black12,\r\n offset: new Offset(0, 1),\r\n blurRadius: 3,\r\n spreadRadius: 0\r\n });\r\n }\r\n\r\n /**\r\n * Material Design 3 Elevation 2\r\n */\r\n static elevation2() {\r\n return new BoxShadow({\r\n color: Colors.black26,\r\n offset: new Offset(0, 3),\r\n blurRadius: 6,\r\n spreadRadius: 0\r\n });\r\n }\r\n\r\n /**\r\n * Material Design 3 Elevation 3\r\n */\r\n static elevation3() {\r\n return new BoxShadow({\r\n color: Colors.black38,\r\n offset: new Offset(0, 10),\r\n blurRadius: 20,\r\n spreadRadius: 0\r\n });\r\n }\r\n\r\n /**\r\n * Material Design 3 Elevation 4\r\n */\r\n static elevation4() {\r\n return new BoxShadow({\r\n color: Colors.black45,\r\n offset: new Offset(0, 15),\r\n blurRadius: 25,\r\n spreadRadius: 0\r\n });\r\n }\r\n\r\n /**\r\n * Material Design 3 Elevation 5\r\n */\r\n static elevation5() {\r\n return new BoxShadow({\r\n color: Colors.black54,\r\n offset: new Offset(0, 20),\r\n blurRadius: 40,\r\n spreadRadius: 0\r\n });\r\n }\r\n\r\n /**\r\n * Converts to CSS box-shadow string\r\n */\r\n toCSSString() {\r\n const { dx, dy } = this.offset;\r\n return `${dx}px ${dy}px ${this.blurRadius}px ${this.spreadRadius}px ${this.color}`;\r\n }\r\n\r\n toString() {\r\n return `BoxShadow(color: ${this.color}, offset: ${this.offset}, blur: ${this.blurRadius})`;\r\n }\r\n}\r\n\r\n/**\r\n * Multiple shadows (supports layered shadows)\r\n */\r\nexport class BoxShadows {\r\n constructor(shadows = []) {\r\n this.shadows = shadows;\r\n }\r\n\r\n /**\r\n * Converts to CSS box-shadow string (multiple shadows)\r\n */\r\n toCSSString() {\r\n return this.shadows.map(shadow => shadow.toCSSString()).join(', ');\r\n }\r\n\r\n toString() {\r\n return `BoxShadows(${this.shadows.length} shadows)`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 4. GRADIENT.JS - Gradient fill configuration\r\n// ============================================================================\r\n\r\n/**\r\n * Linear gradient fill\r\n */\r\nexport class LinearGradient {\r\n constructor({\r\n begin = Alignment.topLeft,\r\n end = Alignment.bottomRight,\r\n colors = [],\r\n stops = null,\r\n tileMode = 'clamp' // 'clamp', 'repeated', 'mirror'\r\n } = {}) {\r\n this.begin = begin;\r\n this.end = end;\r\n this.colors = colors.map(c => typeof c === 'string' ? c : c.hex);\r\n this.stops = stops || colors.map((_, i) => i / (colors.length - 1 || 1));\r\n this.tileMode = tileMode;\r\n }\r\n\r\n /**\r\n * Calculates gradient angle in degrees\r\n */\r\n getAngle() {\r\n const dx = this.end.x - this.begin.x;\r\n const dy = this.end.y - this.begin.y;\r\n return Math.atan2(dy, dx) * (180 / Math.PI);\r\n }\r\n\r\n /**\r\n * Converts to CSS linear-gradient string\r\n */\r\n toCSSString() {\r\n const angle = this.getAngle();\r\n const colorStops = this.colors\r\n .map((color, i) => `${color} ${(this.stops[i] * 100).toFixed(2)}%`)\r\n .join(', ');\r\n return `linear-gradient(${angle}deg, ${colorStops})`;\r\n }\r\n\r\n toString() {\r\n return `LinearGradient(colors: ${this.colors.length}, from: ${this.begin} to: ${this.end})`;\r\n }\r\n}\r\n\r\n/**\r\n * Radial gradient fill\r\n */\r\nexport class RadialGradient {\r\n constructor({\r\n center = Alignment.center,\r\n radius = 0.5,\r\n colors = [],\r\n stops = null,\r\n tileMode = 'clamp'\r\n } = {}) {\r\n this.center = center;\r\n this.radius = radius;\r\n this.colors = colors.map(c => typeof c === 'string' ? c : c.hex);\r\n this.stops = stops || colors.map((_, i) => i / (colors.length - 1 || 1));\r\n this.tileMode = tileMode;\r\n }\r\n\r\n /**\r\n * Converts to CSS radial-gradient string\r\n */\r\n toCSSString() {\r\n const centerX = ((this.center.x + 1) / 2) * 100;\r\n const centerY = ((this.center.y + 1) / 2) * 100;\r\n const colorStops = this.colors\r\n .map((color, i) => `${color} ${(this.stops[i] * 100).toFixed(2)}%`)\r\n .join(', ');\r\n return `radial-gradient(circle at ${centerX}% ${centerY}%, ${colorStops})`;\r\n }\r\n\r\n toString() {\r\n return `RadialGradient(colors: ${this.colors.length}, center: ${this.center})`;\r\n }\r\n}\r\n\r\n/**\r\n * Sweep gradient (conic) fill\r\n */\r\nexport class SweepGradient {\r\n constructor({\r\n center = Alignment.center,\r\n startAngle = 0,\r\n endAngle = 360,\r\n colors = [],\r\n stops = null\r\n } = {}) {\r\n this.center = center;\r\n this.startAngle = startAngle;\r\n this.endAngle = endAngle;\r\n this.colors = colors.map(c => typeof c === 'string' ? c : c.hex);\r\n this.stops = stops || colors.map((_, i) => i / (colors.length - 1 || 1));\r\n }\r\n\r\n /**\r\n * Converts to CSS conic-gradient string\r\n */\r\n toCSSString() {\r\n const centerX = ((this.center.x + 1) / 2) * 100;\r\n const centerY = ((this.center.y + 1) / 2) * 100;\r\n const colorStops = this.colors\r\n .map((color, i) => `${color} ${(this.stops[i] * 360).toFixed(2)}deg`)\r\n .join(', ');\r\n return `conic-gradient(from 0deg at ${centerX}% ${centerY}%, ${colorStops})`;\r\n }\r\n\r\n toString() {\r\n return `SweepGradient(colors: ${this.colors.length}, center: ${this.center})`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 5. BOX-DECORATION.JS - Complete box decoration\r\n// ============================================================================\r\n\r\n/**\r\n * Complete decoration configuration for a box/container\r\n * Combines color, border, border-radius, shadow, and gradient\r\n */\r\nexport class BoxDecoration {\r\n constructor({\r\n color = null,\r\n gradient = null,\r\n image = null,\r\n border = new Border(),\r\n borderRadius = new BorderRadius(),\r\n boxShadow = new BoxShadow(),\r\n boxShadows = [],\r\n backgroundBlendMode = 'normal'\r\n } = {}) {\r\n // Either color or gradient, not both\r\n this.color = typeof color === 'string' ? color : color?.hex || null;\r\n this.gradient = gradient;\r\n this.image = image;\r\n \r\n this.border = border;\r\n this.borderRadius = borderRadius;\r\n this.boxShadow = boxShadow;\r\n this.boxShadows = boxShadows.length > 0 ? boxShadows : (boxShadow ? [boxShadow] : []);\r\n \r\n this.backgroundBlendMode = backgroundBlendMode;\r\n }\r\n\r\n /**\r\n * Creates a simple colored decoration\r\n */\r\n static color({\r\n color = Colors.primary,\r\n borderRadius = new BorderRadius()\r\n } = {}) {\r\n return new BoxDecoration({ color, borderRadius });\r\n }\r\n\r\n /**\r\n * Creates a decoration with gradient\r\n */\r\n static gradient({\r\n gradient = new LinearGradient(),\r\n borderRadius = new BorderRadius()\r\n } = {}) {\r\n return new BoxDecoration({ gradient, borderRadius });\r\n }\r\n\r\n /**\r\n * Creates a decoration with border only\r\n */\r\n static border({\r\n border = Border.all(),\r\n borderRadius = new BorderRadius()\r\n } = {}) {\r\n return new BoxDecoration({ border, borderRadius });\r\n }\r\n\r\n /**\r\n * Creates a decoration with shadow\r\n */\r\n static shadow({\r\n color = null,\r\n boxShadow = BoxShadow.elevation2(),\r\n borderRadius = new BorderRadius()\r\n } = {}) {\r\n return new BoxDecoration({ color, boxShadow, borderRadius });\r\n }\r\n\r\n /**\r\n * Creates Material Design 3 card decoration\r\n */\r\n static card({\r\n color = Colors.surface,\r\n elevation = 1,\r\n borderRadius = BorderRadius.circular(12)\r\n } = {}) {\r\n let shadow;\r\n switch (elevation) {\r\n case 1: shadow = BoxShadow.elevation1(); break;\r\n case 2: shadow = BoxShadow.elevation2(); break;\r\n case 3: shadow = BoxShadow.elevation3(); break;\r\n case 4: shadow = BoxShadow.elevation4(); break;\r\n case 5: shadow = BoxShadow.elevation5(); break;\r\n default: shadow = BoxShadow.none();\r\n }\r\n return new BoxDecoration({ color, boxShadow: shadow, borderRadius });\r\n }\r\n\r\n /**\r\n * Merges two decorations\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return new BoxDecoration({\r\n color: other.color ?? this.color,\r\n gradient: other.gradient ?? this.gradient,\r\n image: other.image ?? this.image,\r\n border: this.border.merge(other.border),\r\n borderRadius: this.borderRadius.merge(other.borderRadius),\r\n boxShadow: other.boxShadow ?? this.boxShadow,\r\n boxShadows: other.boxShadows.length > 0 ? other.boxShadows : this.boxShadows,\r\n backgroundBlendMode: other.backgroundBlendMode ?? this.backgroundBlendMode\r\n });\r\n }\r\n\r\n /**\r\n * Converts to CSS style object\r\n */\r\n toCSSObject() {\r\n const style = {};\r\n\r\n // Background\r\n if (this.gradient) {\r\n style.background = this.gradient.toCSSString();\r\n } else if (this.color) {\r\n style.backgroundColor = this.color;\r\n }\r\n\r\n // Border\r\n const borderCSS = this.border.toCSSObject();\r\n Object.assign(style, borderCSS);\r\n\r\n // Border Radius\r\n const radiusCSS = this.borderRadius.toCSSObject();\r\n Object.assign(style, radiusCSS);\r\n\r\n // Box Shadow\r\n if (this.boxShadows.length > 0) {\r\n style.boxShadow = this.boxShadows.map(s => s.toCSSString()).join(', ');\r\n } else if (this.boxShadow) {\r\n style.boxShadow = this.boxShadow.toCSSString();\r\n }\r\n\r\n // Blend Mode\r\n if (this.backgroundBlendMode !== 'normal') {\r\n style.mixBlendMode = this.backgroundBlendMode;\r\n }\r\n\r\n return style;\r\n }\r\n\r\n /**\r\n * Applies decoration to a DOM element\r\n */\r\n applyToElement(element) {\r\n const styles = this.toCSSObject();\r\n Object.assign(element.style, styles);\r\n }\r\n\r\n toString() {\r\n const parts = [];\r\n if (this.color) parts.push(`color: ${this.color}`);\r\n if (this.gradient) parts.push(`gradient: ${this.gradient}`);\r\n if (this.boxShadow) parts.push(`shadow: ${this.boxShadow}`);\r\n return `BoxDecoration(${parts.join(', ')})`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 6. INDEX.JS - Re-export all decoration classes\r\n// ============================================================================\r\n\r\nexport default {\r\n // Border\r\n BorderSide,\r\n Border,\r\n \r\n // Border Radius\r\n Radius,\r\n BorderRadius,\r\n \r\n // Shadow\r\n BoxShadow,\r\n BoxShadows,\r\n \r\n // Gradient\r\n LinearGradient,\r\n RadialGradient,\r\n SweepGradient,\r\n \r\n // Complete Decoration\r\n BoxDecoration\r\n};"], - "mappings": "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", - "names": ["Offset", "Alignment", "Colors", "BorderSide", "width", "color", "style", "other", "Border", "top", "right", "bottom", "left", "side", "vertical", "horizontal", "Radius", "x", "y", "radius", "BorderRadius", "topLeft", "topRight", "bottomRight", "bottomLeft", "tl", "tr", "br", "bl", "BoxShadow", "offset", "blurRadius", "spreadRadius", "dx", "dy", "BoxShadows", "shadows", "shadow", "LinearGradient", "begin", "end", "colors", "stops", "tileMode", "c", "_", "i", "angle", "colorStops", "RadialGradient", "center", "centerX", "centerY", "SweepGradient", "startAngle", "endAngle", "BoxDecoration", "gradient", "image", "border", "borderRadius", "boxShadow", "boxShadows", "backgroundBlendMode", "elevation", "borderCSS", "radiusCSS", "s", "element", "styles", "parts", "decoration_default"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/divider_theme.js b/packages/flutterjs_engine/package/material/dist/utils/divider_theme.js deleted file mode 100644 index a01d8486..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/divider_theme.js +++ /dev/null @@ -1,2 +0,0 @@ -class r{constructor({thickness:t=1,indent:i=0,endIndent:e=0,height:n,color:h,space:s}={}){this.thickness=t,this.indent=i,this.endIndent=e,this.height=n??t*16,this.color=h,this.space=s}toCSSObject(t={}){return{width:"100%",height:`${this.height}px`,display:"flex",alignItems:"center",marginLeft:0,marginRight:0}}getHorizontalLineStyle(t={}){return{width:`calc(100% - ${this.indent+this.endIndent}px)`,height:`${this.thickness}px`,backgroundColor:this.color||t.outlineVariant||"#CAC7D0",border:"none",margin:`${(this.height-this.thickness)/2}px ${this.endIndent}px ${(this.height-this.thickness)/2}px ${this.indent}px`}}getVerticalLineStyle(t={}){return{width:`${this.thickness}px`,height:this.height?`${this.height}px`:"100%",backgroundColor:this.color||t.outlineVariant||"#CAC7D0",border:"none",margin:`${this.indent}px 0`}}getDividerWithSpacingStyle(t={}){const i=this.space??this.height;return{...this.getHorizontalLineStyle(t),marginTop:`${i}px`,marginBottom:`${i}px`}}getListDividerStyle(t={}){return{...this.getHorizontalLineStyle(t),margin:"0",marginBottom:`${this.height}px`}}getDividerColor(t={}){return this.color||t.outlineVariant||"#CAC7D0"}copyWith({thickness:t,indent:i,endIndent:e,height:n,color:h,space:s}={}){return new r({thickness:t??this.thickness,indent:i??this.indent,endIndent:e??this.endIndent,height:n??this.height,color:h??this.color,space:s??this.space})}merge(t){return t?this.copyWith({thickness:t.thickness,indent:t.indent,endIndent:t.endIndent,height:t.height,color:t.color,space:t.space}):this}toString(){return`DividerTheme(thickness: ${this.thickness}px, height: ${this.height}px)`}}export{r as DividerTheme}; -//# sourceMappingURL=divider_theme.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/divider_theme.js.map b/packages/flutterjs_engine/package/material/dist/utils/divider_theme.js.map deleted file mode 100644 index 1699d935..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/divider_theme.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/divider_theme.js"], - "sourcesContent": ["/**\r\n * Material Design 3 Divider Theme\r\n * Defines the visual properties of Divider widgets\r\n * Follows Flutter Material Design 3 specification\r\n * \r\n * Flutter Reference: https://api.flutter.dev/flutter/material/DividerThemeData-class.html\r\n */\r\nexport class DividerTheme {\r\n constructor({\r\n // Dimensions\r\n thickness = 1,\r\n indent = 0,\r\n endIndent = 0,\r\n height,\r\n \r\n // Color\r\n color,\r\n \r\n // Space\r\n space\r\n } = {}) {\r\n this.thickness = thickness;\r\n this.indent = indent;\r\n this.endIndent = endIndent;\r\n this.height = height ?? (thickness * 16); // Default height factor\r\n this.color = color;\r\n this.space = space;\r\n }\r\n\r\n /**\r\n * Convert to CSS object for horizontal divider\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS style object\r\n */\r\n toCSSObject(themeColors = {}) {\r\n return {\r\n width: '100%',\r\n height: `${this.height}px`,\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginLeft: 0,\r\n marginRight: 0\r\n };\r\n }\r\n\r\n /**\r\n * Get horizontal divider line CSS\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties for the line element\r\n */\r\n getHorizontalLineStyle(themeColors = {}) {\r\n const totalIndent = this.indent + this.endIndent;\r\n const lineWidth = `calc(100% - ${totalIndent}px)`;\r\n \r\n return {\r\n width: lineWidth,\r\n height: `${this.thickness}px`,\r\n backgroundColor: this.color || (themeColors.outlineVariant || '#CAC7D0'),\r\n border: 'none',\r\n margin: `${(this.height - this.thickness) / 2}px ${this.endIndent}px ${(this.height - this.thickness) / 2}px ${this.indent}px`\r\n };\r\n }\r\n\r\n /**\r\n * Get vertical divider CSS object\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getVerticalLineStyle(themeColors = {}) {\r\n return {\r\n width: `${this.thickness}px`,\r\n height: this.height ? `${this.height}px` : '100%',\r\n backgroundColor: this.color || (themeColors.outlineVariant || '#CAC7D0'),\r\n border: 'none',\r\n margin: `${this.indent}px 0`\r\n };\r\n }\r\n\r\n /**\r\n * Get divider with spacing CSS\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties including margins\r\n */\r\n getDividerWithSpacingStyle(themeColors = {}) {\r\n const spacing = this.space ?? this.height;\r\n return {\r\n ...this.getHorizontalLineStyle(themeColors),\r\n marginTop: `${spacing}px`,\r\n marginBottom: `${spacing}px`\r\n };\r\n }\r\n\r\n /**\r\n * Get list divider CSS (commonly used between list items)\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {Object} CSS properties\r\n */\r\n getListDividerStyle(themeColors = {}) {\r\n return {\r\n ...this.getHorizontalLineStyle(themeColors),\r\n margin: '0',\r\n marginBottom: `${this.height}px`\r\n };\r\n }\r\n\r\n /**\r\n * Get divider color\r\n * @param {Object} themeColors - Theme colors object\r\n * @returns {string} Hex color value\r\n */\r\n getDividerColor(themeColors = {}) {\r\n return this.color || themeColors.outlineVariant || '#CAC7D0';\r\n }\r\n\r\n /**\r\n * Copy this theme with updated properties\r\n * @param {Object} properties - Properties to override\r\n * @returns {DividerTheme} New theme instance\r\n */\r\n copyWith({\r\n thickness,\r\n indent,\r\n endIndent,\r\n height,\r\n color,\r\n space\r\n } = {}) {\r\n return new DividerTheme({\r\n thickness: thickness ?? this.thickness,\r\n indent: indent ?? this.indent,\r\n endIndent: endIndent ?? this.endIndent,\r\n height: height ?? this.height,\r\n color: color ?? this.color,\r\n space: space ?? this.space\r\n });\r\n }\r\n\r\n /**\r\n * Merge with another DividerTheme\r\n * @param {DividerTheme} other - Theme to merge with\r\n * @returns {DividerTheme} Merged theme\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return this.copyWith({\r\n thickness: other.thickness,\r\n indent: other.indent,\r\n endIndent: other.endIndent,\r\n height: other.height,\r\n color: other.color,\r\n space: other.space\r\n });\r\n }\r\n\r\n toString() {\r\n return `DividerTheme(thickness: ${this.thickness}px, height: ${this.height}px)`;\r\n }\r\n}"], - "mappings": "AAOO,MAAMA,CAAa,CACxB,YAAY,CAEV,UAAAC,EAAY,EACZ,OAAAC,EAAS,EACT,UAAAC,EAAY,EACZ,OAAAC,EAGA,MAAAC,EAGA,MAAAC,CACF,EAAI,CAAC,EAAG,CACN,KAAK,UAAYL,EACjB,KAAK,OAASC,EACd,KAAK,UAAYC,EACjB,KAAK,OAASC,GAAWH,EAAY,GACrC,KAAK,MAAQI,EACb,KAAK,MAAQC,CACf,CAOA,YAAYC,EAAc,CAAC,EAAG,CAC5B,MAAO,CACL,MAAO,OACP,OAAQ,GAAG,KAAK,MAAM,KACtB,QAAS,OACT,WAAY,SACZ,WAAY,EACZ,YAAa,CACf,CACF,CAOA,uBAAuBA,EAAc,CAAC,EAAG,CAIvC,MAAO,CACL,MAHgB,eADE,KAAK,OAAS,KAAK,SACK,MAI1C,OAAQ,GAAG,KAAK,SAAS,KACzB,gBAAiB,KAAK,OAAUA,EAAY,gBAAkB,UAC9D,OAAQ,OACR,OAAQ,IAAI,KAAK,OAAS,KAAK,WAAa,CAAC,MAAM,KAAK,SAAS,OAAO,KAAK,OAAS,KAAK,WAAa,CAAC,MAAM,KAAK,MAAM,IAC5H,CACF,CAOA,qBAAqBA,EAAc,CAAC,EAAG,CACrC,MAAO,CACL,MAAO,GAAG,KAAK,SAAS,KACxB,OAAQ,KAAK,OAAS,GAAG,KAAK,MAAM,KAAO,OAC3C,gBAAiB,KAAK,OAAUA,EAAY,gBAAkB,UAC9D,OAAQ,OACR,OAAQ,GAAG,KAAK,MAAM,MACxB,CACF,CAOA,2BAA2BA,EAAc,CAAC,EAAG,CAC3C,MAAMC,EAAU,KAAK,OAAS,KAAK,OACnC,MAAO,CACL,GAAG,KAAK,uBAAuBD,CAAW,EAC1C,UAAW,GAAGC,CAAO,KACrB,aAAc,GAAGA,CAAO,IAC1B,CACF,CAOA,oBAAoBD,EAAc,CAAC,EAAG,CACpC,MAAO,CACL,GAAG,KAAK,uBAAuBA,CAAW,EAC1C,OAAQ,IACR,aAAc,GAAG,KAAK,MAAM,IAC9B,CACF,CAOA,gBAAgBA,EAAc,CAAC,EAAG,CAChC,OAAO,KAAK,OAASA,EAAY,gBAAkB,SACrD,CAOA,SAAS,CACP,UAAAN,EACA,OAAAC,EACA,UAAAC,EACA,OAAAC,EACA,MAAAC,EACA,MAAAC,CACF,EAAI,CAAC,EAAG,CACN,OAAO,IAAIN,EAAa,CACtB,UAAWC,GAAa,KAAK,UAC7B,OAAQC,GAAU,KAAK,OACvB,UAAWC,GAAa,KAAK,UAC7B,OAAQC,GAAU,KAAK,OACvB,MAAOC,GAAS,KAAK,MACrB,MAAOC,GAAS,KAAK,KACvB,CAAC,CACH,CAOA,MAAMG,EAAO,CACX,OAAKA,EACE,KAAK,SAAS,CACnB,UAAWA,EAAM,UACjB,OAAQA,EAAM,OACd,UAAWA,EAAM,UACjB,OAAQA,EAAM,OACd,MAAOA,EAAM,MACb,MAAOA,EAAM,KACf,CAAC,EARkB,IASrB,CAEA,UAAW,CACT,MAAO,2BAA2B,KAAK,SAAS,eAAe,KAAK,MAAM,KAC5E,CACF", - "names": ["DividerTheme", "thickness", "indent", "endIndent", "height", "color", "space", "themeColors", "spacing", "other"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/duration.js b/packages/flutterjs_engine/package/material/dist/utils/duration.js deleted file mode 100644 index 2de12652..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/duration.js +++ /dev/null @@ -1,2 +0,0 @@ -class t{constructor(s=0){this.ms=s}get seconds(){return this.ms/1e3}get minutes(){return this.ms/6e4}get inMilliseconds(){return this.ms}static fromMilliseconds(s){return new t(s)}static fromSeconds(s){return new t(s*1e3)}static fromMinutes(s){return new t(s*6e4)}compareTo(s){return this.ms-s.ms}toString(){return`Duration(${this.ms}ms)`}}export{t as Duration}; -//# sourceMappingURL=duration.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/duration.js.map b/packages/flutterjs_engine/package/material/dist/utils/duration.js.map deleted file mode 100644 index 25a99340..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/duration.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/duration.js"], - "sourcesContent": ["export class Duration {\r\n constructor(ms = 0) {\r\n this.ms = ms;\r\n }\r\n\r\n get seconds() {\r\n return this.ms / 1000;\r\n }\r\n\r\n get minutes() {\r\n return this.ms / 60000;\r\n }\r\n\r\n get inMilliseconds() {\r\n return this.ms;\r\n }\r\n\r\n static fromMilliseconds(ms) {\r\n return new Duration(ms);\r\n }\r\n\r\n static fromSeconds(s) {\r\n return new Duration(s * 1000);\r\n }\r\n\r\n static fromMinutes(m) {\r\n return new Duration(m * 60000);\r\n }\r\n\r\n compareTo(other) {\r\n return this.ms - other.ms;\r\n }\r\n\r\n toString() {\r\n return `Duration(${this.ms}ms)`;\r\n }\r\n}"], - "mappings": "AAAO,MAAMA,CAAS,CACpB,YAAYC,EAAK,EAAG,CAClB,KAAK,GAAKA,CACZ,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,GAAK,GACnB,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,GAAK,GACnB,CAEA,IAAI,gBAAiB,CACnB,OAAO,KAAK,EACd,CAEA,OAAO,iBAAiBA,EAAI,CAC1B,OAAO,IAAID,EAASC,CAAE,CACxB,CAEA,OAAO,YAAY,EAAG,CACpB,OAAO,IAAID,EAAS,EAAI,GAAI,CAC9B,CAEA,OAAO,YAAYE,EAAG,CACpB,OAAO,IAAIF,EAASE,EAAI,GAAK,CAC/B,CAEA,UAAUC,EAAO,CACf,OAAO,KAAK,GAAKA,EAAM,EACzB,CAEA,UAAW,CACT,MAAO,YAAY,KAAK,EAAE,KAC5B,CACF", - "names": ["Duration", "ms", "m", "other"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/edge_insets.js b/packages/flutterjs_engine/package/material/dist/utils/edge_insets.js deleted file mode 100644 index 9b78b9c0..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/edge_insets.js +++ /dev/null @@ -1,2 +0,0 @@ -class h{constructor(t=0,i=0,r=0,o=0){this.top=t,this.right=i,this.bottom=r,this.left=o}static zero(){return new h(0,0,0,0)}static all(t){return new h(t,t,t,t)}static symmetric({vertical:t=0,horizontal:i=0}={}){return new h(t,i,t,i)}static only({top:t=0,right:i=0,bottom:r=0,left:o=0}={}){return new h(t,i,r,o)}static fromLTRB(t,i,r,o){return new h(i,r,o,t)}get vertical(){return this.top+this.bottom}get horizontal(){return this.left+this.right}get isNonNegative(){return this.top>=0&&this.right>=0&&this.bottom>=0&&this.left>=0}get isZero(){return this.top===0&&this.right===0&&this.bottom===0&&this.left===0}add(t){return new h(this.top+t.top,this.right+t.right,this.bottom+t.bottom,this.left+t.left)}copyWith({top:t,right:i,bottom:r,left:o}={}){return new h(t??this.top,i??this.right,r??this.bottom,o??this.left)}equals(t){return!t||!(t instanceof h)?!1:this.top===t.top&&this.right===t.right&&this.bottom===t.bottom&&this.left===t.left}toCSSString(){return`${this.top}px ${this.right}px ${this.bottom}px ${this.left}px`}toCSSShorthand(){const{top:t,right:i,bottom:r,left:o}=this;return t===i&&i===r&&r===o?`${t}px`:t===r&&i===o?`${t}px ${i}px`:this.toCSSString()}toCSSMargin(){return this.toCSSString()}toCSSPadding(){return this.toCSSString()}toString(){return`EdgeInsets(${this.top}, ${this.right}, ${this.bottom}, ${this.left})`}}export{h as EdgeInsets}; -//# sourceMappingURL=edge_insets.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/edge_insets.js.map b/packages/flutterjs_engine/package/material/dist/utils/edge_insets.js.map deleted file mode 100644 index 4a02b2bf..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/edge_insets.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/edge_insets.js"], - "sourcesContent": ["export class EdgeInsets {\r\n constructor(top = 0, right = 0, bottom = 0, left = 0) {\r\n this.top = top;\r\n this.right = right;\r\n this.bottom = bottom;\r\n this.left = left;\r\n }\r\n\r\n static zero() {\r\n return new EdgeInsets(0, 0, 0, 0);\r\n }\r\n\r\n static all(value) {\r\n return new EdgeInsets(value, value, value, value);\r\n }\r\n\r\n static symmetric({ vertical = 0, horizontal = 0 } = {}) {\r\n return new EdgeInsets(vertical, horizontal, vertical, horizontal);\r\n }\r\n\r\n static only({ top = 0, right = 0, bottom = 0, left = 0 } = {}) {\r\n return new EdgeInsets(top, right, bottom, left);\r\n }\r\n\r\n static fromLTRB(left, top, right, bottom) {\r\n return new EdgeInsets(top, right, bottom, left);\r\n }\r\n\r\n get vertical() {\r\n return this.top + this.bottom;\r\n }\r\n\r\n get horizontal() {\r\n return this.left + this.right;\r\n }\r\n\r\n get isNonNegative() {\r\n return this.top >= 0 && this.right >= 0 && this.bottom >= 0 && this.left >= 0;\r\n }\r\n\r\n get isZero() {\r\n return this.top === 0 && this.right === 0 && this.bottom === 0 && this.left === 0;\r\n }\r\n\r\n add(other) {\r\n return new EdgeInsets(\r\n this.top + other.top,\r\n this.right + other.right,\r\n this.bottom + other.bottom,\r\n this.left + other.left\r\n );\r\n }\r\n\r\n copyWith({ top, right, bottom, left } = {}) {\r\n return new EdgeInsets(\r\n top ?? this.top,\r\n right ?? this.right,\r\n bottom ?? this.bottom,\r\n left ?? this.left\r\n );\r\n }\r\n\r\n equals(other) {\r\n if (!other || !(other instanceof EdgeInsets)) {\r\n return false;\r\n }\r\n return this.top === other.top &&\r\n this.right === other.right &&\r\n this.bottom === other.bottom &&\r\n this.left === other.left;\r\n }\r\n\r\n toCSSString() {\r\n return `${this.top}px ${this.right}px ${this.bottom}px ${this.left}px`;\r\n }\r\n\r\n toCSSShorthand() {\r\n const { top, right, bottom, left } = this;\r\n if (top === right && right === bottom && bottom === left) {\r\n return `${top}px`;\r\n }\r\n if (top === bottom && right === left) {\r\n return `${top}px ${right}px`;\r\n }\r\n return this.toCSSString();\r\n }\r\n\r\n toCSSMargin() {\r\n return this.toCSSString();\r\n }\r\n\r\n toCSSPadding() {\r\n return this.toCSSString();\r\n }\r\n\r\n toString() {\r\n return `EdgeInsets(${this.top}, ${this.right}, ${this.bottom}, ${this.left})`;\r\n }\r\n}"], - "mappings": "AAAO,MAAMA,CAAW,CACtB,YAAYC,EAAM,EAAGC,EAAQ,EAAGC,EAAS,EAAGC,EAAO,EAAG,CACpD,KAAK,IAAMH,EACX,KAAK,MAAQC,EACb,KAAK,OAASC,EACd,KAAK,KAAOC,CACd,CAEA,OAAO,MAAO,CACZ,OAAO,IAAIJ,EAAW,EAAG,EAAG,EAAG,CAAC,CAClC,CAEA,OAAO,IAAIK,EAAO,CAChB,OAAO,IAAIL,EAAWK,EAAOA,EAAOA,EAAOA,CAAK,CAClD,CAEA,OAAO,UAAU,CAAE,SAAAC,EAAW,EAAG,WAAAC,EAAa,CAAE,EAAI,CAAC,EAAG,CACtD,OAAO,IAAIP,EAAWM,EAAUC,EAAYD,EAAUC,CAAU,CAClE,CAEA,OAAO,KAAK,CAAE,IAAAN,EAAM,EAAG,MAAAC,EAAQ,EAAG,OAAAC,EAAS,EAAG,KAAAC,EAAO,CAAE,EAAI,CAAC,EAAG,CAC7D,OAAO,IAAIJ,EAAWC,EAAKC,EAAOC,EAAQC,CAAI,CAChD,CAEA,OAAO,SAASA,EAAMH,EAAKC,EAAOC,EAAQ,CACxC,OAAO,IAAIH,EAAWC,EAAKC,EAAOC,EAAQC,CAAI,CAChD,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,IAAM,KAAK,MACzB,CAEA,IAAI,YAAa,CACf,OAAO,KAAK,KAAO,KAAK,KAC1B,CAEA,IAAI,eAAgB,CAClB,OAAO,KAAK,KAAO,GAAK,KAAK,OAAS,GAAK,KAAK,QAAU,GAAK,KAAK,MAAQ,CAC9E,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,MAAQ,GAAK,KAAK,QAAU,GAAK,KAAK,SAAW,GAAK,KAAK,OAAS,CAClF,CAEA,IAAII,EAAO,CACT,OAAO,IAAIR,EACT,KAAK,IAAMQ,EAAM,IACjB,KAAK,MAAQA,EAAM,MACnB,KAAK,OAASA,EAAM,OACpB,KAAK,KAAOA,EAAM,IACpB,CACF,CAEA,SAAS,CAAE,IAAAP,EAAK,MAAAC,EAAO,OAAAC,EAAQ,KAAAC,CAAK,EAAI,CAAC,EAAG,CAC1C,OAAO,IAAIJ,EACTC,GAAO,KAAK,IACZC,GAAS,KAAK,MACdC,GAAU,KAAK,OACfC,GAAQ,KAAK,IACf,CACF,CAEA,OAAOI,EAAO,CACZ,MAAI,CAACA,GAAS,EAAEA,aAAiBR,GACxB,GAEF,KAAK,MAAQQ,EAAM,KACxB,KAAK,QAAUA,EAAM,OACrB,KAAK,SAAWA,EAAM,QACtB,KAAK,OAASA,EAAM,IACxB,CAEA,aAAc,CACZ,MAAO,GAAG,KAAK,GAAG,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,MAAM,KAAK,IAAI,IACpE,CAEA,gBAAiB,CACf,KAAM,CAAE,IAAAP,EAAK,MAAAC,EAAO,OAAAC,EAAQ,KAAAC,CAAK,EAAI,KACrC,OAAIH,IAAQC,GAASA,IAAUC,GAAUA,IAAWC,EAC3C,GAAGH,CAAG,KAEXA,IAAQE,GAAUD,IAAUE,EACvB,GAAGH,CAAG,MAAMC,CAAK,KAEnB,KAAK,YAAY,CAC1B,CAEA,aAAc,CACZ,OAAO,KAAK,YAAY,CAC1B,CAEA,cAAe,CACb,OAAO,KAAK,YAAY,CAC1B,CAEA,UAAW,CACT,MAAO,cAAc,KAAK,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,IAAI,GAC5E,CACF", - "names": ["EdgeInsets", "top", "right", "bottom", "left", "value", "vertical", "horizontal", "other"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/geometry.js b/packages/flutterjs_engine/package/material/dist/utils/geometry.js deleted file mode 100644 index 06cfdf73..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/geometry.js +++ /dev/null @@ -1,2 +0,0 @@ -class u{constructor(t=0,i=0){this._dx=t,this._dy=i}get dx(){return this._dx}get dy(){return this._dy}get isInfinite(){return this._dx>=Number.POSITIVE_INFINITY||this._dy>=Number.POSITIVE_INFINITY}get isFinite(){return Number.isFinite(this._dx)&&Number.isFinite(this._dy)}lessThan(t){return this._dxt._dx&&this._dy>t._dy}greaterThanOrEqual(t){return this._dx>=t._dx&&this._dy>=t._dy}equals(t){return!t||!(t instanceof u)?!1:this._dx===t._dx&&this._dy===t._dy}hashCode(){return this._hashCombine(this._dx,this._dy)}_hashCombine(t,i){let e=0;return e=(e<<5)-e+t,e=(e<<5)-e+i,e&e}toString(){return`${this.constructor.name}(${this._dx.toFixed(1)}, ${this._dy.toFixed(1)})`}}class h extends u{constructor(t=0,i=0){super(t,i)}get width(){return this._dx}get height(){return this._dy}static get zero(){return new h(0,0)}static get infinite(){return new h(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY)}static copy(t){return!t||!(t instanceof h)?new h:new h(t.width,t.height)}static square(t){return new h(t,t)}static fromWidth(t){return new h(t,Number.POSITIVE_INFINITY)}static fromHeight(t){return new h(Number.POSITIVE_INFINITY,t)}static fromRadius(t){return new h(t*2,t*2)}get isEmpty(){return this.width<=0||this.height<=0}get aspectRatio(){return this.height!==0?this.width/this.height:this.width>0?Number.POSITIVE_INFINITY:this.width<0?Number.NEGATIVE_INFINITY:0}get shortestSide(){return Math.min(Math.abs(this.width),Math.abs(this.height))}get longestSide(){return Math.max(Math.abs(this.width),Math.abs(this.height))}get flipped(){return new h(this.height,this.width)}topLeft(t=new n(0,0)){return t}topCenter(t=new n(0,0)){return new n(t.dx+this.width/2,t.dy)}topRight(t=new n(0,0)){return new n(t.dx+this.width,t.dy)}centerLeft(t=new n(0,0)){return new n(t.dx,t.dy+this.height/2)}center(t=new n(0,0)){return new n(t.dx+this.width/2,t.dy+this.height/2)}centerRight(t=new n(0,0)){return new n(t.dx+this.width,t.dy+this.height/2)}bottomLeft(t=new n(0,0)){return new n(t.dx,t.dy+this.height)}bottomCenter(t=new n(0,0)){return new n(t.dx+this.width/2,t.dy+this.height)}bottomRight(t=new n(0,0)){return new n(t.dx+this.width,t.dy+this.height)}contains(t){return!t||!(t instanceof n)?!1:t.dx>=0&&t.dx=0&&t.dy1)throw new Error("Parameter t must be between 0 and 1");return i==null?t==null?null:t.multiply(1-e):t==null?i.multiply(e):new h(h._lerpDouble(t.width,i.width,e),h._lerpDouble(t.height,i.height,e))}static _lerpDouble(t,i,e){return t+(i-t)*e}equals(t){return!t||!(t instanceof h)?!1:this._dx===t._dx&&this._dy===t._dy}hashCode(){return this._hashCombine(this.width,this.height)}toString(){return`Size(${this.width.toFixed(1)}, ${this.height.toFixed(1)})`}}class n extends u{constructor(t=0,i=0){super(t,i)}static get zero(){return new n(0,0)}static get infinite(){return new n(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY)}static fromDirection(t,i=1){return new n(i*Math.cos(t),i*Math.sin(t))}static lerp(t,i,e){if(typeof e!="number"||e<0||e>1)throw new Error("Parameter t must be between 0 and 1");return i==null?t==null?null:t.multiply(1-e):t==null?i.multiply(e):new n(n._lerpDouble(t.dx,i.dx,e),n._lerpDouble(t.dy,i.dy,e))}static _lerpDouble(t,i,e){return t+(i-t)*e}get distance(){return Math.sqrt(this._dx*this._dx+this._dy*this._dy)}get distanceSquared(){return this._dx*this._dx+this._dy*this._dy}get direction(){return Math.atan2(this._dy,this._dx)}add(t){if(!t||!(t instanceof n))throw new Error("Can only add Offset to Offset");return new n(this._dx+t._dx,this._dy+t._dy)}subtract(t){if(!t||!(t instanceof n))throw new Error("Can only subtract Offset from Offset");return new n(this._dx-t._dx,this._dy-t._dy)}multiply(t){if(typeof t!="number")throw new Error("Can only multiply Offset by number");return new n(this._dx*t,this._dy*t)}divide(t){if(typeof t!="number")throw new Error("Can only divide Offset by number");if(t===0)throw new Error("Division by zero");return new n(this._dx/t,this._dy/t)}floorDivide(t){if(typeof t!="number")throw new Error("Can only divide Offset by number");if(t===0)throw new Error("Division by zero");return new n(Math.floor(this._dx/t),Math.floor(this._dy/t))}modulo(t){if(typeof t!="number")throw new Error("Can only apply modulo with number");return new n(this._dx%t,this._dy%t)}scale(t,i=t){return new n(this._dx*t,this._dy*i)}rotate(t){const i=Math.cos(t),e=Math.sin(t);return new n(this._dx*i-this._dy*e,this._dx*e+this._dy*i)}translate(t=0,i=0){return new n(this._dx+t,this._dy+i)}get negate(){return new n(-this._dx,-this._dy)}equals(t){return!t||!(t instanceof n)?!1:this._dx===t._dx&&this._dy===t._dy}hashCode(){return this._hashCombine(this._dx,this._dy)}toString(){return`Offset(${this._dx.toFixed(1)}, ${this._dy.toFixed(1)})`}}class l{constructor(t=0,i=0,e=0,o=0){this.left=t,this.top=i,this.right=e,this.bottom=o}static fromLTWH(t,i,e,o){return new l(t,i,t+e,i+o)}static fromCircle(t,i){return new l(t.dx-i,t.dy-i,t.dx+i,t.dy+i)}static fromPoints(t,i){return new l(Math.min(t.dx,i.dx),Math.min(t.dy,i.dy),Math.max(t.dx,i.dx),Math.max(t.dy,i.dy))}get width(){return this.right-this.left}get height(){return this.bottom-this.top}get size(){return new h(this.width,this.height)}get topLeft(){return new n(this.left,this.top)}get bottomRight(){return new n(this.right,this.bottom)}get center(){return new n(this.left+this.width/2,this.top+this.height/2)}contains(t){return t.dx>=this.left&&t.dx=this.top&&t.dy=t.right||this.right<=t.left||this.top>=t.bottom||this.bottom<=t.top)}toString(){return`Rect.fromLTRB(${this.left.toFixed(1)}, ${this.top.toFixed(1)}, ${this.right.toFixed(1)}, ${this.bottom.toFixed(1)})`}}class r{constructor(t=0,i=0){this.x=t,this.y=i}static circular(t){return new r(t,t)}static elliptical(t,i){return new r(t,i)}static get zero(){return new r(0,0)}clamp(t={}){const{minimum:i,maximum:e}=t,o=i||r.circular(Number.NEGATIVE_INFINITY),m=e||r.circular(Number.POSITIVE_INFINITY);return new r(r._clampDouble(this.x,o.x,m.x),r._clampDouble(this.y,o.y,m.y))}clampValues(t={}){const{minimumX:i,minimumY:e,maximumX:o,maximumY:m}=t;return new r(r._clampDouble(this.x,i??Number.NEGATIVE_INFINITY,o??Number.POSITIVE_INFINITY),r._clampDouble(this.y,e??Number.NEGATIVE_INFINITY,m??Number.POSITIVE_INFINITY))}static _clampDouble(t,i,e){return te?e:t}negate(){return new r(-this.x,-this.y)}subtract(t){if(!t||!(t instanceof r))throw new Error("Can only subtract Radius from Radius");return new r(this.x-t.x,this.y-t.y)}add(t){if(!t||!(t instanceof r))throw new Error("Can only add Radius to Radius");return new r(this.x+t.x,this.y+t.y)}multiply(t){if(typeof t!="number")throw new Error("Can only multiply Radius by number");return new r(this.x*t,this.y*t)}divide(t){if(typeof t!="number")throw new Error("Can only divide Radius by number");if(t===0)throw new Error("Division by zero");return new r(this.x/t,this.y/t)}floorDivide(t){if(typeof t!="number")throw new Error("Can only divide Radius by number");if(t===0)throw new Error("Division by zero");return new r(Math.floor(this.x/t),Math.floor(this.y/t))}modulo(t){if(typeof t!="number")throw new Error("Can only apply modulo with number");return new r(this.x%t,this.y%t)}static lerp(t,i,e){if(typeof e!="number"||e<0||e>1)throw new Error("Parameter t must be between 0 and 1");if(i==null){if(t==null)return null;const o=1-e;return new r(t.x*o,t.y*o)}return t==null?new r(i.x*e,i.y*e):new r(r._lerpDouble(t.x,i.x,e),r._lerpDouble(t.y,i.y,e))}static _lerpDouble(t,i,e){return t+(i-t)*e}equals(t){return!t||!(t instanceof r)?!1:this.x===t.x&&this.y===t.y}hashCode(){let t=0;return t=(t<<5)-t+this.x,t=(t<<5)-t+this.y,t&t}toString(){return this.x===this.y?`Radius.circular(${this.x.toFixed(1)})`:`Radius.elliptical(${this.x.toFixed(1)}, ${this.y.toFixed(1)})`}}class s{constructor(t,i,e,o){this.topLeft=t||r.zero,this.topRight=i||r.zero,this.bottomRight=e||r.zero,this.bottomLeft=o||r.zero}static all(t){return t instanceof r||(t=r.circular(t)),new s(t,t,t,t)}static circular(t){const i=r.circular(t);return new s(i,i,i,i)}static vertical(t,i){return new s(t,t,i,i)}static horizontal(t,i){return new s(t,i,i,t)}static only({topLeft:t,topRight:i,bottomRight:e,bottomLeft:o}={}){return new s(t||r.zero,i||r.zero,e||r.zero,o||r.zero)}static fromBorderSide(t,i){return i instanceof r||(i=r.circular(i)),new s(i,i,i,i)}static get zero(){return new s(r.zero,r.zero,r.zero,r.zero)}get isNonNegative(){return this.topLeft.x>=0&&this.topLeft.y>=0&&this.topRight.x>=0&&this.topRight.y>=0&&this.bottomRight.x>=0&&this.bottomRight.y>=0&&this.bottomLeft.x>=0&&this.bottomLeft.y>=0}clamp(t={}){const{minimum:i,maximum:e}=t;return new s(this.topLeft.clamp({minimum:i,maximum:e}),this.topRight.clamp({minimum:i,maximum:e}),this.bottomRight.clamp({minimum:i,maximum:e}),this.bottomLeft.clamp({minimum:i,maximum:e}))}subtract(t){if(!t||!(t instanceof s))throw new Error("Can only subtract BorderRadius from BorderRadius");return new s(this.topLeft.subtract(t.topLeft),this.topRight.subtract(t.topRight),this.bottomRight.subtract(t.bottomRight),this.bottomLeft.subtract(t.bottomLeft))}add(t){if(!t||!(t instanceof s))throw new Error("Can only add BorderRadius to BorderRadius");return new s(this.topLeft.add(t.topLeft),this.topRight.add(t.topRight),this.bottomRight.add(t.bottomRight),this.bottomLeft.add(t.bottomLeft))}multiply(t){if(typeof t!="number")throw new Error("Can only multiply BorderRadius by number");return new s(this.topLeft.multiply(t),this.topRight.multiply(t),this.bottomRight.multiply(t),this.bottomLeft.multiply(t))}divide(t){if(typeof t!="number")throw new Error("Can only divide BorderRadius by number");return new s(this.topLeft.divide(t),this.topRight.divide(t),this.bottomRight.divide(t),this.bottomLeft.divide(t))}toCSSString(){return this._isUniform()?this.topLeft.x===this.topRight.x&&this.topRight.x===this.bottomRight.x&&this.bottomRight.x===this.bottomLeft.x?`${this.topLeft.x}px`:`${this.topLeft.x}px ${this.topRight.x}px ${this.bottomRight.x}px ${this.bottomLeft.x}px`:`${this.topLeft.x}px ${this.topRight.x}px ${this.bottomRight.x}px ${this.bottomLeft.x}px`}_isUniform(){return this.topLeft.x===this.topLeft.y&&this.topRight.x===this.topRight.y&&this.bottomRight.x===this.bottomRight.y&&this.bottomLeft.x===this.bottomLeft.y}static lerp(t,i,e){if(typeof e!="number"||e<0||e>1)throw new Error("Parameter t must be between 0 and 1");return i==null?t==null?null:t.multiply(1-e):t==null?i.multiply(e):new s(r.lerp(t.topLeft,i.topLeft,e),r.lerp(t.topRight,i.topRight,e),r.lerp(t.bottomRight,i.bottomRight,e),r.lerp(t.bottomLeft,i.bottomLeft,e))}equals(t){return!t||!(t instanceof s)?!1:this.topLeft.equals(t.topLeft)&&this.topRight.equals(t.topRight)&&this.bottomRight.equals(t.bottomRight)&&this.bottomLeft.equals(t.bottomLeft)}hashCode(){let t=0;return t=(t<<5)-t+this.topLeft.hashCode(),t=(t<<5)-t+this.topRight.hashCode(),t=(t<<5)-t+this.bottomRight.hashCode(),t=(t<<5)-t+this.bottomLeft.hashCode(),t&t}toString(){return this.topLeft.equals(this.topRight)&&this.topRight.equals(this.bottomRight)&&this.bottomRight.equals(this.bottomLeft)?`BorderRadius.all(${this.topLeft.toString()})`:`BorderRadius(topLeft: ${this.topLeft}, topRight: ${this.topRight}, bottomRight: ${this.bottomRight}, bottomLeft: ${this.bottomLeft})`}}export{s as BorderRadius,n as Offset,u as OffsetBase,r as Radius,l as Rect,h as Size}; -//# sourceMappingURL=geometry.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/geometry.js.map b/packages/flutterjs_engine/package/material/dist/utils/geometry.js.map deleted file mode 100644 index 53ef3eb6..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/geometry.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/geometry.js"], - "sourcesContent": ["\r\n/**\r\n * OffsetBase - Abstract base class for Size and Offset\r\n * Provides common comparison and utility operations\r\n */\r\nclass OffsetBase {\r\n constructor(dx = 0, dy = 0) {\r\n this._dx = dx;\r\n this._dy = dy;\r\n }\r\n\r\n get dx() {\r\n return this._dx;\r\n }\r\n\r\n get dy() {\r\n return this._dy;\r\n }\r\n\r\n get isInfinite() {\r\n return this._dx >= Number.POSITIVE_INFINITY || this._dy >= Number.POSITIVE_INFINITY;\r\n }\r\n\r\n get isFinite() {\r\n return Number.isFinite(this._dx) && Number.isFinite(this._dy);\r\n }\r\n\r\n // Comparison operators\r\n lessThan(other) {\r\n return this._dx < other._dx && this._dy < other._dy;\r\n }\r\n\r\n lessThanOrEqual(other) {\r\n return this._dx <= other._dx && this._dy <= other._dy;\r\n }\r\n\r\n greaterThan(other) {\r\n return this._dx > other._dx && this._dy > other._dy;\r\n }\r\n\r\n greaterThanOrEqual(other) {\r\n return this._dx >= other._dx && this._dy >= other._dy;\r\n }\r\n\r\n equals(other) {\r\n if (!other || !(other instanceof OffsetBase)) {\r\n return false;\r\n }\r\n return this._dx === other._dx && this._dy === other._dy;\r\n }\r\n\r\n hashCode() {\r\n return this._hashCombine(this._dx, this._dy);\r\n }\r\n\r\n _hashCombine(a, b) {\r\n let hash = 0;\r\n hash = ((hash << 5) - hash) + a;\r\n hash = ((hash << 5) - hash) + b;\r\n return hash & hash; // Convert to 32bit integer\r\n }\r\n\r\n toString() {\r\n return `${this.constructor.name}(${this._dx.toFixed(1)}, ${this._dy.toFixed(1)})`;\r\n }\r\n}\r\n\r\n/**\r\n * Size - Represents 2D dimensions with width and height\r\n * Extends OffsetBase for comparison operations\r\n */\r\nclass Size extends OffsetBase {\r\n constructor(width = 0, height = 0) {\r\n super(width, height);\r\n }\r\n\r\n get width() {\r\n return this._dx;\r\n }\r\n\r\n get height() {\r\n return this._dy;\r\n }\r\n\r\n // Static constants\r\n static get zero() {\r\n return new Size(0, 0);\r\n }\r\n\r\n static get infinite() {\r\n return new Size(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\r\n }\r\n\r\n // Static factory methods\r\n static copy(source) {\r\n if (!source || !(source instanceof Size)) {\r\n return new Size();\r\n }\r\n return new Size(source.width, source.height);\r\n }\r\n\r\n static square(dimension) {\r\n return new Size(dimension, dimension);\r\n }\r\n\r\n static fromWidth(width) {\r\n return new Size(width, Number.POSITIVE_INFINITY);\r\n }\r\n\r\n static fromHeight(height) {\r\n return new Size(Number.POSITIVE_INFINITY, height);\r\n }\r\n\r\n static fromRadius(radius) {\r\n return new Size(radius * 2.0, radius * 2.0);\r\n }\r\n\r\n // Properties\r\n get isEmpty() {\r\n return this.width <= 0 || this.height <= 0;\r\n }\r\n\r\n get aspectRatio() {\r\n if (this.height !== 0) {\r\n return this.width / this.height;\r\n }\r\n if (this.width > 0) {\r\n return Number.POSITIVE_INFINITY;\r\n }\r\n if (this.width < 0) {\r\n return Number.NEGATIVE_INFINITY;\r\n }\r\n return 0;\r\n }\r\n\r\n get shortestSide() {\r\n return Math.min(Math.abs(this.width), Math.abs(this.height));\r\n }\r\n\r\n get longestSide() {\r\n return Math.max(Math.abs(this.width), Math.abs(this.height));\r\n }\r\n\r\n get flipped() {\r\n return new Size(this.height, this.width);\r\n }\r\n\r\n // Point operations - returns Offset\r\n topLeft(origin = new Offset(0, 0)) {\r\n return origin;\r\n }\r\n\r\n topCenter(origin = new Offset(0, 0)) {\r\n return new Offset(origin.dx + this.width / 2.0, origin.dy);\r\n }\r\n\r\n topRight(origin = new Offset(0, 0)) {\r\n return new Offset(origin.dx + this.width, origin.dy);\r\n }\r\n\r\n centerLeft(origin = new Offset(0, 0)) {\r\n return new Offset(origin.dx, origin.dy + this.height / 2.0);\r\n }\r\n\r\n center(origin = new Offset(0, 0)) {\r\n return new Offset(origin.dx + this.width / 2.0, origin.dy + this.height / 2.0);\r\n }\r\n\r\n centerRight(origin = new Offset(0, 0)) {\r\n return new Offset(origin.dx + this.width, origin.dy + this.height / 2.0);\r\n }\r\n\r\n bottomLeft(origin = new Offset(0, 0)) {\r\n return new Offset(origin.dx, origin.dy + this.height);\r\n }\r\n\r\n bottomCenter(origin = new Offset(0, 0)) {\r\n return new Offset(origin.dx + this.width / 2.0, origin.dy + this.height);\r\n }\r\n\r\n bottomRight(origin = new Offset(0, 0)) {\r\n return new Offset(origin.dx + this.width, origin.dy + this.height);\r\n }\r\n\r\n // Point containment check\r\n contains(offset) {\r\n if (!offset || !(offset instanceof Offset)) {\r\n return false;\r\n }\r\n return (\r\n offset.dx >= 0 &&\r\n offset.dx < this.width &&\r\n offset.dy >= 0 &&\r\n offset.dy < this.height\r\n );\r\n }\r\n\r\n // Arithmetic operations\r\n subtract(other) {\r\n if (other instanceof Size) {\r\n return new Offset(this.width - other.width, this.height - other.height);\r\n }\r\n if (other instanceof Offset) {\r\n return new Size(this.width - other.dx, this.height - other.dy);\r\n }\r\n throw new Error(`Cannot subtract ${other.constructor.name} from Size`);\r\n }\r\n\r\n add(offset) {\r\n if (!offset || !(offset instanceof Offset)) {\r\n throw new Error('Can only add Offset to Size');\r\n }\r\n return new Size(this.width + offset.dx, this.height + offset.dy);\r\n }\r\n\r\n multiply(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only multiply Size by number');\r\n }\r\n return new Size(this.width * operand, this.height * operand);\r\n }\r\n\r\n divide(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only divide Size by number');\r\n }\r\n if (operand === 0) {\r\n throw new Error('Division by zero');\r\n }\r\n return new Size(this.width / operand, this.height / operand);\r\n }\r\n\r\n floorDivide(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only divide Size by number');\r\n }\r\n if (operand === 0) {\r\n throw new Error('Division by zero');\r\n }\r\n return new Size(\r\n Math.floor(this.width / operand),\r\n Math.floor(this.height / operand)\r\n );\r\n }\r\n\r\n modulo(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only apply modulo with number');\r\n }\r\n return new Size(this.width % operand, this.height % operand);\r\n }\r\n\r\n // Static interpolation\r\n static lerp(a, b, t) {\r\n if (typeof t !== 'number' || t < 0 || t > 1) {\r\n throw new Error('Parameter t must be between 0 and 1');\r\n }\r\n\r\n if (b === null || b === undefined) {\r\n if (a === null || a === undefined) {\r\n return null;\r\n }\r\n return a.multiply(1.0 - t);\r\n }\r\n\r\n if (a === null || a === undefined) {\r\n return b.multiply(t);\r\n }\r\n\r\n return new Size(\r\n Size._lerpDouble(a.width, b.width, t),\r\n Size._lerpDouble(a.height, b.height, t)\r\n );\r\n }\r\n\r\n static _lerpDouble(a, b, t) {\r\n return a + (b - a) * t;\r\n }\r\n\r\n // Equality and hashing\r\n equals(other) {\r\n if (!other || !(other instanceof Size)) {\r\n return false;\r\n }\r\n return this._dx === other._dx && this._dy === other._dy;\r\n }\r\n\r\n hashCode() {\r\n return this._hashCombine(this.width, this.height);\r\n }\r\n\r\n toString() {\r\n return `Size(${this.width.toFixed(1)}, ${this.height.toFixed(1)})`;\r\n }\r\n}\r\n\r\n/**\r\n * Offset - Represents a 2D position/displacement\r\n * Used for relative positioning in coordinate space\r\n */\r\nclass Offset extends OffsetBase {\r\n constructor(dx = 0, dy = 0) {\r\n super(dx, dy);\r\n }\r\n\r\n static get zero() {\r\n return new Offset(0, 0);\r\n }\r\n\r\n static get infinite() {\r\n return new Offset(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY);\r\n }\r\n\r\n static fromDirection(direction, distance = 1.0) {\r\n return new Offset(\r\n distance * Math.cos(direction),\r\n distance * Math.sin(direction)\r\n );\r\n }\r\n\r\n static lerp(a, b, t) {\r\n if (typeof t !== 'number' || t < 0 || t > 1) {\r\n throw new Error('Parameter t must be between 0 and 1');\r\n }\r\n\r\n if (b === null || b === undefined) {\r\n if (a === null || a === undefined) {\r\n return null;\r\n }\r\n return a.multiply(1.0 - t);\r\n }\r\n\r\n if (a === null || a === undefined) {\r\n return b.multiply(t);\r\n }\r\n\r\n return new Offset(\r\n Offset._lerpDouble(a.dx, b.dx, t),\r\n Offset._lerpDouble(a.dy, b.dy, t)\r\n );\r\n }\r\n\r\n static _lerpDouble(a, b, t) {\r\n return a + (b - a) * t;\r\n }\r\n\r\n // Properties\r\n get distance() {\r\n return Math.sqrt(this._dx * this._dx + this._dy * this._dy);\r\n }\r\n\r\n get distanceSquared() {\r\n return this._dx * this._dx + this._dy * this._dy;\r\n }\r\n\r\n get direction() {\r\n return Math.atan2(this._dy, this._dx);\r\n }\r\n\r\n // Operations\r\n add(other) {\r\n if (!other || !(other instanceof Offset)) {\r\n throw new Error('Can only add Offset to Offset');\r\n }\r\n return new Offset(this._dx + other._dx, this._dy + other._dy);\r\n }\r\n\r\n subtract(other) {\r\n if (!other || !(other instanceof Offset)) {\r\n throw new Error('Can only subtract Offset from Offset');\r\n }\r\n return new Offset(this._dx - other._dx, this._dy - other._dy);\r\n }\r\n\r\n multiply(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only multiply Offset by number');\r\n }\r\n return new Offset(this._dx * operand, this._dy * operand);\r\n }\r\n\r\n divide(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only divide Offset by number');\r\n }\r\n if (operand === 0) {\r\n throw new Error('Division by zero');\r\n }\r\n return new Offset(this._dx / operand, this._dy / operand);\r\n }\r\n\r\n floorDivide(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only divide Offset by number');\r\n }\r\n if (operand === 0) {\r\n throw new Error('Division by zero');\r\n }\r\n return new Offset(\r\n Math.floor(this._dx / operand),\r\n Math.floor(this._dy / operand)\r\n );\r\n }\r\n\r\n modulo(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only apply modulo with number');\r\n }\r\n return new Offset(this._dx % operand, this._dy % operand);\r\n }\r\n\r\n // Geometry\r\n scale(scaleX, scaleY = scaleX) {\r\n return new Offset(this._dx * scaleX, this._dy * scaleY);\r\n }\r\n\r\n rotate(angle) {\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n return new Offset(\r\n this._dx * cos - this._dy * sin,\r\n this._dx * sin + this._dy * cos\r\n );\r\n }\r\n\r\n translate(dx = 0, dy = 0) {\r\n return new Offset(this._dx + dx, this._dy + dy);\r\n }\r\n\r\n get negate() {\r\n return new Offset(-this._dx, -this._dy);\r\n }\r\n\r\n equals(other) {\r\n if (!other || !(other instanceof Offset)) {\r\n return false;\r\n }\r\n return this._dx === other._dx && this._dy === other._dy;\r\n }\r\n\r\n hashCode() {\r\n return this._hashCombine(this._dx, this._dy);\r\n }\r\n\r\n toString() {\r\n return `Offset(${this._dx.toFixed(1)}, ${this._dy.toFixed(1)})`;\r\n }\r\n}\r\n\r\n/**\r\n * Rect - Represents a rectangle with left, top, right, bottom coordinates\r\n */\r\nclass Rect {\r\n constructor(left = 0, top = 0, right = 0, bottom = 0) {\r\n this.left = left;\r\n this.top = top;\r\n this.right = right;\r\n this.bottom = bottom;\r\n }\r\n\r\n static fromLTWH(left, top, width, height) {\r\n return new Rect(left, top, left + width, top + height);\r\n }\r\n\r\n static fromCircle(center, radius) {\r\n return new Rect(\r\n center.dx - radius,\r\n center.dy - radius,\r\n center.dx + radius,\r\n center.dy + radius\r\n );\r\n }\r\n\r\n static fromPoints(a, b) {\r\n return new Rect(\r\n Math.min(a.dx, b.dx),\r\n Math.min(a.dy, b.dy),\r\n Math.max(a.dx, b.dx),\r\n Math.max(a.dy, b.dy)\r\n );\r\n }\r\n\r\n get width() {\r\n return this.right - this.left;\r\n }\r\n\r\n get height() {\r\n return this.bottom - this.top;\r\n }\r\n\r\n get size() {\r\n return new Size(this.width, this.height);\r\n }\r\n\r\n get topLeft() {\r\n return new Offset(this.left, this.top);\r\n }\r\n\r\n get bottomRight() {\r\n return new Offset(this.right, this.bottom);\r\n }\r\n\r\n get center() {\r\n return new Offset(\r\n this.left + this.width / 2,\r\n this.top + this.height / 2\r\n );\r\n }\r\n\r\n contains(offset) {\r\n return (\r\n offset.dx >= this.left &&\r\n offset.dx < this.right &&\r\n offset.dy >= this.top &&\r\n offset.dy < this.bottom\r\n );\r\n }\r\n\r\n intersects(other) {\r\n return !(\r\n this.left >= other.right ||\r\n this.right <= other.left ||\r\n this.top >= other.bottom ||\r\n this.bottom <= other.top\r\n );\r\n }\r\n\r\n toString() {\r\n return `Rect.fromLTRB(${this.left.toFixed(1)}, ${this.top.toFixed(1)}, ${this.right.toFixed(1)}, ${this.bottom.toFixed(1)})`;\r\n }\r\n}\r\n\r\n/**\r\n * Radius - Represents corner radius for rounded rectangles\r\n * Can be circular (same x and y) or elliptical (different x and y)\r\n */\r\nclass Radius {\r\n constructor(x = 0, y = 0) {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n\r\n // Static factory methods\r\n static circular(radius) {\r\n return new Radius(radius, radius);\r\n }\r\n\r\n static elliptical(x, y) {\r\n return new Radius(x, y);\r\n }\r\n\r\n static get zero() {\r\n return new Radius(0, 0);\r\n }\r\n\r\n // Clamp radius values\r\n clamp(options = {}) {\r\n const { minimum, maximum } = options;\r\n const minRadius = minimum || Radius.circular(Number.NEGATIVE_INFINITY);\r\n const maxRadius = maximum || Radius.circular(Number.POSITIVE_INFINITY);\r\n\r\n return new Radius(\r\n Radius._clampDouble(this.x, minRadius.x, maxRadius.x),\r\n Radius._clampDouble(this.y, minRadius.y, maxRadius.y)\r\n );\r\n }\r\n\r\n clampValues(options = {}) {\r\n const {\r\n minimumX,\r\n minimumY,\r\n maximumX,\r\n maximumY\r\n } = options;\r\n\r\n return new Radius(\r\n Radius._clampDouble(this.x, minimumX ?? Number.NEGATIVE_INFINITY, maximumX ?? Number.POSITIVE_INFINITY),\r\n Radius._clampDouble(this.y, minimumY ?? Number.NEGATIVE_INFINITY, maximumY ?? Number.POSITIVE_INFINITY)\r\n );\r\n }\r\n\r\n static _clampDouble(value, min, max) {\r\n if (value < min) return min;\r\n if (value > max) return max;\r\n return value;\r\n }\r\n\r\n // Unary negation\r\n negate() {\r\n return new Radius(-this.x, -this.y);\r\n }\r\n\r\n // Binary operations\r\n subtract(other) {\r\n if (!other || !(other instanceof Radius)) {\r\n throw new Error('Can only subtract Radius from Radius');\r\n }\r\n return new Radius(this.x - other.x, this.y - other.y);\r\n }\r\n\r\n add(other) {\r\n if (!other || !(other instanceof Radius)) {\r\n throw new Error('Can only add Radius to Radius');\r\n }\r\n return new Radius(this.x + other.x, this.y + other.y);\r\n }\r\n\r\n multiply(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only multiply Radius by number');\r\n }\r\n return new Radius(this.x * operand, this.y * operand);\r\n }\r\n\r\n divide(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only divide Radius by number');\r\n }\r\n if (operand === 0) {\r\n throw new Error('Division by zero');\r\n }\r\n return new Radius(this.x / operand, this.y / operand);\r\n }\r\n\r\n floorDivide(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only divide Radius by number');\r\n }\r\n if (operand === 0) {\r\n throw new Error('Division by zero');\r\n }\r\n return new Radius(\r\n Math.floor(this.x / operand),\r\n Math.floor(this.y / operand)\r\n );\r\n }\r\n\r\n modulo(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only apply modulo with number');\r\n }\r\n return new Radius(this.x % operand, this.y % operand);\r\n }\r\n\r\n // Linear interpolation\r\n static lerp(a, b, t) {\r\n if (typeof t !== 'number' || t < 0 || t > 1) {\r\n throw new Error('Parameter t must be between 0 and 1');\r\n }\r\n\r\n if (b === null || b === undefined) {\r\n if (a === null || a === undefined) {\r\n return null;\r\n }\r\n const k = 1.0 - t;\r\n return new Radius(a.x * k, a.y * k);\r\n }\r\n\r\n if (a === null || a === undefined) {\r\n return new Radius(b.x * t, b.y * t);\r\n }\r\n\r\n return new Radius(\r\n Radius._lerpDouble(a.x, b.x, t),\r\n Radius._lerpDouble(a.y, b.y, t)\r\n );\r\n }\r\n\r\n static _lerpDouble(a, b, t) {\r\n return a + (b - a) * t;\r\n }\r\n\r\n // Equality and hashing\r\n equals(other) {\r\n if (!other || !(other instanceof Radius)) {\r\n return false;\r\n }\r\n return this.x === other.x && this.y === other.y;\r\n }\r\n\r\n hashCode() {\r\n let hash = 0;\r\n hash = ((hash << 5) - hash) + this.x;\r\n hash = ((hash << 5) - hash) + this.y;\r\n return hash & hash; // Convert to 32bit integer\r\n }\r\n\r\n toString() {\r\n if (this.x === this.y) {\r\n return `Radius.circular(${this.x.toFixed(1)})`;\r\n }\r\n return `Radius.elliptical(${this.x.toFixed(1)}, ${this.y.toFixed(1)})`;\r\n }\r\n}\r\n\r\n/**\r\n * BorderRadius - Represents the radius for all four corners of a rectangle\r\n */\r\nclass BorderRadius {\r\n constructor(topLeft, topRight, bottomRight, bottomLeft) {\r\n this.topLeft = topLeft || Radius.zero;\r\n this.topRight = topRight || Radius.zero;\r\n this.bottomRight = bottomRight || Radius.zero;\r\n this.bottomLeft = bottomLeft || Radius.zero;\r\n }\r\n\r\n // Static factory methods\r\n static all(radius) {\r\n if (!(radius instanceof Radius)) {\r\n radius = Radius.circular(radius);\r\n }\r\n return new BorderRadius(radius, radius, radius, radius);\r\n }\r\n\r\n static circular(radius) {\r\n const r = Radius.circular(radius);\r\n return new BorderRadius(r, r, r, r);\r\n }\r\n\r\n static vertical(top, bottom) {\r\n return new BorderRadius(top, top, bottom, bottom);\r\n }\r\n\r\n static horizontal(left, right) {\r\n return new BorderRadius(left, right, right, left);\r\n }\r\n\r\n static only({ topLeft, topRight, bottomRight, bottomLeft } = {}) {\r\n return new BorderRadius(\r\n topLeft || Radius.zero,\r\n topRight || Radius.zero,\r\n bottomRight || Radius.zero,\r\n bottomLeft || Radius.zero\r\n );\r\n }\r\n\r\n static fromBorderSide(side, radius) {\r\n if (!(radius instanceof Radius)) {\r\n radius = Radius.circular(radius);\r\n }\r\n return new BorderRadius(radius, radius, radius, radius);\r\n }\r\n\r\n static get zero() {\r\n return new BorderRadius(Radius.zero, Radius.zero, Radius.zero, Radius.zero);\r\n }\r\n\r\n // Check if all radii are zero\r\n get isNonNegative() {\r\n return (\r\n this.topLeft.x >= 0 && this.topLeft.y >= 0 &&\r\n this.topRight.x >= 0 && this.topRight.y >= 0 &&\r\n this.bottomRight.x >= 0 && this.bottomRight.y >= 0 &&\r\n this.bottomLeft.x >= 0 && this.bottomLeft.y >= 0\r\n );\r\n }\r\n\r\n // Clamp border radius\r\n clamp(options = {}) {\r\n const { minimum, maximum } = options;\r\n return new BorderRadius(\r\n this.topLeft.clamp({ minimum, maximum }),\r\n this.topRight.clamp({ minimum, maximum }),\r\n this.bottomRight.clamp({ minimum, maximum }),\r\n this.bottomLeft.clamp({ minimum, maximum })\r\n );\r\n }\r\n\r\n // Subtract border radii\r\n subtract(other) {\r\n if (!other || !(other instanceof BorderRadius)) {\r\n throw new Error('Can only subtract BorderRadius from BorderRadius');\r\n }\r\n return new BorderRadius(\r\n this.topLeft.subtract(other.topLeft),\r\n this.topRight.subtract(other.topRight),\r\n this.bottomRight.subtract(other.bottomRight),\r\n this.bottomLeft.subtract(other.bottomLeft)\r\n );\r\n }\r\n\r\n // Add border radii\r\n add(other) {\r\n if (!other || !(other instanceof BorderRadius)) {\r\n throw new Error('Can only add BorderRadius to BorderRadius');\r\n }\r\n return new BorderRadius(\r\n this.topLeft.add(other.topLeft),\r\n this.topRight.add(other.topRight),\r\n this.bottomRight.add(other.bottomRight),\r\n this.bottomLeft.add(other.bottomLeft)\r\n );\r\n }\r\n\r\n // Scale border radius\r\n multiply(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only multiply BorderRadius by number');\r\n }\r\n return new BorderRadius(\r\n this.topLeft.multiply(operand),\r\n this.topRight.multiply(operand),\r\n this.bottomRight.multiply(operand),\r\n this.bottomLeft.multiply(operand)\r\n );\r\n }\r\n\r\n divide(operand) {\r\n if (typeof operand !== 'number') {\r\n throw new Error('Can only divide BorderRadius by number');\r\n }\r\n return new BorderRadius(\r\n this.topLeft.divide(operand),\r\n this.topRight.divide(operand),\r\n this.bottomRight.divide(operand),\r\n this.bottomLeft.divide(operand)\r\n );\r\n }\r\n\r\n // Convert to CSS border-radius string\r\n toCSSString() {\r\n // All corners different\r\n if (!this._isUniform()) {\r\n return `${this.topLeft.x}px ${this.topRight.x}px ${this.bottomRight.x}px ${this.bottomLeft.x}px`;\r\n }\r\n\r\n // Check if all corners have same value\r\n if (\r\n this.topLeft.x === this.topRight.x &&\r\n this.topRight.x === this.bottomRight.x &&\r\n this.bottomRight.x === this.bottomLeft.x\r\n ) {\r\n return `${this.topLeft.x}px`;\r\n }\r\n\r\n return `${this.topLeft.x}px ${this.topRight.x}px ${this.bottomRight.x}px ${this.bottomLeft.x}px`;\r\n }\r\n\r\n _isUniform() {\r\n return (\r\n this.topLeft.x === this.topLeft.y &&\r\n this.topRight.x === this.topRight.y &&\r\n this.bottomRight.x === this.bottomRight.y &&\r\n this.bottomLeft.x === this.bottomLeft.y\r\n );\r\n }\r\n\r\n // Linear interpolation\r\n static lerp(a, b, t) {\r\n if (typeof t !== 'number' || t < 0 || t > 1) {\r\n throw new Error('Parameter t must be between 0 and 1');\r\n }\r\n\r\n if (b === null || b === undefined) {\r\n if (a === null || a === undefined) {\r\n return null;\r\n }\r\n return a.multiply(1.0 - t);\r\n }\r\n\r\n if (a === null || a === undefined) {\r\n return b.multiply(t);\r\n }\r\n\r\n return new BorderRadius(\r\n Radius.lerp(a.topLeft, b.topLeft, t),\r\n Radius.lerp(a.topRight, b.topRight, t),\r\n Radius.lerp(a.bottomRight, b.bottomRight, t),\r\n Radius.lerp(a.bottomLeft, b.bottomLeft, t)\r\n );\r\n }\r\n\r\n // Equality and hashing\r\n equals(other) {\r\n if (!other || !(other instanceof BorderRadius)) {\r\n return false;\r\n }\r\n return (\r\n this.topLeft.equals(other.topLeft) &&\r\n this.topRight.equals(other.topRight) &&\r\n this.bottomRight.equals(other.bottomRight) &&\r\n this.bottomLeft.equals(other.bottomLeft)\r\n );\r\n }\r\n\r\n hashCode() {\r\n let hash = 0;\r\n hash = ((hash << 5) - hash) + this.topLeft.hashCode();\r\n hash = ((hash << 5) - hash) + this.topRight.hashCode();\r\n hash = ((hash << 5) - hash) + this.bottomRight.hashCode();\r\n hash = ((hash << 5) - hash) + this.bottomLeft.hashCode();\r\n return hash & hash;\r\n }\r\n\r\n toString() {\r\n if (\r\n this.topLeft.equals(this.topRight) &&\r\n this.topRight.equals(this.bottomRight) &&\r\n this.bottomRight.equals(this.bottomLeft)\r\n ) {\r\n return `BorderRadius.all(${this.topLeft.toString()})`;\r\n }\r\n return `BorderRadius(topLeft: ${this.topLeft}, topRight: ${this.topRight}, bottomRight: ${this.bottomRight}, bottomLeft: ${this.bottomLeft})`;\r\n }\r\n}\r\n\r\nexport { Size, Offset, Rect, OffsetBase, Radius, BorderRadius };"], - "mappings": "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", - "names": ["OffsetBase", "dx", "dy", "other", "a", "b", "hash", "Size", "width", "height", "source", "dimension", "radius", "origin", "Offset", "offset", "operand", "t", "direction", "distance", "scaleX", "scaleY", "angle", "cos", "sin", "Rect", "left", "top", "right", "bottom", "center", "Radius", "x", "y", "options", "minimum", "maximum", "minRadius", "maxRadius", "minimumX", "minimumY", "maximumX", "maximumY", "value", "min", "max", "k", "BorderRadius", "topLeft", "topRight", "bottomRight", "bottomLeft", "r", "side"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/input_decoration.js b/packages/flutterjs_engine/package/material/dist/utils/input_decoration.js deleted file mode 100644 index 84bd6619..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/input_decoration.js +++ /dev/null @@ -1,2 +0,0 @@ -class T{constructor({hintText:t="",labelText:e="",helperText:s="",errorText:i="",prefixIcon:l=null,suffixIcon:n=null,filled:r=!1,fillColor:h="#f5f5f5",border:o=null,enabledBorder:a=null,focusedBorder:d=null,errorBorder:u=null,contentPadding:f=null,isDense:c=!1,isCollapsed:x=!1,counterText:g="",maxLength:p=null}={}){this.hintText=t,this.labelText=e,this.helperText=s,this.errorText=i,this.prefixIcon=l,this.suffixIcon=n,this.filled=r,this.fillColor=h,this.border=o,this.enabledBorder=a,this.focusedBorder=d,this.errorBorder=u,this.contentPadding=f||EdgeInsets.symmetric({horizontal:12,vertical:8}),this.isDense=c,this.isCollapsed=x,this.counterText=g,this.maxLength=p}getContentPadding(){return this.isCollapsed?EdgeInsets.zero():this.isDense?EdgeInsets.all(8):this.contentPadding}toString(){return`InputDecoration(label: ${this.labelText}, hint: ${this.hintText})`}}export{T as InputDecoration}; -//# sourceMappingURL=input_decoration.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/input_decoration.js.map b/packages/flutterjs_engine/package/material/dist/utils/input_decoration.js.map deleted file mode 100644 index bdc8609d..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/input_decoration.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/input_decoration.js"], - "sourcesContent": ["export class InputDecoration {\r\n constructor({\r\n hintText = '',\r\n labelText = '',\r\n helperText = '',\r\n errorText = '',\r\n prefixIcon = null,\r\n suffixIcon = null,\r\n filled = false,\r\n fillColor = '#f5f5f5',\r\n border = null,\r\n enabledBorder = null,\r\n focusedBorder = null,\r\n errorBorder = null,\r\n contentPadding = null,\r\n isDense = false,\r\n isCollapsed = false,\r\n counterText = '',\r\n maxLength = null\r\n } = {}) {\r\n this.hintText = hintText;\r\n this.labelText = labelText;\r\n this.helperText = helperText;\r\n this.errorText = errorText;\r\n this.prefixIcon = prefixIcon;\r\n this.suffixIcon = suffixIcon;\r\n this.filled = filled;\r\n this.fillColor = fillColor;\r\n this.border = border;\r\n this.enabledBorder = enabledBorder;\r\n this.focusedBorder = focusedBorder;\r\n this.errorBorder = errorBorder;\r\n this.contentPadding = contentPadding || EdgeInsets.symmetric({ horizontal: 12, vertical: 8 });\r\n this.isDense = isDense;\r\n this.isCollapsed = isCollapsed;\r\n this.counterText = counterText;\r\n this.maxLength = maxLength;\r\n }\r\n\r\n getContentPadding() {\r\n if (this.isCollapsed) return EdgeInsets.zero();\r\n if (this.isDense) return EdgeInsets.all(8);\r\n return this.contentPadding;\r\n }\r\n\r\n toString() {\r\n return `InputDecoration(label: ${this.labelText}, hint: ${this.hintText})`;\r\n }\r\n}"], - "mappings": "AAAO,MAAMA,CAAgB,CAC3B,YAAY,CACV,SAAAC,EAAW,GACX,UAAAC,EAAY,GACZ,WAAAC,EAAa,GACb,UAAAC,EAAY,GACZ,WAAAC,EAAa,KACb,WAAAC,EAAa,KACb,OAAAC,EAAS,GACT,UAAAC,EAAY,UACZ,OAAAC,EAAS,KACT,cAAAC,EAAgB,KAChB,cAAAC,EAAgB,KAChB,YAAAC,EAAc,KACd,eAAAC,EAAiB,KACjB,QAAAC,EAAU,GACV,YAAAC,EAAc,GACd,YAAAC,EAAc,GACd,UAAAC,EAAY,IACd,EAAI,CAAC,EAAG,CACN,KAAK,SAAWhB,EAChB,KAAK,UAAYC,EACjB,KAAK,WAAaC,EAClB,KAAK,UAAYC,EACjB,KAAK,WAAaC,EAClB,KAAK,WAAaC,EAClB,KAAK,OAASC,EACd,KAAK,UAAYC,EACjB,KAAK,OAASC,EACd,KAAK,cAAgBC,EACrB,KAAK,cAAgBC,EACrB,KAAK,YAAcC,EACnB,KAAK,eAAiBC,GAAkB,WAAW,UAAU,CAAE,WAAY,GAAI,SAAU,CAAE,CAAC,EAC5F,KAAK,QAAUC,EACf,KAAK,YAAcC,EACnB,KAAK,YAAcC,EACnB,KAAK,UAAYC,CACnB,CAEA,mBAAoB,CAClB,OAAI,KAAK,YAAoB,WAAW,KAAK,EACzC,KAAK,QAAgB,WAAW,IAAI,CAAC,EAClC,KAAK,cACd,CAEA,UAAW,CACT,MAAO,0BAA0B,KAAK,SAAS,WAAW,KAAK,QAAQ,GACzE,CACF", - "names": ["InputDecoration", "hintText", "labelText", "helperText", "errorText", "prefixIcon", "suffixIcon", "filled", "fillColor", "border", "enabledBorder", "focusedBorder", "errorBorder", "contentPadding", "isDense", "isCollapsed", "counterText", "maxLength"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/linear_gradient.js b/packages/flutterjs_engine/package/material/dist/utils/linear_gradient.js deleted file mode 100644 index 69b3da1d..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/linear_gradient.js +++ /dev/null @@ -1,2 +0,0 @@ -import{Alignment as o}from"./property/alignment.js";class g{constructor({begin:n=o.topLeft,end:i=o.bottomRight,colors:t=[],stops:s=null}={}){this.begin=n,this.end=i,this.colors=t,this.stops=s||t.map((h,e)=>e/(t.length-1||1))}toCSSString(){const n=Math.atan2(this.end.y-this.begin.y,this.end.x-this.begin.x)*(180/Math.PI),i=this.colors.map((t,s)=>`${t} ${this.stops[s]*100}%`).join(", ");return`linear-gradient(${n}deg, ${i})`}toString(){return`LinearGradient(colors: ${this.colors.length})`}}export{g as LinearGradient}; -//# sourceMappingURL=linear_gradient.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/linear_gradient.js.map b/packages/flutterjs_engine/package/material/dist/utils/linear_gradient.js.map deleted file mode 100644 index e06e7fba..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/linear_gradient.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/linear_gradient.js"], - "sourcesContent": ["import { Alignment } from './property/alignment.js';\r\n\r\nexport class LinearGradient {\r\n constructor({\r\n begin = Alignment.topLeft,\r\n end = Alignment.bottomRight,\r\n colors = [],\r\n stops = null\r\n } = {}) {\r\n this.begin = begin;\r\n this.end = end;\r\n this.colors = colors;\r\n this.stops = stops || colors.map((_, i) => i / (colors.length - 1 || 1));\r\n }\r\n\r\n toCSSString() {\r\n const angle = Math.atan2(this.end.y - this.begin.y, this.end.x - this.begin.x) * (180 / Math.PI);\r\n const colorStops = this.colors\r\n .map((color, i) => `${color} ${this.stops[i] * 100}%`)\r\n .join(', ');\r\n return `linear-gradient(${angle}deg, ${colorStops})`;\r\n }\r\n\r\n toString() {\r\n return `LinearGradient(colors: ${this.colors.length})`;\r\n }\r\n}"], - "mappings": "AAAA,OAAS,aAAAA,MAAiB,0BAEnB,MAAMC,CAAe,CAC1B,YAAY,CACV,MAAAC,EAAQF,EAAU,QAClB,IAAAG,EAAMH,EAAU,YAChB,OAAAI,EAAS,CAAC,EACV,MAAAC,EAAQ,IACV,EAAI,CAAC,EAAG,CACN,KAAK,MAAQH,EACb,KAAK,IAAMC,EACX,KAAK,OAASC,EACd,KAAK,MAAQC,GAASD,EAAO,IAAI,CAACE,EAAGC,IAAMA,GAAKH,EAAO,OAAS,GAAK,EAAE,CACzE,CAEA,aAAc,CACZ,MAAMI,EAAQ,KAAK,MAAM,KAAK,IAAI,EAAI,KAAK,MAAM,EAAG,KAAK,IAAI,EAAI,KAAK,MAAM,CAAC,GAAK,IAAM,KAAK,IACvFC,EAAa,KAAK,OACrB,IAAI,CAACC,EAAOH,IAAM,GAAGG,CAAK,IAAI,KAAK,MAAMH,CAAC,EAAI,GAAG,GAAG,EACpD,KAAK,IAAI,EACZ,MAAO,mBAAmBC,CAAK,QAAQC,CAAU,GACnD,CAEA,UAAW,CACT,MAAO,0BAA0B,KAAK,OAAO,MAAM,GACrD,CACF", - "names": ["Alignment", "LinearGradient", "begin", "end", "colors", "stops", "_", "i", "angle", "colorStops", "color"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/motion_theme.js b/packages/flutterjs_engine/package/material/dist/utils/motion_theme.js deleted file mode 100644 index fb8e3537..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/motion_theme.js +++ /dev/null @@ -1,6 +0,0 @@ -class a{constructor({shortDuration:e=50,shortMediumDuration:r=100,mediumDuration:i=200,mediumLongDuration:t=300,longDuration:u=500,veryLongDuration:n=1e3,standardCurve:s="cubic-bezier(0.2, 0.0, 0.0, 1.0)",standardAccelerateCurve:o="cubic-bezier(0.3, 0.0, 1.0, 1.0)",standardDecelerateCurve:c="cubic-bezier(0.0, 0.0, 0.0, 1.0)",emphasizedCurve:d="cubic-bezier(0.2, 0.0, 0.0, 1.0)",emphasizedAccelerateCurve:h="cubic-bezier(0.3, 0.0, 1.0, 1.0)",emphasizedDecelerateCurve:m="cubic-bezier(0.05, 0.7, 0.1, 1.0)",legacyAccelerateCurve:l="cubic-bezier(0.4, 0.0, 1.0, 1.0)",legacyDecelerateCurve:v="cubic-bezier(0.0, 0.0, 0.2, 1.0)",easeInCurve:D="cubic-bezier(0.4, 0.0, 1.0, 1.0)",easeOutCurve:C="cubic-bezier(0.0, 0.0, 0.2, 1.0)",easeInOutCurve:p="cubic-bezier(0.4, 0.0, 0.2, 1.0)",linearCurve:g="linear",bounceInCurve:b="cubic-bezier(0.675, 0.19, 0.985, 0.16)",bounceOutCurve:z="cubic-bezier(0.015, 0.84, 0.33, 1.0)",elasticInCurve:y="cubic-bezier(0.17, 0.67, 0.83, 0.67)",elasticOutCurve:L="cubic-bezier(0.17, 0.67, 0.83, 0.67)"}={}){this.shortDuration=e,this.shortMediumDuration=r,this.mediumDuration=i,this.mediumLongDuration=t,this.longDuration=u,this.veryLongDuration=n,this.standardCurve=s,this.standardAccelerateCurve=o,this.standardDecelerateCurve=c,this.emphasizedCurve=d,this.emphasizedAccelerateCurve=h,this.emphasizedDecelerateCurve=m,this.legacyAccelerateCurve=l,this.legacyDecelerateCurve=v,this.easeInCurve=D,this.easeOutCurve=C,this.easeInOutCurve=p,this.linearCurve=g,this.bounceInCurve=b,this.bounceOutCurve=z,this.elasticInCurve=y,this.elasticOutCurve=L}getDuration(e){return this[e]??null}getCurve(e){return this[e]??null}createTransition(e,r="standardCurve",i="mediumDuration"){const t=this.getDuration(i),u=this.getCurve(r);return!t||!u?null:`${e} ${t}ms ${u}`}createTransitions(e,r="standardCurve",i="mediumDuration"){return e.map(t=>this.createTransition(t,r,i)).join(", ")}getAllDurations(){return{shortDuration:this.shortDuration,shortMediumDuration:this.shortMediumDuration,mediumDuration:this.mediumDuration,mediumLongDuration:this.mediumLongDuration,longDuration:this.longDuration,veryLongDuration:this.veryLongDuration}}getAllCurves(){return{standardCurve:this.standardCurve,standardAccelerateCurve:this.standardAccelerateCurve,standardDecelerateCurve:this.standardDecelerateCurve,emphasizedCurve:this.emphasizedCurve,emphasizedAccelerateCurve:this.emphasizedAccelerateCurve,emphasizedDecelerateCurve:this.emphasizedDecelerateCurve,legacyAccelerateCurve:this.legacyAccelerateCurve,legacyDecelerateCurve:this.legacyDecelerateCurve,easeInCurve:this.easeInCurve,easeOutCurve:this.easeOutCurve,easeInOutCurve:this.easeInOutCurve,linearCurve:this.linearCurve,bounceInCurve:this.bounceInCurve,bounceOutCurve:this.bounceOutCurve,elasticInCurve:this.elasticInCurve,elasticOutCurve:this.elasticOutCurve}}static reducedMotion(){return new a({shortDuration:0,shortMediumDuration:0,mediumDuration:0,mediumLongDuration:0,longDuration:0,veryLongDuration:0,linearCurve:"linear"})}static slower(){return new a({shortDuration:75,shortMediumDuration:150,mediumDuration:300,mediumLongDuration:450,longDuration:750,veryLongDuration:1500})}static faster(){return new a({shortDuration:25,shortMediumDuration:50,mediumDuration:100,mediumLongDuration:150,longDuration:250,veryLongDuration:500})}toCSSVariables(){let e=`:root { -`;const r=this.getAllDurations();for(const[t,u]of Object.entries(r)){const n=`--motion-duration-${t.replace(/([A-Z])/g,"-$1").toLowerCase()}`;e+=` ${n}: ${u}ms; -`}e+=` -`;const i=this.getAllCurves();for(const[t,u]of Object.entries(i)){const n=`--motion-curve-${t.replace(/([A-Z])/g,"-$1").toLowerCase()}`;e+=` ${n}: ${u}; -`}return e+="}",e}getPresets(){return{ripple:{duration:this.shortMediumDuration,curve:this.linearCurve},standardFadeIn:{duration:this.mediumDuration,curve:this.standardDecelerateCurve,properties:["opacity"]},standardFadeOut:{duration:this.mediumDuration,curve:this.standardAccelerateCurve,properties:["opacity"]},emphasizedFadeIn:{duration:this.mediumLongDuration,curve:this.emphasizedDecelerateCurve,properties:["opacity"]},slideIn:{duration:this.mediumLongDuration,curve:this.standardDecelerateCurve,properties:["transform","opacity"]},slideOut:{duration:this.mediumDuration,curve:this.standardAccelerateCurve,properties:["transform","opacity"]},scaleIn:{duration:this.mediumDuration,curve:this.emphasizedDecelerateCurve,properties:["transform","opacity"]},scaleOut:{duration:this.mediumDuration,curve:this.standardAccelerateCurve,properties:["transform","opacity"]},hoverFocus:{duration:this.shortMediumDuration,curve:this.linearCurve,properties:["background-color","box-shadow"]},dialogOpen:{duration:this.mediumLongDuration,curve:this.emphasizedDecelerateCurve,properties:["transform","opacity"]},dialogClose:{duration:this.mediumDuration,curve:this.emphasizedAccelerateCurve,properties:["transform","opacity"]}}}getPresetStyle(e){const r=this.getPresets()[e];return r?r.properties?{transition:this.createTransitions(r.properties,null,null).split(", ").map(i=>{const[t,...u]=i.split(" ");return`${t} ${r.duration}ms ${r.curve}`}).join(", ")}:{animationDuration:`${r.duration}ms`,animationTimingFunction:r.curve}:null}copyWith(e={}){return new a({shortDuration:e.shortDuration??this.shortDuration,shortMediumDuration:e.shortMediumDuration??this.shortMediumDuration,mediumDuration:e.mediumDuration??this.mediumDuration,mediumLongDuration:e.mediumLongDuration??this.mediumLongDuration,longDuration:e.longDuration??this.longDuration,veryLongDuration:e.veryLongDuration??this.veryLongDuration,...e})}merge(e){return e?this.copyWith({...e.getAllDurations(),...e.getAllCurves()}):this}static respectPreference(){return typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-reduced-motion: reduce)").matches?a.reducedMotion():new a}toString(){return"MotionTheme(durations: 6, curves: 16, presets: 10)"}}export{a as MotionTheme}; -//# sourceMappingURL=motion_theme.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/motion_theme.js.map b/packages/flutterjs_engine/package/material/dist/utils/motion_theme.js.map deleted file mode 100644 index 9ffa85fc..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/motion_theme.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/motion_theme.js"], - "sourcesContent": ["/**\r\n * Material Design 3 Motion System\r\n * Defines animation curves and durations for consistent motion\r\n * Follows Flutter Material Design 3 specification\r\n * \r\n * Flutter Reference: https://api.flutter.dev/flutter/material/AnimationDuration-class.html\r\n * https://api.flutter.dev/flutter/animation/Curves-class.html\r\n */\r\nexport class MotionTheme {\r\n constructor({\r\n // Standard Durations (milliseconds)\r\n shortDuration = 50,\r\n shortMediumDuration = 100,\r\n mediumDuration = 200,\r\n mediumLongDuration = 300,\r\n longDuration = 500,\r\n veryLongDuration = 1000,\r\n \r\n // Animation Curves\r\n standardCurve = 'cubic-bezier(0.2, 0.0, 0.0, 1.0)', // Material standard\r\n standardAccelerateCurve = 'cubic-bezier(0.3, 0.0, 1.0, 1.0)', // Accelerate\r\n standardDecelerateCurve = 'cubic-bezier(0.0, 0.0, 0.0, 1.0)', // Decelerate\r\n emphasizedCurve = 'cubic-bezier(0.2, 0.0, 0.0, 1.0)', // Emphasized\r\n emphasizedAccelerateCurve = 'cubic-bezier(0.3, 0.0, 1.0, 1.0)', // Emphasized Accelerate\r\n emphasizedDecelerateCurve = 'cubic-bezier(0.05, 0.7, 0.1, 1.0)', // Emphasized Decelerate\r\n legacyAccelerateCurve = 'cubic-bezier(0.4, 0.0, 1.0, 1.0)', // Legacy\r\n legacyDecelerateCurve = 'cubic-bezier(0.0, 0.0, 0.2, 1.0)', // Legacy\r\n easeInCurve = 'cubic-bezier(0.4, 0.0, 1.0, 1.0)',\r\n easeOutCurve = 'cubic-bezier(0.0, 0.0, 0.2, 1.0)',\r\n easeInOutCurve = 'cubic-bezier(0.4, 0.0, 0.2, 1.0)',\r\n linearCurve = 'linear',\r\n bounceInCurve = 'cubic-bezier(0.675, 0.19, 0.985, 0.16)',\r\n bounceOutCurve = 'cubic-bezier(0.015, 0.84, 0.33, 1.0)',\r\n elasticInCurve = 'cubic-bezier(0.17, 0.67, 0.83, 0.67)',\r\n elasticOutCurve = 'cubic-bezier(0.17, 0.67, 0.83, 0.67)'\r\n } = {}) {\r\n // ========== DURATIONS ==========\r\n this.shortDuration = shortDuration;\r\n this.shortMediumDuration = shortMediumDuration;\r\n this.mediumDuration = mediumDuration;\r\n this.mediumLongDuration = mediumLongDuration;\r\n this.longDuration = longDuration;\r\n this.veryLongDuration = veryLongDuration;\r\n\r\n // ========== EASING CURVES ==========\r\n this.standardCurve = standardCurve;\r\n this.standardAccelerateCurve = standardAccelerateCurve;\r\n this.standardDecelerateCurve = standardDecelerateCurve;\r\n this.emphasizedCurve = emphasizedCurve;\r\n this.emphasizedAccelerateCurve = emphasizedAccelerateCurve;\r\n this.emphasizedDecelerateCurve = emphasizedDecelerateCurve;\r\n this.legacyAccelerateCurve = legacyAccelerateCurve;\r\n this.legacyDecelerateCurve = legacyDecelerateCurve;\r\n this.easeInCurve = easeInCurve;\r\n this.easeOutCurve = easeOutCurve;\r\n this.easeInOutCurve = easeInOutCurve;\r\n this.linearCurve = linearCurve;\r\n this.bounceInCurve = bounceInCurve;\r\n this.bounceOutCurve = bounceOutCurve;\r\n this.elasticInCurve = elasticInCurve;\r\n this.elasticOutCurve = elasticOutCurve;\r\n }\r\n\r\n /**\r\n * Get duration by name\r\n * @param {string} durationName - Name of duration\r\n * @returns {number} Duration in milliseconds\r\n * \r\n * @example\r\n * const duration = theme.getDuration('mediumDuration'); // 200\r\n */\r\n getDuration(durationName) {\r\n return this[durationName] ?? null;\r\n }\r\n\r\n /**\r\n * Get easing curve by name\r\n * @param {string} curveName - Name of curve\r\n * @returns {string} CSS easing function\r\n * \r\n * @example\r\n * const curve = theme.getCurve('standardCurve');\r\n * // 'cubic-bezier(0.2, 0.0, 0.0, 1.0)'\r\n */\r\n getCurve(curveName) {\r\n return this[curveName] ?? null;\r\n }\r\n\r\n /**\r\n * Create CSS transition string\r\n * @param {string} property - CSS property to animate\r\n * @param {string} curveName - Easing curve name (default: standardCurve)\r\n * @param {string} durationName - Duration name (default: mediumDuration)\r\n * @returns {string} CSS transition string\r\n * \r\n * @example\r\n * theme.createTransition('opacity', 'standardCurve', 'mediumDuration')\r\n * // 'opacity 200ms cubic-bezier(0.2, 0.0, 0.0, 1.0)'\r\n */\r\n createTransition(property, curveName = 'standardCurve', durationName = 'mediumDuration') {\r\n const duration = this.getDuration(durationName);\r\n const curve = this.getCurve(curveName);\r\n \r\n if (!duration || !curve) return null;\r\n \r\n return `${property} ${duration}ms ${curve}`;\r\n }\r\n\r\n /**\r\n * Create multiple CSS transitions\r\n * @param {string[]} properties - CSS properties to animate\r\n * @param {string} curveName - Easing curve name\r\n * @param {string} durationName - Duration name\r\n * @returns {string} CSS transition string\r\n * \r\n * @example\r\n * theme.createTransitions(['opacity', 'transform'], 'standardCurve', 'mediumDuration')\r\n * // 'opacity 200ms cubic-bezier(...), transform 200ms cubic-bezier(...)'\r\n */\r\n createTransitions(properties, curveName = 'standardCurve', durationName = 'mediumDuration') {\r\n return properties\r\n .map(prop => this.createTransition(prop, curveName, durationName))\r\n .join(', ');\r\n }\r\n\r\n /**\r\n * Get all durations as object\r\n * @returns {Object} Duration map\r\n */\r\n getAllDurations() {\r\n return {\r\n shortDuration: this.shortDuration,\r\n shortMediumDuration: this.shortMediumDuration,\r\n mediumDuration: this.mediumDuration,\r\n mediumLongDuration: this.mediumLongDuration,\r\n longDuration: this.longDuration,\r\n veryLongDuration: this.veryLongDuration\r\n };\r\n }\r\n\r\n /**\r\n * Get all curves as object\r\n * @returns {Object} Curve map\r\n */\r\n getAllCurves() {\r\n return {\r\n standardCurve: this.standardCurve,\r\n standardAccelerateCurve: this.standardAccelerateCurve,\r\n standardDecelerateCurve: this.standardDecelerateCurve,\r\n emphasizedCurve: this.emphasizedCurve,\r\n emphasizedAccelerateCurve: this.emphasizedAccelerateCurve,\r\n emphasizedDecelerateCurve: this.emphasizedDecelerateCurve,\r\n legacyAccelerateCurve: this.legacyAccelerateCurve,\r\n legacyDecelerateCurve: this.legacyDecelerateCurve,\r\n easeInCurve: this.easeInCurve,\r\n easeOutCurve: this.easeOutCurve,\r\n easeInOutCurve: this.easeInOutCurve,\r\n linearCurve: this.linearCurve,\r\n bounceInCurve: this.bounceInCurve,\r\n bounceOutCurve: this.bounceOutCurve,\r\n elasticInCurve: this.elasticInCurve,\r\n elasticOutCurve: this.elasticOutCurve\r\n };\r\n }\r\n\r\n /**\r\n * Create reduced motion theme for accessibility\r\n * Disables most animations\r\n * @returns {MotionTheme} Reduced motion theme\r\n * \r\n * @example\r\n * const reducedMotion = MotionTheme.reducedMotion();\r\n */\r\n static reducedMotion() {\r\n return new MotionTheme({\r\n shortDuration: 0,\r\n shortMediumDuration: 0,\r\n mediumDuration: 0,\r\n mediumLongDuration: 0,\r\n longDuration: 0,\r\n veryLongDuration: 0,\r\n // Keep curves but they won't be used with 0 duration\r\n linearCurve: 'linear'\r\n });\r\n }\r\n\r\n /**\r\n * Create slower motion theme (for accessibility/preference)\r\n * Increases all animation durations by 1.5x\r\n * @returns {MotionTheme} Slower motion theme\r\n * \r\n * @example\r\n * const slower = MotionTheme.slower();\r\n */\r\n static slower() {\r\n return new MotionTheme({\r\n shortDuration: 75,\r\n shortMediumDuration: 150,\r\n mediumDuration: 300,\r\n mediumLongDuration: 450,\r\n longDuration: 750,\r\n veryLongDuration: 1500\r\n });\r\n }\r\n\r\n /**\r\n * Create faster motion theme\r\n * Decreases all animation durations by 0.5x\r\n * @returns {MotionTheme} Faster motion theme\r\n * \r\n * @example\r\n * const faster = MotionTheme.faster();\r\n */\r\n static faster() {\r\n return new MotionTheme({\r\n shortDuration: 25,\r\n shortMediumDuration: 50,\r\n mediumDuration: 100,\r\n mediumLongDuration: 150,\r\n longDuration: 250,\r\n veryLongDuration: 500\r\n });\r\n }\r\n\r\n /**\r\n * Generate CSS variables for all durations and curves\r\n * @returns {string} CSS variable declarations\r\n * \r\n * @example\r\n * const css = theme.toCSSVariables();\r\n * // Output: --motion-duration-medium: 200ms; --motion-curve-standard: ...;\r\n */\r\n toCSSVariables() {\r\n let css = ':root {\\n';\r\n \r\n // Duration variables\r\n const durations = this.getAllDurations();\r\n for (const [name, value] of Object.entries(durations)) {\r\n const cssVarName = `--motion-duration-${name.replace(/([A-Z])/g, '-$1').toLowerCase()}`;\r\n css += ` ${cssVarName}: ${value}ms;\\n`;\r\n }\r\n \r\n css += '\\n';\r\n \r\n // Curve variables\r\n const curves = this.getAllCurves();\r\n for (const [name, value] of Object.entries(curves)) {\r\n const cssVarName = `--motion-curve-${name.replace(/([A-Z])/g, '-$1').toLowerCase()}`;\r\n css += ` ${cssVarName}: ${value};\\n`;\r\n }\r\n \r\n css += '}';\r\n return css;\r\n }\r\n\r\n /**\r\n * Get predefined animation presets\r\n * @returns {Object} Animation presets for common transitions\r\n */\r\n getPresets() {\r\n return {\r\n // Fast feedback animations\r\n ripple: {\r\n duration: this.shortMediumDuration,\r\n curve: this.linearCurve\r\n },\r\n \r\n // Standard UI transitions\r\n standardFadeIn: {\r\n duration: this.mediumDuration,\r\n curve: this.standardDecelerateCurve,\r\n properties: ['opacity']\r\n },\r\n \r\n standardFadeOut: {\r\n duration: this.mediumDuration,\r\n curve: this.standardAccelerateCurve,\r\n properties: ['opacity']\r\n },\r\n \r\n // Emphasized transitions\r\n emphasizedFadeIn: {\r\n duration: this.mediumLongDuration,\r\n curve: this.emphasizedDecelerateCurve,\r\n properties: ['opacity']\r\n },\r\n \r\n // Slide animations\r\n slideIn: {\r\n duration: this.mediumLongDuration,\r\n curve: this.standardDecelerateCurve,\r\n properties: ['transform', 'opacity']\r\n },\r\n \r\n slideOut: {\r\n duration: this.mediumDuration,\r\n curve: this.standardAccelerateCurve,\r\n properties: ['transform', 'opacity']\r\n },\r\n \r\n // Scale animations\r\n scaleIn: {\r\n duration: this.mediumDuration,\r\n curve: this.emphasizedDecelerateCurve,\r\n properties: ['transform', 'opacity']\r\n },\r\n \r\n scaleOut: {\r\n duration: this.mediumDuration,\r\n curve: this.standardAccelerateCurve,\r\n properties: ['transform', 'opacity']\r\n },\r\n \r\n // Hover/interactive\r\n hoverFocus: {\r\n duration: this.shortMediumDuration,\r\n curve: this.linearCurve,\r\n properties: ['background-color', 'box-shadow']\r\n },\r\n \r\n // Dialogs\r\n dialogOpen: {\r\n duration: this.mediumLongDuration,\r\n curve: this.emphasizedDecelerateCurve,\r\n properties: ['transform', 'opacity']\r\n },\r\n \r\n dialogClose: {\r\n duration: this.mediumDuration,\r\n curve: this.emphasizedAccelerateCurve,\r\n properties: ['transform', 'opacity']\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Get preset transition CSS\r\n * @param {string} presetName - Preset name\r\n * @returns {Object} CSS properties\r\n * \r\n * @example\r\n * const style = theme.getPresetStyle('slideIn');\r\n * // { transition: 'transform 300ms ..., opacity 300ms ...' }\r\n */\r\n getPresetStyle(presetName) {\r\n const preset = this.getPresets()[presetName];\r\n if (!preset) return null;\r\n \r\n if (preset.properties) {\r\n return {\r\n transition: this.createTransitions(preset.properties, null, null)\r\n .split(', ')\r\n .map(t => {\r\n // Replace null curve with preset curve\r\n const [prop, ...rest] = t.split(' ');\r\n return `${prop} ${preset.duration}ms ${preset.curve}`;\r\n })\r\n .join(', ')\r\n };\r\n }\r\n \r\n return {\r\n animationDuration: `${preset.duration}ms`,\r\n animationTimingFunction: preset.curve\r\n };\r\n }\r\n\r\n /**\r\n * Copy theme with updated values\r\n * @param {Object} config - Config to override\r\n * @returns {MotionTheme} New theme instance\r\n */\r\n copyWith(config = {}) {\r\n return new MotionTheme({\r\n shortDuration: config.shortDuration ?? this.shortDuration,\r\n shortMediumDuration: config.shortMediumDuration ?? this.shortMediumDuration,\r\n mediumDuration: config.mediumDuration ?? this.mediumDuration,\r\n mediumLongDuration: config.mediumLongDuration ?? this.mediumLongDuration,\r\n longDuration: config.longDuration ?? this.longDuration,\r\n veryLongDuration: config.veryLongDuration ?? this.veryLongDuration,\r\n ...config\r\n });\r\n }\r\n\r\n /**\r\n * Merge with another motion theme\r\n * @param {MotionTheme} other - Theme to merge with\r\n * @returns {MotionTheme} Merged theme\r\n */\r\n merge(other) {\r\n if (!other) return this;\r\n return this.copyWith({\r\n ...other.getAllDurations(),\r\n ...other.getAllCurves()\r\n });\r\n }\r\n\r\n /**\r\n * Respect prefers-reduced-motion media query\r\n * @returns {MotionTheme} Accessible motion theme\r\n */\r\n static respectPreference() {\r\n // Check if user prefers reduced motion\r\n if (typeof window !== 'undefined' && \r\n window.matchMedia && \r\n window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\r\n return MotionTheme.reducedMotion();\r\n }\r\n return new MotionTheme();\r\n }\r\n\r\n toString() {\r\n return `MotionTheme(durations: 6, curves: 16, presets: 10)`;\r\n }\r\n}"], - "mappings": "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", - "names": ["MotionTheme", "shortDuration", "shortMediumDuration", "mediumDuration", "mediumLongDuration", "longDuration", "veryLongDuration", "standardCurve", "standardAccelerateCurve", "standardDecelerateCurve", "emphasizedCurve", "emphasizedAccelerateCurve", "emphasizedDecelerateCurve", "legacyAccelerateCurve", "legacyDecelerateCurve", "easeInCurve", "easeOutCurve", "easeInOutCurve", "linearCurve", "bounceInCurve", "bounceOutCurve", "elasticInCurve", "elasticOutCurve", "durationName", "curveName", "property", "duration", "curve", "properties", "prop", "css", "durations", "name", "value", "cssVarName", "curves", "presetName", "preset", "t", "rest", "config", "other"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/offset.js b/packages/flutterjs_engine/package/material/dist/utils/offset.js deleted file mode 100644 index 51b4c67e..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/offset.js +++ /dev/null @@ -1,2 +0,0 @@ -class n{constructor(t=0,i=0){this.dx=t,this.dy=i}static zero(){return new n(0,0)}static infinite(){return new n(1/0,1/0)}get distance(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)}translate(t,i){return new n(this.dx+t,this.dy+i)}scale(t,i=t){return new n(this.dx*t,this.dy*i)}toString(){return`Offset(${this.dx}, ${this.dy})`}}export{n as Offset}; -//# sourceMappingURL=offset.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/offset.js.map b/packages/flutterjs_engine/package/material/dist/utils/offset.js.map deleted file mode 100644 index d2ec6976..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/offset.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/utils/offset.js"], - "sourcesContent": ["\r\nexport class Offset {\r\n constructor(dx = 0, dy = 0) {\r\n this.dx = dx;\r\n this.dy = dy;\r\n }\r\n\r\n static zero() {\r\n return new Offset(0, 0);\r\n }\r\n\r\n static infinite() {\r\n return new Offset(Infinity, Infinity);\r\n }\r\n\r\n get distance() {\r\n return Math.sqrt(this.dx * this.dx + this.dy * this.dy);\r\n }\r\n\r\n translate(translateX, translateY) {\r\n return new Offset(this.dx + translateX, this.dy + translateY);\r\n }\r\n\r\n scale(scaleX, scaleY = scaleX) {\r\n return new Offset(this.dx * scaleX, this.dy * scaleY);\r\n }\r\n\r\n toString() {\r\n return `Offset(${this.dx}, ${this.dy})`;\r\n }\r\n}"], - "mappings": "AACO,MAAMA,CAAO,CAClB,YAAYC,EAAK,EAAGC,EAAK,EAAG,CAC1B,KAAK,GAAKD,EACV,KAAK,GAAKC,CACZ,CAEA,OAAO,MAAO,CACZ,OAAO,IAAIF,EAAO,EAAG,CAAC,CACxB,CAEA,OAAO,UAAW,CAChB,OAAO,IAAIA,EAAO,IAAU,GAAQ,CACtC,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,KAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,EAAE,CACxD,CAEA,UAAUG,EAAYC,EAAY,CAChC,OAAO,IAAIJ,EAAO,KAAK,GAAKG,EAAY,KAAK,GAAKC,CAAU,CAC9D,CAEA,MAAMC,EAAQC,EAASD,EAAQ,CAC7B,OAAO,IAAIL,EAAO,KAAK,GAAKK,EAAQ,KAAK,GAAKC,CAAM,CACtD,CAEA,UAAW,CACT,MAAO,UAAU,KAAK,EAAE,KAAK,KAAK,EAAE,GACtC,CACF", - "names": ["Offset", "dx", "dy", "translateX", "translateY", "scaleX", "scaleY"] -} diff --git a/packages/flutterjs_engine/package/material/dist/utils/property/alignment.js b/packages/flutterjs_engine/package/material/dist/utils/property/alignment.js deleted file mode 100644 index a139308f..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/property/alignment.js +++ /dev/null @@ -1,2 +0,0 @@ -var a=Object.defineProperty;var f=(c,t,r)=>t in c?a(c,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):c[t]=r;var o=(c,t,r)=>(f(c,typeof t!="symbol"?t+"":t,r),r);const e=class e{constructor(t=0,r=0){this.x=t,this.y=r,Object.freeze(this)}static get topLeft(){return new e(-1,-1)}static get topCenter(){return new e(0,-1)}static get topRight(){return new e(1,-1)}static get centerLeft(){return new e(-1,0)}static get center(){return new e(0,0)}static get centerRight(){return new e(1,0)}static get bottomLeft(){return new e(-1,1)}static get bottomCenter(){return new e(0,1)}static get bottomRight(){return new e(1,1)}static fromString(t){const n={"top-left":e.topLeft,"top-center":e.topCenter,"top-right":e.topRight,"center-left":e.centerLeft,center:e.center,"center-right":e.centerRight,"bottom-left":e.bottomLeft,"bottom-center":e.bottomCenter,"bottom-right":e.bottomRight}[t];if(!n)throw new Error(`Invalid alignment string: "${t}"`);return n}toString(){const t=`${this.x},${this.y}`;return{"-1,-1":"top-left","0,-1":"top-center","1,-1":"top-right","-1,0":"center-left","0,0":"center","1,0":"center-right","-1,1":"bottom-left","0,1":"bottom-center","1,1":"bottom-right"}[t]||`Alignment(${this.x}, ${this.y})`}toCSSFlex(){const t={"-1":"flex-start",0:"center",1:"flex-end"},r={"-1":"flex-start",0:"center",1:"flex-end"};return`${t[this.x]} ${r[this.y]}`}toCSSObjectPosition(){const t={"-1":"left",0:"center",1:"right"},r={"-1":"top",0:"center",1:"bottom"};return`${t[this.x]} ${r[this.y]}`}toCSSBackground(){const t={"-1":"0%",0:"50%",1:"100%"},r={"-1":"0%",0:"50%",1:"100%"};return`${t[this.x]} ${r[this.y]}`}positionElement(t,r){const n=r.getBoundingClientRect(),i=t.getBoundingClientRect(),s=(n.width-i.width)*(this.x+1)/2,h=(n.height-i.height)*(this.y+1)/2;return t.style.position="absolute",t.style.left=`${s}px`,t.style.top=`${h}px`,{left:s,top:h}}static lerp(t,r,n){return!(t instanceof e)||!(r instanceof e)?t:new e(t.x+(r.x-t.x)*n,t.y+(r.y-t.y)*n)}equals(t){return t instanceof e&&this.x===t.x&&this.y===t.y}};o(e,"topLeftStr","top-left"),o(e,"topCenterStr","top-center"),o(e,"topRightStr","top-right"),o(e,"centerLeftStr","center-left"),o(e,"centerStr","center"),o(e,"centerRightStr","center-right"),o(e,"bottomLeftStr","bottom-left"),o(e,"bottomCenterStr","bottom-center"),o(e,"bottomRightStr","bottom-right");let p=e;export{p as Alignment}; -//# sourceMappingURL=alignment.js.map diff --git a/packages/flutterjs_engine/package/material/dist/utils/property/alignment.js.map b/packages/flutterjs_engine/package/material/dist/utils/property/alignment.js.map deleted file mode 100644 index 1740605a..00000000 --- a/packages/flutterjs_engine/package/material/dist/utils/property/alignment.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../src/utils/property/alignment.js"], - "sourcesContent": ["export class Alignment {\r\n constructor(x = 0, y = 0) {\r\n this.x = x;\r\n this.y = y;\r\n Object.freeze(this); // Immutable like Flutter\r\n }\r\n\r\n // --- Flutter-style Static Getters ---\r\n static get topLeft() { return new Alignment(-1, -1); }\r\n static get topCenter() { return new Alignment(0, -1); }\r\n static get topRight() { return new Alignment(1, -1); }\r\n static get centerLeft() { return new Alignment(-1, 0); }\r\n static get center() { return new Alignment(0, 0); }\r\n static get centerRight() { return new Alignment(1, 0); }\r\n static get bottomLeft() { return new Alignment(-1, 1); }\r\n static get bottomCenter() { return new Alignment(0, 1); }\r\n static get bottomRight() { return new Alignment(1, 1); }\r\n\r\n // --- String-based Constants (CSS/JS) ---\r\n static topLeftStr = 'top-left';\r\n static topCenterStr = 'top-center';\r\n static topRightStr = 'top-right';\r\n static centerLeftStr = 'center-left';\r\n static centerStr = 'center';\r\n static centerRightStr = 'center-right';\r\n static bottomLeftStr = 'bottom-left';\r\n static bottomCenterStr = 'bottom-center';\r\n static bottomRightStr = 'bottom-right';\r\n\r\n // --- Convert String \u2192 Alignment Instance ---\r\n static fromString(str) {\r\n const map = {\r\n 'top-left': Alignment.topLeft,\r\n 'top-center': Alignment.topCenter,\r\n 'top-right': Alignment.topRight,\r\n 'center-left': Alignment.centerLeft,\r\n 'center': Alignment.center,\r\n 'center-right': Alignment.centerRight,\r\n 'bottom-left': Alignment.bottomLeft,\r\n 'bottom-center': Alignment.bottomCenter,\r\n 'bottom-right': Alignment.bottomRight,\r\n };\r\n const result = map[str];\r\n if (!result) throw new Error(`Invalid alignment string: \"${str}\"`);\r\n return result;\r\n }\r\n\r\n // --- Convert Alignment \u2192 String Shortcut ---\r\n toString() {\r\n const key = `${this.x},${this.y}`;\r\n const map = {\r\n '-1,-1': 'top-left',\r\n '0,-1': 'top-center',\r\n '1,-1': 'top-right',\r\n '-1,0': 'center-left',\r\n '0,0': 'center',\r\n '1,0': 'center-right',\r\n '-1,1': 'bottom-left',\r\n '0,1': 'bottom-center',\r\n '1,1': 'bottom-right',\r\n };\r\n return map[key] || `Alignment(${this.x}, ${this.y})`;\r\n }\r\n\r\n // --- CSS: Flexbox / Grid (align-items + justify-items) ---\r\n toCSSFlex() {\r\n const xMap = { '-1': 'flex-start', '0': 'center', '1': 'flex-end' };\r\n const yMap = { '-1': 'flex-start', '0': 'center', '1': 'flex-end' };\r\n return `${xMap[this.x]} ${yMap[this.y]}`; // e.g., \"flex-end flex-end\"\r\n }\r\n\r\n // --- CSS: object-position (for ,