taxforge 0.9.24__py3-none-any.whl → 0.9.26__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
aitax/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """TaxForge - AI-powered tax preparation"""
2
2
 
3
- __version__ = "0.9.24"
3
+ __version__ = "0.9.26"
aitax/aitax.py CHANGED
@@ -1264,10 +1264,93 @@ def review_page() -> rx.Component:
1264
1264
  ),
1265
1265
 
1266
1266
  width="100%",
1267
- max_width="1200px",
1267
+ max_width="1400px",
1268
1268
  margin="0 auto",
1269
1269
  padding="100px 40px 40px 40px",
1270
1270
  ),
1271
+ # Responsive layout CSS - uses MutationObserver for reliable DOM manipulation
1272
+ rx.html("""
1273
+ <style>
1274
+ .review-grid-container {
1275
+ display: grid;
1276
+ grid-template-columns: 1fr 1fr;
1277
+ gap: 24px;
1278
+ width: 100%;
1279
+ margin-bottom: 24px;
1280
+ }
1281
+ @media (max-width: 900px) {
1282
+ .review-grid-container {
1283
+ grid-template-columns: 1fr;
1284
+ }
1285
+ }
1286
+ </style>
1287
+ <script>
1288
+ (function() {
1289
+ function applyLayout() {
1290
+ // Find the review page vstack
1291
+ const vstacks = document.querySelectorAll('div');
1292
+ for (let v of vstacks) {
1293
+ // Look for the vstack that contains both Documents and Manual Entry
1294
+ const text = v.textContent || '';
1295
+ if (text.includes('Review Tax Data') &&
1296
+ text.includes('Documents') &&
1297
+ text.includes('Manual Entry') &&
1298
+ text.includes('Income')) {
1299
+
1300
+ // Find direct children that are the sections
1301
+ const children = v.children;
1302
+ let docIdx = -1, manualIdx = -1;
1303
+
1304
+ for (let i = 0; i < children.length; i++) {
1305
+ const childText = children[i].textContent || '';
1306
+ if (childText.includes('Documents') && childText.includes('Select All') && !childText.includes('Manual Entry')) {
1307
+ docIdx = i;
1308
+ }
1309
+ if (childText.includes('Manual Entry') && childText.includes('Rental Properties')) {
1310
+ manualIdx = i;
1311
+ }
1312
+ }
1313
+
1314
+ // If we found both and they're not already wrapped
1315
+ if (docIdx >= 0 && manualIdx >= 0 &&
1316
+ !children[docIdx].parentElement.classList.contains('review-grid-container')) {
1317
+
1318
+ const wrapper = document.createElement('div');
1319
+ wrapper.className = 'review-grid-container';
1320
+
1321
+ // Get references before modifying
1322
+ const docSection = children[docIdx];
1323
+ const manualSection = children[manualIdx];
1324
+
1325
+ // Insert wrapper before doc section
1326
+ v.insertBefore(wrapper, docSection);
1327
+
1328
+ // Move both sections into wrapper
1329
+ wrapper.appendChild(docSection);
1330
+ wrapper.appendChild(manualSection);
1331
+ }
1332
+ break;
1333
+ }
1334
+ }
1335
+ }
1336
+
1337
+ // Run on load and observe for changes
1338
+ if (document.readyState === 'loading') {
1339
+ document.addEventListener('DOMContentLoaded', function() {
1340
+ setTimeout(applyLayout, 100);
1341
+ });
1342
+ } else {
1343
+ setTimeout(applyLayout, 100);
1344
+ }
1345
+
1346
+ // Also observe for Reflex re-renders
1347
+ const observer = new MutationObserver(function(mutations) {
1348
+ setTimeout(applyLayout, 50);
1349
+ });
1350
+ observer.observe(document.body, { childList: true, subtree: true });
1351
+ })();
1352
+ </script>
1353
+ """),
1271
1354
  )
1272
1355
 
1273
1356
 
aitax/cli.py CHANGED
@@ -8,7 +8,7 @@ import shutil
8
8
  from pathlib import Path
9
9
 
10
10
 
11
- __version__ = "0.9.24"
11
+ __version__ = "0.9.26"
12
12
 
13
13
  RXCONFIG_CONTENT = '''"""Reflex config for TaxForge."""
14
14
  import reflex as rx
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taxforge
3
- Version: 0.9.24
3
+ Version: 0.9.26
4
4
  Summary: AI-powered tax preparation assistant
5
5
  Author: TaxForge Team
6
6
  License: MIT
@@ -0,0 +1,12 @@
1
+ aitax/__init__.py,sha256=Ie-qTJy35FiDjEHl-6KgME_oDaC8I8wtPxFMvhwHdR8,68
2
+ aitax/aitax.py,sha256=2V0wX9lm0rPoLBdb2U8utdqZLnwEMN0r1sL-h7dReHA,80076
3
+ aitax/cli.py,sha256=lVM2KP2K-pLp3BuWKggcERs1CwQO-1C0EqHrf_ssUdQ,2651
4
+ aitax/components.py,sha256=p3MQgKQr95zmO5Uu-jcgCBApuULoV_AD2SZvAGGT0dw,23855
5
+ aitax/document_extractor.py,sha256=k1mEXNp5nxM7jSLi7_okZuElu6PItrKL7K2yHRpOc6c,16130
6
+ aitax/persistence.py,sha256=m9Bel2wrgDaduNQyRxyfXRYEsw_z_83xc2oK2I94FXI,5932
7
+ aitax/state.py,sha256=D85kA3mcUUP7YuDARfstTPjSPilVv2HAKDYD3K2jIAI,47234
8
+ taxforge-0.9.26.dist-info/METADATA,sha256=mkNhOJuD3nKAUFzF89pX5afA2hu0OZoF8Kl5Aeo6JGk,4874
9
+ taxforge-0.9.26.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
10
+ taxforge-0.9.26.dist-info/entry_points.txt,sha256=2dG4U_m3yvQaVeD8LeEGm1v8szyNGQtXUZOvbwH75Gg,44
11
+ taxforge-0.9.26.dist-info/top_level.txt,sha256=H7DuLZSRzSwHT5STc7uQa0oTOsKcNYUz2Pn4a4C5Q0Y,6
12
+ taxforge-0.9.26.dist-info/RECORD,,
@@ -1,12 +0,0 @@
1
- aitax/__init__.py,sha256=PFQlZ7HU1mcQdh9Jr5vc7gjtxm9ZwoYnri359kdqLzc,68
2
- aitax/aitax.py,sha256=XXvfqcFjrnGVcsOOAJK74RkGclbByNbid3URC0QGCCg,75745
3
- aitax/cli.py,sha256=rkykM7eyC1YQ7b8vOcYK3H2LQjFhFPYlsOdy-EPR16Y,2651
4
- aitax/components.py,sha256=p3MQgKQr95zmO5Uu-jcgCBApuULoV_AD2SZvAGGT0dw,23855
5
- aitax/document_extractor.py,sha256=k1mEXNp5nxM7jSLi7_okZuElu6PItrKL7K2yHRpOc6c,16130
6
- aitax/persistence.py,sha256=m9Bel2wrgDaduNQyRxyfXRYEsw_z_83xc2oK2I94FXI,5932
7
- aitax/state.py,sha256=D85kA3mcUUP7YuDARfstTPjSPilVv2HAKDYD3K2jIAI,47234
8
- taxforge-0.9.24.dist-info/METADATA,sha256=3JKfaGcexFvKi9dGbUlpfWytgSedHSltEUXQ9I53-Lo,4874
9
- taxforge-0.9.24.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
10
- taxforge-0.9.24.dist-info/entry_points.txt,sha256=2dG4U_m3yvQaVeD8LeEGm1v8szyNGQtXUZOvbwH75Gg,44
11
- taxforge-0.9.24.dist-info/top_level.txt,sha256=H7DuLZSRzSwHT5STc7uQa0oTOsKcNYUz2Pn4a4C5Q0Y,6
12
- taxforge-0.9.24.dist-info/RECORD,,