Przedstawiamy Shoelace, niezależną od platformy bibliotekę UX opartą na komponentach PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Przedstawiamy Shoelace, niezależną od platformy bibliotekę UX opartą na komponentach

To jest post o sznurowadło, biblioteka komponentów autorstwa Cory LaViska, ale z niespodzianką. Definiuje wszystkie standardowe komponenty UX: tabulatory, modal, akordeony, autouzupełniania i o wiele wiele więcej. Wyglądają pięknie po wyjęciu z pudełka, są dostępne i w pełni konfigurowalne. Ale zamiast tworzyć te komponenty w React, Solid, Svelte itp., tworzy je za pomocą Komponenty sieciowe; oznacza to, że możesz ich używać z każdy Ramy.

Kilka wstępnych rzeczy

Komponenty sieciowe są świetne, ale obecnie jest kilka małych problemów, o których należy pamiętać.

React

Powiedziałem, że działają w dowolnym frameworku JavaScript, ale jak pisałem wcześniej, wsparcie Reacta dla Web Components jest obecnie biedny. Aby rozwiązać ten problem, Shoelace właściwie utworzone opakowania tylko dla Reacta.

Inną opcją, którą osobiście lubię, jest stworzenie cienkiego komponentu Reacta, który akceptuje nazwę znacznika komponentu sieciowego oraz wszystkie jego atrybuty i właściwości, a następnie wykonuje brudną robotę związaną z obsługą niedociągnięć Reacta. Mówiłem o tej opcji w poprzednim poście. Podoba mi się to rozwiązanie, ponieważ jest przeznaczone do usunięcia. Problem interoperacyjności Web Component jest obecnie rozwiązany w eksperymentalnej gałęzi Reacta, więc po dostarczeniu, każdy cienki interoperacyjny komponent Web Component, którego używasz, może zostać przeszukany i usunięty, pozostawiając Ci bezpośrednie użycie Web Component, bez żadnych opakowań Reacta.

Renderowanie po stronie serwera (SSR)

Wsparcie dla SSR jest również słabe w momencie pisania tego tekstu. Teoretycznie jest coś, co nazywa się Deklaratywny cień DOM (DSD), który umożliwiłby SSR. Ale obsługa przeglądarek jest minimalna, a w każdym razie DSD faktycznie wymaga obsługa serwera działać dobrze, co oznacza Następna, Remix, lub cokolwiek, czego akurat używasz na serwerze, będzie musiało być zdolne do specjalnej obsługi.

To powiedziawszy, istnieją inne sposoby, aby komponenty sieciowe do po prostu pracuj z aplikacją internetową, która jest z SSR z czymś takim jak Dalej. Krótka wersja jest taka, że ​​skrypty rejestrujące składniki sieci Web muszą być uruchamiane w skrypcie blokującym przed analizowaniem znaczników. Ale to już temat na inny post.

Oczywiście, jeśli budujesz jakikolwiek rodzaj SPA renderowanego przez klienta, nie jest to problemem. Z tym będziemy pracować w tym poście.

Zaczynajmy

Ponieważ chcę, aby ten post skupiał się na sznurowadle i jego naturze komponentów sieciowych, będę używał Smukły za wszystko. Ja też będę tego używał Projekt Stackblitz do demonstracji. Zbudujemy to demo razem, krok po kroku, ale możesz otworzyć tę REPL w dowolnym momencie, aby zobaczyć efekt końcowy.

Pokażę ci, jak używać sznurowadła, a co ważniejsze, jak go dostosować. Porozmawiamy o Domy cienia i które style blokują przed światem zewnętrznym (a także których nie). Porozmawiamy też o ::part Selektor CSS — który może być dla Ciebie zupełnie nowy — a nawet zobaczymy, jak Shoelace pozwala nam nadpisywać i dostosowywać różne animacje.

Jeśli po przeczytaniu tego posta stwierdzisz, że lubisz Shoelace i chcesz wypróbować to w projekcie React, radzę skorzystać opakowanie jak wspomniałem we wstępie. Umożliwi to korzystanie z dowolnego komponentu Shoelace i będzie można go całkowicie usunąć, gdy React dostarczy poprawki do komponentów sieciowych, które już mają (poszukaj tego w wersji 19).

Przedstawiamy sznurowadło

Sznurowadło ma dość szczegółowe Instrukcje Instalacji. W najprostszym przypadku możesz zrzucić i tagi do twojego dokumentu HTML i to wszystko. Jednak w przypadku każdej aplikacji produkcyjnej prawdopodobnie będziesz chciał selektywnie zaimportować tylko to, co chcesz, i są na to również instrukcje.

Po zainstalowaniu Shoelace utwórzmy składnik Svelte do renderowania niektórych treści, a następnie przejdźmy przez kroki, aby w pełni go dostosować. Aby wybrać coś dość nietrywialnego, skorzystałem z zakładek i okna dialogowego (powszechnie określanego jako modalne). Oto kilka znaczników zaczerpnięte głównie z dokumentów:


  General
  Custom
  Advanced
  Disabled

  This is the general tab panel.
  This is the custom tab panel.
  This is the advanced tab panel.
  This is a disabled tab panel.



  Hello World!
  



To renderuje kilka ładnych, stylizowanych zakładek. Podkreślenie na aktywnej karcie jest nawet ładnie animowane i przesuwa się z jednej aktywnej karty do drugiej.

Domyślne zakładki w Shoelace

Nie będę marnował Twojego czasu na przeglądanie każdego centymetra interfejsów API, które są już dobrze udokumentowane na stronie Shoelace. Zamiast tego przyjrzyjmy się, jak najlepiej współdziałać i w pełni dostosowywać te składniki sieci Web.

Interakcja z API: metody i zdarzenia

Wywoływanie metod i subskrypcja zdarzeń w składniku sieciowym może się nieco różnić od tego, do czego przywykłeś w zwykłym, wybranym frameworku, ale nie jest to zbyt skomplikowane. Zobaczmy jak.

Tabs

Składnik kart () ma show metoda, który ręcznie pokazuje konkretną kartę. Aby to nazwać, musimy uzyskać dostęp do podstawowego elementu DOM naszych zakładek. W Svelte oznacza to używanie bind:this. W React byłoby to ref. I tak dalej. Ponieważ używamy Svelte, zadeklarujmy zmienną dla naszego tabs instancja:


  let tabs;

…i zwiąż:

Teraz możemy dodać przycisk, aby to nazwać:

To ten sam pomysł na imprezy. Jest sl-tab-show wydarzenie uruchamia się, gdy pojawia się nowa karta. Moglibyśmy użyć addEventListener na nasze tabs zmienna lub możemy użyć Svelte's on:event-name skrót.

 console.log(e)}>

To działa i rejestruje obiekty zdarzeń podczas wyświetlania różnych kart.

Meta obiektu zdarzenia pokazana w DevTools.
Przedstawiamy Shoelace, niezależną od platformy bibliotekę UX opartą na komponentach

Zazwyczaj renderujemy karty i pozwalamy użytkownikowi klikać między nimi, więc ta praca zwykle nie jest nawet konieczna, ale jest tam, jeśli jej potrzebujesz. Teraz przejdźmy do interaktywnego komponentu dialog.

dialog

Komponent okna dialogowego () przyjmuje plik open prop, który kontroluje, czy okno dialogowe jest… otwarte. Zadeklarujmy to w naszym komponencie Svelte:


  let tabs;
  let open = false;

Ma też sl-hide zdarzenie, gdy okno dialogowe jest ukryte. Pomińmy nasze open podeprzeć i powiązać z hide zdarzenie, dzięki czemu możemy je zresetować, gdy użytkownik kliknie poza zawartością okna dialogowego, aby je zamknąć. Dodajmy obsługę kliknięć do tego przycisku zamykania, aby ustawić nasz open rekwizyt do false, co również zamknie okno dialogowe.

 open = false}>
  Hello World!
  

Na koniec połączmy nasz przycisk otwartego okna dialogowego:

I to jest to. Interakcja z API biblioteki komponentów jest mniej lub bardziej prosta. Jeśli to wszystko, co zrobił ten post, byłoby dość nudne.

Ale Shoelace — zbudowane z Web Components — oznacza, że ​​niektóre rzeczy, w szczególności style, będą działać nieco inaczej niż moglibyśmy być przyzwyczajeni.

Dostosuj wszystkie style!

W chwili pisania tego tekstu Shoelace jest nadal w wersji beta, a twórca rozważa zmianę niektórych domyślnych stylów, być może nawet całkowite usunięcie niektórych domyślnych, aby nie zastępowały one już stylów aplikacji hosta. Koncepcje, które omówimy, są istotne tak czy inaczej, ale nie zdziw się, jeśli niektóre ze specyfików sznurowadeł, o których wspominam, różnią się, gdy zaczniesz go używać.

Choć domyślne style Shoelace są ładne, możemy mieć własne projekty w naszej aplikacji internetowej i chcemy, aby nasze komponenty UX pasowały do ​​siebie. Zobaczmy, jak podeszlibyśmy do tego w świecie komponentów sieciowych.

Właściwie nie będziemy próbować podnieść byle co. Twórca Shoelace jest znacznie lepszym projektantem niż ja kiedykolwiek będę. Zamiast tego przyjrzymy się, jak: zmiana rzeczy, dzięki czemu możesz dostosować się do własnych aplikacji internetowych.

Szybka prezentacja Shadow DOMs

Rzuć okiem na jeden z tych nagłówków zakładek w DevTools; powinno wyglądać mniej więcej tak:

Znaczniki komponentu kart pokazane w DevTools.
Przedstawiamy Shoelace, niezależną od platformy bibliotekę UX opartą na komponentach

Nasz element tab utworzył div pojemnik z .tab i .tab--active klasa i tabindex, wyświetlając jednocześnie tekst, który wprowadziliśmy dla tej karty. Ale zauważ, że siedzi wewnątrz korzeń cienia. Pozwala to autorom komponentów sieciowych na dodawanie własnych znaczników do komponentu sieciowego, zapewniając jednocześnie miejsce na treść we dostarczać. Zwróć uwagę na element? Zasadniczo oznacza to „umieść dowolną treść wyrenderowaną przez użytkownika pomiędzy tagi komponentów sieciowych tutaj".

Więc komponent tworzy cień główny, dodaje do niego trochę zawartości, aby renderować ładnie stylizowany nagłówek karty wraz z symbolem zastępczym (), który renderuje naszą zawartość w środku.

Zamknięte style

Jednym z klasycznych, bardziej frustrujących problemów w tworzeniu stron internetowych zawsze były style kaskadowy do miejsc, w których ich nie chcemy. Możesz się obawiać, że w naszej aplikacji reguły stylu, które określają coś takiego jak div.tab kolidowałby z tymi zakładkami. Okazuje się, że to nie problem; korzenie cienia hermetyzują style. Style spoza korzenia cienia nie wpływają na to, co znajduje się wewnątrz korzenia cienia (z pewnymi wyjątkami, o których będziemy mówić) i na odwrót.

Wyjątkiem są style dziedziczne. Oczywiście nie musisz składać wniosku font-family styl dla każdego elementu w Twojej aplikacji internetowej. Zamiast tego możesz określić swój font-family raz, w dniu :root or html i niech dziedziczy wszędzie pod nim. W rzeczywistości to dziedzictwo przebije również korzeń cienia.

Niestandardowe właściwości CSS (często nazywane „zmiennymi css”) są powiązanym wyjątkiem. Shadow root może bezwzględnie odczytać właściwość CSS zdefiniowaną poza Shadow root; za chwilę stanie się to istotne.

Połączenia ::part selektor

A co ze stylami, które? nie dziedziczyć. Co jeśli chcemy dostosować coś takiego? cursor, który nie dziedziczy, na czymś wewnątrz korzenia cienia. Czy nie mamy szczęścia? Okazuje się, że nie. Jeszcze raz spójrz na powyższy obraz elementu tab i jego główny element cienia. Zwróć uwagę na part atrybut na div? To pozwala na celowanie i stylizowanie tego elementu spoza korzenia cienia za pomocą ::part selektor. Przejdziemy trochę przez przykład.

Nadrzędne style sznurowadeł

Zobaczmy każde z tych podejść w akcji. Od teraz dużo stylów Shoelace, w tym czcionek, otrzymuje wartości domyślne z niestandardowych właściwości CSS. Aby dopasować te czcionki do stylów aplikacji, zastąp odpowiednie właściwości niestandardowe. Widzieć dokumenty aby dowiedzieć się, jakich zmiennych CSS używa Shoelace, lub możesz po prostu sprawdzić style w dowolnym elemencie w DevTools.

Dziedziczenie stylów poprzez korzeń cienia

Otwórz app.css Plik w src katalog Projekt StackBlitz, w :root na dole, powinieneś zobaczyć letter-spacing: normal; deklaracja. Ponieważ letter-spacing właściwość jest dziedziczna, spróbuj ustawić nową wartość, na przykład 2px. Podczas zapisywania cała zawartość, w tym nagłówki kart zdefiniowane w katalogu głównym cienia, zostaną odpowiednio dostosowane.

Cztery poziome nagłówki zakładek z pierwszym aktywnym w kolorze niebieskim z zawartością plqceholder zawartą w panelu poniżej. Tekst jest lekko rozciągnięty z odstępami między literami.
Przedstawiamy Shoelace, niezależną od platformy bibliotekę UX opartą na komponentach

Nadpisywanie zmiennych CSS Shoelace

Połączenia komponent czyta --indicator-color Niestandardowa właściwość CSS dla podkreślenia aktywnej karty. Możemy to zmienić za pomocą podstawowego kodu CSS:

sl-tab-group {
  --indicator-color: green;
}

I tak po prostu mamy teraz zielony wskaźnik!

Cztery poziome nagłówki kart, z których pierwsza jest aktywna, z niebieskim tekstem i zielonym podkreśleniem.
Przedstawiamy Shoelace, niezależną od platformy bibliotekę UX opartą na komponentach

Odpytywanie części

W wersji Shoelace, której obecnie używam (2.0.0-beta.83), każda niewyłączona karta ma pointer kursor. Zmieńmy to na domyślny kursor dla aktywnej (wybranej) karty. Widzieliśmy już, że element dodaje a part="base" atrybut w kontenerze dla nagłówka karty. Ponadto aktualnie wybrana zakładka otrzymuje active atrybut. Wykorzystajmy te fakty, aby wskazać aktywną kartę i zmienić kursor:

sl-tab[active]::part(base) {
  cursor: default;
}

I to jest to!

Dostosowywanie animacji

Dla wisienki na metaforycznym torcie zobaczmy, jak Shoelace pozwala nam dostosować animacje. Sznurowadło wykorzystuje Interfejs API animacji internetowychi eksponuje a setDefaultAnimation API do kontrolowania sposobu, w jaki różne elementy animują ich różne interakcje. Szczegółowe informacje znajdziesz w dokumentacji, ale jako przykład możesz zmienić domyślną animację okna dialogowego Shoelace z rozwijania na zewnątrz i zmniejszania do wewnątrz na animację od góry i rozwijanie podczas ukrywania.

import { setDefaultAnimation } from "@shoelace-style/shoelace/dist/utilities/animation-registry";

setDefaultAnimation("dialog.show", {
  keyframes: [
    { opacity: 0, transform: "translate3d(0px, -20px, 0px)" },
    { opacity: 1, transform: "translate3d(0px, 0px, 0px)" },
  ],
  options: { duration: 250, easing: "cubic-bezier(0.785, 0.135, 0.150, 0.860)" },
});
setDefaultAnimation("dialog.hide", {
  keyframes: [
    { opacity: 1, transform: "translate3d(0px, 0px, 0px)" },
    { opacity: 0, transform: "translate3d(0px, 20px, 0px)" },
  ],
  options: { duration: 200, easing: "cubic-bezier(0.785, 0.135, 0.150, 0.860)" },
});

Ten kod jest w App.svelte plik. Dodaj komentarz, aby zobaczyć oryginalną, domyślną animację.

Zamykając

Shoelace to niezwykle ambitna biblioteka komponentów zbudowana za pomocą komponentów internetowych. Ponieważ Web Components są niezależne od frameworka, mogą być używane w dowolnym projekcie, z dowolnym frameworkiem. Wraz z pojawieniem się nowych frameworków, które mają niesamowitą wydajność, a także łatwość użycia, możliwość korzystania z wysokiej jakości widżetów, które nie są powiązane z żadną jedną platformą, nigdy nie była bardziej przekonująca.

Znak czasu:

Więcej z Sztuczki CSS