@tenerife.music/ui 2.0.5 → 2.0.6

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 CHANGED
@@ -10,8 +10,8 @@ Strict. Predictable. Built for system-level consistency.
10
10
  ![TailwindCSS](https://img.shields.io/badge/TailwindCSS-3.4-38b2ac?style=for-the-badge)
11
11
  ![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)
12
12
 
13
- **Current Release:** [v2.0.3](CHANGELOG.md#203---2025-12-31) (npm)
14
- **Next Release:** v2.0.4 (Unreleased) — See [CHANGELOG](CHANGELOG.md#unreleased)
13
+ **Current Release:** [v2.0.6](CHANGELOG.md#206) (npm)
14
+ **Next Release:** [Unreleased] — See [CHANGELOG](CHANGELOG.md#unreleased)
15
15
 
16
16
  <p align="center">
17
17
  <img src="https://raw.githubusercontent.com/Tureckiy-zart/tenerife-ui/main/.github/banner.png" width="100%" alt="TUI Banner" />
@@ -6,7 +6,7 @@ import * as React from 'react';
6
6
  *
7
7
  * @internal
8
8
  */
9
- declare const _LINK_VARIANTS: readonly ["primary", "secondary", "accent", "outline", "ghost", "link", "destructive"];
9
+ declare const _LINK_VARIANTS: readonly ["primary", "secondary", "accent", "outline", "ghost", "text", "link", "wrapper", "destructive"];
10
10
  /**
11
11
  * Link variant type
12
12
  *
@@ -26,13 +26,13 @@ declare const _LINK_SIZES: readonly ["sm", "md", "lg"];
26
26
  */
27
27
  type LinkSize = (typeof _LINK_SIZES)[number];
28
28
  declare const linkVariants: (props?: ({
29
- variant?: "primary" | "secondary" | "accent" | "destructive" | "outline" | "link" | "ghost" | null | undefined;
29
+ variant?: "primary" | "secondary" | "accent" | "destructive" | "outline" | "link" | "ghost" | "text" | "wrapper" | null | undefined;
30
30
  size?: "sm" | "md" | "lg" | null | undefined;
31
31
  } & class_variance_authority_types.ClassProp) | undefined) => string;
32
32
  interface LinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "className" | "style"> {
33
33
  /**
34
34
  * Link variant style
35
- * @default "link"
35
+ * @default "text"
36
36
  */
37
37
  variant?: LinkVariant;
38
38
  /**
@@ -6,7 +6,7 @@ import * as React from 'react';
6
6
  *
7
7
  * @internal
8
8
  */
9
- declare const _LINK_VARIANTS: readonly ["primary", "secondary", "accent", "outline", "ghost", "link", "destructive"];
9
+ declare const _LINK_VARIANTS: readonly ["primary", "secondary", "accent", "outline", "ghost", "text", "link", "wrapper", "destructive"];
10
10
  /**
11
11
  * Link variant type
12
12
  *
@@ -26,13 +26,13 @@ declare const _LINK_SIZES: readonly ["sm", "md", "lg"];
26
26
  */
27
27
  type LinkSize = (typeof _LINK_SIZES)[number];
28
28
  declare const linkVariants: (props?: ({
29
- variant?: "primary" | "secondary" | "accent" | "destructive" | "outline" | "link" | "ghost" | null | undefined;
29
+ variant?: "primary" | "secondary" | "accent" | "destructive" | "outline" | "link" | "ghost" | "text" | "wrapper" | null | undefined;
30
30
  size?: "sm" | "md" | "lg" | null | undefined;
31
31
  } & class_variance_authority_types.ClassProp) | undefined) => string;
32
32
  interface LinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "className" | "style"> {
33
33
  /**
34
34
  * Link variant style
35
- * @default "link"
35
+ * @default "text"
36
36
  */
37
37
  variant?: LinkVariant;
38
38
  /**
@@ -138,6 +138,18 @@ var LINK_TOKENS = {
138
138
  /**
139
139
  * Link heights by size
140
140
  * Maps to Tailwind height utilities
141
+ *
142
+ * @example
143
+ * // Small size link
144
+ * <Link href="/link" size="sm">Small Link</Link>
145
+ *
146
+ * @example
147
+ * // Medium size link (default)
148
+ * <Link href="/link" size="md">Medium Link</Link>
149
+ *
150
+ * @example
151
+ * // Large size link
152
+ * <Link href="/link" size="lg">Large Link</Link>
141
153
  */
142
154
  height: {
143
155
  // 28px (1.75rem)
@@ -149,6 +161,12 @@ var LINK_TOKENS = {
149
161
  /**
150
162
  * Link padding by size
151
163
  * Horizontal and vertical padding values
164
+ *
165
+ * @example
166
+ * // Padding is automatically applied based on size prop
167
+ * <Link href="/link" size="sm">Small Link</Link> // Uses px-sm py-xs
168
+ * <Link href="/link" size="md">Medium Link</Link> // Uses px-md py-sm
169
+ * <Link href="/link" size="lg">Large Link</Link> // Uses px-lg py-sm
152
170
  */
153
171
  padding: {
154
172
  horizontal: {
@@ -169,6 +187,13 @@ var LINK_TOKENS = {
169
187
  */
170
188
  layout: "inline-flex items-center justify-center whitespace-nowrap",
171
189
  // Base layout for link container
190
+ /**
191
+ * Block-level layout token for variant='wrapper' (and deprecated variant='link')
192
+ * Used when Link needs to wrap block elements (e.g., Card) in grid/flex compositions
193
+ * Provides block display with full width for proper layout contract
194
+ */
195
+ layoutBlock: "block w-full",
196
+ // Block-level layout for wrapper variant (and deprecated link variant)
172
197
  /**
173
198
  * Font weight token
174
199
  * References foundation typography fontWeight tokens from Typography Authority
@@ -181,6 +206,12 @@ var LINK_TOKENS = {
181
206
  /**
182
207
  * Icon wrapper layout
183
208
  * Layout utilities for icon containers
209
+ *
210
+ * @example
211
+ * // Icons are automatically wrapped with proper layout
212
+ * <Link href="/profile" leftIcon={<UserIcon />} rightIcon={<ArrowIcon />}>
213
+ * Profile
214
+ * </Link>
184
215
  */
185
216
  iconWrapper: "inline-flex items-center",
186
217
  // Layout for left/right icon wrappers
@@ -190,14 +221,29 @@ var LINK_TOKENS = {
190
221
  *
191
222
  * @rule All fontSize values reference Typography Authority tokens
192
223
  * @see docs/architecture/TYPOGRAPHY_AUTHORITY_CONTRACT.md
224
+ *
225
+ * @example
226
+ * // Small font size (14px)
227
+ * <Link href="/link" size="sm">Small Text</Link>
228
+ *
229
+ * @example
230
+ * // Medium font size (16px, default)
231
+ * <Link href="/link" size="md">Medium Text</Link>
232
+ *
233
+ * @example
234
+ * // Large font size (18px)
235
+ * <Link href="/link" size="lg">Large Text</Link>
193
236
  */
194
237
  fontSize: {
195
238
  // References fontSize.xs[0] from Typography Authority (~12px)
196
- sm: "text-xs",
197
- // References fontSize.xs[0] from Typography Authority (~12px)
198
- md: "text-sm",
239
+ /** Small font size (~14px) */
240
+ sm: "text-sm",
199
241
  // References fontSize.sm[0] from Typography Authority (~14px)
200
- lg: "text-sm"},
242
+ /** Medium font size (~16px, default) */
243
+ md: "text-base",
244
+ // References fontSize.base[0] from Typography Authority (~16px)
245
+ /** Large font size (~18px) */
246
+ lg: "text-lg"},
201
247
  /**
202
248
  * Border radius for outline and ghost variants
203
249
  * References componentRadius from Radius Authority
@@ -231,6 +277,14 @@ var LINK_TOKENS = {
231
277
  *
232
278
  * @rule Focus MUST use focus-visible: prefix (keyboard navigation only)
233
279
  * @rule Focus MUST be blocked when disabled={true}
280
+ *
281
+ * @example
282
+ * // Focus ring appears automatically on keyboard navigation (Tab key)
283
+ * <Link href="/link">Focusable Link</Link>
284
+ *
285
+ * @example
286
+ * // Focus is disabled when link is disabled
287
+ * <Link href="/link" disabled>Disabled Link</Link>
234
288
  */
235
289
  focus: {
236
290
  ring: "focus-visible:ring-2 focus-visible:ring-ring",
@@ -243,6 +297,16 @@ var LINK_TOKENS = {
243
297
  /**
244
298
  * Disabled state tokens
245
299
  * Uses explicit disabled semantic tokens for better accessibility
300
+ *
301
+ * @example
302
+ * // Disabled link with proper accessibility attributes
303
+ * <Link href="/disabled" disabled>Disabled Link</Link>
304
+ *
305
+ * @example
306
+ * // Disabled link prevents navigation and removes from tab order
307
+ * <Link href="/action" disabled onClick={handleClick}>
308
+ * Cannot Click
309
+ * </Link>
246
310
  */
247
311
  state: {
248
312
  disabled: {
@@ -255,8 +319,47 @@ var LINK_TOKENS = {
255
319
  /**
256
320
  * Color tokens for link variants
257
321
  * Uses semantic color tokens that map to CSS variables
322
+ *
323
+ * @example
324
+ * // Primary variant - emphasized link with primary color
325
+ * <Link href="/cta" variant="primary">Get Started</Link>
326
+ *
327
+ * @example
328
+ * // Secondary variant - muted link style
329
+ * <Link href="/info" variant="secondary">Learn More</Link>
330
+ *
331
+ * @example
332
+ * // Accent variant - accent color link
333
+ * <Link href="/feature" variant="accent">Explore Feature</Link>
334
+ *
335
+ * @example
336
+ * // Outline variant - bordered link button
337
+ * <Link href="/action" variant="outline">Action</Link>
338
+ *
339
+ * @example
340
+ * // Ghost variant - subtle background link
341
+ * <Link href="/menu" variant="ghost">Menu Item</Link>
342
+ *
343
+ * @example
344
+ * // Text variant (default) - inline text link
345
+ * <Link href="/about" variant="text">About Us</Link>
346
+ *
347
+ * @example
348
+ * // Wrapper variant - block-level wrapper for cards
349
+ * <Link href="/article" variant="wrapper">
350
+ * <Card>Article Content</Card>
351
+ * </Link>
352
+ *
353
+ * @example
354
+ * // Destructive variant - danger/delete actions
355
+ * <Link href="/delete" variant="destructive">Delete</Link>
258
356
  */
259
357
  variant: {
358
+ /**
359
+ * Primary variant - emphasized link with primary color
360
+ * @example
361
+ * <Link href="/cta" variant="primary">Get Started</Link>
362
+ */
260
363
  primary: {
261
364
  text: "text-primary",
262
365
  // Primary text using CSS var
@@ -265,12 +368,22 @@ var LINK_TOKENS = {
265
368
  underline: "hover:underline"
266
369
  // Underline on hover
267
370
  },
371
+ /**
372
+ * Secondary variant - muted link style
373
+ * @example
374
+ * <Link href="/info" variant="secondary">Learn More</Link>
375
+ */
268
376
  secondary: {
269
377
  text: "text-secondary",
270
378
  // Secondary text using CSS var
271
379
  hover: "hover:underline"
272
380
  // Underline on hover
273
381
  },
382
+ /**
383
+ * Accent variant - accent color link
384
+ * @example
385
+ * <Link href="/feature" variant="accent">Explore Feature</Link>
386
+ */
274
387
  accent: {
275
388
  text: "text-accent",
276
389
  // Accent text using CSS var (accent color, not accent-foreground)
@@ -279,6 +392,11 @@ var LINK_TOKENS = {
279
392
  underline: "hover:underline"
280
393
  // Underline on hover
281
394
  },
395
+ /**
396
+ * Outline variant - bordered link button
397
+ * @example
398
+ * <Link href="/action" variant="outline">Action</Link>
399
+ */
282
400
  outline: {
283
401
  border: "border border-input",
284
402
  // Input border using CSS var
@@ -293,6 +411,11 @@ var LINK_TOKENS = {
293
411
  // Hover text
294
412
  }
295
413
  },
414
+ /**
415
+ * Ghost variant - subtle background link
416
+ * @example
417
+ * <Link href="/menu" variant="ghost">Menu Item</Link>
418
+ */
296
419
  ghost: {
297
420
  background: "bg-muted/10",
298
421
  // Light background for better contrast on dark surfaces
@@ -305,12 +428,23 @@ var LINK_TOKENS = {
305
428
  // Hover text
306
429
  }
307
430
  },
431
+ /**
432
+ * Link variant (deprecated) - use 'wrapper' instead
433
+ * @deprecated Use variant='wrapper' instead
434
+ * @example
435
+ * <Link href="/article" variant="link">Article</Link>
436
+ */
308
437
  link: {
309
438
  text: "text-primary",
310
439
  // Primary text using CSS var
311
440
  hover: "hover:underline"
312
441
  // Underline on hover
313
442
  },
443
+ /**
444
+ * Destructive variant - danger/delete actions
445
+ * @example
446
+ * <Link href="/delete" variant="destructive">Delete</Link>
447
+ */
314
448
  destructive: {
315
449
  text: "text-destructive",
316
450
  // Destructive text using CSS var
@@ -327,16 +461,21 @@ function renderIcon(icon) {
327
461
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: ICON_WRAPPER_CLASS, children: icon });
328
462
  }
329
463
  var linkVariants = tokenCVA({
330
- base: `${LINK_TOKENS.layout} ${LINK_TOKENS.fontWeight} ${LINK_TOKENS.transition.colors} ${LINK_TOKENS.focus.outline} ${LINK_TOKENS.focus.ring} ${LINK_TOKENS.focus.offset} ${LINK_TOKENS.state.disabled.pointerEvents} ${LINK_TOKENS.state.disabled.text}`,
464
+ base: `${LINK_TOKENS.fontWeight} ${LINK_TOKENS.transition.colors} ${LINK_TOKENS.focus.outline} ${LINK_TOKENS.focus.ring} ${LINK_TOKENS.focus.offset} ${LINK_TOKENS.state.disabled.pointerEvents} ${LINK_TOKENS.state.disabled.text}`,
331
465
  variants: {
332
466
  variant: {
333
- primary: `${LINK_TOKENS.variant.primary.text} ${LINK_TOKENS.variant.primary.hover} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.primary.underline}`,
334
- secondary: `${LINK_TOKENS.variant.secondary.text} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.secondary.hover}`,
335
- accent: `${LINK_TOKENS.variant.accent.text} ${LINK_TOKENS.variant.accent.hover} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.accent.underline}`,
336
- outline: `${LINK_TOKENS.variant.outline.border} ${LINK_TOKENS.variant.outline.background} ${LINK_TOKENS.variant.outline.text} ${LINK_TOKENS.radius} ${LINK_TOKENS.variant.outline.hover.background} ${LINK_TOKENS.variant.outline.hover.text}`,
337
- ghost: `${LINK_TOKENS.variant.ghost.background} ${LINK_TOKENS.variant.ghost.text} ${LINK_TOKENS.variant.ghost.hover.background} ${LINK_TOKENS.variant.ghost.hover.text} ${LINK_TOKENS.radius}`,
338
- link: `${LINK_TOKENS.variant.link.text} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.link.hover}`,
339
- destructive: `${LINK_TOKENS.variant.destructive.text} ${LINK_TOKENS.variant.destructive.hover} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.destructive.underline}`
467
+ primary: `${LINK_TOKENS.layout} ${LINK_TOKENS.variant.primary.text} ${LINK_TOKENS.variant.primary.hover} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.primary.underline}`,
468
+ secondary: `${LINK_TOKENS.layout} ${LINK_TOKENS.variant.secondary.text} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.secondary.hover}`,
469
+ accent: `${LINK_TOKENS.layout} ${LINK_TOKENS.variant.accent.text} ${LINK_TOKENS.variant.accent.hover} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.accent.underline}`,
470
+ outline: `${LINK_TOKENS.layout} ${LINK_TOKENS.variant.outline.border} ${LINK_TOKENS.variant.outline.background} ${LINK_TOKENS.variant.outline.text} ${LINK_TOKENS.radius} ${LINK_TOKENS.variant.outline.hover.background} ${LINK_TOKENS.variant.outline.hover.text}`,
471
+ ghost: `${LINK_TOKENS.layout} ${LINK_TOKENS.variant.ghost.background} ${LINK_TOKENS.variant.ghost.text} ${LINK_TOKENS.variant.ghost.hover.background} ${LINK_TOKENS.variant.ghost.hover.text} ${LINK_TOKENS.radius}`,
472
+ text: `${LINK_TOKENS.layout} ${LINK_TOKENS.variant.link.text} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.link.hover}`,
473
+ /**
474
+ * @deprecated Use variant='wrapper' instead. This variant is kept for backward compatibility and will be removed in a future major version.
475
+ */
476
+ link: `${LINK_TOKENS.layoutBlock} ${LINK_TOKENS.variant.link.text} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.link.hover}`,
477
+ wrapper: `${LINK_TOKENS.layoutBlock} ${LINK_TOKENS.variant.link.text} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.link.hover}`,
478
+ destructive: `${LINK_TOKENS.layout} ${LINK_TOKENS.variant.destructive.text} ${LINK_TOKENS.variant.destructive.hover} ${LINK_TOKENS.underlineOffset} ${LINK_TOKENS.variant.destructive.underline}`
340
479
  },
341
480
  size: {
342
481
  sm: `${LINK_TOKENS.height.sm} ${LINK_TOKENS.fontSize.sm} ${LINK_TOKENS.padding.horizontal.sm} ${LINK_TOKENS.padding.vertical.xs}`,
@@ -345,7 +484,7 @@ var linkVariants = tokenCVA({
345
484
  }
346
485
  },
347
486
  defaultVariants: {
348
- variant: "link",
487
+ variant: "text",
349
488
  size: "md"
350
489
  }
351
490
  });
@@ -397,8 +536,6 @@ var NextLinkAdapter = React__namespace.forwardRef(
397
536
  scroll,
398
537
  shallow,
399
538
  locale,
400
- passHref: true,
401
- legacyBehavior: true,
402
539
  children: /* @__PURE__ */ jsxRuntime.jsx(Link, { ref, href: hrefString, ...props })
403
540
  }
404
541
  );
@@ -1,6 +1,6 @@
1
1
  import { LinkProps as LinkProps$1 } from 'next/link';
2
2
  import * as React from 'react';
3
- import { L as LinkProps } from '../../Link-ZWr5iFB0.cjs';
3
+ import { L as LinkProps } from '../../Link-DlH433PB.cjs';
4
4
  import 'class-variance-authority/types';
5
5
 
6
6
  interface NextLinkAdapterProps extends Omit<LinkProps, "href"> {
@@ -21,9 +21,8 @@ interface NextLinkAdapterProps extends Omit<LinkProps, "href"> {
21
21
  * NextLinkAdapter
22
22
  *
23
23
  * A compatibility adapter that bridges Next.js `next/link` with TenerifeUI `Link`.
24
- * This adapter resolves the "nested <a> tag" hydration error common in Next.js 13+
25
- * by utilizing the `legacyBehavior` pattern, allowing Foundation Link (which is an <a>)
26
- * to function as the child of NextLink.
24
+ * This adapter allows Foundation Link (which is an <a>) to function as the child of NextLink.
25
+ * Next.js 13+ automatically handles <a> children without creating nested anchors.
27
26
  *
28
27
  * @example
29
28
  * ```tsx
@@ -1,6 +1,6 @@
1
1
  import { LinkProps as LinkProps$1 } from 'next/link';
2
2
  import * as React from 'react';
3
- import { L as LinkProps } from '../../Link-ZWr5iFB0.js';
3
+ import { L as LinkProps } from '../../Link-DlH433PB.js';
4
4
  import 'class-variance-authority/types';
5
5
 
6
6
  interface NextLinkAdapterProps extends Omit<LinkProps, "href"> {
@@ -21,9 +21,8 @@ interface NextLinkAdapterProps extends Omit<LinkProps, "href"> {
21
21
  * NextLinkAdapter
22
22
  *
23
23
  * A compatibility adapter that bridges Next.js `next/link` with TenerifeUI `Link`.
24
- * This adapter resolves the "nested <a> tag" hydration error common in Next.js 13+
25
- * by utilizing the `legacyBehavior` pattern, allowing Foundation Link (which is an <a>)
26
- * to function as the child of NextLink.
24
+ * This adapter allows Foundation Link (which is an <a>) to function as the child of NextLink.
25
+ * Next.js 13+ automatically handles <a> children without creating nested anchors.
27
26
  *
28
27
  * @example
29
28
  * ```tsx