Button
The button. Variants, tones, sizes, icons and a non-shifting loading state.
Four packages, one theme. React is the only peer — no clsx, no floating-ui, no animation library, no Tailwind and no CSS-in-JS runtime. Every colour, radius, control height and typeface is a --lac-* variable you can redefine in one line, and every component on this page is the real thing, rendered live.
npm i @lacspace/components @lacspace/charts @lacspace/table @lacspace/dateThese knobs write --lac-* custom properties onto one container's inline style. Everything below it — including the dialogs, which are portalled into that same container — follows. No rebuild, no theme provider, no forked components.
--lac-accent--lac-radius: 10px--lac-control-h-md: 38px--lac-fontdata-theme:root {
--lac-accent: #4d9fff;
--lac-radius: 10px;
--lac-control-h-md: 38px;
--lac-font: ui-sans-serif, system-ui, -apple-system, sans-serif;
/* derived from the accent — optional, but this is what keeps
hover, focus rings and button labels readable */
--lac-accent-hover: #66acff;
--lac-accent-soft: rgba(77, 159, 255, 0.16);
--lac-accent-ring: rgba(77, 159, 255, 0.42);
--lac-accent-fg: #ffffff;
}That block is the whole integration. Paste it into your own stylesheet and every component below — buttons, inputs, dialogs, tabs, charts, tables, date pickers — follows it. No config file, no theme provider, no rebuild. The same four variables are what this page writes onto the preview container as you drag.
Five visual weights, three sizes, a danger tone and a loading state that keeps the label in place so the button never changes width mid-click.
The button. Variants, tones, sizes, icons and a non-shifting loading state.
A square button holding one icon. The `label` prop is required — an icon alone has no accessible name.
Joins buttons into one segmented control and squares off the inner corners.
Labels, hints, errors and aria wiring handled for you. Field hands its children the ids for aria-describedby and aria-invalid already correct — the part hand-rolled forms get wrong.
Label, control, hint and error in the right order, wired together. Pass the render-prop children and the ids arrive correct.
A text input with adornments that sit inside the field — the padding adjusts so text never slides under the icon.
A multi-line input on the same tokens as Input, with the same invalid state.
A native select, styled. Native is deliberate — on a phone it opens the platform picker.
Including the indeterminate state, applied as a DOM property through a ref — it cannot be set as an attribute.
One radio, for when you are laying the group out yourself. RadioGroup below does it for you.
A role=switch button rather than a styled checkbox, so the state is announced as on/off.
State: on
A real <fieldset>/<legend> pair with a hint and one error covering the whole group.
The standalone label, with the required asterisk — for controls you are wiring up by hand.
Sliders with two thumbs, a combobox with real typeahead, a password meter you can swap the scorer on, a file drop that validates before it accepts. All of it keyboard-operable, none of it pulling in a dependency.
One thumb or two, marks, a value bubble and PageUp/PageDown. Drag it.
40% · $20–70
Steppers, precision, thousands grouping and clamp-on-blur. null is an empty field, which is not the same as 0.
One box per digit, with paste-to-fill, backspace-to-previous and an onComplete callback.
Type or paste six digits.
Type to filter, arrow to choose. Swap the matching rule for fuzzy or server-side search.
The same listbox, holding several picks as removable chips, with an optional ceiling.
A magnifier, a clear button and a debounced onSearch that also fires immediately on clear and on Enter.
onSearch fires 300ms after you stop typing.
Show/hide plus a strength meter whose scorer you can replace with your own.
Drag, drop, validate. Rejections come back with a reason each instead of vanishing.
Drop files, or click to pick.
A swatch, a hex field and one-click presets. Emits normalised #rrggbb whatever you type.
Options as data, with a secondary hint line per option and arrow-key roving.
The multi-pick equivalent, with a max that simply ignores ticks past the limit.
A segmented control, single or multiple. Icon-only segments require an ariaLabel.
Trapped focus, Escape to close, focus handed back where it came from, and the page behind marked aria-hidden. They portal out of their container, so nothing with overflow: hidden can ever clip them.
A real dialog: dimmed page, trapped focus, scroll lock, and nothing rendered at all on the server.
The are-you-sure, with the async case handled: the button stays busy until onConfirm settles, and a rejection leaves the dialog open.
The confirm button waits for the promise.
A panel from any edge, with identical focus and escape rules to Modal — from the keyboard they are the same thing.
Anchored to its trigger, position: fixed and portalled, so it flips instead of running off screen — and is never clipped by a table or a card.
Appears on hover and on keyboard focus — focus is the half everyone forgets. The tip never takes pointer events.
A queue, not a cap: extra toasts wait for a slot, timers pause while you hover, and duration 0 stays until dismissed.
Avatars that survive a 404, a KPI block that knows a rise in churn is bad news, a breakdown whose bars and percentages measure different things on purpose, and a tree with the full ARIA keyboard pattern.
Initials are always rendered underneath; the image simply stops covering them when it fails. No layout shift, nothing to configure.
Overlapping faces with a real +N element — not a pseudo-element, so it survives copy-paste and screen readers.
A KPI block. invertDelta exists because the arrow and the colour are different questions — churn up is a rise and bad news.
An <ol>, because the order carries meaning. The connector is drawn by CSS, so items of any height stay joined.
v1.0.0 published
Typecheck passed
Docs deploy
A real <dl>, each pair wrapped in a div so the label and value stay associated for assistive tech.
The nothing-here-yet panel. action is a slot, so two buttons or a file input fit without a prop for each.
No deployments yet
Push to main and one appears here.
A chip whose remove control is a real button with its own label — announced as “Remove design”, not as an anonymous ×.
Type a tag, press Enter. Paste a spreadsheet column, get one tag per line. Backspace on an empty field removes the last.
2 of 6 — paste a comma-separated list to add several.
Halves are a clipped copy of the same glyph, so a custom icon gets halves free. Interactive ratings are a real slider role.
3.5 out of 5
cmd+k becomes two caps and a separator, because one cap reading “cmd+k” lies about which keys you press.
Inline code, for a flag or a path inside a sentence.
Pass --fullstack to create-lacspace-app, or --force to overwrite.
A code block with a copy button. The prompt is rendered but never copied, so “$ npm i” puts “npm i” on the clipboard.
npm i @lacspace/componentsWith a label it stays a separator for assistive tech and grows two line segments around the text.
The ARIA tree pattern in full: Right opens then steps in, Left closes then steps out, and only one row is tabbable.
Selected: index
Bars scale to the largest row so the smallest stays visible; the percentage is that row's share of the total. Confusing the two is why dashboards show bars adding to 130%.
A spinner that inherits the text colour, skeletons shaped like the paragraph they stand in for, and a progress bar that admits when it does not know how long something will take.
One element, sized from the current font by default so it sits on the text baseline.
With lines it renders a paragraph shape, the last line shortened — which reads as text far better than equal-width bars.
With no value it animates indefinitely — the honest way to show work of unknown length.
The compact circular form, for dashboards and cards.
Anything with the danger tone gets role=alert so it is announced immediately; quieter tones stay polite.
Heads up
Key expires in 3 days
Build failed
Published to npm
A small status pill for table cells, list rows and headers — soft or outline, with an optional status dot.
Real SVG — every mark is an element with a class and a data-* attribute. No canvas, no D3, no chart engine. Hover the line, bar, pie, donut, heatmap and candlestick charts: the tooltips are live.
Fictional sample data. Every figure on this page belongs to “Meridian Cloud”, an invented company used to demonstrate the components. None of it describes Lacspace or any real customer.
A trend at the size of a word — put it beside the number it describes, never on its own.
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| MRR | $182k | $191k | $206k | $214k | $233k | $248k | $259k | $277k | $296k | $311k | $329k | $348k |
| Plan | $180k | $195k | $210k | $225k | $240k | $255k | $270k | $285k | $300k | $315k | $330k | $345k |
A continuous measure over time, and how it tracked against the plan. Hover for the nearest point.
What makes up a total. Stack when the parts sum to something meaningful; leave it overlapping to compare them.
Compare discrete buckets side by side. Two or more series group automatically; add `stacked` for composition.
Long category names, ranked. Horizontal bars give the labels room that a rotated x axis never does.
Parts of one whole, when there are five or fewer of them and the shares are far apart.
The same question as a pie, but the hole carries the number the chart is really about.
One number against the range it is allowed to be in. Without threshold bands a gauge is just a number in a circle.
Two categorical axes and one measure — support load by weekday and hour, cohorts, correlations.
A year of a daily count. Kept at its natural cell size and scrolled rather than squashed, because a 2px cell says nothing.
Several things scored on the same axes. The floor stays at zero — a truncated radar exaggerates by area.
How many made it to each step and where they left. Width is the share of the first stage; the rate beside it is against the previous one.
Open, high, low and close per period. Hover a candle for the full OHLC.
Sorting, global search, pagination, row selection, column show/hide, pinned columns, expandable rows, footer totals and a real CSV download — all of it live below, on 40 rows of invented account data.
| Expand | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Oakfield Digital | Enterprise | Active | 246 | $14,268 | Yes | M. Silva | ||||
| Ambercroft | Enterprise | Active | 210 | $12,180 | Yes | M. Silva | ||||
| Kestrel Works | Enterprise | Past due | 178 | $10,324 | Yes | T. Andersen | ||||
| Mistral Energy | Enterprise | Active | 174 | $10,092 | No | M. Silva | ||||
| Westbrook Legal | Enterprise | Past due | 142 | $8,236 | Yes | T. Andersen | ||||
| Lumen Partners | Scale | Trial | 195 | $6,630 | Yes | R. Iyer | ||||
| Glasshouse Co | Enterprise | Active | 110 | $6,380 | Yes | A. Rahman | ||||
| Inkwell Press | Enterprise | Past due | 106 | $6,148 | Yes | T. Andersen | ||||
| Xenith Robotics | Scale | Trial | 159 | $5,406 | No | R. Iyer | ||||
| Clearwater Dental | Growth | Past due | 244 | $4,636 | No | T. Andersen | ||||
| 4,940 | $132,215 |
The table above is this snippet, with a few more columns. Column helpers carry the read, so sorting, search, footer totals and the CSV export are all written once.
The batteries-included table: pass data and columns, switch the features on with booleans.
The same engine with no markup. Search, sort, paginate and select — rendered as a list instead of a table.
Calendars, pickers, ranges with presets, a time picker, a booking grid and a self-updating “3 minutes ago” — with the full WAI-ARIA keyboard pattern and not one runtime dependency. Click anything below; it all works.
A month grid on the page rather than in a popover. Arrows move a day, PageUp/PageDown a month, Enter selects.
A real input plus a popover. Typed text is parsed against `format`, and 31/02 is rejected rather than rolled forward.
Two months, a hover preview and the reporting shortcuts you would otherwise write by hand every time.
Hours, minutes and an optional AM/PM toggle, each segment its own spinbutton. Type 09, or step with the arrow keys.
A day and a time in one popover. Picking a day keeps the time already chosen, and vice versa.
A reporting period, not a day. Yields the 1st of the month at midnight, so it stores and compares cleanly.
A page of years, anchored to the selection rather than to this decade — which is what a date-of-birth field needs.
“Week ending 14 March” fields. Click any day and it takes the whole week; hovering previews the row.
Days across, times down, every cell a real button. Lunch is blocked and you can hold at most three slots.
“3 minutes ago”, kept current — every second while it is seconds, hourly once it is days. Hydration-safe by construction.
Responsive props take a breakpoint map — { base: 'column', md: 'row' } is the classic stacked-on-phones layout and costs no JavaScript. The maths behind each one (spaceToken, gridTemplate, ratioToPercent, scrollEdges) is exported too.
A bordered surface, plus the parts — CardHeader, CardTitle, CardDescription, CardBody, CardFooter.
Everything in Starter, plus SSO.
A titled region, optionally collapsible. The body stays mounted and is hidden, so form state and scroll position survive a collapse.
One-dimensional layout with a gap from the shared scale, and an optional divider between children.
Give it minColWidth and it reflows on its own container width with no breakpoints at all.
Width-limited, gutter-aware page column. Border-box throughout, so nesting one inside another cannot double the padding.
A titled band with consistent rhythm. The heading gets a stable id and is referenced by aria-labelledby, so the landmark is actually labelled.
Last 30 days.
Centres its children, with a minHeight for heroes and empty states. The layout job everybody rewrites — here once.
Content is absolutely positioned and clipped, so an image or iframe that reports its own size cannot push the box out of ratio.
Edge shadows toggled by data attributes, so they cost no extra DOM — and a Sticky header that actually sticks inside it.
Empty space. With no size it flexes, pushing its siblings to the ends of the row.
A heading whose tag and whose size are two separate decisions, a Prose block that styles markup you did not author, and a middle-ellipsis that keeps the informative half of a path.
Sizes, tones, weights, truncation, line clamping and a tabular mono option for anything in a column.
Large body copy.
Muted supporting copy.
Small, danger, semibold.
lac_live_9f2c4a81
Eyebrow label
Clamped to two lines with an ellipsis on the last one, which is what you want in a card where the copy is out of your control and the row heights are not.
level is the tag, size is the look. Coupling them is how pages end up with an h4 before an h2.
Styles raw markup you did not author — rendered Markdown, a CMS field, an email body — without adding a single class to it.
Override any variable in your own CSS. The ones most people touch are --lac-accent and --lac-radius.
A quotation with its attribution marked up as a footer/cite pair, the way HTML intends.
Restyled by variables, not by forking.
Real <mark> elements, matched with indexOf rather than a RegExp — so a query full of dots and brackets matches literally instead of exploding.
Zero-dependency React components: no Tailwind, no CSS-in-JS, zero runtime deps.
Middle-ellipsis for ids, hashes and paths. CSS text-overflow can only cut the end, which destroys the half that identifies the thing.
143 React components plus the hooks, pure functions, constants and TypeScript types that ship beside them — 701 exports across the four packages. The logic behind each component (pagination ranges, slider snapping, sort comparators, month grids) is exported on its own, so you can use it with no React at all.
Buttons, inputs, overlays, navigation, data display, layout and type — the whole application surface.
| Group | Exports |
|---|---|
| Utilities & hooks | cxclamppercentuseControllableuseStableIdSizeTone |
| Stylesheet | LacspaceStylescomponentsCss |
| Actions | ButtonButtonGroupIconButtonButtonPropsButtonGroupPropsButtonVariantIconButtonProps |
| Feedback | SpinnerSkeletonProgressProgressRingSpinnerPropsSkeletonPropsProgressPropsProgressRingProps |
| Surfaces | CardCardHeaderCardBodyCardFooterCardTitleCardDescriptionAlertBadgeCardPropsAlertPropsBadgeProps |
| Form basics | FieldLabelInputTextareaSelectCheckboxRadioSwitchFieldPropsLabelPropsInputPropsTextareaPropsSelectPropsSelectOptionCheckboxPropsRadioPropsSwitchProps |
| Overlays | BackdropModalConfirmDialogDrawerPopoverTooltipToastToastProvideruseToastpositionFloatingplacementFitsoppositePlacementnextFocusIndextoastReducervisibleToastsBackdropPropsModalPropsModalSizeConfirmDialogPropsDrawerPropsDrawerSidePopoverPropsTooltipPropsToastPropsToastProviderPropsToastOptionsToastApiToastPositionToastRecordToastStateToastActionPlacementAnchorRectFloatingSizeViewportSizePositionOptionsPositionResult |
| Navigation | TabsTabListTabTabPanelAccordionAccordionItemBreadcrumbsPaginationStepperDropdownMenuNavListNavSectionNavItemToolbarToolbarGroupToolbarSeparatorELLIPSISpaginationRangecollapseBreadcrumbsrovingIndexfirstEnabledIndexlastEnabledIndextypeaheadBuffertypeaheadMatchderiveStepStatestoggleAccordionValueTabsPropsTabsVariantTabListPropsTabPropsTabPanelPropsAccordionPropsAccordionVariantAccordionItemPropsBreadcrumbsPropsBreadcrumbItemBreadcrumbSlotPaginationPropsPaginationLabelsPaginationSlotStepperPropsStepItemStepStateStepStateOptionsDropdownMenuPropsDropdownMenuItemDropdownMenuActionDropdownMenuSeparatorDropdownMenuLabelNavListPropsNavSectionPropsNavItemPropsToolbarPropsToolbarGroupPropsToolbarSeparatorProps |
| Data display | AvatarAvatarGroupStatTimelineTimelineItemDescriptionListEmptyStateTagTagInputRatingKbdCodeSnippetDividerTreeMetricBarAVATAR_COLOR_COUNTTAG_SEPARATORSinitialscolorIndexForsplitAvatarOverflowformatDeltadeltaToneroundToHalfnormalizeRatingsplitKeyssplitTagInputmergeTagsnormalizeMetricsflattenTreeAvatarPropsAvatarGroupPropsAvatarSizeStatPropsTimelinePropsTimelineItemPropsDescriptionListPropsDescriptionItemEmptyStatePropsTagPropsTagInputPropsRatingPropsKbdPropsCodePropsSnippetPropsDividerPropsTreePropsTreeNodeMetricBarPropsMetricItemAvatarOverflowDeltaDirectionDeltaInfoFormatDeltaOptionsMergeTagsOptionsMergeTagsResultNormalizedMetricFlatTreeNode |
| Layout | StackHStackVStackGridGridItemContainerSectionSpacerCenterAspectRatioScrollAreaStickyPanelspaceTokenlengthTokengridTemplatespanValueresolveResponsiveresponsiveVarsratioToPercentscrollEdgesStackPropsStackDirectionGridPropsGridItemPropsContainerPropsContainerSizeSectionPropsSpacerPropsCenterPropsAspectRatioPropsScrollAreaPropsStickyPropsPanelPropsBreakpointResponsiveResponsiveMapSpaceValueScrollEdgeState |
| Typography | TextHeadingProseBlockquoteHighlightTruncatetruncateMiddlesplitHighlightTextPropsTextSizeTextToneTextWeightHeadingPropsHeadingLevelProsePropsBlockquotePropsHighlightPropsTruncatePropsHighlightPart |
| Advanced form controls | SliderNumberInputPinInputComboboxMultiSelectSearchInputPasswordInputFileDropColorInputRadioGroupCheckboxGroupToggleGroupFieldsetsnapToStepsliderValueToPercentpercentToSliderValueorderThumbssetThumbValuemoveThumbnearestThumbdecimalPlacesroundToclampNumberparseNumericInputformatNumberValuegroupThousandsstepNumberpinPatternpadPindistributePinfirstEmptyPinIndexdefaultComboboxFilterfilterOptionsmoveHighlightnextEnabledIndexscorePasswordCOMMON_PASSWORDSmatchesAcceptvalidateFilesformatBytesisValidHexnormalizeHexhexWithoutAlphatoggleSelectiondebounceSliderPropsSliderValueSliderMarkSliderScaleNumberInputPropsNumberFormatOptionsNumberStepOptionsPinInputPropsPinTypeComboboxPropsComboboxOptionMultiSelectPropsSearchInputPropsPasswordInputPropsPasswordStrengthFileDropPropsFileLikeFileRejectionFileRejectionReasonFileValidationOptionsColorInputPropsRadioGroupPropsCheckboxGroupPropsChoiceOptionToggleGroupPropsToggleGroupItemToggleSelectionOptionsFieldsetPropsDebounced |
Real SVG marks: line, area, bar, pie, donut, sparkline, gauge, heatmap, radar, funnel and candlestick. No canvas, no D3.
| Group | Exports |
|---|---|
| Utilities & hooks | cxclassesclamppercentuseStableIdSizeTone |
| Stylesheet | LacspaceChartStyleschartsCss |
| Scales, geometry & formatting | extentpadDegenerateniceNumniceTicksniceDomainroundToStepsumlinearScalebandScaleplotAreaDEFAULT_MARGINstackSeriesstackExtentlinePathsmoothPathareaPathpolygonPathroundedBarPathpolarPointarcPathpieSlicesgaugeAngleDEFAULT_PALETTEcolorAtparseHexmixColorheatColorformatNumberformatPercentdescribeSeriesnearestPointohlcExtentcandleDirectionfunnelStagescalendarCellsPointLinearScaleBandScaleMarginPlotStackBandSliceHitCandleFunnelStageCalendarCell |
| Shared chart parts | ChartFrameChartGridChartAxisChartLegendChartTooltipChartDataTableSeriesChartBasePropsChartFramePropsChartGridPropsChartAxisPropsAxisTickChartLegendPropsLegendItemChartTooltipPropsTooltipRowChartDataTableProps |
| Line & area | LineChartAreaChartCartesianChartPropsAreaChartProps |
| Bars | BarChartBarChartProps |
| Pie & donut | PieChartDonutChartPieChartPropsDonutChartPropsPieDatum |
| Sparklines | SparklineSparkBarsSparklinePropsSparkBarsProps |
| Gauge | GaugeGaugePropsGaugeBand |
| Heatmap | HeatmapHeatmapProps |
| Radar | RadarChartRadarChartProps |
| Funnel | FunnelChartFunnelChartPropsFunnelDatum |
| Candlestick | CandlestickChartCandlestickChartProps |
Sorting, filtering, search, pagination, selection, resizing, pinning and CSV export — with the whole engine exported as pure functions.
| Group | Exports |
|---|---|
| The table | DataTableDataTablePropsRowDetailContext |
| Headless engine hook | useTableinferRowIdUseTableOptionsTableInstanceTableRowModelExportScope |
| Table parts | TableTableScrollTableCaptionTHeadTBodyTFootTrThTdTableToolbarTableSearchTableCheckboxTableColumnsMenuTablePaginationTableEmptyTablePropsTableScrollPropsTableCaptionPropsTrPropsThPropsTdPropsPinPropsDensityTableToolbarPropsTableSearchPropsTableCheckboxPropsTableColumnsMenuPropsColumnToggleTablePaginationPropsPaginationLabelsTableEmptyProps |
| Column builders | defineColumndefineColumnsresolveColumnresolveColumnscolumnReadersortFieldsFromfilterFieldsFromexportColumnsFromtextColumnnumberColumncurrencyColumndateColumnbadgeColumnbooleanColumnlinkColumnactionsColumncustomColumnformatNumberformatCurrencyformatDatetoDateDEFAULT_COLUMN_WIDTHColumnDefAnyColumnCommonColumnOptionsResolvedColumnCellContextFooterContextTextColumnOptionsNumberColumnOptionsCurrencyColumnOptionsDateColumnOptionsBadgeColumnOptionsBooleanColumnOptionsLinkColumnOptionsActionsColumnOptionsCustomColumnOptionsRowActionNumberFormatOptionsCurrencyFormatOptionsDateFormatOptions |
| Engine — pure functions | isBlanktoNumbertoTextdefaultComparesortRowssortDirectionOfsortIndexOfcycleSortisNumberRangeisEmptyFiltermatchesFiltermatchesQueryfilterRowssearchableIdspageCountclampPagepageSlicepageRangepageForSizeChangepageTokenstoggleSelectedsetSelectionselectionModeisIndeterminatepruneSelectionclampColumnWidthresizeColumnpinnedOffsetsMIN_COLUMN_WIDTHMAX_COLUMN_WIDTHaggregatenumericValuesneutraliseFormulaescapeCelltoDelimitedtoCsvtoTsvexportRowsdownloadCsvFORMULA_PREFIXESSortDirectionSortRuleSortStateSortFieldNumberRangeFilterValueFilterFieldFilterOptionsPageTokenSelectionStateSelectionModeAggregateFnExportColumnExportOptionsDelimitedOptions |
| Stylesheet | TableStylestableCss |
| Utilities & hooks | cxclassesclampuseControllableuseStableIdSizeToneAlign |
Calendar, date, range, month, year, time and date-time pickers plus a scheduler grid, over a tested date engine with no moment, date-fns or dayjs.
| Group | Exports |
|---|---|
| Stylesheet | DateStylesdateCss |
| Utilities & hooks | cxclassesclampuseControllableuseStableIdSize |
| Calendar family | CalendarMonthPickerYearPickerWeekPickeruseDayFocusCalendarPropsDayRulePropsMonthPickerPropsYearPickerPropsWeekPickerProps |
| Picker family | DatePickerDateRangePickerDateTimePickerDatePickerPropsDateRangePickerPropsDateTimePickerPropsPickerBaseProps |
| Time | TimePickerTimePickerProps |
| Schedule | ScheduleGridScheduleGridProps |
| Relative time | RelativeTimeRelativeTimeProps |
| Date engine — pure functions | makeDatecloneDateisValidDateisLeapYeardaysInMonthstartOfDayendOfDaystartOfWeekendOfWeekstartOfMonthendOfMonthstartOfYearendOfYearaddDaysaddWeeksaddMonthsaddYearsaddMinutesaddHoursisSameDayisSameMonthisSameYearisSameWeekcompareDayisBeforeDayisAfterDaydiffInDaysdiffInMonthsclampDatemonthGridweekdayOrdereachDayOfIntervalweekDaysisoWeekNumbernextFocusFromKeyisCompleteRangenormalizeRangeisInRangeisRangeStartisRangeEndpreviewRangeisInPreviewRangenightsBetweenisRangeAllowedselectRangeDatedefaultPresetsisDateDisabledisMonthDisabledisYearDisablednextEnabledDateresolveLocaleformatIntlmonthNamesweekdayNamesfullDateLabelmonthLabelformatDateparseDateutcStampgetTimeValuesetTimeValueroundToStepfloorToStepnormalizeTimeto12Hourfrom12HourstepTimePartformatTimeValueparseTimeTextdaySlotsscheduleDaysslotKeyhasSlottoggleSlotrelativePartsrelativeFallbackformatRelativerelativeRefreshMsWeekdayCalendarDayMonthGridOptionsDateRangeCompleteRangeRangeLimitsRangePresetDisabledRulesTimeValueTimeStepsSlotSpecRelativeUnitRelativeParts |
Import the stylesheet once, redefine the variables you care about, and ship. The licence is the Lacspace Free Licence v1.0 — use it, modify it, ship it commercially.