@hilum/ui 0.1.1 → 0.1.3

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 (92) hide show
  1. package/README.md +23 -4
  2. package/dist/chunk-J2QQDUF4.js +204 -0
  3. package/dist/chunk-J2QQDUF4.js.map +1 -0
  4. package/dist/create-theme.d.ts +27 -0
  5. package/dist/create-theme.js +172 -0
  6. package/dist/create-theme.js.map +1 -0
  7. package/dist/index.d.ts +21 -8
  8. package/dist/index.js +393 -381
  9. package/dist/index.js.map +1 -1
  10. package/dist/tokens.css +59 -50
  11. package/dist/tokens.d.ts +46 -38
  12. package/dist/tokens.js +1 -191
  13. package/dist/tokens.js.map +1 -1
  14. package/llms.txt +1514 -0
  15. package/package.json +11 -7
  16. package/src/components/accordion.tsx +5 -5
  17. package/src/components/action-panel.tsx +6 -6
  18. package/src/components/activity-feed.tsx +4 -4
  19. package/src/components/alert-dialog.tsx +3 -3
  20. package/src/components/alert.tsx +4 -4
  21. package/src/components/avatar-stack.tsx +2 -2
  22. package/src/components/avatar.tsx +2 -2
  23. package/src/components/badge.tsx +6 -5
  24. package/src/components/breadcrumb.tsx +5 -5
  25. package/src/components/button-group.tsx +4 -4
  26. package/src/components/button.tsx +6 -5
  27. package/src/components/calendar.tsx +7 -7
  28. package/src/components/card-heading.tsx +3 -3
  29. package/src/components/card.tsx +3 -3
  30. package/src/components/chart.tsx +11 -11
  31. package/src/components/checkbox.tsx +1 -1
  32. package/src/components/color-input.tsx +7 -7
  33. package/src/components/color-picker.tsx +5 -5
  34. package/src/components/combobox.tsx +10 -10
  35. package/src/components/command-palette.tsx +11 -11
  36. package/src/components/command.tsx +13 -13
  37. package/src/components/context-menu.tsx +15 -16
  38. package/src/components/data-table.tsx +6 -6
  39. package/src/components/date-picker.tsx +9 -4
  40. package/src/components/description-list.tsx +8 -8
  41. package/src/components/dialog.tsx +3 -3
  42. package/src/components/drawer.tsx +5 -5
  43. package/src/components/dropdown-menu.tsx +15 -16
  44. package/src/components/empty-state.tsx +3 -3
  45. package/src/components/field.tsx +13 -6
  46. package/src/components/grid-list.tsx +12 -12
  47. package/src/components/hover-card.tsx +1 -1
  48. package/src/components/input-group.tsx +8 -8
  49. package/src/components/input-number.tsx +7 -7
  50. package/src/components/input-otp.tsx +3 -3
  51. package/src/components/input.tsx +5 -4
  52. package/src/components/kbd.tsx +1 -1
  53. package/src/components/label.tsx +1 -1
  54. package/src/components/menubar.tsx +21 -22
  55. package/src/components/native-select.tsx +4 -4
  56. package/src/components/navigation-menu.tsx +10 -10
  57. package/src/components/notification.tsx +10 -10
  58. package/src/components/page-heading.tsx +8 -8
  59. package/src/components/pagination.tsx +1 -1
  60. package/src/components/progress.tsx +1 -1
  61. package/src/components/property-row.tsx +1 -1
  62. package/src/components/radio-card.tsx +6 -6
  63. package/src/components/radio-group.tsx +3 -3
  64. package/src/components/resizable.tsx +3 -3
  65. package/src/components/scroll-area.tsx +1 -1
  66. package/src/components/section-heading.tsx +3 -3
  67. package/src/components/select.tsx +11 -11
  68. package/src/components/separator.tsx +1 -1
  69. package/src/components/sheet.tsx +3 -3
  70. package/src/components/sidebar.tsx +19 -19
  71. package/src/components/skeleton.tsx +1 -1
  72. package/src/components/slider.tsx +1 -1
  73. package/src/components/sonner.tsx +5 -5
  74. package/src/components/stacked-list.tsx +4 -4
  75. package/src/components/stat-card.tsx +6 -6
  76. package/src/components/steps.tsx +13 -12
  77. package/src/components/switch.tsx +1 -1
  78. package/src/components/table.tsx +9 -9
  79. package/src/components/tabs.tsx +2 -2
  80. package/src/components/textarea.tsx +4 -4
  81. package/src/components/toggle.tsx +8 -8
  82. package/src/components/tooltip.tsx +1 -1
  83. package/src/index.ts +3 -2
  84. package/src/tokens/tokens.ts +54 -40
  85. package/src/components/__tests__/data.test.tsx +0 -180
  86. package/src/components/__tests__/disclosure.test.tsx +0 -198
  87. package/src/components/__tests__/display.test.tsx +0 -262
  88. package/src/components/__tests__/feedback.test.tsx +0 -138
  89. package/src/components/__tests__/form.test.tsx +0 -297
  90. package/src/components/__tests__/layout.test.tsx +0 -388
  91. package/src/components/__tests__/overlay.test.tsx +0 -90
  92. package/src/components/__tests__/primitives.test.tsx +0 -248
@@ -1,90 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { render, screen } from "@testing-library/react";
3
- import { userEvent } from "@testing-library/user-event";
4
- import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from "../tooltip";
5
- import { Progress } from "../progress";
6
- import { Switch } from "../switch";
7
- import { Slider } from "../slider";
8
-
9
- /**
10
- * Tests for Radix overlay primitives. These focus on:
11
- * 1. Trigger elements render and are accessible
12
- * 2. Content appears on interaction
13
- * 3. No render crashes
14
- */
15
-
16
- /* ------------------------------------------------------------------ */
17
- /* Tooltip */
18
- /* ------------------------------------------------------------------ */
19
-
20
- describe("Tooltip", () => {
21
- it("renders the trigger element", () => {
22
- render(
23
- <TooltipProvider>
24
- <Tooltip>
25
- <TooltipTrigger asChild>
26
- <button>Hover me</button>
27
- </TooltipTrigger>
28
- <TooltipContent>Helpful hint</TooltipContent>
29
- </Tooltip>
30
- </TooltipProvider>,
31
- );
32
- expect(screen.getByRole("button", { name: "Hover me" })).toBeInTheDocument();
33
- });
34
-
35
- it("shows tooltip content on hover", async () => {
36
- const user = userEvent.setup();
37
- render(
38
- <TooltipProvider>
39
- <Tooltip>
40
- <TooltipTrigger asChild>
41
- <button>Trigger</button>
42
- </TooltipTrigger>
43
- <TooltipContent>Tooltip text</TooltipContent>
44
- </Tooltip>
45
- </TooltipProvider>,
46
- );
47
- await user.hover(screen.getByRole("button", { name: "Trigger" }));
48
- // Use role="tooltip" to target the accessible tooltip element specifically
49
- expect(await screen.findByRole("tooltip", { name: "Tooltip text" })).toBeInTheDocument();
50
- });
51
- });
52
-
53
- /* ------------------------------------------------------------------ */
54
- /* Switch — additional a11y checks */
55
- /* ------------------------------------------------------------------ */
56
-
57
- describe("Switch a11y", () => {
58
- it("has a role of switch", () => {
59
- render(<Switch aria-label="Enable notifications" />);
60
- expect(screen.getByRole("switch", { name: "Enable notifications" })).toBeInTheDocument();
61
- });
62
- });
63
-
64
- /* ------------------------------------------------------------------ */
65
- /* Slider — additional a11y checks */
66
- /* ------------------------------------------------------------------ */
67
-
68
- describe("Slider a11y", () => {
69
- it("has proper ARIA attributes", () => {
70
- render(<Slider defaultValue={[30]} min={0} max={100} aria-label="Volume" />);
71
- const slider = screen.getByRole("slider");
72
- expect(slider).toHaveAttribute("aria-valuemin", "0");
73
- expect(slider).toHaveAttribute("aria-valuemax", "100");
74
- expect(slider).toHaveAttribute("aria-valuenow", "30");
75
- });
76
- });
77
-
78
- /* ------------------------------------------------------------------ */
79
- /* Progress — additional a11y checks */
80
- /* ------------------------------------------------------------------ */
81
-
82
- describe("Progress a11y", () => {
83
- it("has proper ARIA range attributes", () => {
84
- render(<Progress value={45} />);
85
- const bar = screen.getByRole("progressbar");
86
- expect(bar).toHaveAttribute("aria-valuemin", "0");
87
- expect(bar).toHaveAttribute("aria-valuemax", "100");
88
- expect(bar).toHaveAttribute("aria-valuenow", "45");
89
- });
90
- });
@@ -1,248 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { render, screen } from "@testing-library/react";
3
- import { Button } from "../button";
4
- import { Badge } from "../badge";
5
- import { Input } from "../input";
6
- import { Textarea } from "../textarea";
7
- import { Label } from "../label";
8
- import { Spinner } from "../spinner";
9
- import { Skeleton } from "../skeleton";
10
- import { Separator } from "../separator";
11
- import { Kbd } from "../kbd";
12
-
13
- /* ------------------------------------------------------------------ */
14
- /* Button */
15
- /* ------------------------------------------------------------------ */
16
-
17
- describe("Button", () => {
18
- it("renders as a button element by default", () => {
19
- render(<Button>Click me</Button>);
20
- expect(screen.getByRole("button", { name: "Click me" })).toBeInTheDocument();
21
- });
22
-
23
- it("forwards data-slot attribute", () => {
24
- render(<Button>Test</Button>);
25
- expect(screen.getByRole("button")).toHaveAttribute("data-slot", "button");
26
- });
27
-
28
- it("renders all variants without error", () => {
29
- const variants = [
30
- "default",
31
- "destructive",
32
- "outline",
33
- "secondary",
34
- "brand",
35
- "ghost",
36
- "link",
37
- ] as const;
38
- for (const variant of variants) {
39
- const { unmount } = render(<Button variant={variant}>Btn</Button>);
40
- expect(screen.getByRole("button")).toBeInTheDocument();
41
- unmount();
42
- }
43
- });
44
-
45
- it("renders all sizes without error", () => {
46
- const sizes = ["default", "xs", "sm", "lg", "icon", "icon-xs", "icon-sm", "icon-lg"] as const;
47
- for (const size of sizes) {
48
- const { unmount } = render(<Button size={size}>B</Button>);
49
- expect(screen.getByRole("button")).toBeInTheDocument();
50
- unmount();
51
- }
52
- });
53
-
54
- it("renders as child element when asChild is true", () => {
55
- render(
56
- <Button asChild>
57
- <a href="/home">Home</a>
58
- </Button>,
59
- );
60
- expect(screen.getByRole("link", { name: "Home" })).toBeInTheDocument();
61
- });
62
-
63
- it("is disabled when disabled prop is set", () => {
64
- render(<Button disabled>Disabled</Button>);
65
- expect(screen.getByRole("button")).toBeDisabled();
66
- });
67
- });
68
-
69
- /* ------------------------------------------------------------------ */
70
- /* Badge */
71
- /* ------------------------------------------------------------------ */
72
-
73
- describe("Badge", () => {
74
- it("renders children", () => {
75
- render(<Badge>Active</Badge>);
76
- expect(screen.getByText("Active")).toBeInTheDocument();
77
- });
78
-
79
- it("renders all variants without error", () => {
80
- const variants = [
81
- "default",
82
- "secondary",
83
- "outline",
84
- "brand",
85
- "success",
86
- "warning",
87
- "destructive",
88
- ] as const;
89
- for (const variant of variants) {
90
- const { unmount } = render(<Badge variant={variant}>v</Badge>);
91
- expect(screen.getByText("v")).toBeInTheDocument();
92
- unmount();
93
- }
94
- });
95
-
96
- it("forwards className", () => {
97
- const { container } = render(<Badge className="custom-class">Badge</Badge>);
98
- expect(container.firstChild).toHaveClass("custom-class");
99
- });
100
- });
101
-
102
- /* ------------------------------------------------------------------ */
103
- /* Input */
104
- /* ------------------------------------------------------------------ */
105
-
106
- describe("Input", () => {
107
- it("renders an input element", () => {
108
- render(<Input />);
109
- expect(screen.getByRole("textbox")).toBeInTheDocument();
110
- });
111
-
112
- it("carries data-slot attribute", () => {
113
- render(<Input />);
114
- expect(screen.getByRole("textbox")).toHaveAttribute("data-slot", "input");
115
- });
116
-
117
- it("accepts a placeholder", () => {
118
- render(<Input placeholder="Type here" />);
119
- expect(screen.getByPlaceholderText("Type here")).toBeInTheDocument();
120
- });
121
-
122
- it("is disabled when disabled prop is set", () => {
123
- render(<Input disabled />);
124
- expect(screen.getByRole("textbox")).toBeDisabled();
125
- });
126
- });
127
-
128
- /* ------------------------------------------------------------------ */
129
- /* Textarea */
130
- /* ------------------------------------------------------------------ */
131
-
132
- describe("Textarea", () => {
133
- it("renders a textarea", () => {
134
- render(<Textarea />);
135
- expect(screen.getByRole("textbox")).toBeInTheDocument();
136
- });
137
-
138
- it("carries data-slot attribute", () => {
139
- render(<Textarea />);
140
- expect(screen.getByRole("textbox")).toHaveAttribute("data-slot", "textarea");
141
- });
142
-
143
- it("accepts placeholder", () => {
144
- render(<Textarea placeholder="Write here" />);
145
- expect(screen.getByPlaceholderText("Write here")).toBeInTheDocument();
146
- });
147
- });
148
-
149
- /* ------------------------------------------------------------------ */
150
- /* Label */
151
- /* ------------------------------------------------------------------ */
152
-
153
- describe("Label", () => {
154
- it("renders label text", () => {
155
- render(<Label>Username</Label>);
156
- expect(screen.getByText("Username")).toBeInTheDocument();
157
- });
158
-
159
- it("associates with an input via htmlFor", () => {
160
- render(
161
- <>
162
- <Label htmlFor="input-id">Name</Label>
163
- <input id="input-id" />
164
- </>,
165
- );
166
- expect(screen.getByLabelText("Name")).toBeInTheDocument();
167
- });
168
- });
169
-
170
- /* ------------------------------------------------------------------ */
171
- /* Spinner */
172
- /* ------------------------------------------------------------------ */
173
-
174
- describe("Spinner", () => {
175
- it('renders with role="status"', () => {
176
- render(<Spinner />);
177
- expect(screen.getByRole("status")).toBeInTheDocument();
178
- });
179
-
180
- it("has accessible label", () => {
181
- render(<Spinner />);
182
- expect(screen.getByRole("status")).toHaveAttribute("aria-label", "Loading");
183
- });
184
-
185
- it("renders all sizes without error", () => {
186
- const sizes = ["xs", "sm", "default", "lg", "xl"] as const;
187
- for (const size of sizes) {
188
- const { unmount } = render(<Spinner size={size} />);
189
- expect(screen.getByRole("status")).toBeInTheDocument();
190
- unmount();
191
- }
192
- });
193
- });
194
-
195
- /* ------------------------------------------------------------------ */
196
- /* Skeleton */
197
- /* ------------------------------------------------------------------ */
198
-
199
- describe("Skeleton", () => {
200
- it("renders a div with data-slot", () => {
201
- const { container } = render(<Skeleton />);
202
- expect(container.firstChild).toHaveAttribute("data-slot", "skeleton");
203
- });
204
-
205
- it("forwards className", () => {
206
- const { container } = render(<Skeleton className="w-24 h-4" />);
207
- expect(container.firstChild).toHaveClass("w-24", "h-4");
208
- });
209
- });
210
-
211
- /* ------------------------------------------------------------------ */
212
- /* Separator */
213
- /* ------------------------------------------------------------------ */
214
-
215
- describe("Separator", () => {
216
- it("renders a separator with role", () => {
217
- render(<Separator />);
218
- expect(screen.getByRole("none")).toBeInTheDocument();
219
- });
220
-
221
- it("renders horizontal orientation without error", () => {
222
- const { unmount } = render(<Separator orientation="horizontal" />);
223
- expect(screen.getByRole("none")).toBeInTheDocument();
224
- unmount();
225
- });
226
-
227
- it("renders vertical orientation without error", () => {
228
- const { unmount } = render(<Separator orientation="vertical" />);
229
- expect(screen.getByRole("none")).toBeInTheDocument();
230
- unmount();
231
- });
232
- });
233
-
234
- /* ------------------------------------------------------------------ */
235
- /* Kbd */
236
- /* ------------------------------------------------------------------ */
237
-
238
- describe("Kbd", () => {
239
- it("renders keyboard shortcut text", () => {
240
- render(<Kbd>⌘K</Kbd>);
241
- expect(screen.getByText("⌘K")).toBeInTheDocument();
242
- });
243
-
244
- it("renders as kbd element", () => {
245
- const { container } = render(<Kbd>Esc</Kbd>);
246
- expect(container.querySelector("kbd")).toBeInTheDocument();
247
- });
248
- });