Skip to content

Commit 8bbbcc9

Browse files
authored
Update fast-search-card.js
1 parent 0cd8049 commit 8bbbcc9

File tree

1 file changed

+48
-134
lines changed

1 file changed

+48
-134
lines changed

dist/fast-search-card.js

Lines changed: 48 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -4599,42 +4599,51 @@ class FastSearchCard extends HTMLElement {
45994599
height: 0;
46004600
pointer-events: none;
46014601
}
4602+
4603+
/* NEU: Spotlight Search Morphing */
4604+
.search-panel.morphing {
4605+
filter: url(#searchMorph);
4606+
transition: none !important;
4607+
}
46024608

4603-
/* Blob Animation Container */
4604-
.blob-container {
4609+
.search-liquid-extension {
46054610
position: absolute;
46064611
top: 0;
46074612
right: 0;
4608-
width: 400px;
4609-
height: 72px;
4613+
width: 0;
4614+
height: 100%;
4615+
background: rgba(255, 255, 255, 0.15);
4616+
backdrop-filter: blur(var(--glass-blur-amount));
4617+
border-radius: 35px;
4618+
opacity: 0;
46104619
pointer-events: none;
4611-
z-index: 5;
4612-
display: none;
4620+
will-change: transform, width, opacity;
46134621
}
46144622

4615-
.liquid-blob {
4623+
.liquid-droplet {
46164624
position: absolute;
46174625
background: rgba(255, 255, 255, 0.15);
46184626
backdrop-filter: blur(var(--glass-blur-amount));
46194627
border-radius: 50%;
46204628
opacity: 0;
46214629
will-change: transform, opacity;
4622-
}
4623-
4624-
/* Blob-spezifische Größen */
4625-
.blob-1 { width: 72px; height: 72px; }
4626-
.blob-2 { width: 72px; height: 72px; }
4627-
.blob-3 { width: 72px; height: 72px; }
4628-
.blob-4 { width: 72px; height: 72px; }
4629-
.blob-5 { width: 72px; height: 72px; }
4630+
pointer-events: none;
4631+
}
46304632

46314633
</style>
46324634

4633-
<!-- NEU: SVG Filter für Gooey Effect -->
4635+
<!-- ERSETZEN Sie den bestehenden SVG Filter mit diesem: -->
46344636
<svg class="gooey-filter">
46354637
<defs>
46364638
<filter id="categoryGooey" x="-50%" y="-50%" width="200%" height="200%">
4637-
<feGaussianBlur in="SourceGraphic" stdDeviation="8"/>
4639+
<feGaussianBlur in="SourceGraphic" stdDeviation="15"/>
4640+
<feComponentTransfer>
4641+
<feFuncA type="discrete" tableValues="0 .5 1"/>
4642+
</feComponentTransfer>
4643+
</filter>
4644+
<!-- NEU: Filter für Suchleiste Morphing -->
4645+
<filter id="searchMorph" x="-20%" y="-20%" width="140%" height="140%">
4646+
<feGaussianBlur in="SourceGraphic" stdDeviation="12"/>
46384647
<feComponentTransfer>
46394648
<feFuncA type="discrete" tableValues="0 .7 1"/>
46404649
</feComponentTransfer>
@@ -4754,6 +4763,14 @@ class FastSearchCard extends HTMLElement {
47544763

47554764
</div>
47564765

4766+
4767+
<div class="search-liquid-extension" id="liquidExtension"></div>
4768+
<div class="liquid-droplet" id="mainDroplet"></div>
4769+
<div class="liquid-droplet" id="droplet1"></div>
4770+
<div class="liquid-droplet" id="droplet2"></div>
4771+
<div class="liquid-droplet" id="droplet3"></div>
4772+
<div class="liquid-droplet" id="droplet4"></div>
4773+
47574774
<div class="results-container">
47584775
<div class="subcategories">
47594776
<div class="subcategory-chip active" data-subcategory="all">
@@ -4801,14 +4818,7 @@ class FastSearchCard extends HTMLElement {
48014818
<div class="detail-panel glass-panel">
48024819
</div>
48034820

4804-
<!-- NEU: Blob Container für Liquid Animation -->
4805-
<div class="blob-container" id="blobContainer">
4806-
<div class="liquid-blob blob-1"></div>
4807-
<div class="liquid-blob blob-2"></div>
4808-
<div class="liquid-blob blob-3"></div>
4809-
<div class="liquid-blob blob-4"></div>
4810-
<div class="liquid-blob blob-5"></div>
4811-
</div>
4821+
48124822

48134823

48144824
<div class="category-buttons">
@@ -5049,19 +5059,27 @@ class FastSearchCard extends HTMLElement {
50495059

50505060
showCategoryButtons() {
50515061
this.collapsePanel();
5052-
5053-
// NEU: Search-Wrapper auf Mobile verstecken
5062+
50545063
if (this.isMobile()) {
50555064
const searchWrapper = this.shadowRoot.querySelector('.search-panel');
50565065
if (searchWrapper) {
50575066
searchWrapper.style.display = 'none';
50585067
}
50595068
}
50605069

5070+
const categoryButtons = this.shadowRoot.querySelector('.category-buttons');
50615071
this.isMenuView = true;
5072+
categoryButtons.classList.add('visible');
50625073

5063-
// 🌊 NEUE LIQUID ANIMATION statt der alten Animation
5064-
this.startLiquidCategoryAnimation();
5074+
// ALTE ANIMATION TEMPORÄR
5075+
categoryButtons.animate([
5076+
{ opacity: 0, transform: 'translateX(20px) scale(0.9)' },
5077+
{ opacity: 1, transform: 'translateX(0) scale(1)' }
5078+
], {
5079+
duration: 400,
5080+
easing: 'cubic-bezier(0.16, 1, 0.3, 1)',
5081+
fill: 'forwards'
5082+
});
50655083
}
50665084

50675085
hideCategoryButtons() {
@@ -5076,7 +5094,7 @@ class FastSearchCard extends HTMLElement {
50765094
const categoryButtons = this.shadowRoot.querySelector('.category-buttons');
50775095
if (!this.isMenuView) return;
50785096

5079-
// 🌊 REVERSE LIQUID ANIMATION
5097+
// ZURÜCK ZUR ALTEN ANIMATION
50805098
const animation = categoryButtons.animate([
50815099
{ opacity: 1, transform: 'translateX(0) scale(1)' },
50825100
{ opacity: 0, transform: 'translateX(20px) scale(0.9)' }
@@ -5089,12 +5107,6 @@ class FastSearchCard extends HTMLElement {
50895107
animation.finished.then(() => {
50905108
categoryButtons.classList.remove('visible');
50915109
this.isMenuView = false;
5092-
5093-
// Blobs auch verstecken falls sichtbar
5094-
const blobContainer = this.shadowRoot.querySelector('#blobContainer');
5095-
if (blobContainer) {
5096-
blobContainer.style.display = 'none';
5097-
}
50985110
});
50995111
}
51005112

@@ -5123,107 +5135,9 @@ class FastSearchCard extends HTMLElement {
51235135

51245136
// 🌊 LIQUID ANIMATION METHODEN
51255137

5126-
createBlobAnimation() {
5127-
const blobContainer = this.shadowRoot.querySelector('#blobContainer');
5128-
const blobs = blobContainer.querySelectorAll('.liquid-blob');
5129-
5130-
// Alle Blobs zurücksetzen
5131-
blobs.forEach(blob => {
5132-
blob.style.opacity = '0';
5133-
blob.style.transform = 'scale(0) translateX(0px)';
5134-
});
5135-
5136-
return { blobContainer, blobs };
5137-
}
51385138

5139-
animateBlobEmergence(blobs) {
5140-
return new Promise((resolve) => {
5141-
// Schritt 1: Ersten Blob erscheinen lassen
5142-
const firstBlob = blobs[0];
5143-
firstBlob.style.display = 'block';
5144-
firstBlob.style.left = '0px';
5145-
firstBlob.style.top = '0px';
5146-
5147-
firstBlob.animate([
5148-
{ opacity: 0, transform: 'scale(0) translateX(0px)' },
5149-
{ opacity: 1, transform: 'scale(1) translateX(0px)' }
5150-
], {
5151-
duration: 300,
5152-
easing: 'cubic-bezier(0.16, 1, 0.3, 1)',
5153-
fill: 'forwards'
5154-
}).finished.then(() => {
5155-
setTimeout(resolve, 100);
5156-
});
5157-
});
5158-
}
51595139

5160-
animateBlobSegmentation(blobs) {
5161-
return new Promise((resolve) => {
5162-
// Alle 5 Blobs zu ihren finalen Positionen animieren
5163-
const positions = [
5164-
{ x: 0, y: 0 }, // devices
5165-
{ x: 84, y: 0 }, // scripts
5166-
{ x: 168, y: 0 }, // automations
5167-
{ x: 252, y: 0 }, // scenes
5168-
{ x: 336, y: 0 } // custom
5169-
];
5170-
5171-
const animations = Array.from(blobs).map((blob, index) => {
5172-
const pos = positions[index];
5173-
5174-
return blob.animate([
5175-
{
5176-
opacity: index === 0 ? 1 : 0,
5177-
transform: `scale(${index === 0 ? 1 : 0}) translateX(0px)`
5178-
},
5179-
{
5180-
opacity: 1,
5181-
transform: `scale(1) translateX(${pos.x}px)`
5182-
}
5183-
], {
5184-
duration: 400,
5185-
delay: index * 80,
5186-
easing: 'cubic-bezier(0.16, 1, 0.3, 1)',
5187-
fill: 'forwards'
5188-
});
5189-
});
5190-
5191-
Promise.all(animations.map(anim => anim.finished)).then(() => {
5192-
setTimeout(resolve, 200);
5193-
});
5194-
});
5195-
}
51965140

5197-
startLiquidCategoryAnimation() {
5198-
const { blobContainer, blobs } = this.createBlobAnimation();
5199-
5200-
// Blob-Container anzeigen
5201-
blobContainer.style.display = 'block';
5202-
5203-
// Starte Animations-Kette
5204-
this.animateBlobEmergence(blobs)
5205-
.then(() => this.animateBlobSegmentation(blobs))
5206-
.then(() => this.materialiseCategoryButtons());
5207-
}
5208-
5209-
materialiseCategoryButtons() {
5210-
const categoryButtons = this.shadowRoot.querySelector('.category-buttons');
5211-
const blobContainer = this.shadowRoot.querySelector('#blobContainer');
5212-
5213-
// Category-Buttons anzeigen und Blobs verstecken
5214-
categoryButtons.classList.add('visible');
5215-
blobContainer.style.display = 'none';
5216-
5217-
// Finale Category-Button Animation
5218-
categoryButtons.animate([
5219-
{ opacity: 0, transform: 'translateX(20px) scale(0.9)' },
5220-
{ opacity: 1, transform: 'translateX(0) scale(1)' }
5221-
], {
5222-
duration: 300,
5223-
easing: 'cubic-bezier(0.16, 1, 0.3, 1)',
5224-
fill: 'forwards'
5225-
});
5226-
}
52275141

52285142
handleSubcategorySelect(selectedChip) {
52295143
let subcategory = selectedChip.dataset.subcategory;

0 commit comments

Comments
 (0)