@tenerife.music/ui 1.0.12 → 1.0.15
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 +112 -414
- package/dist/{colors-DPNI96bB.d.cts → colors-BZtZJBBm.d.cts} +1 -1
- package/dist/{colors-DPNI96bB.d.ts → colors-BZtZJBBm.d.ts} +1 -1
- package/dist/index-CP_dmFn4.d.cts +7105 -0
- package/dist/index-CP_dmFn4.d.ts +7105 -0
- package/dist/index.cjs +6168 -4636
- package/dist/index.d.cts +877 -509
- package/dist/index.d.ts +877 -509
- package/dist/index.mjs +6021 -4509
- package/dist/preset.cjs +1 -0
- package/dist/preset.mjs +1 -0
- package/dist/theme/index.cjs +0 -13
- package/dist/theme/index.d.cts +3 -78
- package/dist/theme/index.d.ts +3 -78
- package/dist/theme/index.mjs +1 -11
- package/dist/tokens/index.cjs +720 -222
- package/dist/tokens/index.d.cts +54 -5453
- package/dist/tokens/index.d.ts +54 -5453
- package/dist/tokens/index.mjs +719 -223
- package/package.json +13 -7
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# 🌴
|
|
1
|
+
# 🌴 TUI
|
|
2
2
|
|
|
3
|
-
**
|
|
4
|
-
|
|
3
|
+
**Token-driven UI architecture for long-living React products**
|
|
4
|
+
Strict. Predictable. Built for system-level consistency.
|
|
5
5
|
|
|
6
6
|

|
|
7
7
|

|
|
@@ -10,504 +10,202 @@ Elegant. Token-driven. Fully Typed. Built for Luxury Interfaces.
|
|
|
10
10
|

|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
13
|
-
<img src="https://raw.githubusercontent.com/Tureckiy-zart/tenerife-ui/main/.github/banner.png" width="100%" alt="
|
|
13
|
+
<img src="https://raw.githubusercontent.com/Tureckiy-zart/tenerife-ui/main/.github/banner.png" width="100%" alt="TUI Banner" />
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
17
|
-
<strong>
|
|
18
|
-
|
|
17
|
+
<strong>
|
|
18
|
+
A production-grade, token-driven design infrastructure for React applications.<br/>
|
|
19
|
+
Built on a locked Foundation layer, Radix UI behavioral primitives, and strict TypeScript contracts.
|
|
20
|
+
</strong>
|
|
19
21
|
</p>
|
|
20
22
|
|
|
21
|
-
> ⚠️ **Important:** The library is under active development. The API may change between versions. Use at your own risk. Thorough testing is recommended before using in production.
|
|
22
|
-
|
|
23
23
|
---
|
|
24
24
|
|
|
25
|
-
##
|
|
26
|
-
|
|
27
|
-
### Installation
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
# npm
|
|
31
|
-
npm install @tenerife.music/ui
|
|
32
|
-
|
|
33
|
-
# pnpm
|
|
34
|
-
pnpm add @tenerife.music/ui
|
|
25
|
+
## 🧭 Architectural Manifest
|
|
35
26
|
|
|
36
|
-
|
|
37
|
-
yarn add @tenerife.music/ui
|
|
38
|
-
```
|
|
27
|
+
TUI is **not a beginner-friendly UI library**.
|
|
39
28
|
|
|
40
|
-
|
|
29
|
+
This system is intentionally built for developers and teams who value
|
|
30
|
+
**architectural consistency, long-term scalability, and system-level thinking**
|
|
31
|
+
over quick experimentation or visual convenience.
|
|
41
32
|
|
|
42
|
-
|
|
43
|
-
import { ThemeProvider, Button } from "@tenerife.music/ui";
|
|
33
|
+
### This library is for you if:
|
|
44
34
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
```
|
|
35
|
+
- You build **long-living products**, not throwaway interfaces
|
|
36
|
+
- You want to **prevent design entropy**, not fight it later
|
|
37
|
+
- You prefer **strict rules over flexible chaos**
|
|
38
|
+
- You see constraints as a **feature**, not a limitation
|
|
39
|
+
- You are comfortable trading short-term DX for long-term maintainability
|
|
53
40
|
|
|
54
|
-
|
|
41
|
+
### This library is NOT for you if:
|
|
55
42
|
|
|
56
|
-
|
|
43
|
+
- You want to freely tweak styles with strings, numbers, or ad-hoc classes
|
|
44
|
+
- You expect “easy overrides” or escape hatches
|
|
45
|
+
- You are looking for a quick UI kit or experimentation playground
|
|
46
|
+
- You prefer visual freedom over architectural discipline
|
|
57
47
|
|
|
58
|
-
|
|
48
|
+
### Core philosophy
|
|
59
49
|
|
|
60
|
-
|
|
50
|
+
- **Tokens are the single source of truth**
|
|
51
|
+
- **The Foundation layer is locked and immutable**
|
|
52
|
+
- **Design decisions must be explicit and centralized**
|
|
53
|
+
- **Constraints exist to protect the system — even from its author**
|
|
61
54
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
- 🎯 **TypeScript-first** — full typing for all components and API
|
|
65
|
-
- ♿ **Accessibility** — WCAG AA compliance out of the box, full keyboard and screen reader support
|
|
66
|
-
- 📦 **Tree-shakeable** — bundle size optimization through named imports
|
|
67
|
-
- 🎭 **CVA variants** — unified Variant API for all components
|
|
68
|
-
- 🎨 **Tailwind CSS** — full integration with Tailwind preset
|
|
69
|
-
- 🚀 **Production-ready** — tested and ready for production use
|
|
55
|
+
If the system feels strict, uncomfortable, or limiting at first —
|
|
56
|
+
that means it is working as intended.
|
|
70
57
|
|
|
71
58
|
---
|
|
72
59
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
| Document | Description |
|
|
76
|
-
| --------------------------------------------------------- | ------------------------------------------------------ |
|
|
77
|
-
| **[Complete Guide](./docs/GETTING_STARTED.md)** | Comprehensive guide for installation, setup, and usage |
|
|
78
|
-
| [Quick Start](./docs/QUICK_START.md) | Get started in 30 seconds |
|
|
79
|
-
| [API Reference](./docs/public-api.md) | Complete API documentation for all components |
|
|
80
|
-
| [Tokens Guide](./docs/TOKENS_GUIDE.md) | Working with design tokens |
|
|
81
|
-
| [Theme Guide](./docs/THEME_GUIDE.md) | Theme setup and customization |
|
|
82
|
-
| [Storybook](https://Tureckiy-zart.github.io/tenerife-ui/) | Interactive examples of all components |
|
|
60
|
+
> ⚠️ **Status:** The Foundation layer is locked and stable. Extension components may evolve.
|
|
61
|
+
> This system is actively developed for real production usage.
|
|
83
62
|
|
|
84
63
|
---
|
|
85
64
|
|
|
86
|
-
##
|
|
87
|
-
|
|
88
|
-
### Requirements
|
|
65
|
+
## 🚀 Initial Setup
|
|
89
66
|
|
|
90
|
-
|
|
91
|
-
- **React DOM**: `^18 || ^19`
|
|
92
|
-
- **Node.js**: `>=22` (recommended)
|
|
93
|
-
- **TypeScript**: `>=5.0` (optional, but recommended)
|
|
67
|
+
Minimum setup required to evaluate and work with the system.
|
|
94
68
|
|
|
95
|
-
###
|
|
69
|
+
### Installation
|
|
96
70
|
|
|
97
71
|
```bash
|
|
72
|
+
# npm
|
|
98
73
|
npm install @tenerife.music/ui
|
|
99
|
-
npm install -D tailwindcss postcss autoprefixer
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Step 2: Configure Tailwind CSS
|
|
103
|
-
|
|
104
|
-
Create `tailwind.config.ts`:
|
|
105
|
-
|
|
106
|
-
```typescript
|
|
107
|
-
import type { Config } from "tailwindcss";
|
|
108
|
-
import preset from "@tenerife.music/ui/preset";
|
|
109
|
-
|
|
110
|
-
const config: Config = {
|
|
111
|
-
content: [
|
|
112
|
-
"./src/**/*.{js,ts,jsx,tsx}",
|
|
113
|
-
"./node_modules/@tenerife.music/ui/dist/**/*.{js,ts,jsx,tsx}",
|
|
114
|
-
],
|
|
115
|
-
presets: [preset],
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
export default config;
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### Step 3: Import Styles
|
|
122
|
-
|
|
123
|
-
In your application's root file:
|
|
124
|
-
|
|
125
|
-
```typescript
|
|
126
|
-
import "@tenerife.music/ui/styles";
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### Step 4: Setup ThemeProvider
|
|
130
74
|
|
|
131
|
-
|
|
132
|
-
|
|
75
|
+
# pnpm
|
|
76
|
+
pnpm add @tenerife.music/ui
|
|
133
77
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
<ThemeProvider defaultMode="night" enableSystem={true}>
|
|
137
|
-
<YourApp />
|
|
138
|
-
</ThemeProvider>
|
|
139
|
-
);
|
|
140
|
-
}
|
|
78
|
+
# yarn
|
|
79
|
+
yarn add @tenerife.music/ui
|
|
141
80
|
```
|
|
142
81
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
## 💡 Usage Examples
|
|
148
|
-
|
|
149
|
-
### Basic Example
|
|
82
|
+
### Minimal Example
|
|
150
83
|
|
|
151
84
|
```tsx
|
|
152
|
-
import {
|
|
153
|
-
ThemeProvider,
|
|
154
|
-
Button,
|
|
155
|
-
Card,
|
|
156
|
-
CardHeader,
|
|
157
|
-
CardTitle,
|
|
158
|
-
CardContent,
|
|
159
|
-
} from "@tenerife.music/ui";
|
|
85
|
+
import { ThemeProvider, Button } from "@tenerife.music/ui";
|
|
160
86
|
|
|
161
87
|
export default function App() {
|
|
162
88
|
return (
|
|
163
89
|
<ThemeProvider defaultMode="night">
|
|
164
|
-
<
|
|
165
|
-
<CardHeader>
|
|
166
|
-
<CardTitle>Welcome</CardTitle>
|
|
167
|
-
</CardHeader>
|
|
168
|
-
<CardContent>
|
|
169
|
-
<Button variant="default">Get Started</Button>
|
|
170
|
-
</CardContent>
|
|
171
|
-
</Card>
|
|
172
|
-
</ThemeProvider>
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### Theme Toggle
|
|
178
|
-
|
|
179
|
-
```tsx
|
|
180
|
-
import { ThemeProvider, useTheme, Button } from "@tenerife.music/ui";
|
|
181
|
-
|
|
182
|
-
function ThemeToggle() {
|
|
183
|
-
const { mode, toggleMode } = useTheme();
|
|
184
|
-
|
|
185
|
-
return (
|
|
186
|
-
<Button onClick={toggleMode} variant="outline">
|
|
187
|
-
{mode === "night" ? "☀️ Day" : "🌙 Night"}
|
|
188
|
-
</Button>
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export default function App() {
|
|
193
|
-
return (
|
|
194
|
-
<ThemeProvider defaultMode="night" enableSystem={true}>
|
|
195
|
-
<ThemeToggle />
|
|
90
|
+
<Button variant="default">Click me</Button>
|
|
196
91
|
</ThemeProvider>
|
|
197
92
|
);
|
|
198
93
|
}
|
|
199
94
|
```
|
|
200
95
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
```tsx
|
|
204
|
-
import {
|
|
205
|
-
Field,
|
|
206
|
-
FieldLabel,
|
|
207
|
-
FieldControl,
|
|
208
|
-
FieldError,
|
|
209
|
-
Input,
|
|
210
|
-
Button,
|
|
211
|
-
Card,
|
|
212
|
-
CardHeader,
|
|
213
|
-
CardTitle,
|
|
214
|
-
CardContent,
|
|
215
|
-
} from "@tenerife.music/ui";
|
|
216
|
-
|
|
217
|
-
function ContactForm() {
|
|
218
|
-
return (
|
|
219
|
-
<Card>
|
|
220
|
-
<CardHeader>
|
|
221
|
-
<CardTitle>Contact Us</CardTitle>
|
|
222
|
-
</CardHeader>
|
|
223
|
-
<CardContent>
|
|
224
|
-
<form className="space-y-4">
|
|
225
|
-
<Field>
|
|
226
|
-
<FieldLabel>Email</FieldLabel>
|
|
227
|
-
<FieldControl asChild>
|
|
228
|
-
<Input type="email" placeholder="example@email.com" />
|
|
229
|
-
</FieldControl>
|
|
230
|
-
<FieldError>Email is required</FieldError>
|
|
231
|
-
</Field>
|
|
232
|
-
<Button type="submit" variant="default">
|
|
233
|
-
Submit
|
|
234
|
-
</Button>
|
|
235
|
-
</form>
|
|
236
|
-
</CardContent>
|
|
237
|
-
</Card>
|
|
238
|
-
);
|
|
239
|
-
}
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
> 📖 **More examples:** See the [Complete Guide](./docs/GETTING_STARTED.md) for additional usage examples.
|
|
96
|
+
> 📖 **Note:** This example demonstrates API shape only. Understanding the system
|
|
97
|
+
> requires familiarity with tokens, variants, and architectural constraints.
|
|
243
98
|
|
|
244
99
|
---
|
|
245
100
|
|
|
246
|
-
##
|
|
247
|
-
|
|
248
|
-
### Primitives
|
|
249
|
-
|
|
250
|
-
Basic UI components for building interfaces:
|
|
251
|
-
|
|
252
|
-
- **Button** — buttons with various variants (default, outline, destructive, ghost, link)
|
|
253
|
-
- **Input** — text input fields with state support (success, error, warning)
|
|
254
|
-
- **Textarea** — multi-line text input
|
|
255
|
-
- **Label** — form field labels
|
|
256
|
-
- **Card** — cards with variants (default, elevated, glass, outline)
|
|
257
|
-
- **Badge** — badges for labels and statuses
|
|
258
|
-
- **Text / Heading** — typography components
|
|
259
|
-
|
|
260
|
-
### Forms
|
|
261
|
-
|
|
262
|
-
Components for creating forms:
|
|
263
|
-
|
|
264
|
-
- **Checkbox** — checkboxes with state support
|
|
265
|
-
- **Radio / RadioGroup** — radio buttons and groups
|
|
266
|
-
- **Select** — dropdown lists with search
|
|
267
|
-
- **Field** — form field wrapper with validation
|
|
268
|
-
- **FormInput / FormSelect / FormTextarea** — specialized form components
|
|
269
|
-
|
|
270
|
-
### Layout
|
|
271
|
-
|
|
272
|
-
Components for structuring layouts:
|
|
273
|
-
|
|
274
|
-
- **Flex** — flexbox container with direction, alignment, and gap settings
|
|
275
|
-
- **Grid** — responsive grid with breakpoint support
|
|
276
|
-
- **Stack** — vertical/horizontal element placement
|
|
277
|
-
- **Section** — sections with responsive padding
|
|
278
|
-
- **Container** — containers with width constraints
|
|
279
|
-
|
|
280
|
-
### Overlays
|
|
281
|
-
|
|
282
|
-
Components for modal windows and popup elements:
|
|
283
|
-
|
|
284
|
-
- **Modal** — modal windows with variants
|
|
285
|
-
- **Dialog** — dialog windows (DialogRoot, DialogTrigger, DialogContent)
|
|
286
|
-
- **Toast** — notifications with ToastProvider system
|
|
287
|
-
- **Popover** — popup tooltips
|
|
288
|
-
- **Tooltip** — tooltips for elements
|
|
289
|
-
|
|
290
|
-
### Navigation
|
|
291
|
-
|
|
292
|
-
Components for interface navigation:
|
|
293
|
-
|
|
294
|
-
- **Tabs** — tabs with keyboard support
|
|
295
|
-
- **Breadcrumbs** — breadcrumb navigation
|
|
296
|
-
- **Pagination** — pagination with settings
|
|
297
|
-
- **Stepper** — step-by-step forms
|
|
298
|
-
- **SegmentedControl** — segmented control
|
|
299
|
-
|
|
300
|
-
### Data
|
|
301
|
-
|
|
302
|
-
Components for displaying data:
|
|
303
|
-
|
|
304
|
-
- **Table** — tables with sorting and filtering
|
|
305
|
-
- **DataList** — data lists (DataListRoot, DataListItem, DataListLabel, DataListValue)
|
|
306
|
-
- **Skeleton** — loading state skeletons
|
|
307
|
-
- **EmptyState** — empty states with actions
|
|
308
|
-
|
|
309
|
-
### Notifications
|
|
101
|
+
## ✨ Key Characteristics
|
|
310
102
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
- **
|
|
314
|
-
- **
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
- **EventCard** — event cards with variants and sizes
|
|
321
|
-
- **VenueCard** — venue cards
|
|
322
|
-
- **ArtistCard** — artist cards
|
|
323
|
-
- **TicketCard** — ticket cards
|
|
324
|
-
- **PromoCard** — promo cards
|
|
325
|
-
|
|
326
|
-
> 📖 **Full list:** See [API Reference](./docs/public-api.md) for a complete list of all components and their props.
|
|
103
|
+
- 🎨 **Token-driven architecture** — no raw values, no ad-hoc styles
|
|
104
|
+
- 🏛️ **Radix UI behavioral foundation** — accessibility and interactions are delegated
|
|
105
|
+
- 🔒 **Locked Foundation layer** — one canonical component per category
|
|
106
|
+
- 🧩 **Extension-based composition** — no Foundation duplication
|
|
107
|
+
- 🌓 **Theme-aware tokens** — day/night modes via semantic tokens
|
|
108
|
+
- 🎯 **TypeScript-first API** — strict, expressive, autocomplete-driven
|
|
109
|
+
- ♿ **Accessibility-first** — WCAG-compliant by design
|
|
110
|
+
- 🚫 **No escape hatches** — consistency over convenience
|
|
327
111
|
|
|
328
112
|
---
|
|
329
113
|
|
|
330
|
-
##
|
|
331
|
-
|
|
332
|
-
Tenerife UI uses a fully tokenized design system:
|
|
333
|
-
|
|
334
|
-
### Colors
|
|
335
|
-
|
|
336
|
-
- 100+ color tokens
|
|
337
|
-
- Full color scales (primary, accent, secondary)
|
|
338
|
-
- Surface tokens (base, elevated1-3, overlay, glass)
|
|
339
|
-
- Semantic colors (success, error, warning, info)
|
|
340
|
-
- Text colors (primary, secondary, tertiary, muted)
|
|
341
|
-
- Day/night mode support
|
|
342
|
-
|
|
343
|
-
### Typography
|
|
344
|
-
|
|
345
|
-
- Fluid clamp scale for responsive sizes
|
|
346
|
-
- 13 text styles
|
|
347
|
-
- 9 font weights (thin - black)
|
|
348
|
-
- 6 line-height variants
|
|
349
|
-
- 6 letter-spacing variants
|
|
350
|
-
|
|
351
|
-
### Spacing
|
|
352
|
-
|
|
353
|
-
- 8px-based system (scale 0–96)
|
|
354
|
-
- Semantic tokens (xs, sm, md, lg, xl, 2xl, 3xl, 4xl, 5xl)
|
|
355
|
-
- Layout tokens (section padding, container widths, grid gaps)
|
|
356
|
-
|
|
357
|
-
### Shadows
|
|
358
|
-
|
|
359
|
-
- Elevation levels (none, xs, sm, md, lg, xl, 2xl)
|
|
360
|
-
- Colored shadows (primary-_, accent-_)
|
|
361
|
-
- Glow effects (primary-glow-subtle, primary-glow-medium)
|
|
362
|
-
- Focus rings (focus-ring-default, focus-ring-primary)
|
|
363
|
-
|
|
364
|
-
### Radius
|
|
365
|
-
|
|
366
|
-
- Radius system (none, xs, sm, md, lg, xl, 2xl, 3xl, full)
|
|
367
|
-
- Component standards (button, card, input, badge)
|
|
368
|
-
|
|
369
|
-
### Motion
|
|
370
|
-
|
|
371
|
-
- Durations (instant, fast, normal, slow, slower, slowest)
|
|
372
|
-
- Easing functions (linear, ease-in, ease-out, ease-in-out, bounce, elastic)
|
|
373
|
-
- Pre-configured transitions
|
|
374
|
-
- Keyframes (fade, slide, scale, spin, pulse, bounce)
|
|
114
|
+
## 📚 Documentation
|
|
375
115
|
|
|
376
|
-
|
|
116
|
+
| Document | Description |
|
|
117
|
+
| ------------------------- | ------------------------------------- |
|
|
118
|
+
| **Complete Guide** | System overview and usage principles |
|
|
119
|
+
| Tokens Guide | Design token structure and philosophy |
|
|
120
|
+
| Theme Guide | Theme configuration and modes |
|
|
121
|
+
| **Architecture Lock** | Canonical architectural constraints |
|
|
122
|
+
| **Final Foundation Lock** | Authoritative source of truth |
|
|
123
|
+
| Storybook | Component examples and contracts |
|
|
377
124
|
|
|
378
125
|
---
|
|
379
126
|
|
|
380
|
-
##
|
|
127
|
+
## 🏗 Architecture Overview
|
|
381
128
|
|
|
382
|
-
###
|
|
129
|
+
### Foundation Layer (Locked)
|
|
383
130
|
|
|
384
|
-
|
|
131
|
+
The Foundation layer defines **canonical behavior** and is **immutable**.
|
|
132
|
+
There is exactly **one Foundation component per category**.
|
|
385
133
|
|
|
386
|
-
|
|
134
|
+
- Modal (Dialog)
|
|
135
|
+
- Tabs
|
|
136
|
+
- Select
|
|
137
|
+
- ContextMenu
|
|
138
|
+
- Toast
|
|
387
139
|
|
|
388
|
-
|
|
140
|
+
All Foundation components:
|
|
389
141
|
|
|
390
|
-
|
|
142
|
+
- delegate behavior to Radix UI
|
|
143
|
+
- expose token-driven visual APIs
|
|
144
|
+
- are backward-compatible and locked
|
|
391
145
|
|
|
392
|
-
|
|
146
|
+
### Extension Layer
|
|
393
147
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
<Button variant="outline" size="lg">Click me</Button>
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
### Strict TypeScript
|
|
148
|
+
Extensions compose Foundation components or implement primitives
|
|
149
|
+
that rely strictly on tokens and shared semantics.
|
|
400
150
|
|
|
401
|
-
|
|
151
|
+
Examples:
|
|
402
152
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
153
|
+
- Button
|
|
154
|
+
- Input / Textarea
|
|
155
|
+
- Card / Badge
|
|
156
|
+
- Layout primitives (Stack, Grid, Container)
|
|
157
|
+
- Data and feedback components
|
|
406
158
|
|
|
407
159
|
---
|
|
408
160
|
|
|
409
|
-
##
|
|
410
|
-
|
|
411
|
-
### Install Dependencies
|
|
412
|
-
|
|
413
|
-
```bash
|
|
414
|
-
pnpm install
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
### Run in Development Mode
|
|
418
|
-
|
|
419
|
-
```bash
|
|
420
|
-
pnpm dev
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
### Run Storybook
|
|
424
|
-
|
|
425
|
-
```bash
|
|
426
|
-
pnpm storybook
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
Storybook is available at `http://localhost:6006`
|
|
430
|
-
|
|
431
|
-
### Testing
|
|
432
|
-
|
|
433
|
-
```bash
|
|
434
|
-
# Run tests
|
|
435
|
-
pnpm test
|
|
436
|
-
|
|
437
|
-
# Run tests with coverage
|
|
438
|
-
pnpm test:coverage
|
|
161
|
+
## 🎨 Design Tokens
|
|
439
162
|
|
|
440
|
-
|
|
441
|
-
pnpm test:a11y
|
|
442
|
-
```
|
|
163
|
+
TUI uses a fully tokenized design system:
|
|
443
164
|
|
|
444
|
-
|
|
165
|
+
- **Colors** — semantic, theme-aware
|
|
166
|
+
- **Typography** — fluid, scalable
|
|
167
|
+
- **Spacing** — semantic and layout-based
|
|
168
|
+
- **Radius & Shadows** — consistent elevation model
|
|
169
|
+
- **Motion** — durations and easing as tokens
|
|
445
170
|
|
|
446
|
-
|
|
447
|
-
pnpm build
|
|
448
|
-
```
|
|
171
|
+
Tokens are **immutable contracts**, not convenience variables.
|
|
449
172
|
|
|
450
|
-
|
|
173
|
+
---
|
|
451
174
|
|
|
452
|
-
|
|
453
|
-
# Check linting
|
|
454
|
-
pnpm lint:check
|
|
175
|
+
## 🧩 Domain-Specific Components
|
|
455
176
|
|
|
456
|
-
|
|
457
|
-
|
|
177
|
+
The following components are **used internally** in Tenerife Music projects
|
|
178
|
+
and are **not generic UI primitives**:
|
|
458
179
|
|
|
459
|
-
|
|
460
|
-
|
|
180
|
+
- EventCard
|
|
181
|
+
- VenueCard
|
|
182
|
+
- ArtistCard
|
|
183
|
+
- TicketCard
|
|
184
|
+
- PromoCard
|
|
461
185
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
```
|
|
186
|
+
> These components are tightly coupled to specific product domains
|
|
187
|
+
> and are documented for reference, not as reusable primitives.
|
|
465
188
|
|
|
466
189
|
---
|
|
467
190
|
|
|
468
191
|
## 🛠 Contributing
|
|
469
192
|
|
|
470
|
-
|
|
193
|
+
Contributions are welcome **within the boundaries of the system**.
|
|
471
194
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
195
|
+
> ⚠️ TUI follows a strict, opinionated architecture.
|
|
196
|
+
> All contributions are expected to respect locked layers,
|
|
197
|
+
> token ownership rules, and canonical constraints.
|
|
475
198
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
1. Fork the repository
|
|
479
|
-
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
480
|
-
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
481
|
-
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
482
|
-
5. Open a Pull Request
|
|
199
|
+
Architectural discussions take precedence over visual changes.
|
|
483
200
|
|
|
484
201
|
---
|
|
485
202
|
|
|
486
203
|
## 📜 License
|
|
487
204
|
|
|
488
|
-
MIT License —
|
|
489
|
-
|
|
490
|
-
Use in commercial projects is permitted without restrictions.
|
|
491
|
-
|
|
492
|
-
---
|
|
493
|
-
|
|
494
|
-
## 🔗 Links
|
|
495
|
-
|
|
496
|
-
- **Repository**: [https://github.com/Tureckiy-zart/tenerife-ui](https://github.com/Tureckiy-zart/tenerife-ui)
|
|
497
|
-
- **Issues**: [https://github.com/Tureckiy-zart/tenerife-ui/issues](https://github.com/Tureckiy-zart/tenerife-ui/issues)
|
|
498
|
-
- **Storybook**: [https://Tureckiy-zart.github.io/tenerife-ui/](https://Tureckiy-zart.github.io/tenerife-ui/)
|
|
499
|
-
- **npm**: [https://www.npmjs.com/package/@tenerife.music/ui](https://www.npmjs.com/package/@tenerife.music/ui)
|
|
500
|
-
|
|
501
|
-
---
|
|
502
|
-
|
|
503
|
-
## 🎤 From the Author
|
|
504
|
-
|
|
505
|
-
Tenerife UI is my personal approach to creating a commercial, beautiful, and premium UI system.
|
|
506
|
-
|
|
507
|
-
If you're building interfaces with a "luxury, stylish, and technological" aesthetic — you're home. 🏠
|
|
205
|
+
MIT License — commercial use permitted.
|
|
508
206
|
|
|
509
207
|
---
|
|
510
208
|
|
|
511
209
|
<p align="center">
|
|
512
|
-
<strong>
|
|
210
|
+
<strong>Built for long-term systems, not short-term convenience.</strong>
|
|
513
211
|
</p>
|
|
@@ -286,4 +286,4 @@ declare const tailwindThemeColors: {
|
|
|
286
286
|
};
|
|
287
287
|
};
|
|
288
288
|
|
|
289
|
-
export { type BaseColorTokens as B, type
|
|
289
|
+
export { type BaseColorTokens as B, type ChartColors as C, type Mode as M, type SemanticColors as S, type TextColors as T, type ColorScale as a, type ColorTokens as b, type SurfaceColors as c, accentColors as d, baseColors as e, chartColors as f, colorCSSVariables as g, cssVariableColorTokens as h, semanticColors as i, surfaceColors as j, textColors as k, primaryColors as p, secondaryColors as s, tailwindThemeColors as t };
|
|
@@ -286,4 +286,4 @@ declare const tailwindThemeColors: {
|
|
|
286
286
|
};
|
|
287
287
|
};
|
|
288
288
|
|
|
289
|
-
export { type BaseColorTokens as B, type
|
|
289
|
+
export { type BaseColorTokens as B, type ChartColors as C, type Mode as M, type SemanticColors as S, type TextColors as T, type ColorScale as a, type ColorTokens as b, type SurfaceColors as c, accentColors as d, baseColors as e, chartColors as f, colorCSSVariables as g, cssVariableColorTokens as h, semanticColors as i, surfaceColors as j, textColors as k, primaryColors as p, secondaryColors as s, tailwindThemeColors as t };
|