Getting Started
Components
Accordion Alert Alert Dialog Aspect Ratio Avatar Badge Breadcrumb Button Calendar Card Carousel Chart Checkbox Checkbox Group Collapsible Combobox Context Menu Date Picker Dialog Editor Hover Card Input Input OTP Label Menu Menu Bar Pagination Popover Progress Radio Group reCAPTCHA Select Separator Sheet Skeleton Slider Switch Table Tabs Textarea Toast Toggle Toggle Group Tooltip
Carousel
A carousel with motion and swipe built using Embla.
1
2
3
4
5
import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
import {
ScCard,
ScCardContent,
ScCarousel,
ScCarouselContainer,
ScCarouselItem,
ScCarouselItems,
ScCarouselNext,
ScCarouselPrevious,
} from '@semantic-components/ui';
import { SiArrowLeftIcon, SiArrowRightIcon } from '@semantic-icons/lucide-icons';
import { EmblaOptionsType, EmblaPluginType } from 'embla-carousel';
import Autoplay from 'embla-carousel-autoplay';
@Component({
selector: 'app-carousel-demo',
imports: [
ScCarousel,
ScCarouselContainer,
ScCarouselItems,
ScCarouselItem,
ScCarouselPrevious,
ScCarouselNext,
SiArrowLeftIcon,
SiArrowRightIcon,
ScCard,
ScCardContent,
],
template: `
<div class="w-full max-w-xs" sc-carousel-container>
<div class="w-full" [options]="options" [plugins]="plugins" sc-carousel>
<div sc-carousel-items>
@for (item of items; track $index) {
<div sc-carousel-item>
<div class="p-1">
<div sc-card>
<div class="flex aspect-square items-center justify-center p-6" sc-card-content>
<span class="text-4xl font-semibold">{{ item }}</span>
</div>
</div>
</div>
</div>
}
</div>
<button sc-carousel-previous>
<svg class="size-4" si-arrow-left-icon></svg>
<span class="sr-only">Previous slide</span>
</button>
<button sc-carousel-next>
<svg class="size-4" si-arrow-right-icon></svg>
<span class="sr-only">Next slide</span>
</button>
</div>
</div>
`,
styles: ``,
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CarouselDemo {
items = Array.from({ length: 5 }, (_, i) => i + 1);
options: EmblaOptionsType = { loop: false };
plugins: EmblaPluginType[] = [Autoplay()];
}
Size
1
2
3
4
5
import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
import {
ScCard,
ScCardContent,
ScCarousel,
ScCarouselContainer,
ScCarouselItem,
ScCarouselItems,
ScCarouselNext,
ScCarouselPrevious,
} from '@semantic-components/ui';
import { SiArrowLeftIcon, SiArrowRightIcon } from '@semantic-icons/lucide-icons';
@Component({
selector: 'app-carousel-size',
imports: [
ScCarousel,
ScCarouselContainer,
ScCarouselItems,
ScCarouselItem,
ScCarouselPrevious,
ScCarouselNext,
SiArrowLeftIcon,
SiArrowRightIcon,
ScCard,
ScCardContent,
],
template: `
<div class="w-full max-w-xs" sc-carousel-container>
<div class="w-full" sc-carousel>
<div sc-carousel-items>
@for (item of items; track $index) {
<div class="md:basis-1/2 lg:basis-1/3" sc-carousel-item>
<div class="p-1">
<div sc-card>
<div class="flex aspect-square items-center justify-center p-6" sc-card-content>
<span class="text-4xl font-semibold">{{ item }}</span>
</div>
</div>
</div>
</div>
}
</div>
<button sc-carousel-previous>
<svg class="size-4" si-arrow-left-icon></svg>
<span class="sr-only">Previous slide</span>
</button>
<button sc-carousel-next>
<svg class="size-4" si-arrow-right-icon></svg>
<span class="sr-only">Next slide</span>
</button>
</div>
</div>
`,
styles: ``,
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CarouselSize {
items = Array.from({ length: 5 }, (_, i) => i + 1);
}
Orientation
1
2
3
4
5
import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
import {
ScCard,
ScCardContent,
ScCarousel,
ScCarouselContainer,
ScCarouselItem,
ScCarouselItems,
ScCarouselNext,
ScCarouselPrevious,
} from '@semantic-components/ui';
import { SiArrowLeftIcon, SiArrowRightIcon } from '@semantic-icons/lucide-icons';
import { EmblaOptionsType } from 'embla-carousel';
@Component({
selector: 'app-carousel-orientation',
imports: [
ScCarousel,
ScCarouselContainer,
ScCarouselItems,
ScCarouselItem,
ScCarouselPrevious,
ScCarouselNext,
SiArrowLeftIcon,
SiArrowRightIcon,
ScCard,
ScCardContent,
],
template: `
<div class="w-full max-w-xs mt-10" sc-carousel-container>
<div class="w-full" [options]="options" orientation="vertical" sc-carousel>
<div class="-mt-1 h-[200px]" sc-carousel-items>
@for (item of items; track $index) {
<div class="pt-1 md:basis-1/2" sc-carousel-item>
<div class="p-1">
<div sc-card>
<div class="flex items-center justify-center p-6" sc-card-content>
<span class="text-4xl font-semibold">{{ item }}</span>
</div>
</div>
</div>
</div>
}
</div>
<button sc-carousel-previous>
<svg class="size-4" si-arrow-left-icon></svg>
<span class="sr-only">Previous slide</span>
</button>
<button sc-carousel-next>
<svg class="size-4" si-arrow-right-icon></svg>
<span class="sr-only">Next slide</span>
</button>
</div>
</div>
`,
styles: ``,
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CarouselOrientation {
items = Array.from({ length: 5 }, (_, i) => i + 1);
options: EmblaOptionsType = { align: 'start' };
}