@a4ui/core 0.37.1 → 0.38.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.
Files changed (102) hide show
  1. package/README.md +8 -7
  2. package/dist/Collapse-Cr5cDqAl.js +375 -0
  3. package/dist/charts/AreaChart.d.ts +38 -0
  4. package/dist/charts/BarChart.d.ts +17 -1
  5. package/dist/charts/PieChart.d.ts +29 -0
  6. package/dist/charts/RadialBarChart.d.ts +33 -0
  7. package/dist/charts/index.d.ts +5 -0
  8. package/dist/charts/shared.d.ts +111 -0
  9. package/dist/charts.js +1493 -780
  10. package/dist/commerce.js +625 -634
  11. package/dist/elements.css +1076 -8
  12. package/dist/elements.iife.js +1 -6
  13. package/dist/elements.js +7774 -9133
  14. package/dist/full.css +1076 -8
  15. package/dist/index.d.ts +30 -3
  16. package/dist/index.js +17502 -15126
  17. package/dist/layout/Aurora.d.ts +16 -0
  18. package/dist/layout/EffectsToggle.d.ts +1 -1
  19. package/dist/layout/SpaceBackground.d.ts +1 -1
  20. package/dist/motion-CTIBwMCA.js +104 -0
  21. package/dist/styles.css +110 -3
  22. package/dist/ui/AspectRatio.d.ts +19 -0
  23. package/dist/ui/Attachment.d.ts +70 -0
  24. package/dist/ui/ButtonGroup.d.ts +37 -0
  25. package/dist/ui/ChatMarker.d.ts +20 -0
  26. package/dist/ui/ChatThread.d.ts +32 -8
  27. package/dist/ui/ContactSection.d.ts +49 -0
  28. package/dist/ui/CtaBanner.d.ts +28 -0
  29. package/dist/ui/Drawer.d.ts +5 -2
  30. package/dist/ui/Faq.d.ts +29 -0
  31. package/dist/ui/FeatureGrid.d.ts +35 -0
  32. package/dist/ui/Field.d.ts +148 -0
  33. package/dist/ui/Hero.d.ts +48 -0
  34. package/dist/ui/InputGroup.d.ts +93 -0
  35. package/dist/ui/Item.d.ts +63 -0
  36. package/dist/ui/Label.d.ts +23 -0
  37. package/dist/ui/Menubar.d.ts +83 -0
  38. package/dist/ui/Message.d.ts +51 -5
  39. package/dist/ui/Modal.d.ts +8 -2
  40. package/dist/ui/NativeSelect.d.ts +26 -0
  41. package/dist/ui/NavigationMenu.d.ts +85 -0
  42. package/dist/ui/PromptComposer.d.ts +5 -0
  43. package/dist/ui/Prose.d.ts +21 -0
  44. package/dist/ui/Questionnaire.d.ts +71 -0
  45. package/dist/ui/ScrollArea.d.ts +30 -0
  46. package/dist/ui/Sidebar.d.ts +229 -0
  47. package/dist/ui/SiteFooter.d.ts +39 -0
  48. package/dist/ui/SiteNav.d.ts +35 -0
  49. package/dist/ui/TeamGrid.d.ts +33 -0
  50. package/dist/ui/Testimonials.d.ts +37 -0
  51. package/dist/ui/internal/sectionKit.d.ts +22 -0
  52. package/dist/ui/internal/socialIcons.d.ts +9 -0
  53. package/package.json +38 -26
  54. package/preset.d.ts +23 -0
  55. package/src/charts/AreaChart.tsx +206 -0
  56. package/src/charts/BarChart.tsx +241 -5
  57. package/src/charts/DonutChart.tsx +8 -11
  58. package/src/charts/LineChart.tsx +2 -3
  59. package/src/charts/PieChart.tsx +145 -0
  60. package/src/charts/RadialBarChart.tsx +141 -0
  61. package/src/charts/index.ts +14 -0
  62. package/src/charts/shared.tsx +304 -0
  63. package/src/index.ts +192 -3
  64. package/src/layout/Aurora.tsx +36 -7
  65. package/src/layout/sceneEffects.ts +22 -3
  66. package/src/ui/AspectRatio.tsx +35 -0
  67. package/src/ui/Attachment.tsx +189 -0
  68. package/src/ui/ButtonGroup.tsx +89 -0
  69. package/src/ui/ChatMarker.tsx +58 -0
  70. package/src/ui/ChatThread.tsx +115 -23
  71. package/src/ui/ContactSection.tsx +199 -0
  72. package/src/ui/CtaBanner.tsx +62 -0
  73. package/src/ui/DateField.tsx +2 -1
  74. package/src/ui/DateRangePicker.tsx +2 -1
  75. package/src/ui/Drawer.tsx +37 -4
  76. package/src/ui/Faq.tsx +57 -0
  77. package/src/ui/FeatureGrid.tsx +77 -0
  78. package/src/ui/Field.tsx +374 -0
  79. package/src/ui/Hero.tsx +146 -0
  80. package/src/ui/InputGroup.tsx +219 -0
  81. package/src/ui/Item.tsx +185 -0
  82. package/src/ui/Label.tsx +50 -0
  83. package/src/ui/Menubar.tsx +212 -0
  84. package/src/ui/Message.tsx +139 -13
  85. package/src/ui/Modal.tsx +41 -5
  86. package/src/ui/MultiSelect.tsx +2 -1
  87. package/src/ui/NativeSelect.tsx +66 -0
  88. package/src/ui/NavigationMenu.tsx +262 -0
  89. package/src/ui/PromptComposer.tsx +11 -0
  90. package/src/ui/Prose.tsx +63 -0
  91. package/src/ui/Questionnaire.tsx +331 -0
  92. package/src/ui/ScrollArea.tsx +70 -0
  93. package/src/ui/Sidebar.tsx +753 -0
  94. package/src/ui/SiteFooter.tsx +112 -0
  95. package/src/ui/SiteNav.tsx +146 -0
  96. package/src/ui/TeamGrid.tsx +81 -0
  97. package/src/ui/Testimonials.tsx +103 -0
  98. package/src/ui/TimeField.tsx +2 -1
  99. package/src/ui/internal/sectionKit.tsx +72 -0
  100. package/src/ui/internal/socialIcons.tsx +41 -0
  101. package/dist/NumberInput-Bnh2u7pp.js +0 -381
  102. package/dist/motion-jYMWmZqB.js +0 -119
@@ -10,6 +10,11 @@ export interface PromptComposerProps {
10
10
  /** Attachment labels/filenames shown as removable chips above the input. */
11
11
  attachments?: string[];
12
12
  onRemoveAttachment?: (index: number) => void;
13
+ /**
14
+ * Rich attachment slot rendered above the input (alongside the chips above).
15
+ * Pass `Attachment`s, ideally wrapped in an `AttachmentGroup`.
16
+ */
17
+ attachmentItems?: JSX.Element;
13
18
  /** When set, shows a paperclip button that calls this on click. */
14
19
  onAttach?: () => void;
15
20
  class?: string;
@@ -0,0 +1,21 @@
1
+ import { JSX, ParentProps } from 'solid-js';
2
+ export type ProseSize = 'sm' | 'base' | 'lg';
3
+ interface ProseProps extends ParentProps {
4
+ /** Body text scale. @default 'base' */
5
+ size?: ProseSize;
6
+ /** Element to render. @default 'div' */
7
+ as?: 'div' | 'article' | 'section';
8
+ class?: string;
9
+ }
10
+ export type { ProseProps };
11
+ /**
12
+ * Typography wrapper that styles raw HTML or rendered markdown children
13
+ * (headings, paragraphs, `.lead`, links, quotes, lists, code, tables) with
14
+ * token colors. No CSS file and no typography plugin.
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * <Prose size="lg"><div innerHTML={renderedMarkdown} /></Prose>
19
+ * ```
20
+ */
21
+ export declare function Prose(props: ProseProps): JSX.Element;
@@ -0,0 +1,71 @@
1
+ import { JSX } from 'solid-js';
2
+ /** A selectable choice of a `single` / `multiple` {@link QuestionnaireQuestion}. */
3
+ export interface QuestionnaireOption {
4
+ value: string;
5
+ label: string;
6
+ description?: string;
7
+ }
8
+ /** One step of a {@link Questionnaire}. */
9
+ export interface QuestionnaireQuestion {
10
+ /** Key of the answer in the submitted object. Must be unique. */
11
+ id: string;
12
+ title: string;
13
+ description?: string;
14
+ /** `single` = pick one, `multiple` = pick any, `text` = free text. */
15
+ type: 'single' | 'multiple' | 'text';
16
+ /** Choices; required for `single` and `multiple`. */
17
+ options?: QuestionnaireOption[];
18
+ /** Required questions block "Next" until answered and cannot be skipped. */
19
+ required?: boolean;
20
+ /** Placeholder of the `text` field. */
21
+ placeholder?: string;
22
+ }
23
+ /** Answers keyed by question id. Unanswered / skipped questions have no key. */
24
+ export type QuestionnaireAnswers = Record<string, string | string[]>;
25
+ /** Overridable UI strings (i18n). `stepOf` accepts `{current}` and `{total}`. */
26
+ export interface QuestionnaireLabels {
27
+ next: string;
28
+ previous: string;
29
+ skip: string;
30
+ submit: string;
31
+ required: string;
32
+ stepOf: string;
33
+ thanks: string;
34
+ thanksDescription: string;
35
+ }
36
+ export interface QuestionnaireProps {
37
+ questions: QuestionnaireQuestion[];
38
+ /** Called once with the answers when the last step is submitted. */
39
+ onSubmit: (answers: QuestionnaireAnswers) => void;
40
+ /** Called with the full answers object after every change. */
41
+ onChange?: (answers: QuestionnaireAnswers) => void;
42
+ /** Answers to start from (read once on mount). */
43
+ initialAnswers?: QuestionnaireAnswers;
44
+ labels?: Partial<QuestionnaireLabels>;
45
+ /** Replaces the default "Thanks" panel shown after submit. */
46
+ summary?: (answers: QuestionnaireAnswers) => JSX.Element;
47
+ class?: string;
48
+ }
49
+ /**
50
+ * Multi-step questionnaire / survey, driven by a `questions` array: one question
51
+ * per step with a progress indicator, required validation (inline error linked
52
+ * via `aria-describedby`), Previous / Skip / Next / Submit, and a final panel.
53
+ *
54
+ * Keyboard: digits `1`-`9` pick the matching option on choice steps, `Enter`
55
+ * advances (in the free-text field use `Ctrl`/`Cmd` + `Enter`, since `Enter`
56
+ * inserts a newline there). Focus moves to the step heading on every step change.
57
+ * Step transitions are CSS animations, neutralised under `prefers-reduced-motion`.
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * <Questionnaire
62
+ * questions={[
63
+ * { id: 'role', title: 'Your role?', type: 'single', required: true,
64
+ * options: [{ value: 'dev', label: 'Developer' }, { value: 'pm', label: 'Manager' }] },
65
+ * { id: 'notes', title: 'Anything else?', type: 'text' },
66
+ * ]}
67
+ * onSubmit={(answers) => save(answers)}
68
+ * />
69
+ * ```
70
+ */
71
+ export declare function Questionnaire(props: QuestionnaireProps): JSX.Element;
@@ -0,0 +1,30 @@
1
+ import { JSX, ParentProps } from 'solid-js';
2
+ export type ScrollAreaOrientation = 'vertical' | 'horizontal' | 'both';
3
+ interface ScrollAreaProps extends ParentProps {
4
+ /** Which axis scrolls. @default 'vertical' */
5
+ orientation?: ScrollAreaOrientation;
6
+ /**
7
+ * Accessible name. When set, the area is exposed as a labelled `region`.
8
+ * Recommended whenever the content is more than decoration.
9
+ */
10
+ label?: string;
11
+ /** Receives the scrolling element (to read or set `scrollTop`, observe, …). */
12
+ ref?: (el: HTMLDivElement) => void;
13
+ class?: string;
14
+ style?: JSX.CSSProperties;
15
+ }
16
+ export type { ScrollAreaProps };
17
+ /**
18
+ * Scrollable container with thin scrollbars tinted from the theme tokens. Give it
19
+ * a bounded size (`class="h-64"`, `max-h-…`, or a flex parent) — it scrolls
20
+ * whatever overflows. It is keyboard-focusable so the content can be scrolled
21
+ * with the arrow keys.
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * <ScrollArea class="h-64 rounded-xl border border-border" label="Release notes">
26
+ * <div class="p-4">…long content…</div>
27
+ * </ScrollArea>
28
+ * ```
29
+ */
30
+ export declare function ScrollArea(props: ScrollAreaProps): JSX.Element;
@@ -0,0 +1,229 @@
1
+ import { Accessor, JSX, ParentProps } from 'solid-js';
2
+ export type SidebarSide = 'left' | 'right';
3
+ export type SidebarVariant = 'sidebar' | 'floating' | 'inset';
4
+ export type SidebarCollapsible = 'offcanvas' | 'icon' | 'none';
5
+ interface SidebarContextValue {
6
+ /** Desktop expanded state. */
7
+ open: Accessor<boolean>;
8
+ setOpen: (open: boolean) => void;
9
+ /** Flip the active state: the drawer on mobile, the desktop panel otherwise. */
10
+ toggle: () => void;
11
+ /** True below the `md` breakpoint, where the sidebar renders inside a Drawer. */
12
+ isMobile: Accessor<boolean>;
13
+ openMobile: Accessor<boolean>;
14
+ setOpenMobile: (open: boolean) => void;
15
+ /** @internal id of the sidebar panel, for `aria-controls`. */
16
+ panelId: string;
17
+ /** @internal registered by `Sidebar` so `SidebarInset` / `SidebarRail` can adapt. */
18
+ config: Accessor<{
19
+ side: SidebarSide;
20
+ variant: SidebarVariant;
21
+ collapsible: SidebarCollapsible;
22
+ }>;
23
+ setConfig: (c: {
24
+ side: SidebarSide;
25
+ variant: SidebarVariant;
26
+ collapsible: SidebarCollapsible;
27
+ }) => void;
28
+ }
29
+ /** State of the nearest {@link SidebarProvider}. Throws outside one. */
30
+ export declare function useSidebar(): Omit<SidebarContextValue, 'panelId' | 'config' | 'setConfig'>;
31
+ interface SidebarProviderProps extends ParentProps {
32
+ /** Controlled desktop open state. */
33
+ open?: boolean;
34
+ /** Called with the next desktop open state (controlled or not). */
35
+ onOpenChange?: (open: boolean) => void;
36
+ /** Initial state when uncontrolled. @default true */
37
+ defaultOpen?: boolean;
38
+ /** Key toggled with Ctrl/Cmd; `false` disables the shortcut. @default 'b' */
39
+ shortcut?: string | false;
40
+ class?: string;
41
+ }
42
+ /**
43
+ * Owns the sidebar state and wraps `Sidebar` + `SidebarInset` in a flex row.
44
+ * Give it a bounded height (the sidebar fills it). Ctrl/Cmd+B toggles the sidebar.
45
+ *
46
+ * @example
47
+ * ```tsx
48
+ * <SidebarProvider class="h-screen">
49
+ * <Sidebar collapsible="icon">…</Sidebar>
50
+ * <SidebarInset>…</SidebarInset>
51
+ * </SidebarProvider>
52
+ * ```
53
+ */
54
+ export declare function SidebarProvider(props: SidebarProviderProps): JSX.Element;
55
+ interface SidebarProps extends ParentProps {
56
+ /** Which edge it sits on. @default 'left' */
57
+ side?: SidebarSide;
58
+ /** `sidebar` is flush, `floating` is a detached rounded panel, `inset` has no surface of its own (pair with `SidebarInset`). @default 'sidebar' */
59
+ variant?: SidebarVariant;
60
+ /** `offcanvas` slides away, `icon` shrinks to an icon rail, `none` never collapses. @default 'offcanvas' */
61
+ collapsible?: SidebarCollapsible;
62
+ /** Accessible name (and the drawer title on mobile). @default 'Navigation' */
63
+ label?: string;
64
+ class?: string;
65
+ }
66
+ /**
67
+ * The sidebar panel. Collapses per `collapsible`; below `md` it opens as a
68
+ * `Drawer` on the same `side` (toggled by `SidebarTrigger` / Ctrl+B).
69
+ *
70
+ * @example
71
+ * ```tsx
72
+ * <Sidebar collapsible="icon" variant="floating">
73
+ * <SidebarHeader>…</SidebarHeader>
74
+ * <SidebarContent>…</SidebarContent>
75
+ * </Sidebar>
76
+ * ```
77
+ */
78
+ export declare function Sidebar(props: SidebarProps): JSX.Element;
79
+ interface SidebarTriggerProps {
80
+ /** Accessible name. @default 'Toggle sidebar' */
81
+ label?: string;
82
+ class?: string;
83
+ /** Replaces the default panel icon. */
84
+ children?: JSX.Element;
85
+ }
86
+ /**
87
+ * Button that toggles the sidebar (the drawer on mobile). Exposes
88
+ * `aria-expanded` and `aria-controls` for the panel.
89
+ */
90
+ export declare function SidebarTrigger(props: SidebarTriggerProps): JSX.Element;
91
+ /**
92
+ * Thin hit area on the sidebar's inner edge that toggles it. Pointer-only
93
+ * affordance (`tabindex=-1`); keyboard users have `SidebarTrigger` and Ctrl+B.
94
+ * Place it as the last child of `Sidebar`.
95
+ */
96
+ export declare function SidebarRail(props: {
97
+ class?: string;
98
+ }): JSX.Element;
99
+ /**
100
+ * Main content wrapper. With `variant="inset"` it becomes a rounded glass panel
101
+ * beside the sidebar; otherwise it is a plain scrolling region.
102
+ *
103
+ * @example
104
+ * ```tsx
105
+ * <SidebarInset><main>…</main></SidebarInset>
106
+ * ```
107
+ */
108
+ export declare function SidebarInset(props: ParentProps<{
109
+ class?: string;
110
+ }>): JSX.Element;
111
+ /** Top slot (brand, switcher, search). */
112
+ export declare function SidebarHeader(props: ParentProps<{
113
+ class?: string;
114
+ }>): JSX.Element;
115
+ /** Bottom slot (account, settings). */
116
+ export declare function SidebarFooter(props: ParentProps<{
117
+ class?: string;
118
+ }>): JSX.Element;
119
+ /** Scrolling middle region, built on `ScrollArea`. */
120
+ export declare function SidebarContent(props: ParentProps<{
121
+ class?: string;
122
+ }>): JSX.Element;
123
+ /** A labelled section of the sidebar. */
124
+ export declare function SidebarGroup(props: ParentProps<{
125
+ class?: string;
126
+ }>): JSX.Element;
127
+ /** Small uppercase heading of a group; hidden when the rail is icon-collapsed. */
128
+ export declare function SidebarGroupLabel(props: ParentProps<{
129
+ class?: string;
130
+ }>): JSX.Element;
131
+ interface SidebarGroupActionProps extends ParentProps {
132
+ /** Required accessible name (the action is usually just an icon). */
133
+ label: string;
134
+ onClick?: (e: MouseEvent) => void;
135
+ class?: string;
136
+ }
137
+ /** Icon button aligned to the right of the group label. */
138
+ export declare function SidebarGroupAction(props: SidebarGroupActionProps): JSX.Element;
139
+ /** Wrapper for a group's items. */
140
+ export declare function SidebarGroupContent(props: ParentProps<{
141
+ class?: string;
142
+ }>): JSX.Element;
143
+ /** `<ul>` of menu items. */
144
+ export declare function SidebarMenu(props: ParentProps<{
145
+ class?: string;
146
+ }>): JSX.Element;
147
+ /** `<li>` of a menu; anchors `SidebarMenuAction` and `SidebarMenuBadge`. */
148
+ export declare function SidebarMenuItem(props: ParentProps<{
149
+ class?: string;
150
+ }>): JSX.Element;
151
+ type MenuButtonSize = 'sm' | 'default' | 'lg';
152
+ interface SidebarMenuButtonProps extends ParentProps {
153
+ /** Marks the current page: sets `aria-current="page"` and the highlight. */
154
+ active?: boolean;
155
+ /** Renders a link. Otherwise a `<button>` (use `onClick`). */
156
+ href?: string;
157
+ onClick?: (e: MouseEvent) => void;
158
+ /** Shown as a tooltip (beside the icon) only while the rail is icon-collapsed. */
159
+ tooltip?: JSX.Element;
160
+ size?: MenuButtonSize;
161
+ class?: string;
162
+ }
163
+ /**
164
+ * Main navigation row. Pass `href` for a link or `onClick` for an action;
165
+ * `active` sets `aria-current="page"`. Put the label in a `<span>` after the icon
166
+ * so it can collapse; with `collapsible="icon"` the `tooltip` appears on
167
+ * hover/focus and the span stays as the accessible name.
168
+ *
169
+ * @example
170
+ * ```tsx
171
+ * <SidebarMenuButton href="#/inbox" active tooltip="Inbox"><Inbox /><span>Inbox</span></SidebarMenuButton>
172
+ * ```
173
+ */
174
+ export declare function SidebarMenuButton(props: SidebarMenuButtonProps): JSX.Element;
175
+ /** Icon button to the right of a `SidebarMenuButton` (add, more…). Needs a `label`. */
176
+ export declare function SidebarMenuAction(props: ParentProps<{
177
+ label: string;
178
+ onClick?: (e: MouseEvent) => void;
179
+ showOnHover?: boolean;
180
+ class?: string;
181
+ }>): JSX.Element;
182
+ /** Count / status pill at the right edge of a menu item. */
183
+ export declare function SidebarMenuBadge(props: ParentProps<{
184
+ class?: string;
185
+ }>): JSX.Element;
186
+ interface SidebarMenuSubProps extends ParentProps {
187
+ /** Text of the row that expands the submenu. */
188
+ label: string;
189
+ /** Icon shown before the label. */
190
+ icon?: JSX.Element;
191
+ /** Controlled expanded state. */
192
+ open?: boolean;
193
+ onOpenChange?: (open: boolean) => void;
194
+ /** Initial state when uncontrolled. @default false */
195
+ defaultOpen?: boolean;
196
+ class?: string;
197
+ }
198
+ /**
199
+ * Collapsible nested menu: a toggle row (`aria-expanded` / `aria-controls`) and an
200
+ * indented list of `SidebarMenuSubItem`. Use inside a `SidebarMenuItem`. In the icon
201
+ * rail the toggle expands the sidebar first, then the submenu.
202
+ *
203
+ * @example
204
+ * ```tsx
205
+ * <SidebarMenuItem>
206
+ * <SidebarMenuSub label="Projects" icon={<Folder />}>
207
+ * <SidebarMenuSubItem><SidebarMenuSubButton href="#/a">Orbit</SidebarMenuSubButton></SidebarMenuSubItem>
208
+ * </SidebarMenuSub>
209
+ * </SidebarMenuItem>
210
+ * ```
211
+ */
212
+ export declare function SidebarMenuSub(props: SidebarMenuSubProps): JSX.Element;
213
+ /** `<li>` of a submenu. */
214
+ export declare function SidebarMenuSubItem(props: ParentProps<{
215
+ class?: string;
216
+ }>): JSX.Element;
217
+ /** Link (`href`) or button row inside a submenu; `active` sets `aria-current="page"`. */
218
+ export declare function SidebarMenuSubButton(props: ParentProps<{
219
+ active?: boolean;
220
+ href?: string;
221
+ onClick?: (e: MouseEvent) => void;
222
+ class?: string;
223
+ }>): JSX.Element;
224
+ /** Loading placeholder shaped like a menu row. Decorative (`aria-hidden`). */
225
+ export declare function SidebarMenuSkeleton(props: {
226
+ showIcon?: boolean;
227
+ class?: string;
228
+ }): JSX.Element;
229
+ export type { SidebarProps, SidebarProviderProps, SidebarTriggerProps, SidebarGroupActionProps, SidebarMenuButtonProps, SidebarMenuSubProps, };
@@ -0,0 +1,39 @@
1
+ import { JSX } from 'solid-js';
2
+ import { SectionLink } from './internal/sectionKit';
3
+ import { SocialNetwork } from './internal/socialIcons';
4
+ export type { SocialNetwork };
5
+ /** A titled group of links in a {@link SiteFooter}. */
6
+ export interface FooterColumn {
7
+ title: string;
8
+ links: SectionLink[];
9
+ }
10
+ /** A social profile link in a {@link SiteFooter}. */
11
+ export interface SocialLink {
12
+ network: SocialNetwork;
13
+ href: string;
14
+ }
15
+ export interface SiteFooterProps {
16
+ brand: string;
17
+ /** One line under the brand. */
18
+ tagline?: string;
19
+ columns?: FooterColumn[];
20
+ social?: SocialLink[];
21
+ /** Copyright line. Defaults to `© <current year> <brand>`. */
22
+ copyright?: string;
23
+ class?: string;
24
+ }
25
+ /**
26
+ * Site footer: brand and tagline, columns of links, social network icons and a
27
+ * copyright line on a glass band. Columns wrap to two per row on phones.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * <SiteFooter
32
+ * brand="Northwind"
33
+ * tagline="Websites for small businesses."
34
+ * columns={[{ title: 'Company', links: [{ label: 'About', href: '/about' }] }]}
35
+ * social={[{ network: 'instagram', href: 'https://instagram.com/northwind' }]}
36
+ * />
37
+ * ```
38
+ */
39
+ export declare function SiteFooter(props: SiteFooterProps): JSX.Element;
@@ -0,0 +1,35 @@
1
+ import { JSX } from 'solid-js';
2
+ import { SectionLink } from './internal/sectionKit';
3
+ export interface SiteNavProps {
4
+ /** Brand name shown at the left; also the home link's text. */
5
+ brand: string;
6
+ /** Logo image URL shown before the brand name. */
7
+ logo?: string;
8
+ /** Where the brand links to. Defaults to `'/'`. */
9
+ brandHref?: string;
10
+ /** Navigation links, in order. */
11
+ links: SectionLink[];
12
+ /** Call-to-action button at the right (and at the bottom of the mobile menu). */
13
+ cta?: SectionLink;
14
+ /** Stick to the top of the viewport while scrolling. Defaults to `true`. */
15
+ sticky?: boolean;
16
+ /** Accessible label of the mobile menu button. Defaults to `'Menu'`. */
17
+ menuLabel?: string;
18
+ class?: string;
19
+ }
20
+ /**
21
+ * Top navigation bar for a marketing site: brand (with optional logo), links and
22
+ * a call-to-action on a frosted glass bar. Below the `md` breakpoint the links
23
+ * collapse into a menu button that opens a panel under the bar; it closes on
24
+ * Escape, on outside click and when a link is followed.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <SiteNav
29
+ * brand="Northwind"
30
+ * links={[{ label: 'Features', href: '#features' }, { label: 'Pricing', href: '#pricing' }]}
31
+ * cta={{ label: 'Get started', href: '/signup' }}
32
+ * />
33
+ * ```
34
+ */
35
+ export declare function SiteNav(props: SiteNavProps): JSX.Element;
@@ -0,0 +1,33 @@
1
+ import { JSX } from 'solid-js';
2
+ /** One person rendered by {@link TeamGrid}. */
3
+ export interface TeamMember {
4
+ name: string;
5
+ role: string;
6
+ /** Photo URL. Falls back to the name's initials. */
7
+ photo?: string;
8
+ /** One or two sentences about the person. */
9
+ bio?: string;
10
+ }
11
+ export interface TeamGridProps {
12
+ title?: string;
13
+ subtitle?: string;
14
+ members: TeamMember[];
15
+ /** Columns on wide screens. Defaults to `3`. */
16
+ columns?: 2 | 3 | 4;
17
+ /** Anchor id for in-page navigation. */
18
+ id?: string;
19
+ class?: string;
20
+ }
21
+ /**
22
+ * Team section: a responsive grid of glass cards with each person's photo (or
23
+ * initials), name, role and an optional short bio.
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * <TeamGrid
28
+ * title="Our team"
29
+ * members={[{ name: 'Ana Ruiz', role: 'Founder', bio: 'Ten years building for small shops.' }]}
30
+ * />
31
+ * ```
32
+ */
33
+ export declare function TeamGrid(props: TeamGridProps): JSX.Element;
@@ -0,0 +1,37 @@
1
+ import { JSX } from 'solid-js';
2
+ /** One quote rendered by {@link Testimonials}. */
3
+ export interface TestimonialItem {
4
+ quote: string;
5
+ /** Who said it. */
6
+ name: string;
7
+ /** Job title and/or company, e.g. `"CTO, Northwind"`. */
8
+ role?: string;
9
+ /** Avatar image URL. Falls back to the name's initials. */
10
+ avatar?: string;
11
+ }
12
+ /** Arrangement of {@link Testimonials}. */
13
+ export type TestimonialsLayout = 'grid' | 'marquee';
14
+ export interface TestimonialsProps {
15
+ title?: string;
16
+ subtitle?: string;
17
+ items: TestimonialItem[];
18
+ /** `'grid'` (default) or a horizontally scrolling `'marquee'` (still under reduced motion). */
19
+ layout?: TestimonialsLayout;
20
+ /** Anchor id for in-page navigation. */
21
+ id?: string;
22
+ class?: string;
23
+ }
24
+ /**
25
+ * Social-proof section of customer quotes, each with the person's name, role
26
+ * and avatar (initials when no image). Lay them out as a responsive grid of
27
+ * glass cards, or as a marquee that scrolls sideways and pauses on hover.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * <Testimonials
32
+ * title="Loved by small teams"
33
+ * items={[{ quote: 'We launched in two days.', name: 'Ana Ruiz', role: 'Founder, Brisa' }]}
34
+ * />
35
+ * ```
36
+ */
37
+ export declare function Testimonials(props: TestimonialsProps): JSX.Element;
@@ -0,0 +1,22 @@
1
+ import { JSX } from 'solid-js';
2
+ /** A plain link used by the page-section blocks: visible text plus a URL. */
3
+ export interface SectionLink {
4
+ /** Visible text. */
5
+ label: string;
6
+ /** Destination URL, in-page anchor (`#features`) or `mailto:`/`tel:` link. */
7
+ href: string;
8
+ }
9
+ interface SectionHeadingProps {
10
+ eyebrow?: string;
11
+ title?: string;
12
+ subtitle?: string;
13
+ /** Heading level of `title`. Defaults to `2`. */
14
+ level?: 1 | 2;
15
+ align?: 'center' | 'left';
16
+ class?: string;
17
+ }
18
+ /** Eyebrow + title + subtitle stack. Renders nothing when all three are empty. */
19
+ export declare function SectionHeading(props: SectionHeadingProps): JSX.Element;
20
+ /** Up-to-two-letter initials for avatar fallbacks. */
21
+ export declare function initials(name: string): string;
22
+ export {};
@@ -0,0 +1,9 @@
1
+ import { JSX } from 'solid-js';
2
+ /** Social networks {@link SiteFooter} can link to. */
3
+ export type SocialNetwork = 'x' | 'instagram' | 'facebook' | 'linkedin' | 'github' | 'youtube' | 'tiktok';
4
+ /** Human-readable network names, used as accessible link labels. */
5
+ export declare const SOCIAL_LABEL: Record<SocialNetwork, string>;
6
+ export declare function SocialIcon(props: {
7
+ network: SocialNetwork;
8
+ class?: string;
9
+ }): JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a4ui/core",
3
- "version": "0.37.1",
3
+ "version": "0.38.0",
4
4
  "description": "A4ui — Spatial Glass design system & component library for SolidJS (Kobalte behavior + Tailwind glass tokens + motion).",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,6 +30,7 @@
30
30
  "files": [
31
31
  "dist",
32
32
  "preset.js",
33
+ "preset.d.ts",
33
34
  "src/index.ts",
34
35
  "src/ui",
35
36
  "src/lib",
@@ -63,6 +64,7 @@
63
64
  "default": "./dist/charts.js"
64
65
  },
65
66
  "./preset": {
67
+ "types": "./preset.d.ts",
66
68
  "import": "./preset.js",
67
69
  "default": "./preset.js"
68
70
  },
@@ -78,7 +80,7 @@
78
80
  "engines": {
79
81
  "node": ">=20"
80
82
  },
81
- "packageManager": "npm@10.9.3",
83
+ "packageManager": "npm@10.9.9",
82
84
  "publishConfig": {
83
85
  "access": "public"
84
86
  },
@@ -116,39 +118,49 @@
116
118
  ]
117
119
  },
118
120
  "peerDependencies": {
119
- "solid-js": "^1.9.13"
121
+ "solid-js": "^1.9.16",
122
+ "tailwindcss": "^3.4.0"
120
123
  },
121
124
  "dependencies": {
122
- "@kobalte/core": "^0.13.12",
123
- "@tanstack/solid-virtual": "^3.13.33",
125
+ "@kobalte/core": "^0.13.14",
126
+ "@tanstack/solid-virtual": "^3.13.51",
124
127
  "clsx": "^2.1.1",
125
- "lucide-solid": "^1.23.0",
126
- "motion": "^12.42.2",
127
- "tailwind-merge": "^3.6.0"
128
+ "lucide-solid": "^1.65.0",
129
+ "motion": "^14.9.0",
130
+ "tailwind-merge": "^3.7.0"
128
131
  },
129
132
  "devDependencies": {
130
- "@axe-core/playwright": "^4.12.1",
131
- "@eslint/js": "^9.39.5",
132
- "@playwright/test": "^1.61.1",
133
+ "@axe-core/playwright": "^4.14.0",
134
+ "@eslint/js": "^10.0.1",
135
+ "@playwright/test": "^1.64.1",
133
136
  "@solidjs/testing-library": "^0.8.10",
134
- "@testing-library/jest-dom": "^6.9.1",
135
- "axe-core": "^4.12.1",
136
- "eslint": "^9.39.5",
137
+ "@testing-library/jest-dom": "^7.0.1",
138
+ "axe-core": "^4.14.0",
139
+ "eslint": "^10.14.0",
137
140
  "eslint-config-prettier": "^10.1.8",
138
- "eslint-plugin-solid": "^0.14.5",
141
+ "eslint-plugin-solid": "^0.18.1",
142
+ "globals": "^17.13.0",
139
143
  "husky": "^9.1.7",
140
- "jsdom": "^29.1.1",
141
- "lint-staged": "^16.4.0",
142
- "marked": "^18.0.6",
143
- "playwright-core": "^1.61.1",
144
- "prettier": "^3.9.5",
144
+ "jsdom": "^30.1.3",
145
+ "lint-staged": "^17.6.0",
146
+ "marked": "^18.1.2",
147
+ "playwright-core": "^1.64.1",
148
+ "prettier": "^3.9.10",
145
149
  "solid-element": "^1.9.2",
146
150
  "tailwindcss": "^3.4.19",
147
- "typescript": "^5.6.0",
148
- "typescript-eslint": "^8.64.0",
149
- "vite": "^6.0.0",
150
- "vite-plugin-dts": "^4.3.0",
151
- "vite-plugin-solid": "^2.11.12",
152
- "vitest": "^4.1.10"
151
+ "typescript": "~6.0.3",
152
+ "typescript-eslint": "^8.72.1",
153
+ "vite": "^8.3.5",
154
+ "vite-plugin-dts": "^5.1.2",
155
+ "vite-plugin-solid": "^2.11.15",
156
+ "vitest": "^5.0.5"
157
+ },
158
+ "peerDependenciesMeta": {
159
+ "tailwindcss": {
160
+ "optional": true
161
+ }
162
+ },
163
+ "overrides": {
164
+ "minimatch": "^11.0.3"
153
165
  }
154
166
  }