@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.
- package/demo/workflow-demo.html +232 -36
- package/package.json +1 -1
package/demo/workflow-demo.html
CHANGED
|
@@ -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
|
-
<
|
|
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">
|
|
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
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
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
|
|
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="
|
|
1454
|
-
<div class="
|
|
1455
|
-
<span class="
|
|
1456
|
-
<span class="
|
|
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="
|
|
1459
|
-
<div class="
|
|
1460
|
-
<span class="
|
|
1461
|
-
<span class="
|
|
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="
|
|
1464
|
-
<div class="
|
|
1465
|
-
<span class="
|
|
1466
|
-
<span class="
|
|
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="
|
|
1469
|
-
<div class="
|
|
1470
|
-
<span class="
|
|
1471
|
-
<span class="
|
|
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="
|
|
1474
|
-
<div class="
|
|
1475
|
-
<span class="
|
|
1476
|
-
<span class="
|
|
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('
|
|
2237
|
-
|
|
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('.
|
|
2240
|
-
.to('
|
|
2241
|
-
.to('#introFlow
|
|
2242
|
-
|
|
2243
|
-
.to('.
|
|
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