@hustle-together/api-dev-tools 2.0.0 → 2.0.1

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.
@@ -711,6 +711,140 @@
711
711
  font-size: 1.1rem;
712
712
  }
713
713
 
714
+ /* ============================================
715
+ HUSTLE BRAND TITLE
716
+ ============================================ */
717
+ .hustle-brand {
718
+ display: flex;
719
+ justify-content: center;
720
+ gap: 20px;
721
+ margin-bottom: 20px;
722
+ flex-wrap: wrap;
723
+ }
724
+
725
+ .hustle-word {
726
+ font-size: 4rem;
727
+ font-weight: bold;
728
+ letter-spacing: 8px;
729
+ opacity: 0;
730
+ transform: translateY(30px);
731
+ }
732
+
733
+ .hustle-highlight {
734
+ color: var(--accent-red);
735
+ text-shadow: 0 0 30px var(--accent-red-glow), 0 0 60px var(--accent-red-glow);
736
+ }
737
+
738
+ .text-red {
739
+ color: var(--accent-red);
740
+ }
741
+
742
+ /* ============================================
743
+ PHASE FLOW - LIGHTING UP SEQUENCE
744
+ ============================================ */
745
+ .phase-flow {
746
+ display: flex;
747
+ align-items: center;
748
+ justify-content: center;
749
+ gap: 15px;
750
+ margin-top: 50px;
751
+ flex-wrap: wrap;
752
+ opacity: 0;
753
+ }
754
+
755
+ .phase-node {
756
+ position: relative;
757
+ border: 2px solid var(--dark-grey);
758
+ padding: 20px 25px;
759
+ text-align: center;
760
+ min-width: 100px;
761
+ transition: all 0.4s ease;
762
+ opacity: 0;
763
+ transform: translateY(20px);
764
+ }
765
+
766
+ .phase-node .phase-glow {
767
+ position: absolute;
768
+ top: -2px;
769
+ left: -2px;
770
+ right: -2px;
771
+ bottom: -2px;
772
+ border: 2px solid var(--accent-red);
773
+ opacity: 0;
774
+ box-shadow: 0 0 20px var(--accent-red-glow), inset 0 0 20px var(--accent-red-glow);
775
+ transition: opacity 0.4s ease;
776
+ }
777
+
778
+ .phase-node.active {
779
+ border-color: var(--accent-red);
780
+ background: rgba(186, 12, 47, 0.1);
781
+ }
782
+
783
+ .phase-node.active .phase-glow {
784
+ opacity: 1;
785
+ }
786
+
787
+ .phase-node.active .phase-icon {
788
+ color: var(--accent-red);
789
+ text-shadow: 0 0 10px var(--accent-red);
790
+ }
791
+
792
+ .phase-node.active .phase-label {
793
+ color: var(--white);
794
+ }
795
+
796
+ .phase-icon {
797
+ display: block;
798
+ font-size: 1.8rem;
799
+ font-weight: bold;
800
+ margin-bottom: 8px;
801
+ color: var(--grey);
802
+ transition: all 0.4s ease;
803
+ }
804
+
805
+ .phase-label {
806
+ font-size: 0.7rem;
807
+ text-transform: uppercase;
808
+ letter-spacing: 2px;
809
+ color: var(--dark-grey);
810
+ transition: all 0.4s ease;
811
+ }
812
+
813
+ .phase-connector-arrow {
814
+ color: var(--dark-grey);
815
+ font-size: 1.5rem;
816
+ opacity: 0;
817
+ transition: all 0.3s ease;
818
+ }
819
+
820
+ .phase-connector-arrow.active {
821
+ color: var(--accent-red);
822
+ text-shadow: 0 0 10px var(--accent-red-glow);
823
+ }
824
+
825
+ @media (max-width: 768px) {
826
+ .hustle-word {
827
+ font-size: 2.5rem;
828
+ letter-spacing: 4px;
829
+ }
830
+ .hustle-brand {
831
+ gap: 10px;
832
+ }
833
+ .phase-flow {
834
+ gap: 10px;
835
+ }
836
+ .phase-node {
837
+ padding: 15px 18px;
838
+ min-width: 70px;
839
+ }
840
+ .phase-icon {
841
+ font-size: 1.4rem;
842
+ }
843
+ .phase-connector-arrow {
844
+ font-size: 1rem;
845
+ }
846
+ }
847
+
714
848
  .intro-text {
715
849
  max-width: 700px;
716
850
  margin: 40px auto 0;
@@ -1432,48 +1566,56 @@
1432
1566
  ============================================ -->
1433
1567
  <section id="intro">
1434
1568
  <div class="ascii-border">
1435
- <h1 id="titleText">INTERVIEW-DRIVEN API DEVELOPMENT</h1>
1569
+ <div class="hustle-brand" id="hustleBrand">
1570
+ <span class="hustle-word">HUSTLE</span>
1571
+ <span class="hustle-word hustle-highlight">DEV</span>
1572
+ <span class="hustle-word">TOOLS</span>
1573
+ </div>
1436
1574
  <div class="package-name" id="packageName">@hustle-together/api-dev-tools</div>
1437
- <div class="version" id="versionText">v1.9.0</div>
1575
+ <div class="version" id="versionText">v2.0.0</div>
1438
1576
  <p class="tagline">"Interview first, test first, document always"<span class="cursor"></span></p>
1439
1577
 
1440
1578
  <div class="intro-text">
1441
1579
  <p>
1442
- This tool helps you build APIs the right way by <strong>enforcing a structured workflow</strong>.
1443
- Instead of letting AI assistants jump straight to code, it ensures they first research,
1444
- then ask YOU questions with <strong>multiple-choice options</strong> based on what they found.
1580
+ Build APIs the <span class="text-red">right way</span> with <strong>enforced workflows</strong>.
1581
+ No more AI shortcuts. Research first, then structured interviews with
1582
+ <strong>multiple-choice options</strong> based on real findings.
1445
1583
  </p>
1446
1584
  <p style="margin-top: 20px;">
1447
- <strong>Scroll down</strong> to see how it works, step by step, using a real example:
1448
- creating a <strong>Brandfetch API endpoint</strong> from scratch.
1585
+ <strong>Scroll down</strong> to see the 5-phase workflow in action.
1449
1586
  </p>
1450
1587
  </div>
1451
1588
 
1452
- <!-- Visual Quick Overview -->
1453
- <div class="data-flow" style="margin-top: 40px; opacity: 0;" id="introFlow">
1454
- <div class="data-node glow-border">
1455
- <span class="data-node-icon">[R]</span>
1456
- <span class="data-node-label">Research</span>
1589
+ <!-- Visual Quick Overview - Phases Light Up -->
1590
+ <div class="phase-flow" id="introFlow">
1591
+ <div class="phase-node" data-phase="research">
1592
+ <span class="phase-icon">R</span>
1593
+ <span class="phase-label">Research</span>
1594
+ <div class="phase-glow"></div>
1457
1595
  </div>
1458
- <span class="data-arrow">→</span>
1459
- <div class="data-node glow-border">
1460
- <span class="data-node-icon">[?]</span>
1461
- <span class="data-node-label">Interview</span>
1596
+ <span class="phase-connector-arrow">→</span>
1597
+ <div class="phase-node" data-phase="interview">
1598
+ <span class="phase-icon">?</span>
1599
+ <span class="phase-label">Interview</span>
1600
+ <div class="phase-glow"></div>
1462
1601
  </div>
1463
- <span class="data-arrow">→</span>
1464
- <div class="data-node glow-border">
1465
- <span class="data-node-icon">[T]</span>
1466
- <span class="data-node-label">Test</span>
1602
+ <span class="phase-connector-arrow">→</span>
1603
+ <div class="phase-node" data-phase="test">
1604
+ <span class="phase-icon">T</span>
1605
+ <span class="phase-label">Test</span>
1606
+ <div class="phase-glow"></div>
1467
1607
  </div>
1468
- <span class="data-arrow">→</span>
1469
- <div class="data-node glow-border">
1470
- <span class="data-node-icon">[C]</span>
1471
- <span class="data-node-label">Code</span>
1608
+ <span class="phase-connector-arrow">→</span>
1609
+ <div class="phase-node" data-phase="code">
1610
+ <span class="phase-icon">C</span>
1611
+ <span class="phase-label">Code</span>
1612
+ <div class="phase-glow"></div>
1472
1613
  </div>
1473
- <span class="data-arrow">→</span>
1474
- <div class="data-node glow-border">
1475
- <span class="data-node-icon">[D]</span>
1476
- <span class="data-node-label">Docs</span>
1614
+ <span class="phase-connector-arrow">→</span>
1615
+ <div class="phase-node" data-phase="docs">
1616
+ <span class="phase-icon">D</span>
1617
+ <span class="phase-label">Docs</span>
1618
+ <div class="phase-glow"></div>
1477
1619
  </div>
1478
1620
  </div>
1479
1621
 
@@ -2222,7 +2364,7 @@
2222
2364
  });
2223
2365
 
2224
2366
  // ============================================
2225
- // SECTION 1: INTRO ANIMATION
2367
+ // SECTION 1: INTRO ANIMATION - HUSTLE BRAND + PHASE LIGHTING
2226
2368
  // ============================================
2227
2369
  const introTL = gsap.timeline({
2228
2370
  scrollTrigger: {
@@ -2232,15 +2374,69 @@
2232
2374
  }
2233
2375
  });
2234
2376
 
2377
+ // Hustle brand title animation
2235
2378
  introTL
2236
- .to('#intro h1', { opacity: 1, duration: 0.6 })
2237
- .to('#packageName', { opacity: 1, duration: 0.5 }, '-=0.3')
2379
+ .to('.hustle-word', {
2380
+ opacity: 1,
2381
+ y: 0,
2382
+ duration: 0.5,
2383
+ stagger: 0.15,
2384
+ ease: 'back.out(1.7)'
2385
+ })
2386
+ .to('#packageName', { opacity: 1, duration: 0.4 }, '-=0.2')
2238
2387
  .to('#versionText', { opacity: 1, duration: 0.3 })
2239
- .to('.intro-text', { opacity: 1, duration: 0.6 }, '-=0.2')
2240
- .to('#introFlow', { opacity: 1, duration: 0.6 })
2241
- .to('#introFlow .data-node', { opacity: 1, y: 0, stagger: 0.15, duration: 0.4 }, '-=0.3')
2242
- .to('#introFlow .data-arrow', { opacity: 1, stagger: 0.1, duration: 0.2 }, '-=0.5')
2243
- .to('.scroll-hint', { opacity: 1, duration: 0.4 });
2388
+ .to('.tagline', { opacity: 1, duration: 0.4 })
2389
+ .to('.intro-text', { opacity: 1, duration: 0.5 }, '-=0.2')
2390
+ .to('#introFlow', { opacity: 1, duration: 0.3 })
2391
+ // Phase nodes appear one by one
2392
+ .to('#introFlow .phase-node', {
2393
+ opacity: 1,
2394
+ y: 0,
2395
+ duration: 0.3,
2396
+ stagger: 0.12,
2397
+ ease: 'power2.out'
2398
+ })
2399
+ // Arrows appear between nodes
2400
+ .to('#introFlow .phase-connector-arrow', {
2401
+ opacity: 1,
2402
+ duration: 0.2,
2403
+ stagger: 0.1
2404
+ }, '-=0.4')
2405
+ .to('.scroll-hint', { opacity: 1, duration: 0.4 }, '-=0.2');
2406
+
2407
+ // Phase lighting sequence - lights up each phase with red glow
2408
+ const phaseNodes = document.querySelectorAll('#introFlow .phase-node');
2409
+ const phaseArrows = document.querySelectorAll('#introFlow .phase-connector-arrow');
2410
+
2411
+ // Create a separate timeline for the lighting sequence that loops
2412
+ const lightingTL = gsap.timeline({
2413
+ repeat: -1,
2414
+ repeatDelay: 1,
2415
+ delay: 3 // Wait for intro animation to complete
2416
+ });
2417
+
2418
+ phaseNodes.forEach((node, i) => {
2419
+ lightingTL
2420
+ .call(() => {
2421
+ // Light up current node
2422
+ node.classList.add('active');
2423
+ // Light up the arrow before this node (if any)
2424
+ if (i > 0 && phaseArrows[i-1]) {
2425
+ phaseArrows[i-1].classList.add('active');
2426
+ }
2427
+ })
2428
+ .to({}, { duration: 0.5 }); // Pause to show the lit state
2429
+ });
2430
+
2431
+ // Keep all lit for a moment, then reset
2432
+ lightingTL
2433
+ .to({}, { duration: 1.5 })
2434
+ .call(() => {
2435
+ // Reset all
2436
+ phaseNodes.forEach(node => node.classList.remove('active'));
2437
+ phaseArrows.forEach(arrow => arrow.classList.remove('active'));
2438
+ })
2439
+ .to({}, { duration: 0.5 }); // Brief pause before restart
2244
2440
 
2245
2441
  // ============================================
2246
2442
  // SECTION 2: PROBLEMS ANIMATION
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hustle-together/api-dev-tools",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Interview-driven API development workflow for Claude Code - Automates research, testing, and documentation",
5
5
  "main": "bin/cli.js",
6
6
  "bin": {