UI kit

143 components, zero dependencies

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.

96 components19 charts17 table11 date0 runtime dependencies701 exports in all
terminal
npm i @lacspace/components @lacspace/charts @lacspace/table @lacspace/date
Live theme

Change four variables, change everything

These 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.

Restyle every preview on this page

Accent--lac-accent
Corner radius--lac-radius: 10px
Control height--lac-control-h-md: 38px
Typeface--lac-font
Preview themedata-theme
your-app.css
: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.

Actions

Buttons that don't jump · 3 live

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.

Button

The button. Variants, tones, sizes, icons and a non-shifting loading state.

IconButton

A square button holding one icon. The `label` prop is required — an icon alone has no accessible name.

ButtonGroup

Joins buttons into one segmented control and squares off the inner corners.

Forms

The controls you use every day · 9 live

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.

Field

Label, control, hint and error in the right order, wired together. Pass the render-prop children and the ids arrive correct.

We never share it.
That name is already taken.

Input

A text input with adornments that sit inside the field — the padding adjusts so text never slides under the icon.

Rs/mo

Textarea

A multi-line input on the same tokens as Input, with the same invalid state.

Select

A native select, styled. Native is deliberate — on a phone it opens the platform picker.

Checkbox

Including the indeterminate state, applied as a DOM property through a ref — it cannot be set as an attribute.

Radio

One radio, for when you are laying the group out yourself. RadioGroup below does it for you.

Switch

A role=switch button rather than a styled checkbox, so the state is announced as on/off.

State: on

Fieldset

A real <fieldset>/<legend> pair with a hint and one error covering the whole group.

Billing addressUsed on every invoice.

Label

The standalone label, with the required asterisk — for controls you are wiring up by hand.

Forms · advanced

The ones people reach for a library to get · 12 live

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.

Slider

One thumb or two, marks, a value bubble and PageUp/PageDown. Drag it.

40% · $20–70

NumberInput

Steppers, precision, thousands grouping and clamp-on-blur. null is an empty field, which is not the same as 0.

Grouped while the field is not focused.

PinInput

One box per digit, with paste-to-fill, backspace-to-previous and an onComplete callback.

Type or paste six digits.

Combobox

Type to filter, arrow to choose. Swap the matching rule for fuzzy or server-side search.

MultiSelect

The same listbox, holding several picks as removable chips, with an optional ceiling.

SEO Kit

SearchInput

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.

PasswordInput

Show/hide plus a strength meter whose scorer you can replace with your own.

Very weak — Use at least 8 characters
Try typing — the meter is plain, predictable arithmetic.

FileDrop

Drag, drop, validate. Rejections come back with a reason each instead of vanishing.

No files selected

Drop files, or click to pick.

ColorInput

A swatch, a hex field and one-click presets. Emits normalised #rrggbb whatever you type.

Also accepts #abc and ABCDEF.

RadioGroup

Options as data, with a secondary hint line per option and arrow-key roving.

Plan
One projectUnlimited projects, SSODedicated support

CheckboxGroup

The multi-pick equivalent, with a max that simply ignores ticks past the limit.

Notify me about

ToggleGroup

A segmented control, single or multiple. Icon-only segments require an ariaLabel.

Overlays

Dialogs that behave like dialogs · 6 live

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.

Modal

A real dialog: dimmed page, trapped focus, scroll lock, and nothing rendered at all on the server.

ConfirmDialog

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.

Drawer

A panel from any edge, with identical focus and escape rules to Modal — from the keyboard they are the same thing.

Popover

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.

Tooltip

Appears on hover and on keyboard focus — focus is the half everyone forgets. The tip never takes pointer events.

Toast

A queue, not a cap: extra toasts wait for a slot, timers pause while you hover, and duration 0 stays until dismissed.

Copied to clipboard
Rendered inline, no queue needed.
Data display

Showing the numbers and the people behind them · 15 live

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.

Avatar

Initials are always rendered underneath; the image simply stops covering them when it fails. No layout shift, nothing to configure.

ALGHonlineKJATbusy

AvatarGroup

Overlapping faces with a real +N element — not a pseudo-element, so it survives copy-paste and screen readers.

ALGHKJ+3939 more

Stat

A KPI block. invertDelta exists because the arrow and the colour are different questions — churn up is a rise and bad news.

Downloads
412,908
+12.5%vs last 30 days
Monthly churn
2.1%
+0.4%vs last 30 days
Open issues
7
0%unchanged

Timeline

An <ol>, because the order carries meaning. The connector is drawn by CSS, so items of any height stay joined.

  1. v1.0.0 published

  2. Typecheck passed

  3. Docs deploy

DescriptionList

A real <dl>, each pair wrapped in a div so the label and value stay associated for assistive tech.

Version
1.0.0
Licence
Lacspace Free Licence v1.0
Dependencies
0
Peer
react >= 18

EmptyState

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.

Tag

A chip whose remove control is a real button with its own label — announced as “Remove design”, not as an anonymous ×.

livebetanewlocked
designdocsinfra

TagInput

Type a tag, press Enter. Paste a spreadsheet column, get one tag per line. Backspace on an empty field removes the last.

reactzero-dependency

2 of 6 — paste a comma-separated list to add several.

Rating

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

Kbd

cmd+k becomes two caps and a separator, because one cap reading “cmd+k” lies about which keys you press.

cmdkctrlshiftpesc

Code

Inline code, for a flag or a path inside a sentence.

Pass --fullstack to create-lacspace-app, or --force to overwrite.

Snippet

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/components

Divider

With a label it stays a separator for assistive tech and grows two line segments around the text.

Tree

The ARIA tree pattern in full: Right opens then steps in, Left closes then steps out, and only one row is tabbable.

  • src
    • index.tsx
    • button.tsx
  • README.md

Selected: index

MetricBar

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%.

  • npm41,208
  • GitHub18,840
  • Docs site9,210
  • Other1,180
Feedback

Telling people what is happening · 6 live

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.

Spinner

One element, sized from the current font by default so it sits on the text baseline.

Inline with text

Skeleton

With lines it renders a paragraph shape, the last line shortened — which reads as text far better than equal-width bars.

Progress

With no value it animates indefinitely — the honest way to show work of unknown length.

38% · the third bar has no value, so it is honestly indeterminate

ProgressRing

The compact circular form, for dashboards and cards.

72%
38%

Alert

Anything with the danger tone gets role=alert so it is announced immediately; quieter tones stay polite.

Heads up

The stylesheet is imported once, anywhere in your app.

Key expires in 3 days

Rotate it before Friday or deploys will start failing.

Published to npm

Badge

A small status pill for table cells, list rows and headers — soft or outline, with an optional status dot.

LiveDraftFailingv1.0.0Neutral
@lacspace/charts

Twelve chart types, zero dependencies

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.

MRR$348k+5.8% MoM
Active workspaces1,842+33 this month
Net new seats / wk1033 down weeks in 12
p95 API latency214 ms−54 ms this year

Sparkline · SparkBars

inline

A trend at the size of a word — put it beside the number it describes, never on its own.

  • MRR
  • Plan
Line chart. MRR: 12 points from 182 to 348, ending at 348. Plan: 12 points from 180 to 345, ending at 345.
JanFebMarAprMayJunJulAugSepOctNovDec
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

LineChart

tooltip on

A continuous measure over time, and how it tracked against the plan. Hover for the nearest point.

  • Organic
  • Direct
  • Referral
  • Paid

AreaChart

stacked

What makes up a total. Stack when the parts sum to something meaningful; leave it overlapping to compare them.

  • FY25
  • FY26

BarChart

grouped

Compare discrete buckets side by side. Two or more series group automatically; add `stacked` for composition.

41231824417196

BarChart · horizontal

ranked

Long category names, ranked. Horizontal bars give the labels room that a rotated x axis never does.

42%24%15%11%7%
  • Organic search42%
  • Direct24%
  • Referral15%
  • Social11%
  • Paid7%

PieChart

tooltip on

Parts of one whole, when there are five or fewer of them and the shares are far apart.

14,280orders
  • Asia-Pacific36%
  • Europe28%
  • North America23%
  • Latin America8%
  • Middle East & Africa5%

DonutChart

centre slot

The same question as a pie, but the hole carries the number the chart is really about.

0%100%68%Error budget consumed

Gauge

bands

One number against the range it is allowed to be in. Without threshold bands a gauge is just a number in a circle.

MonTueWedThuFriSatSun0003060912151821
LessMore

Heatmap · matrix

tooltip on

Two categorical axes and one measure — support load by weekday and hour, cohorts, correlations.

MonWedFri
LessMore

Heatmap · calendar

scrolls sideways

A year of a daily count. Kept at its natural cell size and scrolled rather than squashed, because a 2px cell says nothing.

2.557.510ThroughputLatencyDXDocsSecurityCost
  • Meridian Cloud
  • Category median

RadarChart

scorecard

Several things scored on the same axes. The floor stays at zero — a truncated radar exaggerates by area.

Visited pricing48,200 · 100%Started signup19,140 · 40%40% of previousVerified email12,380 · 26%65% of previousCreated a project4,380 · 9%35% of previousConverted to paid1,120 · 2%26% of previous

FunnelChart

conversion

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.

CandlestickChart

tooltip on

Open, high, low and close per period. Hover a candle for the full OHLC.

@lacspace/table

A data table that actually does the work

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.

Columns
Meridian Cloud — sample account book
Expand
Oakfield DigitalEnterpriseActive246$14,268YesM. Silva
AmbercroftEnterpriseActive210$12,180YesM. Silva
Kestrel WorksEnterprisePast due178$10,324YesT. Andersen
Mistral EnergyEnterpriseActive174$10,092NoM. Silva
Westbrook LegalEnterprisePast due142$8,236YesT. Andersen
Lumen PartnersScaleTrial195$6,630YesR. Iyer
Glasshouse CoEnterpriseActive110$6,380YesA. Rahman
Inkwell PressEnterprisePast due106$6,148YesT. Andersen
Xenith RoboticsScaleTrial159$5,406NoR. Iyer
Clearwater DentalGrowthPast due244$4,636NoT. Andersen
4,940$132,215
Selected: 0 of 40Click a row’s chevron to expand it. Shift-click a header for a second sort key.

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.

DataTable

above

The batteries-included table: pass data and columns, switch the features on with booleans.

15 of 12

useTable

headless

The same engine with no markup. Search, sort, paginate and select — rendered as a list instead of a table.

@lacspace/date

Every date field, and no date library

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.

Selected: nothing yet

Calendar

keyboard grid

A month grid on the page rather than in a popover. Arrows move a day, PageUp/PageDown a month, Enter selects.

Value: null

DatePicker

typeable

A real input plus a popover. Typed text is parsed against `format`, and 31/02 is rejected rather than rolled forward.

Start: End: Nights: 0

DateRangePicker

presets

Two months, a hover preview and the reporting shortcuts you would otherwise write by hand every time.

Value: null

TimePicker

spinbuttons

Hours, minutes and an optional AM/PM toggle, each segment its own spinbutton. Type 09, or step with the arrow keys.

Value: null

DateTimePicker

one field

A day and a time in one popover. Picking a day keeps the time already chosen, and vice versa.

Value: null

MonthPicker

12 cells

A reporting period, not a day. Yields the 1st of the month at midnight, so it stores and compares cleanly.

Value: null

YearPicker

paged

A page of years, anchored to the selection rather than to this decade — which is what a date-of-birth field needs.

Week: nothing yet

WeekPicker

whole rows

“Week ending 14 March” fields. Click any day and it takes the whole week; hovering previews the row.

Chosen: 0 / 3Click a slot to book it.

ScheduleGrid

booking

Days across, times down, every cell a real button. Lunch is blocked and you can hold at most three slots.

RelativeTime

self-updating

“3 minutes ago”, kept current — every second while it is seconds, hourly once it is days. Hydration-safe by construction.

Layout

Primitives instead of a utility class soup · 10 live

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.

Card

A bordered surface, plus the parts — CardHeader, CardTitle, CardDescription, CardBody, CardFooter.

Pro

Everything in Starter, plus SSO.

Unlimited projects and a 99.9% uptime target.

Panel

A titled region, optionally collapsible. The body stays mounted and is hidden, so form state and scroll position survive a collapse.

3
Click the header. The content below is hidden, not unmounted.

Stack · HStack · VStack

One-dimensional layout with a gap from the shared scale, and an optional divider between children.

onetwothree
Dividedverticalstack

Grid · GridItem

Give it minColWidth and it reflows on its own container width with no breakpoints at all.

Container

Width-limited, gutter-aware page column. Border-box throughout, so nesting one inside another cannot double the padding.

size="xs" inside a dashed parent

Section

A titled band with consistent rhythm. The heading gets a stable id and is referenced by aria-labelledby, so the landmark is actually labelled.

Deployments

Last 30 days.

Content sits under a properly labelled region.

Center

Centres its children, with a minHeight for heroes and empty states. The layout job everybody rewrites — here once.

Dead centre

AspectRatio

Content is absolutely positioned and clipped, so an image or iframe that reports its own size cannot push the box out of ratio.

ScrollArea · Sticky

Edge shadows toggled by data attributes, so they cost no extra DOM — and a Sticky header that actually sticks inside it.

Sticky header
Row 1 — scroll to see the edge shadows appear.Row 2 — scroll to see the edge shadows appear.Row 3 — scroll to see the edge shadows appear.Row 4 — scroll to see the edge shadows appear.Row 5 — scroll to see the edge shadows appear.Row 6 — scroll to see the edge shadows appear.Row 7 — scroll to see the edge shadows appear.Row 8 — scroll to see the edge shadows appear.Row 9 — scroll to see the edge shadows appear.Row 10 — scroll to see the edge shadows appear.Row 11 — scroll to see the edge shadows appear.Row 12 — scroll to see the edge shadows appear.

Spacer

Empty space. With no size it flexes, pushing its siblings to the ends of the row.

Total$1,204.00
Typography

Text with the scale built in · 6 live

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.

Text

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.

Heading

level is the tag, size is the look. Coupling them is how pages end up with an h4 before an h2.

Display

Size 2, tag h3

Size 4, muted

Prose

Styles raw markup you did not author — rendered Markdown, a CMS field, an email body — without adding a single class to it.

Theming

Override any variable in your own CSS. The ones most people touch are --lac-accent and --lac-radius.

  • No class names are added to your HTML.
  • Line length is constrained to a reading measure.

Blockquote

A quotation with its attribution marked up as a footer/cite pair, the way HTML intends.

Restyled by variables, not by forking.
The README@lacspace/components

Highlight

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.

Truncate

Middle-ellipsis for ids, hashes and paths. CSS text-overflow can only cut the end, which destroys the half that identifies the thing.

/Users/ada/projec…onents/index.tsx9f2c4a8117…21d7f8a90
Full reference

Every export, nothing hidden

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.

@lacspace/components

96 components · 175 runtime exports · 159 types

Buttons, inputs, overlays, navigation, data display, layout and type — the whole application surface.

GroupExports
Utilities & hooks
cxclamppercentuseControllableuseStableId
SizeTone
Stylesheet
LacspaceStylescomponentsCss
Actions
ButtonButtonGroupIconButton
ButtonPropsButtonGroupPropsButtonVariantIconButtonProps
Feedback
SpinnerSkeletonProgressProgressRing
SpinnerPropsSkeletonPropsProgressPropsProgressRingProps
Surfaces
CardCardHeaderCardBodyCardFooterCardTitleCardDescriptionAlertBadge
CardPropsAlertPropsBadgeProps
Form basics
FieldLabelInputTextareaSelectCheckboxRadioSwitch
FieldPropsLabelPropsInputPropsTextareaPropsSelectPropsSelectOptionCheckboxPropsRadioPropsSwitchProps
Overlays
BackdropModalConfirmDialogDrawerPopoverTooltipToastToastProvideruseToastpositionFloatingplacementFitsoppositePlacementnextFocusIndextoastReducervisibleToasts
BackdropPropsModalPropsModalSizeConfirmDialogPropsDrawerPropsDrawerSidePopoverPropsTooltipPropsToastPropsToastProviderPropsToastOptionsToastApiToastPositionToastRecordToastStateToastActionPlacementAnchorRectFloatingSizeViewportSizePositionOptionsPositionResult
Navigation
TabsTabListTabTabPanelAccordionAccordionItemBreadcrumbsPaginationStepperDropdownMenuNavListNavSectionNavItemToolbarToolbarGroupToolbarSeparatorELLIPSISpaginationRangecollapseBreadcrumbsrovingIndexfirstEnabledIndexlastEnabledIndextypeaheadBuffertypeaheadMatchderiveStepStatestoggleAccordionValue
TabsPropsTabsVariantTabListPropsTabPropsTabPanelPropsAccordionPropsAccordionVariantAccordionItemPropsBreadcrumbsPropsBreadcrumbItemBreadcrumbSlotPaginationPropsPaginationLabelsPaginationSlotStepperPropsStepItemStepStateStepStateOptionsDropdownMenuPropsDropdownMenuItemDropdownMenuActionDropdownMenuSeparatorDropdownMenuLabelNavListPropsNavSectionPropsNavItemPropsToolbarPropsToolbarGroupPropsToolbarSeparatorProps
Data display
AvatarAvatarGroupStatTimelineTimelineItemDescriptionListEmptyStateTagTagInputRatingKbdCodeSnippetDividerTreeMetricBarAVATAR_COLOR_COUNTTAG_SEPARATORSinitialscolorIndexForsplitAvatarOverflowformatDeltadeltaToneroundToHalfnormalizeRatingsplitKeyssplitTagInputmergeTagsnormalizeMetricsflattenTree
AvatarPropsAvatarGroupPropsAvatarSizeStatPropsTimelinePropsTimelineItemPropsDescriptionListPropsDescriptionItemEmptyStatePropsTagPropsTagInputPropsRatingPropsKbdPropsCodePropsSnippetPropsDividerPropsTreePropsTreeNodeMetricBarPropsMetricItemAvatarOverflowDeltaDirectionDeltaInfoFormatDeltaOptionsMergeTagsOptionsMergeTagsResultNormalizedMetricFlatTreeNode
Layout
StackHStackVStackGridGridItemContainerSectionSpacerCenterAspectRatioScrollAreaStickyPanelspaceTokenlengthTokengridTemplatespanValueresolveResponsiveresponsiveVarsratioToPercentscrollEdges
StackPropsStackDirectionGridPropsGridItemPropsContainerPropsContainerSizeSectionPropsSpacerPropsCenterPropsAspectRatioPropsScrollAreaPropsStickyPropsPanelPropsBreakpointResponsiveResponsiveMapSpaceValueScrollEdgeState
Typography
TextHeadingProseBlockquoteHighlightTruncatetruncateMiddlesplitHighlight
TextPropsTextSizeTextToneTextWeightHeadingPropsHeadingLevelProsePropsBlockquotePropsHighlightPropsTruncatePropsHighlightPart
Advanced form controls
SliderNumberInputPinInputComboboxMultiSelectSearchInputPasswordInputFileDropColorInputRadioGroupCheckboxGroupToggleGroupFieldsetsnapToStepsliderValueToPercentpercentToSliderValueorderThumbssetThumbValuemoveThumbnearestThumbdecimalPlacesroundToclampNumberparseNumericInputformatNumberValuegroupThousandsstepNumberpinPatternpadPindistributePinfirstEmptyPinIndexdefaultComboboxFilterfilterOptionsmoveHighlightnextEnabledIndexscorePasswordCOMMON_PASSWORDSmatchesAcceptvalidateFilesformatBytesisValidHexnormalizeHexhexWithoutAlphatoggleSelectiondebounce
SliderPropsSliderValueSliderMarkSliderScaleNumberInputPropsNumberFormatOptionsNumberStepOptionsPinInputPropsPinTypeComboboxPropsComboboxOptionMultiSelectPropsSearchInputPropsPasswordInputPropsPasswordStrengthFileDropPropsFileLikeFileRejectionFileRejectionReasonFileValidationOptionsColorInputPropsRadioGroupPropsCheckboxGroupPropsChoiceOptionToggleGroupPropsToggleGroupItemToggleSelectionOptionsFieldsetPropsDebounced

@lacspace/charts

19 components · 60 runtime exports · 39 types

Real SVG marks: line, area, bar, pie, donut, sparkline, gauge, heatmap, radar, funnel and candlestick. No canvas, no D3.

GroupExports
Utilities & hooks
cxclassesclamppercentuseStableId
SizeTone
Stylesheet
LacspaceChartStyleschartsCss
Scales, geometry & formatting
extentpadDegenerateniceNumniceTicksniceDomainroundToStepsumlinearScalebandScaleplotAreaDEFAULT_MARGINstackSeriesstackExtentlinePathsmoothPathareaPathpolygonPathroundedBarPathpolarPointarcPathpieSlicesgaugeAngleDEFAULT_PALETTEcolorAtparseHexmixColorheatColorformatNumberformatPercentdescribeSeriesnearestPointohlcExtentcandleDirectionfunnelStagescalendarCells
PointLinearScaleBandScaleMarginPlotStackBandSliceHitCandleFunnelStageCalendarCell
Shared chart parts
ChartFrameChartGridChartAxisChartLegendChartTooltipChartDataTable
SeriesChartBasePropsChartFramePropsChartGridPropsChartAxisPropsAxisTickChartLegendPropsLegendItemChartTooltipPropsTooltipRowChartDataTableProps
Line & area
LineChartAreaChart
CartesianChartPropsAreaChartProps
Bars
BarChart
BarChartProps
Pie & donut
PieChartDonutChart
PieChartPropsDonutChartPropsPieDatum
Sparklines
SparklineSparkBars
SparklinePropsSparkBarsProps
Gauge
Gauge
GaugePropsGaugeBand
Heatmap
Heatmap
HeatmapProps
Radar
RadarChart
RadarChartProps
Funnel
FunnelChart
FunnelChartPropsFunnelDatum
Candlestick
CandlestickChart
CandlestickChartProps

@lacspace/table

17 components · 87 runtime exports · 59 types

Sorting, filtering, search, pagination, selection, resizing, pinning and CSV export — with the whole engine exported as pure functions.

GroupExports
The table
DataTable
DataTablePropsRowDetailContext
Headless engine hook
useTableinferRowId
UseTableOptionsTableInstanceTableRowModelExportScope
Table parts
TableTableScrollTableCaptionTHeadTBodyTFootTrThTdTableToolbarTableSearchTableCheckboxTableColumnsMenuTablePaginationTableEmpty
TablePropsTableScrollPropsTableCaptionPropsTrPropsThPropsTdPropsPinPropsDensityTableToolbarPropsTableSearchPropsTableCheckboxPropsTableColumnsMenuPropsColumnToggleTablePaginationPropsPaginationLabelsTableEmptyProps
Column builders
defineColumndefineColumnsresolveColumnresolveColumnscolumnReadersortFieldsFromfilterFieldsFromexportColumnsFromtextColumnnumberColumncurrencyColumndateColumnbadgeColumnbooleanColumnlinkColumnactionsColumncustomColumnformatNumberformatCurrencyformatDatetoDateDEFAULT_COLUMN_WIDTH
ColumnDefAnyColumnCommonColumnOptionsResolvedColumnCellContextFooterContextTextColumnOptionsNumberColumnOptionsCurrencyColumnOptionsDateColumnOptionsBadgeColumnOptionsBooleanColumnOptionsLinkColumnOptionsActionsColumnOptionsCustomColumnOptionsRowActionNumberFormatOptionsCurrencyFormatOptionsDateFormatOptions
Engine — pure functions
isBlanktoNumbertoTextdefaultComparesortRowssortDirectionOfsortIndexOfcycleSortisNumberRangeisEmptyFiltermatchesFiltermatchesQueryfilterRowssearchableIdspageCountclampPagepageSlicepageRangepageForSizeChangepageTokenstoggleSelectedsetSelectionselectionModeisIndeterminatepruneSelectionclampColumnWidthresizeColumnpinnedOffsetsMIN_COLUMN_WIDTHMAX_COLUMN_WIDTHaggregatenumericValuesneutraliseFormulaescapeCelltoDelimitedtoCsvtoTsvexportRowsdownloadCsvFORMULA_PREFIXES
SortDirectionSortRuleSortStateSortFieldNumberRangeFilterValueFilterFieldFilterOptionsPageTokenSelectionStateSelectionModeAggregateFnExportColumnExportOptionsDelimitedOptions
Stylesheet
TableStylestableCss
Utilities & hooks
cxclassesclampuseControllableuseStableId
SizeToneAlign

@lacspace/date

11 components · 96 runtime exports · 26 types

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.

GroupExports
Stylesheet
DateStylesdateCss
Utilities & hooks
cxclassesclampuseControllableuseStableId
Size
Calendar family
CalendarMonthPickerYearPickerWeekPickeruseDayFocus
CalendarPropsDayRulePropsMonthPickerPropsYearPickerPropsWeekPickerProps
Picker family
DatePickerDateRangePickerDateTimePicker
DatePickerPropsDateRangePickerPropsDateTimePickerPropsPickerBaseProps
Time
TimePicker
TimePickerProps
Schedule
ScheduleGrid
ScheduleGridProps
Relative time
RelativeTime
RelativeTimeProps
Date engine — pure functions
makeDatecloneDateisValidDateisLeapYeardaysInMonthstartOfDayendOfDaystartOfWeekendOfWeekstartOfMonthendOfMonthstartOfYearendOfYearaddDaysaddWeeksaddMonthsaddYearsaddMinutesaddHoursisSameDayisSameMonthisSameYearisSameWeekcompareDayisBeforeDayisAfterDaydiffInDaysdiffInMonthsclampDatemonthGridweekdayOrdereachDayOfIntervalweekDaysisoWeekNumbernextFocusFromKeyisCompleteRangenormalizeRangeisInRangeisRangeStartisRangeEndpreviewRangeisInPreviewRangenightsBetweenisRangeAllowedselectRangeDatedefaultPresetsisDateDisabledisMonthDisabledisYearDisablednextEnabledDateresolveLocaleformatIntlmonthNamesweekdayNamesfullDateLabelmonthLabelformatDateparseDateutcStampgetTimeValuesetTimeValueroundToStepfloorToStepnormalizeTimeto12Hourfrom12HourstepTimePartformatTimeValueparseTimeTextdaySlotsscheduleDaysslotKeyhasSlottoggleSlotrelativePartsrelativeFallbackformatRelativerelativeRefreshMs
WeekdayCalendarDayMonthGridOptionsDateRangeCompleteRangeRangeLimitsRangePresetDisabledRulesTimeValueTimeStepsSlotSpecRelativeUnitRelativeParts
Start with one line

Install it, then restyle it

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.