@skutally/ui-library 0.1.0 → 0.1.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.
Files changed (3) hide show
  1. package/README.md +54 -483
  2. package/bin/cli.js +1 -1
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -1,514 +1,85 @@
1
- # UI Library
1
+ # ui-library
2
2
 
3
- A ui-style component library for HTML, Tailwind CSS v4, and Stimulus.js. Copy and paste beautifully designed, accessible components into your projects. No npm dependency the code is yours.
3
+ A CLI for adding beautifully designed components to your HTML + Tailwind CSS v4 + Stimulus.js projects.
4
4
 
5
- ---
5
+ This is NOT a component library you install as a dependency. It's a collection of re-usable components that you copy into your apps and customize. The code is yours.
6
6
 
7
- ## Table of Contents
7
+ ## init
8
8
 
9
- - [Overview](#overview)
10
- - [Tech Stack](#tech-stack)
11
- - [Project Structure](#project-structure)
12
- - [Getting Started](#getting-started)
13
- - [Prerequisites](#prerequisites)
14
- - [Installation](#installation)
15
- - [Development](#development)
16
- - [CLI Tool](#cli-tool)
17
- - [Theming](#theming)
18
- - [CSS Variables](#css-variables)
19
- - [Dark Mode](#dark-mode)
20
- - [Adding Custom Colors](#adding-custom-colors)
21
- - [Components](#components)
22
- - [Component List](#component-list)
23
- - [Component Usage Pattern](#component-usage-pattern)
24
- - [Component API Reference](#component-api-reference)
25
- - [Framework Integration](#framework-integration)
26
- - [Rails (Hotwire)](#rails-hotwire)
27
- - [Accessibility](#accessibility)
28
- - [Contributing](#contributing)
9
+ Use the `init` command to initialize dependencies for a new project.
29
10
 
30
- ---
11
+ The `init` command creates a `components.json` config file and sets up `src/base.css` with Tailwind CSS v4 theme variables.
31
12
 
32
- ## Overview
33
-
34
- This is NOT a traditional component library you install as a dependency. It's a collection of 23 re-usable components that you copy and paste into your apps and customize to your needs.
35
-
36
- Why copy/paste instead of npm install?
37
- - Full ownership and control over the code
38
- - No version conflicts or breaking updates
39
- - Customize everything — styles, behavior, markup
40
- - Zero runtime dependency on this library
41
-
42
- ---
43
-
44
- ## Tech Stack
45
-
46
- | Technology | Version | Purpose |
47
- |---|---|---|
48
- | Tailwind CSS | v4.2+ | Utility-first styling with `@theme` directive |
49
- | Stimulus.js | Latest | Lightweight JavaScript behavior via controllers |
50
- | HTML | 5 | Semantic markup with ARIA attributes |
51
- | Node.js | 18+ | CLI tool and build scripts |
52
-
53
- Fonts (from Google Fonts):
54
- - Inter (400, 500, 600, 700) — UI text
55
- - JetBrains Mono (400, 500) — Code blocks
56
-
57
- ---
58
-
59
- ## Project Structure
60
-
61
- ui-library/
62
- ├── bin/
63
- │ └── cli.js # CLI tool for component management
64
- ├── src/
65
- │ ├── base.css # Tailwind v4 theme config + CSS variables
66
- │ ├── controllers.js # Demo page controller aggregator
67
- │ └── controllers/ # Stimulus.js controllers (19 files)
68
- │ ├── accordion.js
69
- │ ├── alert.js
70
- │ ├── badge.js
71
- │ ├── button.js
72
- │ ├── card.js
73
- │ ├── checkbox.js
74
- │ ├── dropdown.js
75
- │ ├── input.js
76
- │ ├── modal.js
77
- │ ├── popover.js
78
- │ ├── progress.js
79
- │ ├── radio.js
80
- │ ├── sheet.js
81
- │ ├── slider.js
82
- │ ├── table.js
83
- │ ├── tabs.js
84
- │ ├── toast.js
85
- │ ├── toggle.js
86
- │ └── tooltip.js
87
- ├── components/ # Component HTML templates (23 files)
88
- │ ├── accordion.html
89
- │ ├── alert.html
90
- │ ├── avatar.html
91
- │ ├── badge.html
92
- │ ├── breadcrumb.html
93
- │ ├── button.html
94
- │ ├── card.html
95
- │ ├── checkbox.html
96
- │ ├── dropdown.html
97
- │ ├── input.html
98
- │ ├── modal.html
99
- │ ├── popover.html
100
- │ ├── progress.html
101
- │ ├── radio.html
102
- │ ├── separator.html
103
- │ ├── sheet.html
104
- │ ├── skeleton.html
105
- │ ├── slider.html
106
- │ ├── table.html
107
- │ ├── tabs.html
108
- │ ├── toast.html
109
- │ ├── toggle.html
110
- │ └── tooltip.html
111
- ├── registry/
112
- │ └── registry.json # Component metadata & dependency graph
113
- ├── templates/
114
- │ └── components.json # Project init template
115
- ├── dist/
116
- │ └── output.css # Compiled Tailwind CSS output
117
- ├── index.html # Component showcase / demo page
118
- ├── docs.html # Documentation page
119
- ├── blocks.html # Pre-built page blocks & templates
120
- └── package.json
121
-
122
-
123
- ## Getting Started
124
-
125
- ### Prerequisites
126
-
127
- - Node.js 18 or higher
128
- - npm (comes with Node.js)
129
-
130
- ### Installation
131
-
132
- Step 1: Create your project
133
-
134
- mkdir my-project && cd my-project
135
- npm init -y
136
-
137
- Step 2: Install Tailwind CSS v4
138
-
139
- npm install tailwindcss @tailwindcss/cli
140
-
141
-
142
- Step 3: Add Stimulus.js
143
-
144
- <!-- Option A: CDN (simplest) -->
145
- <script src="https://cdn.jsdelivr.net/npm/@hotwired/stimulus/dist/stimulus.umd.js"></script>
146
-
147
- # Option B: npm
148
- npm install @hotwired/stimulus
149
-
150
-
151
- Step 4: Initialize UI Library
152
-
153
- npx ui-library init
154
-
155
-
156
- This creates:
157
- - `components.json` — project configuration
158
- - `src/base.css` — Tailwind v4 theme with CSS variables
159
-
160
- Step 5: Add components
161
-
162
-
163
- npx ui-library add button
164
- npx ui-library add modal tabs accordion
165
-
166
-
167
- Step 6: Build CSS and start developing
168
-
169
- # Watch mode (development)
170
- npx @tailwindcss/cli -i src/base.css -o dist/output.css --watch
171
-
172
- # Production build (minified)
173
- npx @tailwindcss/cli -i src/base.css -o dist/output.css --minify
174
-
175
-
176
- Step 7: Link CSS and Stimulus in your HTML
177
-
178
-
179
- ### Development
180
-
181
- If you cloned this repository directly:
182
-
183
- # Install dependencies
184
- npm install
185
-
186
- # Watch CSS changes during development
187
- npm run dev
188
-
189
- # Build for production
190
- npm run build
191
-
192
- # Start local server
193
- npm run serve
194
-
195
- # Build + serve
196
-
197
-
198
- ## CLI Tool
199
-
200
- The CLI (`bin/cli.js`) provides four commands:
201
-
202
- `ui-library init`
203
-
204
- Initializes a project with `components.json` and `src/base.css`.
205
-
206
- npx ui-library init\
207
-
208
- ### `ui-library add <name> [name...]`
209
-
210
- Installs components with automatic dependency resolution.
211
-
212
- npx ui-library add button
213
- npx ui-library add modal tabs accordion
214
- npx ui-library add slider checkbox radio
215
-
216
-
217
- - Copies controller JS to `src/controllers/`
218
- - Copies HTML template to `components/ui/`
219
- - Auto-resolves dependencies (e.g., `modal` automatically adds `button`)
220
- - Prints registration hints after install
221
-
222
- ### `ui-library list`
223
-
224
- Lists all 23 available components with descriptions.
225
-
226
- npx ui-library list
227
-
228
-
229
- ### `ui-library diff <name>`
230
-
231
- Checks if your local controller differs from the registry version.
232
-
233
- npx ui-library diff button
234
-
235
- ### `components.json` Configuration
236
-
237
- ```json
238
- {
239
- "$schema": "https://ui-library.dev/schema.json",
240
- "style": "default",
241
- "tailwind": {
242
- "version": 4,
243
- "css": "src/base.css",
244
- "cssVariables": true
245
- },
246
- "aliases": {
247
- "controllers": "src/controllers",
248
- "components": "components/ui"
249
- }
250
- }
251
-
252
- | Option | Description |
253
- |---|---|
254
- | `style` | Style preset for components. Default: `"default"` |
255
- | `tailwind.version` | Tailwind CSS version. Currently supports v4 |
256
- | `tailwind.css` | Path to CSS file with Tailwind v4 theme |
257
- | `tailwind.cssVariables` | Use CSS variables for theming. Default: `true` |
258
- | `aliases.controllers` | Directory for Stimulus controllers |
259
- | `aliases.components` | Directory for component HTML templates |
260
-
261
- ---
262
-
263
- ## Theming
264
-
265
- ### CSS Variables
266
-
267
- All theming is done via CSS variables in `src/base.css` using Tailwind v4's `@theme` directive. No `tailwind.config.js` needed.
268
-
269
- Color convention: Each semantic color has a `background` and `foreground` pair:
270
-
271
- ```css
272
- :root {
273
- --background: 0 0% 100%; /* Page background */
274
- --foreground: 240 10% 3.9%; /* Page text */
275
-
276
- --card: 0 0% 100%; /* Card background */
277
- --card-foreground: 240 10% 3.9%;
278
-
279
- --primary: 240 5.9% 10%; /* Primary actions */
280
- --primary-foreground: 0 0% 98%;
281
-
282
- --muted: 240 4.8% 95.9%; /* Muted/subtle elements */
283
- --muted-foreground: 240 3.8% 46.1%;
284
-
285
- --accent: 240 4.8% 95.9%; /* Accent/hover states */
286
- --accent-foreground: 240 5.9% 10%;
287
-
288
- --destructive: 0 84.2% 60.2%; /* Destructive actions */
289
- --destructive-foreground: 0 0% 98%;
290
-
291
- --border: 240 5.9% 90%; /* Border color */
292
- --input: 240 5.9% 90%; /* Input border */
293
- --ring: 240 5.9% 10%; /* Focus ring */
294
- --radius: 0.5rem; /* Border radius */
295
- }
13
+ ```bash
14
+ npx @skutally/ui-library init
296
15
  ```
297
16
 
298
- These are mapped to Tailwind classes via `@theme`:
17
+ ## add
299
18
 
300
- ```css
301
- @theme {
302
- --font-sans: "Inter", "system-ui", "-apple-system", "sans-serif";
303
- --font-mono: "JetBrains Mono", "Fira Code", "monospace";
19
+ Use the `add` command to add components to your project.
304
20
 
305
- --color-background: hsl(var(--background));
306
- --color-foreground: hsl(var(--foreground));
307
- --color-primary: hsl(var(--primary));
308
- --color-primary-foreground: hsl(var(--primary-foreground));
309
- /* ... etc */
21
+ The `add` command copies a component to your project and automatically resolves all required dependencies.
310
22
 
311
- --radius-lg: var(--radius);
312
- --radius-md: calc(var(--radius) - 2px);
313
- --radius-sm: calc(var(--radius) - 4px);
314
- }
23
+ ```bash
24
+ npx @skutally/ui-library add [component]
315
25
  ```
316
26
 
317
- ### Dark Mode
318
-
319
- Dark mode uses the `.dark` class on `<html>`. All CSS variables automatically switch:
27
+ ### Example
320
28
 
321
- ```css
322
- .dark {
323
- --background: 240 10% 3.9%;
324
- --foreground: 0 0% 98%;
325
- --primary: 0 0% 98%;
326
- --primary-foreground: 240 5.9% 10%;
327
- --muted: 240 3.7% 15.9%;
328
- --muted-foreground: 240 5% 64.9%;
329
- --accent: 240 3.7% 15.9%;
330
- --accent-foreground: 0 0% 98%;
331
- --destructive: 0 62.8% 30.6%;
332
- --destructive-foreground: 0 0% 98%;
333
- --border: 240 3.7% 15.9%;
334
- --input: 240 3.7% 15.9%;
335
- --ring: 240 4.9% 83.9%;
336
- }
29
+ ```bash
30
+ npx @skutally/ui-library add button
337
31
  ```
338
32
 
339
- Toggle implementation:
33
+ You can also add multiple components at once:
340
34
 
341
- ```javascript
342
- // Toggle dark mode
343
- function toggleDarkMode() {
344
- document.documentElement.classList.toggle('dark')
345
- const isDark = document.documentElement.classList.contains('dark')
346
- localStorage.setItem('theme', isDark ? 'dark' : 'light')
347
- }
348
-
349
- // Load saved preference on page load (place in <head> to prevent FOUC)
350
- if (localStorage.getItem('theme') === 'dark' ||
351
- (!localStorage.getItem('theme') &&
352
- window.matchMedia('(prefers-color-scheme: dark)').matches)) {
353
- document.documentElement.classList.add('dark')
354
- }
35
+ ```bash
36
+ npx @skutally/ui-library add modal tabs accordion
355
37
  ```
356
38
 
357
- ### Adding Custom Colors
358
-
359
- 1. Define the variable in `:root`:
360
-
361
- :root {
362
- --warning: 38 92% 50%;
363
- --warning-foreground: 48 96% 89%;
364
- }
365
-
366
- 2. Add to the `@theme` block:
367
-
368
- @theme {
369
- --color-warning: hsl(var(--warning));
370
- --color-warning-foreground: hsl(var(--warning-foreground));
371
- }
372
-
373
- 3. Use in HTML:
374
-
375
- <div class="bg-warning text-warning-foreground">Warning message</div>
376
-
377
-
378
- ## Components
379
-
380
- ### Component List
39
+ Run the command without any arguments to view a list of all available components:
381
40
 
382
- | Component | Has JS Controller | Dependencies | Description |
383
- |---|---|---|---|
384
- | Accordion | Yes | — | Vertically stacked interactive headings that reveal content |
385
- | Alert | Yes | — | Callout for important messages (info, success, warning, danger) |
386
- | Avatar | No | — | Image element with fallback for user profiles |
387
- | Badge | Yes | — | Small status descriptor with variant styles |
388
- | Breadcrumb | No | — | Path hierarchy navigation |
389
- | Button | Yes | — | Clickable button with 8 variants and 6 sizes |
390
- | Card | Yes | — | Container with border and shadow |
391
- | Checkbox | Yes | — | Toggle between checked/unchecked states |
392
- | Dropdown | Yes | — | Menu triggered by a button click |
393
- | Input | Yes | — | Text input with variants and icon support |
394
- | Modal | Yes | button | Dialog overlay requiring user interaction |
395
- | Popover | Yes | — | Floating panel anchored to trigger element |
396
- | Progress | Yes | — | Horizontal completion progress bar |
397
- | Radio | Yes | — | Mutually exclusive option group |
398
- | Separator | No | — | Visual divider between content sections |
399
- | Sheet | Yes | button | Panel that slides from screen edge |
400
- | Skeleton | No | — | Placeholder animation while loading |
401
- | Slider | Yes | — | Draggable input for selecting numeric value |
402
- | Table | Yes | — | Data table with sortable column headers |
403
- | Tabs | Yes | — | Layered sections displaying one panel at a time |
404
- | Toast | Yes | — | Temporary notification with auto-dismiss |
405
- | Toggle | Yes | — | Switch control (on/off) |
406
- | Tooltip | Yes | — | Popup showing info on hover |
407
-
408
- ### Component Usage Pattern
409
-
410
- All components follow the same Stimulus.js conventions:
411
-
412
- 1. Attach a controller:
413
-
414
-
415
- <button data-controller="button">Click me</button>
416
-
417
-
418
- 2. Configure with values:
419
-
420
-
421
- <button data-controller="button"
422
- data-button-variant-value="destructive"
423
- data-button-size-value="lg">
424
- Delete
425
- </button>
426
-
427
-
428
- 3. Bind actions:
429
-
430
- <div data-controller="modal">
431
- <button data-action="click->modal#open">Open Modal</button>
432
- <div data-modal-target="overlay" class="hidden">
433
- <!-- modal content -->
434
- </div>
435
- </div>
436
-
437
- 4. Register controllers in your app:
438
-
439
- ```javascript
440
- import { Application } from "@hotwired/stimulus"
441
- import ButtonController from "./src/controllers/button.js"
442
- import ModalController from "./src/controllers/modal.js"
443
-
444
- const app = Application.start()
445
- app.register("button", ButtonController)
446
- app.register("modal", ModalController)
447
-
448
-
449
- ## Accessibility
450
-
451
- Built-in accessibility features across all components:
452
-
453
- - ARIA roles: `role="button"`, `role="dialog"`, `role="tabpanel"`, `role="switch"`, `role="progressbar"`
454
- - ARIA attributes: `aria-checked`, `aria-valuenow`, `aria-valuemin`, `aria-valuemax`
455
- - Keyboard navigation: Escape to close modals, dropdowns, sheets, and popovers
456
- - Focus management: Auto-focus on first input in modals, visible focus rings (`focus-visible:ring-2`)
457
- - Semantic HTML: Proper use of `<button>`, `<input>`, `<label>`, `<nav>`, `<table>`
458
- - Disabled states: `disabled:opacity-50 disabled:pointer-events-none`
459
-
460
- ---
461
-
462
- ## Key Styling Patterns
463
-
464
- | Pattern | Implementation |
465
- |---|---|
466
- | Utility-first | All Tailwind classes, no custom CSS |
467
- | CSS Variables | Semantic colors via custom properties |
468
- | Dark Mode | `.dark` class toggle on `<html>` |
469
- | Transitions | `duration-200`, `transition-all`, `transition-opacity` |
470
- | Focus States | `focus-visible:ring-2 focus-visible:ring-ring` |
471
- | Disabled States | `disabled:opacity-50 disabled:pointer-events-none` |
472
- | Responsive | Mobile-first with `sm:`, `md:`, `lg:` breakpoints |
473
-
474
- ---
475
-
476
- ## Data Attributes Quick Reference
477
-
478
- ```html
479
- <!-- Controller binding -->
480
- <div data-controller="component-name">
481
-
482
- <!-- Action binding -->
483
- <button data-action="click->controller#method">
41
+ ```bash
42
+ npx @skutally/ui-library list
43
+ ```
484
44
 
485
- <!-- Target binding -->
486
- <div data-controller-target="targetName">
45
+ ## diff
487
46
 
488
- <!-- Value binding -->
489
- <div data-controller-name-value="value">
47
+ Use the `diff` command to check if your local component differs from the registry version.
490
48
 
491
- <!-- Action params -->
492
- <button data-action="click->toast#show"
493
- data-toast-type-param="success"
494
- data-toast-title-param="Saved!">
49
+ ```bash
50
+ npx @skutally/ui-library diff button
495
51
  ```
496
52
 
497
- ---
53
+ ## Documentation
498
54
 
499
- ## Contributing
55
+ Visit the [documentation page](https://skutally.github.io/ui-library/docs.html) to view the full docs.
500
56
 
501
- 1. Clone the repository
502
- 2. Run `npm install`
503
- 3. Run `npm run dev` to watch CSS changes
504
- 4. Open `index.html` in your browser (or run `npm run serve`)
505
- 5. Edit components in `components/` and controllers in `src/controllers/`
506
- 6. Update `registry/registry.json` if adding new components
57
+ ## Components
507
58
 
508
- ---
59
+ - Accordion
60
+ - Alert
61
+ - Avatar
62
+ - Badge
63
+ - Breadcrumb
64
+ - Button
65
+ - Card
66
+ - Checkbox
67
+ - Dropdown
68
+ - Input
69
+ - Modal
70
+ - Popover
71
+ - Progress
72
+ - Radio
73
+ - Separator
74
+ - Sheet
75
+ - Skeleton
76
+ - Slider
77
+ - Table
78
+ - Tabs
79
+ - Toast
80
+ - Toggle
81
+ - Tooltip
509
82
 
510
83
  ## License
511
84
 
512
- MIT Free to use for personal and commercial projects. No attribution required.
513
-
514
- Built with Stimulus.js + Tailwind CSS. Inspired by [shadcn/ui](https://ui.shadcn.com).
85
+ Licensed under the [MIT license](LICENSE).
package/bin/cli.js CHANGED
@@ -253,7 +253,7 @@ switch (command) {
253
253
  case "-h":
254
254
  case undefined:
255
255
  console.log(`
256
- ${c.bold}ui-library${c.reset} — shadcn-style UI components for Stimulus + Tailwind
256
+ ${c.bold}ui-library${c.reset} — UI components for Stimulus + Tailwind
257
257
 
258
258
  ${c.bold}Usage:${c.reset}
259
259
  ui-library init Initialize project (creates components.json, base CSS, tailwind config)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@skutally/ui-library",
3
- "version": "0.1.0",
4
- "description": "A shadcn-style UI component library for HTML, Tailwind CSS & Stimulus.js. Copy-paste components into your project.",
3
+ "version": "0.1.2",
4
+ "description": "A modern UI component library for HTML, Tailwind CSS & Stimulus.js. Copy-paste components into your project.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "ui-library": "./bin/cli.js"
@@ -20,7 +20,7 @@
20
20
  "components",
21
21
  "tailwindcss",
22
22
  "stimulus",
23
- "shadcn"
23
+ "HTML"
24
24
  ],
25
25
  "scripts": {
26
26
  "dev": "npx @tailwindcss/cli -i src/base.css -o dist/output.css --watch",