@@ -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