accomadesc
v0.4.5
Published
A collection of Svelte 5 components used throughout Accomade products and websites. Provides reusable UI components for accommodation listings including calendars, pricing displays, photo galleries, booking forms, and more.
Readme
accomadesc (Accomade Svelte Components)
A collection of Svelte 5 components used throughout Accomade products and websites. Provides reusable UI components for accommodation listings including calendars, pricing displays, photo galleries, booking forms, and more.
Installation
npm install accomadescPeer dependencies (must be installed separately):
npm install svelte @sveltejs/kitQuick Start
<script>
import { Button, AccoCard } from 'accomadesc';
const card = {
id: '1',
kind: 'acco-card',
content: {
title: 'Beach House',
photos: [{ url: '/house.jpg', alt: 'Beach house' }],
prices: { from: 150, to: 300, currency: 'EUR' },
amenities: ['wifi', 'parking'],
url: '/beach-house',
},
};
</script>
<AccoCard {...card} />
<Button variant="primary">Book Now</Button>Block System
The library uses a block-based content system. Each block has:
id: string- Unique identifierkind: string- Block type discriminatorcontent: T- Block-specific content
Use type guards for type narrowing:
import { isBookingRequest, type AccoBlock } from 'accomadesc';
function processBlock(block: AccoBlock) {
if (isBookingRequest(block)) {
// TypeScript knows block is BookingRequest
}
}Core Components
Basic UI
Button- Multi-variant button componentTextInput- Form text input with validationIcon- SVG icon rendererAvatar- User avatar displaySpinner- Loading indicatorNotes- Annotations and notes
Content Display
AccoCard- Accommodation summary cardAccoDescription- Property descriptionAmenitiesCore- Amenities displayPhoto/PhotoGallery- Image handlingSection/Text- Content sectionsLeafletMap- Location mapWeather- Weather information
Booking & Calendar
Calendar- Availability calendarCalendarGrid- Grid-based calendar viewCalendarRows- Row-based calendar viewCalendarAvailable- Availability summaryBookingRequest- Booking request formContactForm- Contact form
Pricing
Pricing- Detailed pricing tablePricingShort- Compact pricing display
Layout
PageComponent- Full page wrapperPageHeader/PageFooter- Page sectionsMainNav/NavItem- Navigation
Internationalization
Components accept i18n functions as props:
<script>
import { BookingRequest } from 'accomadesc';
let props = {
translateFunc: (key: string) => translations[key],
formatMoneyFunc: (amount: number, currency: string) =>
new Intl.NumberFormat().format(amount) + ' ' + currency,
formatDateFunc: (date: Date) => date.toLocaleDateString(),
};
</script>
<BookingRequest {...props} />State Management
Use SiteState for application state:
import { SiteState } from 'accomadesc';
const site = new SiteState({
lang: 'en',
siteConfig: { ... },
translateFunc: (key) => ...,
formatMoneyFunc: (amount, currency) => ...,
formatDateFunc: (date) => ...,
});Development
# Install dependencies
pnpm install
# Start dev server
pnpm run dev
# Run tests
pnpm run test
# Type check
pnpm run check
# Format code
pnpm run format
# Build library
pnpm run packageLicense
MIT
