@a4ui/core 0.6.0 → 0.8.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.
@@ -0,0 +1,26 @@
1
+ import { JSX } from 'solid-js';
2
+ /** A single day's activity count, keyed by an ISO `YYYY-MM-DD` date. */
3
+ export interface HeatmapValue {
4
+ date: string;
5
+ count: number;
6
+ }
7
+ export interface CalendarHeatmapProps {
8
+ /** Activity counts to plot; dates outside the visible range are ignored. */
9
+ values: HeatmapValue[];
10
+ /** Number of week-columns to show, ending on today. Default 26. */
11
+ weeks?: number;
12
+ class?: string;
13
+ }
14
+ /**
15
+ * GitHub-contributions-style heatmap: a grid of the last `weeks` weeks ending
16
+ * today, laid out as columns (one per week) of 7 vertically-stacked day-cells
17
+ * (Sun→Sat). Each cell is shaded by its count into 5 intensity levels and shows
18
+ * a native tooltip like "3 on 2026-07-10". A "Less … More" legend sits below.
19
+ * Theme-agnostic (semantic tokens only).
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * <CalendarHeatmap values={[{ date: '2026-07-10', count: 3 }]} weeks={26} />
24
+ * ```
25
+ */
26
+ export declare function CalendarHeatmap(props: CalendarHeatmapProps): JSX.Element;
@@ -0,0 +1,28 @@
1
+ import { JSX } from 'solid-js';
2
+ export interface ClockProps {
3
+ /** 'digital' (default) or 'analog'. */
4
+ variant?: 'digital' | 'analog';
5
+ /** Show the seconds hand / seconds digits. @default true */
6
+ seconds?: boolean;
7
+ /** 12-hour clock with AM/PM instead of 24-hour. @default false */
8
+ hour12?: boolean;
9
+ /** IANA time zone (e.g. 'America/Hermosillo'); defaults to the local zone. */
10
+ timeZone?: string;
11
+ /** Diameter in px for the analog face. @default 160 */
12
+ size?: number;
13
+ class?: string;
14
+ }
15
+ /**
16
+ * Live, self-updating clock. Ticks once per second from a single interval
17
+ * (started in `onMount`, cleared in `onCleanup`) and renders either a digital
18
+ * `HH:MM:SS` readout or an analog SVG dial. Pass `timeZone` to show a specific
19
+ * IANA zone instead of the viewer's local time.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * <Clock />
24
+ * <Clock variant="analog" size={200} timeZone="America/Hermosillo" />
25
+ * <Clock hour12 seconds={false} />
26
+ * ```
27
+ */
28
+ export declare function Clock(props: ClockProps): JSX.Element;
@@ -0,0 +1,22 @@
1
+ import { JSX } from 'solid-js';
2
+ export interface ColorPickerProps {
3
+ /** Current color as a `#rrggbb` hex string. */
4
+ value: string;
5
+ /** Called with a valid `#rrggbb` hex whenever the user picks a new color. */
6
+ onChange: (hex: string) => void;
7
+ /** Preset colors shown as clickable swatches. Defaults to a small palette. */
8
+ swatches?: string[];
9
+ class?: string;
10
+ }
11
+ /**
12
+ * Controlled color picker: a native color well, a hex text field, and a row of
13
+ * preset swatches. The text field validates against `#rrggbb` and only reports
14
+ * complete, valid hex values while letting you type freely in between.
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * const [color, setColor] = createSignal('#3b82f6')
19
+ * <ColorPicker value={color()} onChange={setColor} />
20
+ * ```
21
+ */
22
+ export declare function ColorPicker(props: ColorPickerProps): JSX.Element;
@@ -0,0 +1,42 @@
1
+ import { JSX } from 'solid-js';
2
+ /** A single comment node, optionally carrying its own nested `replies`. */
3
+ export interface CommentData {
4
+ /** Unique identifier for the comment. */
5
+ id: string;
6
+ /** Display name of the comment's author. */
7
+ author: string;
8
+ /** Author avatar image URL; falls back to the author's initials. */
9
+ avatar?: string;
10
+ /** Human-readable timestamp shown next to the author. */
11
+ time?: string;
12
+ /** The comment body. */
13
+ content: JSX.Element;
14
+ /** Nested replies, rendered recursively below the comment. */
15
+ replies?: CommentData[];
16
+ }
17
+ export interface CommentProps {
18
+ comment: CommentData;
19
+ /** Renders an actions row (e.g. reply/like) for a given comment. */
20
+ actions?: (comment: CommentData) => JSX.Element;
21
+ class?: string;
22
+ }
23
+ /**
24
+ * Threaded comment layout: a left-aligned {@link Avatar} beside the author,
25
+ * timestamp, content, and an optional actions row. Any `replies` are rendered
26
+ * recursively in a left-indented, bordered thread, inheriting the same `actions`.
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * <Comment
31
+ * comment={{
32
+ * id: '1',
33
+ * author: 'Jane Doe',
34
+ * time: '2h ago',
35
+ * content: <p>Great work on this!</p>,
36
+ * replies: [{ id: '2', author: 'John Smith', content: <p>Agreed.</p> }],
37
+ * }}
38
+ * actions={(c) => <button>Reply to {c.author}</button>}
39
+ * />
40
+ * ```
41
+ */
42
+ export declare function Comment(props: CommentProps): JSX.Element;
@@ -9,7 +9,8 @@ export interface CountdownProps {
9
9
  /**
10
10
  * Live countdown to `props.to`, shown as four cells (Days / Hours / Mins /
11
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.
12
+ * zero. Each digit rolls like an old flip clock as it changes. Hours, minutes,
13
+ * and seconds are zero-padded to two digits.
13
14
  *
14
15
  * @example
15
16
  * ```tsx
@@ -0,0 +1,22 @@
1
+ import { JSX } from 'solid-js';
2
+ /** Props for {@link Portal}. */
3
+ export interface PortalProps {
4
+ /** Where to mount. Defaults to `document.body`. */
5
+ mount?: Node;
6
+ /** Use a Shadow DOM root for the portal container. */
7
+ useShadow?: boolean;
8
+ children: JSX.Element;
9
+ }
10
+ /**
11
+ * Renders its children into a different place in the DOM (by default
12
+ * `document.body`), so overlays aren't clipped by an ancestor's `overflow` or
13
+ * transformed stacking context. Built on Solid's `Portal`.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * <Portal>
18
+ * <div class="fixed inset-0 grid place-items-center">Floating layer</div>
19
+ * </Portal>
20
+ * ```
21
+ */
22
+ export declare function Portal(props: PortalProps): JSX.Element;
@@ -0,0 +1,33 @@
1
+ import { JSX } from 'solid-js';
2
+ export interface SortableProps<T> {
3
+ /** The items to render, in current order. */
4
+ items: T[];
5
+ /** Stable unique key for an item (used for drag tracking + list keying). */
6
+ itemKey: (item: T) => string;
7
+ /** Render an item's content (the grip handle is added automatically to its left). */
8
+ children: (item: T) => JSX.Element;
9
+ /** Called with the new order after a drop. */
10
+ onReorder: (items: T[]) => void;
11
+ /** Disable dragging. */
12
+ disabled?: boolean;
13
+ class?: string;
14
+ }
15
+ /**
16
+ * Vertical list whose rows reorder by dragging a grip handle. Pointer-events
17
+ * driven (works with mouse and touch): the grabbed row leaves behind a dashed
18
+ * placeholder while a floating clone follows the pointer, and other rows shift
19
+ * live as the pointer crosses their midpoint. `onReorder` fires once on drop
20
+ * with the final order.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * <Sortable
25
+ * items={fields()}
26
+ * itemKey={(f) => f.id}
27
+ * onReorder={setFields}
28
+ * >
29
+ * {(field) => <span>{field.label}</span>}
30
+ * </Sortable>
31
+ * ```
32
+ */
33
+ export declare function Sortable<T>(props: SortableProps<T>): JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a4ui/core",
3
- "version": "0.6.0",
3
+ "version": "0.8.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",
@@ -40,13 +40,18 @@
40
40
  "import": "./dist/index.js"
41
41
  },
42
42
  "./preset": "./preset.js",
43
- "./styles.css": "./dist/styles.css"
43
+ "./styles.css": "./dist/styles.css",
44
+ "./elements": {
45
+ "import": "./dist/elements.js"
46
+ },
47
+ "./elements.css": "./dist/elements.css"
44
48
  },
45
49
  "publishConfig": {
46
50
  "access": "public"
47
51
  },
48
52
  "scripts": {
49
- "build": "vite build",
53
+ "build": "vite build && npm run build:elements",
54
+ "build:elements": "vite build --config vite.elements.config.ts && node scripts/build-elements-css.mjs",
50
55
  "dev": "vite build --watch",
51
56
  "preview": "node scripts/gen-llms.mjs && vite --config vite.preview.config.ts",
52
57
  "preview:build": "node scripts/gen-llms.mjs && vite build --config vite.preview.config.ts",
@@ -99,6 +104,7 @@
99
104
  "lint-staged": "^16.4.0",
100
105
  "playwright-core": "^1.61.1",
101
106
  "prettier": "^3.9.5",
107
+ "solid-element": "^1.9.2",
102
108
  "tailwindcss": "^3.4.19",
103
109
  "typescript": "^5.6.0",
104
110
  "typescript-eslint": "^8.64.0",
package/preset.js CHANGED
@@ -14,7 +14,9 @@
14
14
  // content: ['./src/**/*.{ts,tsx}', './node_modules/@a4ui/core/dist/**/*.js'],
15
15
  // }
16
16
 
17
- import plugin from 'tailwindcss/plugin'
17
+ // Explicit .js extension so the preset resolves under strict Node ESM (used by
18
+ // our elements-css build), not just bundlers.
19
+ import plugin from 'tailwindcss/plugin.js'
18
20
 
19
21
  // Frosted "space glass" surfaces. addComponents so they tree-shake like any
20
22
  // utility (emitted only when the class is found in scanned content — a4ui's own