@a4ui/core 0.4.3 → 0.6.0
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 +1 -1
- package/dist/index.d.ts +38 -2
- package/dist/index.js +3262 -1130
- package/dist/layout/ChristmasBackground.d.ts +8 -0
- package/dist/layout/SnowScenery.d.ts +7 -0
- package/dist/styles.css +99 -0
- package/dist/themes/index.d.ts +1 -1
- package/dist/themes/palettes.d.ts +2 -0
- package/dist/ui/Affix.d.ts +21 -0
- package/dist/ui/Anchor.d.ts +28 -0
- package/dist/ui/AvatarGroup.d.ts +29 -0
- package/dist/ui/BackToTop.d.ts +17 -0
- package/dist/ui/BottomNavigation.d.ts +33 -0
- package/dist/ui/Calendar.d.ts +21 -0
- package/dist/ui/Carousel.d.ts +23 -0
- package/dist/ui/Cascader.d.ts +38 -0
- package/dist/ui/Collapse.d.ts +24 -0
- package/dist/ui/Command.d.ts +40 -0
- package/dist/ui/Countdown.d.ts +19 -0
- package/dist/ui/DataGrid.d.ts +40 -0
- package/dist/ui/Descriptions.d.ts +28 -0
- package/dist/ui/Empty.d.ts +27 -0
- package/dist/ui/FloatingActionButton.d.ts +22 -0
- package/dist/ui/Highlight.d.ts +18 -0
- package/dist/ui/Image.d.ts +20 -0
- package/dist/ui/Kbd.d.ts +14 -0
- package/dist/ui/List.d.ts +36 -0
- package/dist/ui/Marquee.d.ts +26 -0
- package/dist/ui/Mentions.d.ts +37 -0
- package/dist/ui/NotificationCenter.d.ts +32 -0
- package/dist/ui/Rating.d.ts +23 -0
- package/dist/ui/Result.d.ts +31 -0
- package/dist/ui/RingProgress.d.ts +23 -0
- package/dist/ui/SpeedDial.d.ts +29 -0
- package/dist/ui/Splitter.d.ts +32 -0
- package/dist/ui/Stepper.d.ts +38 -0
- package/dist/ui/TagInput.d.ts +22 -0
- package/dist/ui/Timeline.d.ts +36 -0
- package/dist/ui/Tour.d.ts +35 -0
- package/dist/ui/Transfer.d.ts +35 -0
- package/dist/ui/Tree.d.ts +41 -0
- package/dist/ui/TreeSelect.d.ts +40 -0
- package/package.json +14 -2
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/**
|
|
3
|
+
* Festive backdrop for the `christmas` theme: night sky, falling snow, a
|
|
4
|
+
* twinkling light garland, a pine tree, and Santa's sleigh flying across (ambient
|
|
5
|
+
* + on background click). Mount as {@link AppShell}'s `background`. Motion is
|
|
6
|
+
* skipped under `motionReduced()`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function ChristmasBackground(): JSX.Element;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/**
|
|
3
|
+
* Falling-snow backdrop for the `snow` theme: snowflakes drift down, a snow bank
|
|
4
|
+
* gathers at the bottom, and cards get a frosted cap. Mount as {@link AppShell}'s
|
|
5
|
+
* `background`. Motion is skipped under `motionReduced()`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function SnowScenery(): JSX.Element;
|
package/dist/styles.css
CHANGED
|
@@ -623,3 +623,102 @@ body {
|
|
|
623
623
|
animation: none !important;
|
|
624
624
|
}
|
|
625
625
|
}
|
|
626
|
+
|
|
627
|
+
/* ---- Snow scenery (the "snow" theme) ------------------------------------ */
|
|
628
|
+
#snow,
|
|
629
|
+
#xmas {
|
|
630
|
+
position: fixed;
|
|
631
|
+
inset: 0;
|
|
632
|
+
z-index: 0;
|
|
633
|
+
pointer-events: none;
|
|
634
|
+
overflow: hidden;
|
|
635
|
+
}
|
|
636
|
+
#snow .snow-sky {
|
|
637
|
+
position: absolute;
|
|
638
|
+
inset: 0;
|
|
639
|
+
background:
|
|
640
|
+
radial-gradient(1200px 800px at 50% -12%, hsl(var(--primary) / 0.18), transparent 60%),
|
|
641
|
+
radial-gradient(900px 700px at 82% 8%, hsl(var(--accent) / 0.14), transparent 60%), hsl(var(--background));
|
|
642
|
+
}
|
|
643
|
+
/* Snowflakes (shared by snow + christmas). Each drifts down with a sideways sway. */
|
|
644
|
+
#snow .flake,
|
|
645
|
+
#xmas .flake {
|
|
646
|
+
position: absolute;
|
|
647
|
+
top: -12px;
|
|
648
|
+
border-radius: 50%;
|
|
649
|
+
background: #fff;
|
|
650
|
+
box-shadow: 0 0 4px rgba(255, 255, 255, 0.6);
|
|
651
|
+
will-change: transform;
|
|
652
|
+
}
|
|
653
|
+
[data-theme='light'] #snow .flake,
|
|
654
|
+
[data-theme='light'] #xmas .flake {
|
|
655
|
+
background: hsl(205 45% 82%);
|
|
656
|
+
box-shadow: 0 0 3px hsl(205 45% 72% / 0.6);
|
|
657
|
+
}
|
|
658
|
+
@keyframes snowFall {
|
|
659
|
+
0% {
|
|
660
|
+
transform: translate(0, -12px);
|
|
661
|
+
}
|
|
662
|
+
100% {
|
|
663
|
+
transform: translate(var(--sway, 12px), 112vh);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
/* Snow settling at the bottom + a frosted cap on cards (snow theme only). */
|
|
667
|
+
#snow .snow-bank {
|
|
668
|
+
position: absolute;
|
|
669
|
+
inset: auto 0 0 0;
|
|
670
|
+
height: 9vh;
|
|
671
|
+
background: linear-gradient(to top, hsl(0 0% 100% / 0.5), transparent);
|
|
672
|
+
filter: blur(2px);
|
|
673
|
+
}
|
|
674
|
+
[data-theme='light'] #snow .snow-bank {
|
|
675
|
+
background: linear-gradient(to top, hsl(0 0% 100% / 0.95), transparent);
|
|
676
|
+
}
|
|
677
|
+
[data-scene='snow'] .card::after {
|
|
678
|
+
content: '';
|
|
679
|
+
position: absolute;
|
|
680
|
+
top: -3px;
|
|
681
|
+
left: 10px;
|
|
682
|
+
right: 10px;
|
|
683
|
+
height: 5px;
|
|
684
|
+
border-radius: 9999px;
|
|
685
|
+
background: hsl(0 0% 100% / 0.8);
|
|
686
|
+
filter: blur(1.5px);
|
|
687
|
+
pointer-events: none;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
/* ---- Christmas scenery (the "christmas" theme) -------------------------- */
|
|
691
|
+
#xmas .xmas-sky {
|
|
692
|
+
position: absolute;
|
|
693
|
+
inset: 0;
|
|
694
|
+
background:
|
|
695
|
+
radial-gradient(1000px 700px at 50% -12%, hsl(var(--primary) / 0.14), transparent 55%),
|
|
696
|
+
radial-gradient(900px 600px at 15% 16%, hsl(var(--accent) / 0.16), transparent 60%),
|
|
697
|
+
hsl(var(--background));
|
|
698
|
+
}
|
|
699
|
+
#xmas .light {
|
|
700
|
+
position: absolute;
|
|
701
|
+
top: 10px;
|
|
702
|
+
width: 9px;
|
|
703
|
+
height: 9px;
|
|
704
|
+
border-radius: 50%;
|
|
705
|
+
animation: twinkleLight 2.2s ease-in-out infinite;
|
|
706
|
+
}
|
|
707
|
+
@keyframes twinkleLight {
|
|
708
|
+
0%,
|
|
709
|
+
100% {
|
|
710
|
+
opacity: 1;
|
|
711
|
+
box-shadow: 0 0 9px currentColor;
|
|
712
|
+
}
|
|
713
|
+
50% {
|
|
714
|
+
opacity: 0.35;
|
|
715
|
+
box-shadow: 0 0 3px currentColor;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
@media (prefers-reduced-motion: reduce) {
|
|
719
|
+
html:not(.force-motion) #snow .flake,
|
|
720
|
+
html:not(.force-motion) #xmas .flake,
|
|
721
|
+
html:not(.force-motion) #xmas .light {
|
|
722
|
+
animation: none !important;
|
|
723
|
+
}
|
|
724
|
+
}
|
package/dist/themes/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Palette, ThemeDefinition } from './palettes';
|
|
2
2
|
export type { Palette, ThemeDefinition } from './palettes';
|
|
3
|
-
export { themes, space, dino, doctor, scientist, soccer, TOKEN_ORDER } from './palettes';
|
|
3
|
+
export { themes, space, dino, doctor, scientist, soccer, snow, christmas, TOKEN_ORDER } from './palettes';
|
|
4
4
|
/**
|
|
5
5
|
* Render a theme to the CSS you'd paste into your own stylesheet: a `:root`
|
|
6
6
|
* block (dark) plus a `:root[data-theme='light']` block. Same output the docs
|
|
@@ -38,5 +38,7 @@ export declare const dino: ThemeDefinition;
|
|
|
38
38
|
export declare const doctor: ThemeDefinition;
|
|
39
39
|
export declare const scientist: ThemeDefinition;
|
|
40
40
|
export declare const soccer: ThemeDefinition;
|
|
41
|
+
export declare const snow: ThemeDefinition;
|
|
42
|
+
export declare const christmas: ThemeDefinition;
|
|
41
43
|
/** All built-in themes, in picker order. Space is the default. */
|
|
42
44
|
export declare const themes: ThemeDefinition[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { JSX, ParentProps } from 'solid-js';
|
|
2
|
+
interface AffixProps extends ParentProps {
|
|
3
|
+
/** Distance in pixels from the top of the viewport to pin at once affixed. Defaults to `0`. */
|
|
4
|
+
offsetTop?: number;
|
|
5
|
+
class?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Sticks its children to the top of the viewport once the user scrolls past the
|
|
9
|
+
* element's original position. While affixed, the children are rendered in a
|
|
10
|
+
* `position: fixed` container and a same-size spacer preserves the document flow
|
|
11
|
+
* so surrounding layout doesn't jump.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <Affix offsetTop={16}>
|
|
16
|
+
* <nav class="rounded-md bg-card px-4 py-2 text-foreground">Sticky toolbar</nav>
|
|
17
|
+
* </Affix>
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function Affix(props: AffixProps): JSX.Element;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface AnchorItem {
|
|
3
|
+
/** The `id` of the section element this link points to. */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Text shown for the link. */
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AnchorProps {
|
|
9
|
+
/** Ordered list of sections to build the table of contents from. */
|
|
10
|
+
items: AnchorItem[];
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A vertical table-of-contents nav with scroll-spy. Each item links to a page
|
|
15
|
+
* section by `id`; the link whose section is topmost in the viewport is marked
|
|
16
|
+
* active. Clicking a link smooth-scrolls to its section.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <Anchor
|
|
21
|
+
* items={[
|
|
22
|
+
* { id: 'intro', label: 'Introduction' },
|
|
23
|
+
* { id: 'usage', label: 'Usage' },
|
|
24
|
+
* ]}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function Anchor(props: AnchorProps): JSX.Element;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface AvatarGroupProps {
|
|
3
|
+
avatars: {
|
|
4
|
+
src?: string;
|
|
5
|
+
fallback: string;
|
|
6
|
+
alt?: string;
|
|
7
|
+
}[];
|
|
8
|
+
/** Maximum number of avatars to render before collapsing the rest into `+N`. */
|
|
9
|
+
max?: number;
|
|
10
|
+
class?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Renders a row of overlapping {@link Avatar}s. When there are more avatars than
|
|
14
|
+
* `max` (default 4), the remainder collapse into a trailing `+N` counter.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <AvatarGroup
|
|
19
|
+
* max={3}
|
|
20
|
+
* avatars={[
|
|
21
|
+
* { src: a.avatarUrl, alt: a.name, fallback: 'AA' },
|
|
22
|
+
* { src: b.avatarUrl, alt: b.name, fallback: 'BB' },
|
|
23
|
+
* { fallback: 'CC' },
|
|
24
|
+
* { fallback: 'DD' },
|
|
25
|
+
* ]}
|
|
26
|
+
* />
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function AvatarGroup(props: AvatarGroupProps): JSX.Element;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface BackToTopProps {
|
|
3
|
+
/** Scroll distance (px) after which the button appears. Defaults to `300`. */
|
|
4
|
+
threshold?: number;
|
|
5
|
+
class?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A floating "scroll to top" button, fixed to the bottom-right of the viewport.
|
|
9
|
+
* It fades in once the user scrolls past `threshold` and smooth-scrolls back up
|
|
10
|
+
* on click.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <BackToTop threshold={500} />
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function BackToTop(props: BackToTopProps): JSX.Element;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/** A single destination within a {@link BottomNavigation}. */
|
|
3
|
+
export interface BottomNavItem {
|
|
4
|
+
value: string;
|
|
5
|
+
label: string;
|
|
6
|
+
icon: JSX.Element;
|
|
7
|
+
}
|
|
8
|
+
export interface BottomNavigationProps {
|
|
9
|
+
items: BottomNavItem[];
|
|
10
|
+
value: string;
|
|
11
|
+
onChange: (value: string) => void;
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Horizontal bar of equal-width navigation items, each stacking an icon above
|
|
16
|
+
* a short label. The active item (matching `value`) is highlighted and marked
|
|
17
|
+
* with `aria-current="page"`. Renders inline where placed — the consumer is
|
|
18
|
+
* responsible for positioning (e.g. `fixed inset-x-0 bottom-0`).
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <BottomNavigation
|
|
23
|
+
* value={tab()}
|
|
24
|
+
* onChange={setTab}
|
|
25
|
+
* items={[
|
|
26
|
+
* { value: 'home', label: 'Home', icon: <HomeIcon /> },
|
|
27
|
+
* { value: 'search', label: 'Search', icon: <SearchIcon /> },
|
|
28
|
+
* { value: 'profile', label: 'Profile', icon: <UserIcon /> },
|
|
29
|
+
* ]}
|
|
30
|
+
* />
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function BottomNavigation(props: BottomNavigationProps): JSX.Element;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface CalendarProps {
|
|
3
|
+
/** Currently selected day. */
|
|
4
|
+
value?: Date;
|
|
5
|
+
/** Called with the newly picked day. */
|
|
6
|
+
onChange?: (date: Date) => void;
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Full-month calendar: a header with the month/year and prev/next navigation, a
|
|
11
|
+
* row of weekday labels, and a 6×7 grid of day buttons. Days outside the shown
|
|
12
|
+
* month are muted; the selected day is filled and "today" gets a ring. Clicking a
|
|
13
|
+
* day calls `onChange`. Theme-agnostic (semantic tokens only), always visible.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const [date, setDate] = createSignal(new Date())
|
|
18
|
+
* <Calendar value={date()} onChange={setDate} />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function Calendar(props: CalendarProps): JSX.Element;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface CarouselProps {
|
|
3
|
+
/** Slides to page through, one visible at a time. */
|
|
4
|
+
slides: JSX.Element[];
|
|
5
|
+
/** Auto-advance interval in ms. Omit to disable autoplay (also skipped under reduced motion / hover). */
|
|
6
|
+
autoplayMs?: number;
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Horizontally-sliding carousel that shows one slide at a time inside a rounded,
|
|
11
|
+
* overflow-hidden viewport. Includes wrapping prev/next arrow buttons, a row of
|
|
12
|
+
* dot indicators, Left/Right arrow-key navigation when focused, and optional
|
|
13
|
+
* autoplay that pauses on hover and is disabled under `prefers-reduced-motion`.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* <Carousel
|
|
18
|
+
* autoplayMs={4000}
|
|
19
|
+
* slides={[<img src="/a.jpg" />, <img src="/b.jpg" />, <img src="/c.jpg" />]}
|
|
20
|
+
* />
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function Carousel(props: CarouselProps): JSX.Element;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/** A node in a {@link Cascader} tree. `children` makes it a branch column. */
|
|
3
|
+
export interface CascaderOption {
|
|
4
|
+
value: string;
|
|
5
|
+
label: string;
|
|
6
|
+
children?: CascaderOption[];
|
|
7
|
+
}
|
|
8
|
+
export interface CascaderProps {
|
|
9
|
+
options: CascaderOption[];
|
|
10
|
+
/** The currently selected value-path (root → leaf). */
|
|
11
|
+
value?: string[];
|
|
12
|
+
/** Fired when a leaf is chosen, with the full value-path and label-path. */
|
|
13
|
+
onChange: (path: string[], labels: string[]) => void;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
class?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Cascading multi-level select. Renders a Select-styled trigger showing the
|
|
19
|
+
* selected path (labels joined with " / "); clicking opens a floating panel of
|
|
20
|
+
* side-by-side columns. Hovering an option with children reveals the next
|
|
21
|
+
* column; clicking a leaf commits the selection and closes the panel.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* <Cascader
|
|
26
|
+
* options={[
|
|
27
|
+
* { value: 'mx', label: 'Mexico', children: [
|
|
28
|
+
* { value: 'son', label: 'Sonora' },
|
|
29
|
+
* { value: 'jal', label: 'Jalisco' },
|
|
30
|
+
* ] },
|
|
31
|
+
* ]}
|
|
32
|
+
* value={path()}
|
|
33
|
+
* onChange={(p, labels) => { setPath(p); console.log(labels.join(' / ')) }}
|
|
34
|
+
* placeholder="Select a region"
|
|
35
|
+
* />
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function Cascader(props: CascaderProps): JSX.Element;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { JSX, ParentProps } from 'solid-js';
|
|
2
|
+
interface CollapseProps extends ParentProps {
|
|
3
|
+
/** Whether the panel is currently expanded. */
|
|
4
|
+
open: boolean;
|
|
5
|
+
/** Called with the next open state when the header is toggled. */
|
|
6
|
+
onOpenChange: (open: boolean) => void;
|
|
7
|
+
/** Text shown in the header button. */
|
|
8
|
+
title: string;
|
|
9
|
+
class?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A single controlled collapsible region: a header button that toggles a panel
|
|
13
|
+
* of arbitrary children. State is owned by the caller via `open`/`onOpenChange`.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const [open, setOpen] = createSignal(false)
|
|
18
|
+
* <Collapse open={open()} onOpenChange={setOpen} title="Details">
|
|
19
|
+
* <p>Hidden content revealed on toggle.</p>
|
|
20
|
+
* </Collapse>
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function Collapse(props: CollapseProps): JSX.Element;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/** A single selectable row in the palette. */
|
|
3
|
+
export interface CommandItem {
|
|
4
|
+
/** Primary text shown on the left of the row. */
|
|
5
|
+
label: string;
|
|
6
|
+
/** Optional secondary text shown muted on the right. */
|
|
7
|
+
hint?: string;
|
|
8
|
+
/** Optional group name; rows sharing a group render under one header. */
|
|
9
|
+
group?: string;
|
|
10
|
+
/** Invoked when the row is picked (click or Enter). */
|
|
11
|
+
onSelect: () => void;
|
|
12
|
+
}
|
|
13
|
+
export interface CommandProps {
|
|
14
|
+
open: boolean;
|
|
15
|
+
onOpenChange: (open: boolean) => void;
|
|
16
|
+
/** Flat list of commands; filtered live against the search query. */
|
|
17
|
+
items: CommandItem[];
|
|
18
|
+
/** Search input placeholder. @default 'Type a command…' */
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A ⌘K command palette: a centered, top-anchored dialog with a search input and
|
|
23
|
+
* a filtered, keyboard-navigable list of commands. Filtering is a
|
|
24
|
+
* case-insensitive substring match over each item's `label + hint + group`.
|
|
25
|
+
* Picking a row runs its `onSelect`, closes the palette, and clears the query.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* const [open, setOpen] = createSignal(false)
|
|
30
|
+
* <Command
|
|
31
|
+
* open={open()}
|
|
32
|
+
* onOpenChange={setOpen}
|
|
33
|
+
* items={[
|
|
34
|
+
* { label: 'New file', hint: '⌘N', group: 'File', onSelect: () => createFile() },
|
|
35
|
+
* { label: 'Toggle theme', group: 'View', onSelect: () => toggleTheme() },
|
|
36
|
+
* ]}
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function Command(props: CommandProps): JSX.Element;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface CountdownProps {
|
|
3
|
+
/** Target moment the countdown runs toward. */
|
|
4
|
+
to: Date;
|
|
5
|
+
/** Called once, the moment the countdown reaches zero. */
|
|
6
|
+
onComplete?: () => void;
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Live countdown to `props.to`, shown as four cells (Days / Hours / Mins /
|
|
11
|
+
* Secs). Updates every second and calls `props.onComplete` once when it hits
|
|
12
|
+
* zero. Hours, minutes, and seconds are zero-padded to two digits.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <Countdown to={new Date(Date.now() + 86_400_000)} onComplete={() => launch()} />
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function Countdown(props: CountdownProps): JSX.Element;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/** A single column definition for {@link DataGrid}. */
|
|
3
|
+
export interface DataGridColumn {
|
|
4
|
+
/** Row property this column reads (also used as the sort key). */
|
|
5
|
+
key: string;
|
|
6
|
+
/** Column heading text. */
|
|
7
|
+
header: string;
|
|
8
|
+
/** When true, the header becomes a button that cycles asc → desc → none. */
|
|
9
|
+
sortable?: boolean;
|
|
10
|
+
/** Custom cell renderer; falls back to `String(row[key])` when omitted. */
|
|
11
|
+
render?: (row: Record<string, unknown>) => JSX.Element;
|
|
12
|
+
}
|
|
13
|
+
/** Props for {@link DataGrid}. */
|
|
14
|
+
export interface DataGridProps {
|
|
15
|
+
columns: DataGridColumn[];
|
|
16
|
+
rows: Record<string, unknown>[];
|
|
17
|
+
/** Rows per page. Defaults to 10. */
|
|
18
|
+
pageSize?: number;
|
|
19
|
+
/** Show the global text filter above the table. Defaults to true. */
|
|
20
|
+
filterable?: boolean;
|
|
21
|
+
class?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Sortable + filterable table. Provide `columns` and `rows`; the grid handles
|
|
25
|
+
* global text filtering, per-column sorting (click a sortable header to cycle
|
|
26
|
+
* ascending → descending → unsorted), and pagination on its own.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* <DataGrid
|
|
31
|
+
* columns={[
|
|
32
|
+
* { key: 'name', header: 'Name', sortable: true },
|
|
33
|
+
* { key: 'age', header: 'Age', sortable: true },
|
|
34
|
+
* ]}
|
|
35
|
+
* rows={[{ name: 'Alfredo', age: 30 }, { name: 'Sonora', age: 12 }]}
|
|
36
|
+
* pageSize={25}
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function DataGrid(props: DataGridProps): JSX.Element;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/** A single label/value row in a {@link Descriptions} list. */
|
|
3
|
+
export interface DescriptionItem {
|
|
4
|
+
label: string;
|
|
5
|
+
value: JSX.Element;
|
|
6
|
+
}
|
|
7
|
+
export interface DescriptionsProps {
|
|
8
|
+
items: DescriptionItem[];
|
|
9
|
+
/** Number of columns on `sm`+ screens (1, 2, or 3). Default: 1. */
|
|
10
|
+
columns?: number;
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Renders a set of label/value pairs as a semantic `<dl>` in a responsive grid.
|
|
15
|
+
* Use `columns` to fan the pairs out into 2 or 3 columns on wider screens.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <Descriptions
|
|
20
|
+
* columns={2}
|
|
21
|
+
* items={[
|
|
22
|
+
* { label: 'Status', value: <Badge tone="success">Active</Badge> },
|
|
23
|
+
* { label: 'Owner', value: 'Ada Lovelace' },
|
|
24
|
+
* ]}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function Descriptions(props: DescriptionsProps): JSX.Element;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface EmptyProps {
|
|
3
|
+
/** Bold headline describing the empty state. */
|
|
4
|
+
title: string;
|
|
5
|
+
/** Optional supporting line under the title. */
|
|
6
|
+
description?: string;
|
|
7
|
+
/** Optional custom icon; falls back to a lucide-solid `Inbox`. */
|
|
8
|
+
icon?: JSX.Element;
|
|
9
|
+
/** Optional action slot (e.g. a Button) rendered below the text. */
|
|
10
|
+
action?: JSX.Element;
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Empty-state placeholder — a centered icon, title, optional description, and an
|
|
15
|
+
* optional action slot — for lists, search results, or first-run views that have
|
|
16
|
+
* nothing to show yet. Falls back to an `Inbox` icon when none is provided.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <Empty
|
|
21
|
+
* title="No projects yet"
|
|
22
|
+
* description="Create your first project to get started."
|
|
23
|
+
* action={<Button>New project</Button>}
|
|
24
|
+
* />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function Empty(props: EmptyProps): JSX.Element;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/** Screen corner a {@link FloatingActionButton} anchors to. Defaults to `'bottom-right'`. */
|
|
3
|
+
export type FloatingActionButtonPosition = 'bottom-right' | 'bottom-left';
|
|
4
|
+
export interface FloatingActionButtonProps {
|
|
5
|
+
/** Icon rendered centered inside the button. */
|
|
6
|
+
icon: JSX.Element;
|
|
7
|
+
/** Accessible label; surfaced via `aria-label`. */
|
|
8
|
+
label: string;
|
|
9
|
+
onClick?: () => void;
|
|
10
|
+
/** Screen corner to anchor to. Defaults to `'bottom-right'`. */
|
|
11
|
+
position?: FloatingActionButtonPosition;
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A fixed circular primary action button pinned to a screen corner.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <FloatingActionButton icon={<PlusIcon />} label="New item" onClick={() => create()} />
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function FloatingActionButton(props: FloatingActionButtonProps): JSX.Element;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface HighlightProps {
|
|
3
|
+
/** Full text to render. */
|
|
4
|
+
text: string;
|
|
5
|
+
/** Substring to highlight; every case-insensitive occurrence is marked. */
|
|
6
|
+
query: string;
|
|
7
|
+
class?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Highlights every case-insensitive occurrence of `query` within `text`.
|
|
11
|
+
* When `query` is empty the text renders unchanged.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <Highlight text="Sonora Precision" query="prec" />
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function Highlight(props: HighlightProps): JSX.Element;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
export interface ImageProps {
|
|
3
|
+
src: string;
|
|
4
|
+
alt: string;
|
|
5
|
+
class?: string;
|
|
6
|
+
/** When true, clicking the image opens a zoomable lightbox. @default true */
|
|
7
|
+
preview?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Lazy-loaded content image. Unless `preview` is disabled, the thumbnail is a
|
|
11
|
+
* zoom-in button that opens a centered lightbox (dimmed overlay + close button)
|
|
12
|
+
* on Kobalte's `Dialog` primitive.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <Image src="/photo.jpg" alt="A scenic view" />
|
|
17
|
+
* <Image src="/logo.svg" alt="Logo" preview={false} />
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function Image(props: ImageProps): JSX.Element;
|
package/dist/ui/Kbd.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { JSX, ParentProps } from 'solid-js';
|
|
2
|
+
interface KbdProps extends ParentProps {
|
|
3
|
+
class?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Keycap-styled indicator for a keyboard key or shortcut token.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* <Kbd>⌘</Kbd><Kbd>K</Kbd>
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare function Kbd(props: KbdProps): JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
/** A single row in a {@link List}. */
|
|
3
|
+
export interface ListItem {
|
|
4
|
+
title: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
avatar?: JSX.Element;
|
|
7
|
+
meta?: JSX.Element;
|
|
8
|
+
actions?: JSX.Element;
|
|
9
|
+
}
|
|
10
|
+
interface ListProps {
|
|
11
|
+
items: ListItem[];
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
export type { ListProps };
|
|
15
|
+
/**
|
|
16
|
+
* Vertical list of rows inside a rounded, bordered container with divider
|
|
17
|
+
* lines between items. Each item shows an optional leading `avatar`, a
|
|
18
|
+
* `title` with optional `description`, and an optional trailing `meta` /
|
|
19
|
+
* `actions` slot.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <List
|
|
24
|
+
* items={[
|
|
25
|
+
* {
|
|
26
|
+
* title: 'Alfredo Rivera',
|
|
27
|
+
* description: 'Owner',
|
|
28
|
+
* avatar: <Avatar name="Alfredo" />,
|
|
29
|
+
* meta: <span>2h ago</span>,
|
|
30
|
+
* actions: <Button size="sm">Edit</Button>,
|
|
31
|
+
* },
|
|
32
|
+
* ]}
|
|
33
|
+
* />
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function List(props: ListProps): JSX.Element;
|