Compare commits

..

20 Commits

Author SHA1 Message Date
Cory LaViska
5e6e0368a4 Merge branch 'next' into current 2023-08-23 12:58:35 -04:00
Cory LaViska
409ac96ddf Merge branch 'next' into current 2023-08-11 13:27:07 -04:00
Cory LaViska
1bf09f20aa Merge branch 'next' into current 2023-07-31 15:49:04 -04:00
Cory LaViska
ba642a0886 Merge branch 'next' into current 2023-06-26 12:26:48 -04:00
Cory LaViska
c37c71d8fd Merge branch 'next' into current 2023-06-22 11:25:55 -04:00
Cory LaViska
05b1212657 Merge branch 'next' into current 2023-06-20 15:31:04 -04:00
Cory LaViska
62b4525321 Merge branch 'next' into current 2023-04-14 13:01:22 -04:00
Cory LaViska
44628889fe Merge branch 'next' into current 2023-03-09 16:23:15 -05:00
Cory LaViska
3168a1acf8 Merge branch 'next' into current 2023-02-28 17:11:30 -05:00
Cory LaViska
17160e3bed Merge branch 'next' into current 2023-02-28 17:08:01 -05:00
Cory LaViska
fe2e2d6df5 Merge branch 'next' into current 2023-02-16 16:42:29 -05:00
Cory LaViska
6e2856db5f Revert "fix play/pause buttons; #1147"
This reverts commit 6d1eb71d8e.
2023-01-25 16:51:32 -05:00
Cory LaViska
6d1eb71d8e fix play/pause buttons; #1147 2023-01-25 16:51:02 -05:00
Cory LaViska
a334e53a5d Merge branch 'next' into current 2023-01-24 11:48:41 -05:00
Cory LaViska
0d50749ec8 Merge branch 'next' into current 2023-01-05 15:44:58 -05:00
Cory LaViska
316d8b52b6 Merge branch 'next' into current 2022-12-14 09:31:01 -05:00
Cory LaViska
b7b2d9265a Merge branch 'next' into current 2022-12-08 08:53:20 -05:00
Cory LaViska
b797803a2b Merge branch 'next' into current 2022-12-08 08:51:59 -05:00
Cory LaViska
bcb4f2267b Revert "Update fa.ts (#1053)" (#1058)
This reverts commit c951661b58.
2022-12-08 08:50:10 -05:00
Hadi F
c951661b58 Update fa.ts (#1053)
Improved translations by using original Farsi words rather than English ones
2022-12-08 08:45:07 -05:00
16 changed files with 24 additions and 601 deletions

View File

@@ -373,12 +373,4 @@
hide();
}
});
// We're using Turbo, so when a user searches for something, visits a result, and presses the back button, the search
// UI will still be visible but not interactive. This removes the search UI when Turbo renders a page so they don't
// get trapped.
window.addEventListener('turbo:render', () => {
document.body.classList.remove('search-visible');
document.querySelectorAll('.search__overlay, .search__dialog').forEach(el => el.remove());
});
})();

View File

@@ -1,67 +0,0 @@
---
meta:
title: Calendar
description: Calendar shows a monthly view of the Gregorian calendar, optionally allowing users to interact with dates.
layout: component
---
```html:preview
<sl-calendar></sl-calendar>
```
## Examples
### Month & Day Labels
Month and day labels can be customized using the `month-labels` and `day-labels` attributes. Note that month names are localized automatically based on the component's `lang` attribute, falling back to the document language.
```html:preview
<sl-calendar month-labels="short" day-labels="narrow"></sl-calendar>
```
### Showing Adjacent Dates
By default, only dates in the target month are shown. You can fill the grid with adjacent dates using the `show-adjacent-dates` attribute.
```html:preview
<sl-calendar show-adjacent-dates></sl-calendar>
```
### Date Selection
One or more dates can be selected by setting the `selectedDates` property. An array of dates is accepted and the selection does not have to be continuous.
```html:preview
<sl-calendar class="calendar-selection"></sl-calendar>
<script>
const calendar = document.querySelector('.calendar-selection');
const today = new Date();
// Set the selected date range from the 12-15 of the current month
calendar.selectedDates = [
new Date(today.getFullYear(), today.getMonth(), 12),
new Date(today.getFullYear(), today.getMonth(), 13),
new Date(today.getFullYear(), today.getMonth(), 14),
new Date(today.getFullYear(), today.getMonth(), 15)
];
</script>
```
### With Borders
To add a border, set the `--border-width` custom property. You can further customize the border with `--border-color` and `--border-radius`.
```html:preview
<sl-calendar style="--border-width: 1px;"></sl-calendar>
```
### Localizing the Calendar
By default, the calendar will use the document's locale. You can use the `lang` attribute to change this.
```html:preview
<sl-calendar lang="es"></sl-calendar>
```
[component-metadata:sl-calendar]

View File

@@ -12,11 +12,6 @@ Components with the <sl-badge variant="warning" pill>Experimental</sl-badge> bad
New versions of Shoelace are released as-needed and generally occur when a critical mass of changes have accumulated. At any time, you can see what's coming in the next release by visiting [next.shoelace.style](https://next.shoelace.style).
## Next
- Fixed a bug in `<sl-switch>` that resulted in improper spacing between the label and the required asterisk [#1540]
- Updated `@ctrl/tinycolor` to 4.0.1 [#1542]
## 2.8.0
- Added `--isolatedModules` and `--verbatimModuleSyntax` to `tsconfig.json`. For anyone directly importing event types, they no longer provide a default export due to these options being enabled. For people using the `events/event.js` file directly, there is no change.
@@ -28,7 +23,7 @@ New versions of Shoelace are released as-needed and generally occur when a criti
- Improved expand/collapse behavior of `<sl-tree>` to work more like users expect [#1521]
- Improved `<sl-menu-item>` so labels truncate properly instead of getting chopped and overflowing
- Removed the extra `React.Component` around `@lit-labs/react` wrapper. [#1531]
- Updated `@lit-labs/react` to v2.0.1. [#1531]
- Upgrade `@lit-labs/react` to v2.0.1. [#1531]
## 2.7.0

16
package-lock.json generated
View File

@@ -9,7 +9,7 @@
"version": "2.8.0",
"license": "MIT",
"dependencies": {
"@ctrl/tinycolor": "^4.0.1",
"@ctrl/tinycolor": "^3.5.0",
"@floating-ui/dom": "^1.2.1",
"@lit-labs/react": "^2.0.1",
"@shoelace-style/animations": "^1.1.0",
@@ -833,11 +833,11 @@
}
},
"node_modules/@ctrl/tinycolor": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.0.1.tgz",
"integrity": "sha512-dfimuE1mfaqL8P8jyQzdk9yFeFUWCyhjK5VyydXgDtQO0fezr6aWaGauHnlI07BZBIF45gahb0oxJjkUcylDwQ==",
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz",
"integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg==",
"engines": {
"node": ">=14"
"node": ">=10"
}
},
"node_modules/@custom-elements-manifest/analyzer": {
@@ -17913,9 +17913,9 @@
"dev": true
},
"@ctrl/tinycolor": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.0.1.tgz",
"integrity": "sha512-dfimuE1mfaqL8P8jyQzdk9yFeFUWCyhjK5VyydXgDtQO0fezr6aWaGauHnlI07BZBIF45gahb0oxJjkUcylDwQ=="
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz",
"integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg=="
},
"@custom-elements-manifest/analyzer": {
"version": "0.8.3",

View File

@@ -25,8 +25,15 @@
"./dist/react/*": "./dist/react/*",
"./dist/translations/*": "./dist/translations/*"
},
"files": ["dist", "cdn"],
"keywords": ["web components", "custom elements", "components"],
"files": [
"dist",
"cdn"
],
"keywords": [
"web components",
"custom elements",
"components"
],
"repository": {
"type": "git",
"url": "git+https://github.com/shoelace-style/shoelace.git"
@@ -60,7 +67,7 @@
"node": ">=14.17.0"
},
"dependencies": {
"@ctrl/tinycolor": "^4.0.1",
"@ctrl/tinycolor": "^3.5.0",
"@floating-ui/dom": "^1.2.1",
"@lit-labs/react": "^2.0.1",
"@shoelace-style/animations": "^1.1.0",
@@ -133,6 +140,9 @@
"user-agent-data-types": "^0.3.0"
},
"lint-staged": {
"*.{ts,js}": ["eslint --max-warnings 0 --cache --fix", "prettier --write"]
"*.{ts,js}": [
"eslint --max-warnings 0 --cache --fix",
"prettier --write"
]
}
}

View File

@@ -53,10 +53,6 @@ async function buildTheDocs(watch = false) {
output.push(data.toString());
});
child.stderr.on('data', data => {
output.push(data.toString());
});
if (watch) {
// The process doesn't terminate in watch mode so, before resolving, we listen for a known signal in stdout that
// tells us when the first build completes.

View File

@@ -1,204 +0,0 @@
import { classMap } from 'lit/directives/class-map.js';
import { generateCalendarGrid, getAllDayNames, getMonthName, isSameDay } from '../../internal/calendar.js';
import { HasSlotController } from '../../internal/slot.js';
import { html } from 'lit';
import { LocalizeController } from '../../utilities/localize.js';
import { partMap } from '../../internal/part-map.js';
import { property } from 'lit/decorators.js';
import { watch } from '../../internal/watch.js';
import ShoelaceElement from '../../internal/shoelace-element.js';
import styles from './calendar.styles';
import type { CSSResultGroup, TemplateResult } from 'lit';
export interface RenderDayOptions {
disabled?: boolean;
content: string | TemplateResult;
}
/**
* @summary A calendar prototype for Shoelace.
* @documentation https://shoelace.style/components/calendar
*
* @since 2.0
* @status experimental
*
* @dependency sl-example
*
* @event sl-change - Emitted when the date changes.
*
* @slot footer - Optional content to place in the calendar's footer.
*
* @csspart day - Targets day cells.
* @csspart day-label - Targets the day labels (the name of the days in the grid).
* @csspart day-weekend - Targets days that fall on weekends.
* @csspart day-weekday - Targets weekdays.
* @csspart day-current-month - Targets days in the current month.
* @csspart day-previous-month - Targets days in the previous month.
* @csspart day-next-month - Targets days in the next month.
* @csspart day-today - Targets today.
* @csspart day-selected - Targets selected days.
* @csspart day-selection-start - Targets days that begin a selection.
* @csspart day-selection-end - Targets days that end a selection.
*
* @cssproperty --border-color - The calendar's border color.
* @cssproperty --border-width - The calendar's border width.
* @cssproperty --border-radius - The border radius of the calendar.
*/
export default class SlCalendar extends ShoelaceElement {
static styles: CSSResultGroup = styles;
private readonly localize = new LocalizeController(this);
private readonly hasSlotController = new HasSlotController(this, 'prefix', 'suffix');
/** The month to render, 1-12/ */
@property({ type: Number, reflect: true }) month: number = new Date().getMonth() + 1;
/** The year to render. */
@property({ type: Number, reflect: true }) year: number = new Date().getFullYear();
/** Determines how day labels are shown, e.g. "M", "Mon", or "Monday". */
@property({ attribute: 'day-labels' }) dayLabels: 'narrow' | 'short' | 'long' = 'short';
/** Determines how month labels are shown, e.g. "J", "Jan", or "January". */
@property({ attribute: 'month-labels' }) monthLabels: 'numeric' | '2-digit' | 'long' | 'short' | 'narrow' = 'long';
/** When true, dates from the previous and next month will also be shown to fill out the grid. */
@property({ attribute: 'show-adjacent-dates', type: Boolean }) showAdjacentDates = false;
/** Draws the target dates as a selection in the calendar. */
@property({ type: Array }) selectedDates: Date[] = [];
/** Moves the calendar to the current month and year. */
goToToday() {
this.month = new Date().getMonth() + 1;
this.year = new Date().getFullYear();
}
/** Moves the calendar to the previous month. */
goToPreviousMonth() {
if (this.month === 1) {
this.month = 12;
this.year--;
} else {
this.month--;
}
}
/** Moves the calendar to the next month. */
goToNextMonth() {
if (this.month === 12) {
this.month = 1;
this.year++;
} else {
this.month++;
}
}
@watch('month')
@watch('year')
handleMonthChange() {
this.emit('sl-change');
}
render() {
if (this.month < 1 || this.month > 12) {
throw new Error(`The value "${this.month}" is not a valid month.`);
}
const lang = this.lang || document.documentElement.lang;
const month = new Date(this.year, this.month - 1, 1);
const dayGrid = generateCalendarGrid(this.year, this.month);
const dayNames = getAllDayNames(lang, this.dayLabels);
//
// TODO - December is not showing a label because the month is calculated as Sat Jan 01 2022 00:00:00 GMT-0500
//
return html`
<div
class=${classMap({
calendar: true,
'calendar--has-footer': this.hasSlotController.test('footer'),
'calendar--show-adjacent-dates': this.showAdjacentDates
})}
>
<header class="calendar__header">
<sl-icon-button
name="chevron-left"
label=${this.localize.term('previousMonth')}
@click=${this.goToPreviousMonth}
></sl-icon-button>
<span class="calendar__label">
<span class="calendar__month-label">${getMonthName(month, lang, this.monthLabels)}</span>
<span class="calendar__year-label">${month.getFullYear()}</span>
</span>
<sl-icon-button
name="chevron-right"
label=${this.localize.term('nextMonth')}
@click=${this.goToNextMonth}
></sl-icon-button>
</header>
<div class="calendar__days">
${[0, 1, 2, 3, 4, 5, 6].map(day => {
return html`
<span
part=${partMap({
day: true,
'day-label': true,
'day-weekday': day > 0 && day < 6,
'day-weekend': day === 0 || day === 6
})}
class="calendar__day"
>
${dayNames[day]}
</span>
`;
})}
${dayGrid.map((day, index) => {
if (day.isCurrentMonth || this.showAdjacentDates) {
const isSelected = Array.isArray(this.selectedDates)
? this.selectedDates.some(d => isSameDay(d, day.date))
: false;
const previousDay = index > 0 ? dayGrid[index - 1] : null;
const nextDay = index < dayGrid.length - 1 ? dayGrid[index + 1] : null;
const isSelectionStart =
isSelected && previousDay ? !this.selectedDates.some(d => isSameDay(d, previousDay.date)) : false;
const isSelectionEnd =
isSelected && nextDay ? !this.selectedDates.some(d => isSameDay(d, nextDay.date)) : false;
return html`
<button
type="button"
part=${partMap({
day: true,
'day-current-month': day.isCurrentMonth,
'day-previous-month': day.isPreviousMonth,
'day-next-month': day.isNextMonth,
'day-today': day.isToday,
'day-weekday': day.isWeekday,
'day-weekend': day.isWeekend,
'day-selected': isSelected,
'day-selection-start': isSelectionStart,
'day-selection-end': isSelectionEnd
})}
class="calendar__day"
>
${day.date.getDate()}
</button>
`;
}
return html` <div class="calendar__day calendar__day--empty"></div> `;
})}
</div>
<footer class="calendar__footer">
<slot name="footer"></slot>
</footer>
</div>
`;
}
}

View File

@@ -1,119 +0,0 @@
import { css } from 'lit';
import componentStyles from '../../styles/component.styles';
export default css`
${componentStyles}
:host {
--border-color: var(--sl-color-neutral-200);
--border-radius: var(--sl-border-radius-medium);
--border-width: 0;
display: block;
}
.calendar__header {
display: flex;
align-items: center;
margin-bottom: var(--sl-spacing-x-small);
}
.calendar__header sl-icon-button {
flex: 0 0 auto;
}
.calendar__label {
flex: 1 1 auto;
text-align: center;
}
.calendar__days {
isolation: isolate;
display: grid;
grid-template-columns: repeat(7, 1fr);
}
.calendar__day {
position: relative;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
border: solid var(--border-width) var(--border-color);
border-bottom: none;
background: none;
background-color: var(--sl-color-neutral-0);
font: inherit;
color: var(--sl-color-neutral-900);
min-height: 3rem;
padding: 0;
margin: 0;
}
.calendar__day:nth-child(1) {
border-top-left-radius: var(--border-radius);
}
.calendar__day:nth-child(7) {
border-top-right-radius: var(--border-radius);
}
.calendar__day:nth-last-child(1) {
border-bottom-right-radius: var(--border-radius);
}
.calendar__day:nth-last-child(7) {
border-bottom-left-radius: var(--border-radius);
}
.calendar__day:not(:nth-child(7n)) {
border-right: none;
}
.calendar__day:nth-last-child(1),
.calendar__day:nth-last-child(2),
.calendar__day:nth-last-child(3),
.calendar__day:nth-last-child(4),
.calendar__day:nth-last-child(5),
.calendar__day:nth-last-child(6),
.calendar__day:nth-last-child(7) {
border-bottom: solid var(--border-width) var(--border-color);
}
.calendar__day:focus-visible {
outline: solid 2px var(--sl-color-primary-600);
z-index: 1;
}
.calendar__day[part~='day-weekend'] {
color: var(--sl-color-rose-600);
}
.calendar__day[part~='day-today'] {
font-weight: var(--sl-font-weight-bold);
}
.calendar__day[part~='day-selected'] {
background-color: var(--sl-color-primary-100);
}
.calendar__day[part~='day-selection-start'] {
border-top-left-radius: var(--sl-border-radius-pill);
border-bottom-left-radius: var(--sl-border-radius-pill);
}
.calendar__day[part~='day-selection-end'] {
border-top-right-radius: var(--sl-border-radius-pill);
border-bottom-right-radius: var(--sl-border-radius-pill);
}
.calendar__day .calendar__day[part~='day-previous-month'],
.calendar__day[part~='day-next-month'] {
color: var(--sl-color-neutral-400);
}
.calendar__day[part~='day-previous-month'][part~='day-weekend'],
.calendar__day[part~='day-next-month'][part~='day-weekend'] {
color: var(--sl-color-rose-400);
}
`;

View File

@@ -1,9 +0,0 @@
import { expect } from '@open-wc/testing';
describe('<sl-calendar>', () => {
it('should render a component', async () => {
// const el = await fixture(html` <sl-calendar></sl-calendar> `);
const a = true;
expect(a).to.be.true;
});
});

View File

@@ -1,12 +0,0 @@
import SlCalendar from './calendar.component.js';
export * from './calendar.component.js';
export default SlCalendar;
SlCalendar.define('sl-calendar');
declare global {
interface HTMLElementTagNameMap {
'sl-calendar': SlCalendar;
}
}

View File

@@ -215,9 +215,7 @@ export default class SlSwitch extends ShoelaceElement implements ShoelaceFormCon
<span part="thumb" class="switch__thumb"></span>
</span>
<div part="label" class="switch__label">
<slot></slot>
</div>
<slot part="label" class="switch__label"></slot>
</label>
`;
}

View File

@@ -1,141 +0,0 @@
export interface CalendarDay {
date: Date;
isToday: boolean;
isWeekday: boolean;
isWeekend: boolean;
isCurrentMonth: boolean;
isPreviousMonth: boolean;
isNextMonth: boolean;
}
export interface CalendarGridOptions {
weekStartsWith: 'sunday' | 'monday';
}
/** Generates a calendar grid. Month should be 1-12, not 0-11. */
export function generateCalendarGrid(year: number, month: number, options?: Partial<CalendarGridOptions>) {
const weekStartsWith = options?.weekStartsWith || 'sunday';
const today = new Date();
const dayThisMonthStartsWith = new Date(year, month - 1, 1).getDay();
const lastDayOfMonth = new Date(year, month, 0).getDate();
const lastDayOfPreviousMonth =
month === 1 ? new Date(year - 1, 1, 0).getDate() : new Date(year, month - 1, 0).getDate();
const dayGrid: CalendarDay[] = [];
let day = 1;
do {
const date = new Date(year, month - 1, day);
let dayOfWeek = new Date(year, month - 1, day).getDay();
if (weekStartsWith === 'sunday') {
//
// TODO
//
}
// Days in the previous month
if (day === 1) {
let lastMonthDay = lastDayOfPreviousMonth - dayThisMonthStartsWith + 1;
for (let i = 0; i < dayThisMonthStartsWith; i++) {
const dayOfLastMonth = new Date(year, month - 2, lastMonthDay);
dayGrid.push({
date: dayOfLastMonth,
isToday: isSameDay(dayOfLastMonth, today),
isWeekday: isWeekday(dayOfLastMonth),
isWeekend: isWeekend(dayOfLastMonth),
isCurrentMonth: false,
isPreviousMonth: true,
isNextMonth: false
});
lastMonthDay++;
}
}
dayGrid.push({
date,
isToday: isSameDay(date, today),
isWeekday: isWeekday(date),
isWeekend: isWeekend(date),
isCurrentMonth: true,
isPreviousMonth: false,
isNextMonth: false
});
// Days in the next month
if (day === lastDayOfMonth) {
let nextMonthDay = 1;
for (dayOfWeek; dayOfWeek < 6; dayOfWeek++) {
const dayOfNextMonth = new Date(year, month, nextMonthDay);
dayGrid.push({
date: dayOfNextMonth,
isToday: isSameDay(dayOfNextMonth, today),
isWeekday: isWeekday(dayOfNextMonth),
isWeekend: isWeekend(dayOfNextMonth),
isCurrentMonth: false,
isPreviousMonth: false,
isNextMonth: true
});
nextMonthDay++;
}
}
day++;
} while (day <= lastDayOfMonth);
return dayGrid;
}
/** Generates a localized array of day names. */
export function getAllDayNames(locale = 'en', format: Intl.DateTimeFormatOptions['weekday'] = 'long') {
const formatter = new Intl.DateTimeFormat(locale, { weekday: format, timeZone: 'UTC' });
const days = [1, 2, 3, 4, 5, 6, 7].map(day => {
const dd = day < 10 ? `0${day}` : day;
return new Date(`2017-01-${dd}T00:00:00+00:00`);
});
return days.map(date => formatter.format(date));
}
/** Generates a localized array of month names. */
export function getAllMonthNames(locale = 'en', format: Intl.DateTimeFormatOptions['month'] = 'long') {
const formatter = new Intl.DateTimeFormat(locale, { month: format, timeZone: 'UTC' });
const months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map(month => {
const mm = month < 10 ? `0${month}` : month;
return new Date(`2017-${mm}-01T00:00:00+00:00`);
});
return months.map(date => formatter.format(date));
}
/** Determines if two dates are the same day. */
export function isSameDay(date1: Date, date2: Date) {
return (
date1.getFullYear() === date2.getFullYear() &&
date1.getMonth() === date2.getMonth() &&
date1.getDate() === date2.getDate()
);
}
/** Determines if the date is a weekend. */
export function isWeekend(date: Date) {
const day = date.getDay();
return day === 0 || day === 6;
}
/** Determines if the date is a weekday. */
export function isWeekday(date: Date) {
const day = date.getDay();
return day > 0 && day < 6;
}
/** Returns a localized, human-readable day name. */
export function getDayName(date: Date, locale = 'en', format: Intl.DateTimeFormatOptions['weekday'] = 'long') {
return getAllDayNames(locale, format)[date.getDate() - 1];
}
/** Returns a localized, human-readable month name. */
export function getMonthName(date: Date, locale = 'en', format: Intl.DateTimeFormatOptions['month'] = 'long') {
return getAllMonthNames(locale, format)[date.getMonth()];
}

View File

@@ -1,11 +0,0 @@
export function partMap(map: { [partName: string]: boolean }) {
const parts = [];
for (const [key, value] of Object.entries(map)) {
if (value) {
parts.push(key);
}
}
return parts.join(' ');
}

View File

@@ -8,7 +8,6 @@ export { default as SlBreadcrumb } from './components/breadcrumb/breadcrumb.js';
export { default as SlBreadcrumbItem } from './components/breadcrumb-item/breadcrumb-item.js';
export { default as SlButton } from './components/button/button.js';
export { default as SlButtonGroup } from './components/button-group/button-group.js';
export { default as SlCalendar } from './components/calendar/calendar.js';
export { default as SlCard } from './components/card/card.js';
export { default as SlCarousel } from './components/carousel/carousel.js';
export { default as SlCarouselItem } from './components/carousel-item/carousel-item.js';

View File

@@ -16,14 +16,12 @@ const translation: Translation = {
goToSlide: (slide, count) => `Go to slide ${slide} of ${count}`,
hidePassword: 'Hide password',
loading: 'Loading',
nextMonth: 'Next month',
nextSlide: 'Next slide',
numOptionsSelected: num => {
if (num === 0) return 'No options selected';
if (num === 1) return '1 option selected';
return `${num} options selected`;
},
previousMonth: 'Previous month',
previousSlide: 'Previous slide',
progress: 'Progress',
remove: 'Remove',

View File

@@ -23,10 +23,8 @@ export interface Translation extends DefaultTranslation {
goToSlide: (slide: number, count: number) => string;
hidePassword: string;
loading: string;
nextMonth?: string; // TODO - add to other language packs and remove optional ? flag
nextSlide: string;
numOptionsSelected: (num: number) => string;
previousMonth?: string; // TODO - add to other language packs and remove optional ? flag
previousSlide: string;
progress: string;
remove: string;