sunkit-ui 0.1.0-alpha.1 → 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,12 +4,10 @@ A pastel React component library with soft shadows, spring animations, and Web A
4
4
 
5
5
  Built with **React 19**, **Tailwind CSS v4**, and **class-variance-authority**. Zero runtime dependencies beyond React.
6
6
 
7
- ---
8
-
9
7
  ## Installation
10
8
 
11
9
  ```bash
12
- pnpm add sunkit
10
+ pnpm add sunkit-ui@alpha
13
11
  ```
14
12
 
15
13
  Peer dependencies (install if not already present):
@@ -18,8 +16,6 @@ Peer dependencies (install if not already present):
18
16
  pnpm add react react-dom
19
17
  ```
20
18
 
21
- ---
22
-
23
19
  ## Setup
24
20
 
25
21
  Sunkit ships a CSS file that must be imported once — it registers the Tailwind theme (pastel colour tokens) and the utility classes (`btn-shadow`, keyframe animations, etc.).
@@ -41,401 +37,10 @@ Add the sunkit CSS layer to your global stylesheet:
41
37
  import 'sunkit/dist/sunkit.css'
42
38
  ```
43
39
 
44
- ---
45
-
46
- ## Components
47
-
48
- ### Button
49
-
50
- A tactile pastel button with shadow, hover brightness, press scale, and Web Audio click sound.
51
-
52
- ```tsx
53
- import { Button } from 'sunkit'
54
-
55
- <Button color="lavender">Click me</Button>
56
- <Button color="mint" size="sm" icon="left">With icon</Button>
57
- <Button color="sky" size="icon-only" icon="only" aria-label="Star" />
58
- ```
59
-
60
- | Prop | Type | Default |
61
- |-------------|----------------------------------------------------------------------|--------------|
62
- | `color` | `'rose'│'peach'│'lemon'│'mint'│'sky'│'lavender'│'lilac'│'neutral'` | `'lavender'` |
63
- | `size` | `'default'│'sm'│'icon-only'` | `'default'` |
64
- | `icon` | `'none'│'left'│'right'│'only'` | `'none'` |
65
- | `iconLeft` | `ReactNode` | — |
66
- | `iconRight` | `ReactNode` | — |
67
- | `iconOnly` | `ReactNode` | — |
68
- | `radius` | `number` (px) | `10` |
69
-
70
- ---
71
-
72
- ### Toggle
73
-
74
- An iOS-style switch with spring knob animation and squish-on-press. Plays distinct snap sounds on/off.
75
-
76
- ```tsx
77
- import { Toggle } from 'sunkit'
78
-
79
- <Toggle label="Airplane mode" tone="sky" />
80
-
81
- // Controlled
82
- const [on, setOn] = useState(false)
83
- <Toggle checked={on} onCheckedChange={setOn} tone="mint" label="Notifications" />
84
- ```
85
-
86
- | Prop | Type | Default |
87
- |--------------------|-------------------------|-------------|
88
- | `tone` | pastel tone | `'neutral'` |
89
- | `size` | `'default'│'sm'` | `'default'` |
90
- | `checked` | `boolean` | — |
91
- | `defaultChecked` | `boolean` | `false` |
92
- | `onCheckedChange` | `(checked: boolean) =>` | — |
93
- | `label` | `ReactNode` | — |
94
- | `description` | `ReactNode` | — |
95
- | `disabled` | `boolean` | `false` |
96
-
97
- ---
98
-
99
- ### Input
100
-
101
- A text input with three visually distinct variants. Plays a gentle focus chime.
102
-
103
- ```tsx
104
- import { Input } from 'sunkit'
105
-
106
- <Input label="Email" placeholder="you@example.com" tone="lavender" />
107
- <Input variant="filled" label="Search" placeholder="Search…" />
108
- <Input variant="ghost" label="Notes" placeholder="Type anything…" />
109
-
110
- // With adornments
111
- <Input
112
- label="Amount"
113
- leftAdornment={<span>$</span>}
114
- rightAdornment={<span>USD</span>}
115
- />
116
-
117
- // With error
118
- <Input label="Email" error="Please enter a valid email." tone="rose" />
119
- ```
120
-
121
- | Prop | Type | Default |
122
- |--------------------|-----------------------------------|--------------|
123
- | `variant` | `'default'│'filled'│'ghost'` | `'default'` |
124
- | `tone` | pastel tone | `'neutral'` |
125
- | `size` | `'default'│'sm'` | `'default'` |
126
- | `label` | `ReactNode` | — |
127
- | `description` | `ReactNode` | — |
128
- | `error` | `ReactNode` | — |
129
- | `leftAdornment` | `ReactNode` | — |
130
- | `rightAdornment` | `ReactNode` | — |
131
- | `radius` | `number` (px) | `12` |
132
- | `invalid` | `boolean` | auto |
133
-
134
- ---
135
-
136
- ### Select
137
-
138
- A custom dropdown (no native `<select>`) with keyboard navigation, optional search, and matching Input variants.
139
-
140
- ```tsx
141
- import { Select } from 'sunkit'
142
-
143
- const options = [
144
- { value: 'apple', label: 'Apple' },
145
- { value: 'mango', label: 'Mango' },
146
- { value: 'lemon', label: 'Lemon', disabled: true },
147
- ]
148
-
149
- <Select options={options} label="Fruit" placeholder="Pick one…" tone="peach" />
150
- <Select options={options} searchable label="Search & select" />
151
-
152
- // Controlled
153
- const [val, setVal] = useState('')
154
- <Select options={options} value={val} onChange={setVal} />
155
- ```
156
-
157
- | Prop | Type | Default |
158
- |---------------|------------------------------|--------------|
159
- | `options` | `SelectOption[]` (required) | — |
160
- | `value` | `string` | — |
161
- | `defaultValue`| `string` | — |
162
- | `onChange` | `(value: string) => void` | — |
163
- | `placeholder` | `string` | `'Select…'` |
164
- | `searchable` | `boolean` | `false` |
165
- | `variant` | `'default'│'filled'│'ghost'` | `'default'` |
166
- | `tone` | pastel tone | `'neutral'` |
167
- | `size` | `'default'│'sm'` | `'default'` |
168
- | `label` | `ReactNode` | — |
169
- | `description` | `ReactNode` | — |
170
- | `error` | `ReactNode` | — |
171
- | `disabled` | `boolean` | `false` |
172
-
173
- ---
174
-
175
- ### Slider
176
-
177
- A styled range input with a spring-animated thumb that squishes on press. Emits pitched scrub sounds.
178
-
179
- ```tsx
180
- import { Slider } from 'sunkit'
181
-
182
- <Slider label="Volume" min={0} max={100} defaultValue={50} tone="lavender" showValue />
183
-
184
- // With marks
185
- <Slider
186
- label="Quality"
187
- min={0} max={100} step={25}
188
- marks={[
189
- { value: 0, label: 'Low' },
190
- { value: 50, label: 'Med' },
191
- { value: 100, label: 'High' },
192
- ]}
193
- />
194
-
195
- // Controlled
196
- const [val, setVal] = useState(40)
197
- <Slider value={val} onValueChange={setVal} tone="mint" />
198
- ```
199
-
200
- | Prop | Type | Default |
201
- |-----------------|------------------------------|--------------|
202
- | `min` | `number` | `0` |
203
- | `max` | `number` | `100` |
204
- | `step` | `number` | `1` |
205
- | `value` | `number` | — |
206
- | `defaultValue` | `number` | `0` |
207
- | `onValueChange` | `(value: number) => void` | — |
208
- | `tone` | pastel tone | `'lavender'` |
209
- | `size` | `'default'│'sm'` | `'default'` |
210
- | `label` | `ReactNode` | — |
211
- | `description` | `ReactNode` | — |
212
- | `showValue` | `boolean` | `false` |
213
- | `marks` | `{ value: number; label?: string }[]` | — |
214
- | `disabled` | `boolean` | `false` |
215
-
216
- ---
217
-
218
- ### Textarea
219
-
220
- A multi-line text input that matches Input's variants and tones. Supports auto-resize and character count.
221
-
222
- ```tsx
223
- import { Textarea } from 'sunkit'
224
-
225
- <Textarea label="Message" rows={4} tone="sky" />
226
- <Textarea variant="filled" autoResize label="Notes" />
227
- <Textarea maxLength={200} showCount label="Bio" />
228
- ```
229
-
230
- | Prop | Type | Default |
231
- |---------------|------------------------------|-------------|
232
- | `variant` | `'default'│'filled'│'ghost'` | `'default'` |
233
- | `tone` | pastel tone | `'neutral'` |
234
- | `label` | `ReactNode` | — |
235
- | `description` | `ReactNode` | — |
236
- | `error` | `ReactNode` | — |
237
- | `rows` | `number` | `4` |
238
- | `autoResize` | `boolean` | `false` |
239
- | `showCount` | `boolean` | `false` |
240
- | `maxLength` | `number` | — |
241
- | `radius` | `number` (px) | `12` |
242
-
243
- ---
244
-
245
- ### Progress
246
-
247
- A progress bar with determinate and indeterminate states.
248
-
249
- ```tsx
250
- import { Progress } from 'sunkit'
251
-
252
- <Progress value={65} tone="lavender" label="Uploading…" showValue />
253
- <Progress tone="sky" label="Loading…" /> {/* indeterminate */}
254
- ```
255
-
256
- | Prop | Type | Default |
257
- |-------------|----------------------------|--------------|
258
- | `value` | `number` (0–100) | indeterminate if omitted |
259
- | `tone` | pastel tone | `'lavender'` |
260
- | `size` | `'sm'│'default'│'lg'` | `'default'` |
261
- | `label` | `ReactNode` | — |
262
- | `showValue` | `boolean` | `false` |
263
- | `animated` | `boolean` | `true` |
264
-
265
- ---
266
-
267
- ### Card
268
-
269
- A versatile container with elevated, filled, and outline variants. Includes `Card.Header`, `Card.Body`, and `Card.Footer`.
270
-
271
- ```tsx
272
- import { Card } from 'sunkit'
273
-
274
- <Card tone="lavender" variant="elevated" style={{ maxWidth: 360 }}>
275
- <Card.Header>
276
- <h3>Title</h3>
277
- </Card.Header>
278
- <Card.Body>
279
- <p>Body content here.</p>
280
- </Card.Body>
281
- <Card.Footer>
282
- <Button size="sm" color="lavender">Action</Button>
283
- </Card.Footer>
284
- </Card>
285
-
286
- {/* Simple card with inline padding */}
287
- <Card tone="mint" variant="filled" padding={24}>
288
- <p>No subcomponents needed.</p>
289
- </Card>
290
- ```
291
-
292
- | Prop | Type | Default |
293
- |------------|-----------------------------------|--------------|
294
- | `variant` | `'elevated'│'filled'│'outline'` | `'elevated'` |
295
- | `tone` | pastel tone | `'neutral'` |
296
- | `radius` | `number` (px) | `16` |
297
- | `padding` | `number│string` | — |
298
- | `as` | `ElementType` | `'div'` |
299
-
300
- ---
301
-
302
- ### ColorPicker
303
-
304
- A swatch palette for picking one of the 8 pastel tones. Each color plays a unique pitched pluck.
305
-
306
- ```tsx
307
- import { ColorPicker } from 'sunkit'
308
- import type { ButtonColor } from 'sunkit'
309
-
310
- <ColorPicker label="Theme colour" defaultValue="lavender" />
311
-
312
- // Controlled
313
- const [color, setColor] = useState<ButtonColor>('sky')
314
- <ColorPicker value={color} onChange={setColor} />
315
- ```
316
-
317
- | Prop | Type | Default |
318
- |----------------|-------------------------------|-------------|
319
- | `value` | `ButtonColor` | — |
320
- | `defaultValue` | `ButtonColor` | — |
321
- | `onChange` | `(value: ButtonColor) => void`| — |
322
- | `size` | `'default'│'sm'` | `'default'` |
323
- | `label` | `ReactNode` | — |
324
- | `description` | `ReactNode` | — |
325
- | `disabled` | `boolean` | `false` |
326
-
327
- ---
328
-
329
- ### DatePicker
330
-
331
- A fully custom calendar popover — no external dependencies. Full keyboard navigation and min/max date support.
332
-
333
- ```tsx
334
- import { DatePicker } from 'sunkit'
335
-
336
- <DatePicker label="Start date" tone="lavender" />
337
-
338
- // Controlled
339
- const [date, setDate] = useState<Date | null>(null)
340
- <DatePicker value={date} onChange={setDate} />
341
-
342
- // With constraints
343
- <DatePicker
344
- minDate={new Date()}
345
- maxDate={new Date(Date.now() + 30 * 86400000)}
346
- label="Appointment"
347
- />
348
- ```
349
-
350
- | Prop | Type | Default |
351
- |----------------|-------------------------------|------------------|
352
- | `value` | `Date│null` | — |
353
- | `defaultValue` | `Date│null` | `null` |
354
- | `onChange` | `(date: Date│null) => void` | — |
355
- | `minDate` | `Date` | — |
356
- | `maxDate` | `Date` | — |
357
- | `tone` | pastel tone | `'lavender'` |
358
- | `size` | `'default'│'sm'` | `'default'` |
359
- | `placeholder` | `string` | `'Pick a date…'` |
360
- | `label` | `ReactNode` | — |
361
- | `description` | `ReactNode` | — |
362
- | `disabled` | `boolean` | `false` |
363
-
364
- ---
365
-
366
- ### Alert
367
-
368
- An animated feedback strip for info, success, warning, and error states.
369
-
370
- ```tsx
371
- import { Alert } from 'sunkit'
372
-
373
- <Alert variant="success" title="Saved!" dismissable>
374
- Your changes have been saved.
375
- </Alert>
376
-
377
- <Alert variant="error">Something went wrong. Please try again.</Alert>
378
-
379
- // Custom icon
380
- <Alert variant="info" icon={<MyIcon />} title="Note">
381
- Custom icon support.
382
- </Alert>
383
- ```
384
-
385
- | Prop | Type | Default |
386
- |---------------|-----------------------------------------|------------|
387
- | `variant` | `'info'│'success'│'warning'│'error'` | `'info'` |
388
- | `title` | `ReactNode` | — |
389
- | `children` | `ReactNode` | — |
390
- | `dismissable` | `boolean` | `false` |
391
- | `onDismiss` | `() => void` | — |
392
- | `icon` | `ReactNode` | auto |
393
-
394
- ---
395
-
396
- ## Pastel tones
397
-
398
- All toned components accept a `tone` prop from this palette:
399
-
400
- | Token | Light | Dark |
401
- |-------------|--------------------|--------------------|
402
- | `rose` | `#F9C5D1` | `#c2607a` |
403
- | `peach` | `#FDDBB4` | `#b87a3a` |
404
- | `lemon` | `#FFF1A8` | `#8a7820` |
405
- | `mint` | `#B8F0D8` | `#2a7a58` |
406
- | `sky` | `#B8DFFE` | `#2a68a0` |
407
- | `lavender` | `#D4C5F9` | `#5a3eaa` |
408
- | `lilac` | `#F0C8F0` | `#8a3a8a` |
409
- | `neutral` | `#E8E4DC` | `#5a5550` |
410
-
411
- Import the token list directly:
412
-
413
- ```ts
414
- import { COLORS, COLOR_MAP } from 'sunkit'
415
-
416
- COLORS // ColorToken[] — array of all tones
417
- COLOR_MAP // Record<ButtonColor, { hex, darkHex }>
418
- ```
419
-
420
- ---
421
-
422
40
  ## Sound design
423
41
 
424
42
  Every interactive component has its own sonic identity using the Web Audio API. All sounds are synthesised at runtime — no audio files required, and they respect system `prefers-reduced-motion` preferences in future releases.
425
43
 
426
- | Component | Sound |
427
- |--------------|-------------------------------------------------|
428
- | Button | Soft sine press + bright triangle release |
429
- | Toggle | Ascending double-click (on) / descending (off) |
430
- | Input | Descending sine "ting" on focus |
431
- | Textarea | Same as Input |
432
- | Select | Airy pop on open, crisp tick on select |
433
- | Slider | Pitched scrub — frequency maps to value |
434
- | ColorPicker | Soft pluck, pitch varies per tone |
435
- | DatePicker | Whoosh on month nav, ting on date select |
436
-
437
- ---
438
-
439
44
  ## Storybook
440
45
 
441
46
  Browse all components interactively:
@@ -446,8 +51,6 @@ pnpm run storybook
446
51
 
447
52
  Opens at [http://localhost:6006](http://localhost:6006).
448
53
 
449
- ---
450
-
451
54
  ## Build
452
55
 
453
56
  ```bash
@@ -455,9 +58,3 @@ pnpm run build
455
58
  ```
456
59
 
457
60
  Outputs to `dist/` — an ES module, CJS bundle, and `.d.ts` type declarations.
458
-
459
- ---
460
-
461
- ## License
462
-
463
- MIT
@@ -2,9 +2,11 @@ import { ButtonHTMLAttributes, ReactNode, Ref } from 'react';
2
2
  import { ButtonColor } from '../../tokens/colors';
3
3
  export type { ButtonColor };
4
4
  export type ButtonSize = 'default' | 'sm' | 'icon-only';
5
+ export type ButtonVariant = 'solid' | 'outline' | 'ghost';
5
6
  export type ButtonIconPosition = 'none' | 'left' | 'right' | 'only';
6
7
  export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
7
8
  ref?: Ref<HTMLButtonElement>;
9
+ variant?: ButtonVariant;
8
10
  color?: ButtonColor;
9
11
  accentColor?: string;
10
12
  size?: ButtonSize;
@@ -15,4 +17,4 @@ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
15
17
  radius?: number;
16
18
  children?: ReactNode;
17
19
  }
18
- export declare function Button({ ref: externalRef, color, accentColor: accentColorProp, size, icon, iconLeft, iconRight, iconOnly, radius, children, className, style, ...rest }: ButtonProps): import("react/jsx-runtime").JSX.Element;
20
+ export declare function Button({ ref: externalRef, variant, color, accentColor: accentColorProp, size, icon, iconLeft, iconRight, iconOnly, radius, children, className, style, onMouseEnter, onMouseLeave, ...rest }: ButtonProps): import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { ElementType, ReactNode, HTMLAttributes } from 'react';
2
2
  import { VariantProps } from 'class-variance-authority';
3
3
  declare const cardVariants: (props?: ({
4
- variant?: "filled" | "elevated" | "outline" | null | undefined;
4
+ variant?: "filled" | "outline" | "elevated" | null | undefined;
5
5
  tone?: "custom" | "rose" | "peach" | "lemon" | "mint" | "sky" | "lavender" | "lilac" | "neutral" | null | undefined;
6
6
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
7
7
  export type CardTone = NonNullable<VariantProps<typeof cardVariants>['tone']>;
@@ -0,0 +1,24 @@
1
+ import { ReactNode } from 'react';
2
+ export type CheckboxTone = 'rose' | 'peach' | 'lemon' | 'mint' | 'sky' | 'lavender' | 'lilac' | 'neutral';
3
+ export type CheckboxSize = 'default' | 'sm';
4
+ export interface CheckboxProps {
5
+ checked?: boolean;
6
+ defaultChecked?: boolean;
7
+ indeterminate?: boolean;
8
+ onCheckedChange?: (checked: boolean) => void;
9
+ label?: ReactNode;
10
+ description?: ReactNode;
11
+ error?: ReactNode;
12
+ tone?: CheckboxTone;
13
+ accentColor?: string;
14
+ size?: CheckboxSize;
15
+ disabled?: boolean;
16
+ required?: boolean;
17
+ id?: string;
18
+ name?: string;
19
+ value?: string;
20
+ 'aria-describedby'?: string;
21
+ containerClassName?: string;
22
+ className?: string;
23
+ }
24
+ export declare const Checkbox: import('react').ForwardRefExoticComponent<CheckboxProps & import('react').RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,2 @@
1
+ export { Checkbox } from './Checkbox';
2
+ export type { CheckboxProps, CheckboxTone, CheckboxSize } from './Checkbox';
@@ -1,2 +1,2 @@
1
1
  export { DatePicker } from './DatePicker';
2
- export type { DatePickerProps, DatePickerTone, DatePickerSize, DatePickerMode, DateRange } from './DatePicker';
2
+ export type { DatePickerProps, DatePickerTone, DatePickerSize, DatePickerMode, DateRange, } from './DatePicker';
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+ export type DialogTone = 'rose' | 'peach' | 'lemon' | 'mint' | 'sky' | 'lavender' | 'lilac' | 'neutral';
3
+ export type DialogSize = 'sm' | 'default' | 'lg' | 'full';
4
+ export interface DialogProps {
5
+ open?: boolean;
6
+ defaultOpen?: boolean;
7
+ onOpenChange?: (open: boolean) => void;
8
+ trigger?: ReactNode;
9
+ title?: ReactNode;
10
+ description?: ReactNode;
11
+ children?: ReactNode;
12
+ footer?: ReactNode;
13
+ size?: DialogSize;
14
+ closable?: boolean;
15
+ closeOnOverlay?: boolean;
16
+ tone?: DialogTone;
17
+ accentColor?: string;
18
+ radius?: number;
19
+ className?: string;
20
+ }
21
+ export declare function Dialog({ open: openProp, defaultOpen, onOpenChange, trigger, title, description, children, footer, size, closable, closeOnOverlay, tone, accentColor: accentColorProp, radius, className, }: DialogProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,2 @@
1
+ export { Dialog } from './Dialog';
2
+ export type { DialogProps, DialogTone, DialogSize } from './Dialog';
@@ -0,0 +1,19 @@
1
+ import { CSSProperties, MouseEvent, ReactNode } from 'react';
2
+ export type ShapeType = 'circle' | 'square' | 'triangle' | 'triangle-down' | 'diamond' | 'pentagon' | 'hexagon' | 'hexagon-flat' | 'octagon' | 'star4' | 'star5' | 'star6' | 'heart' | 'parallelogram' | 'shield' | 'cross' | 'arrow-right' | 'arrow-left' | 'arrow-up' | 'arrow-down';
3
+ export type ShapeColor = 'rose' | 'peach' | 'lemon' | 'mint' | 'sky' | 'lavender' | 'lilac' | 'neutral';
4
+ export interface ShapeProps {
5
+ shape?: ShapeType;
6
+ size?: number | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
7
+ color?: ShapeColor;
8
+ accentColor?: string;
9
+ /** Corner rounding for polygon shapes (0–49). Works on all shapes with vertices. */
10
+ radius?: number;
11
+ rotation?: number;
12
+ clickable?: boolean;
13
+ onClick?: (e: MouseEvent<HTMLElement>) => void;
14
+ children?: ReactNode;
15
+ className?: string;
16
+ style?: CSSProperties;
17
+ as?: 'div' | 'button';
18
+ }
19
+ export declare function Shape({ shape, size, color, accentColor: accentColorProp, radius, rotation, clickable, onClick, children, className, style, as, }: ShapeProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export { Shape } from './Shape';
2
+ export type { ShapeProps, ShapeType, ShapeColor } from './Shape';
@@ -0,0 +1,2 @@
1
+ import { RefObject } from 'react';
2
+ export declare function useCheckboxSound(ref: RefObject<HTMLInputElement | null>, checked: boolean): void;
@@ -0,0 +1,4 @@
1
+ export declare function useDialogSound(): {
2
+ playOpen: () => void;
3
+ playClose: () => void;
4
+ };
package/dist/index.d.ts CHANGED
@@ -17,9 +17,15 @@ export type { CardProps, CardTone, CardVariant } from './components/Card';
17
17
  export { ColorPicker } from './components/ColorPicker';
18
18
  export type { ColorPickerProps, ColorPickerSize } from './components/ColorPicker';
19
19
  export { DatePicker } from './components/DatePicker';
20
- export type { DatePickerProps, DatePickerTone, DatePickerSize, DatePickerMode, DateRange } from './components/DatePicker';
20
+ export type { DatePickerProps, DatePickerTone, DatePickerSize, DatePickerMode, DateRange, } from './components/DatePicker';
21
21
  export { Alert } from './components/Alert';
22
22
  export type { AlertProps, AlertVariant } from './components/Alert';
23
+ export { Dialog } from './components/Dialog';
24
+ export type { DialogProps, DialogTone, DialogSize } from './components/Dialog';
25
+ export { Checkbox } from './components/Checkbox';
26
+ export type { CheckboxProps, CheckboxTone, CheckboxSize } from './components/Checkbox';
27
+ export { Shape } from './components/Shape';
28
+ export type { ShapeProps, ShapeType, ShapeColor } from './components/Shape';
23
29
  export { ThemeProvider, ThemeContext, useTheme } from './components/Theme';
24
30
  export type { ThemeProviderProps, ThemeContextValue } from './components/Theme';
25
31
  export type { ColorToken } from './tokens/colors';
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Returns true if the given hex color is light enough for dark text to be readable on it.
3
+ * Uses WCAG relative luminance — threshold ~0.23 (geometric mean of black/white luminance).
4
+ */
5
+ export declare function isColorLight(hex: string): boolean;
1
6
  /**
2
7
  * Given any hex accent color, returns:
3
8
  * fill — the accent itself (used as selection / highlight background)