@aleph-alpha/ui-library 1.18.0 → 1.19.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.
package/config.d.ts CHANGED
@@ -176,6 +176,13 @@ export declare const presetUiLibraryThemeFromTokens: (options?: UiLibraryPresetO
176
176
  */
177
177
  export declare const presetUiLibraryUtils: () => Preset;
178
178
 
179
+ /** Overlay tier keys for the `v-hover` directive (injected hover overlay span). */
180
+ export declare const vHoverOverlayVariants: Readonly<{
181
+ subtle: 'subtle';
182
+ default: 'default';
183
+ strong: 'strong';
184
+ }>;
185
+
179
186
  /**
180
187
  * Typography shortcut tuple: [className, cssProperties]
181
188
  */
package/config.js CHANGED
@@ -336,6 +336,11 @@ const buildShadcnVarsFromModeSet = (modeSetName) => {
336
336
  // Hover overlays
337
337
  const hoverDefault = resolve('overlay.hover.default-hover');
338
338
 
339
+ // Overlay hover surfaces (3-mode overlay.hover → utilities: bg-overlay-hover-*)
340
+ const overlayHoverDefault = resolve('overlay.hover.default');
341
+ const overlayHoverSubtle = resolve('overlay.hover.subtle');
342
+ const overlayHoverStrong = resolve('overlay.hover.strong');
343
+
339
344
  // Modal overlay
340
345
  const modalOverlay = resolve('overlay.surface.modal-overlay');
341
346
 
@@ -383,6 +388,9 @@ const buildShadcnVarsFromModeSet = (modeSetName) => {
383
388
  'ring-offset': background,
384
389
  link,
385
390
  'hover-default': hoverDefault,
391
+ 'overlay-hover-default': overlayHoverDefault,
392
+ 'overlay-hover-subtle': overlayHoverSubtle,
393
+ 'overlay-hover-strong': overlayHoverStrong,
386
394
  'modal-overlay': modalOverlay,
387
395
  inverse,
388
396
  'inverse-foreground': inverseForeground,
@@ -537,6 +545,9 @@ export const presetUiLibraryThemeFromTokens = (options = {}) => {
537
545
  modal: 'oklch(var(--modal))',
538
546
  link: 'oklch(var(--link))',
539
547
  'hover-default': 'oklch(var(--hover-default))',
548
+ 'overlay-hover-default': 'oklch(var(--overlay-hover-default))',
549
+ 'overlay-hover-subtle': 'oklch(var(--overlay-hover-subtle))',
550
+ 'overlay-hover-strong': 'oklch(var(--overlay-hover-strong))',
540
551
  'modal-overlay': 'oklch(var(--modal-overlay))',
541
552
  inverse: 'oklch(var(--inverse))',
542
553
  'inverse-foreground': 'oklch(var(--inverse-foreground))',
@@ -586,6 +597,93 @@ export const presetUiLibraryThemeFromTokens = (options = {}) => {
586
597
  };
587
598
  };
588
599
 
600
+ /** Overlay tier names for the `v-hover` directive (token-backed hover layer). */
601
+ export const vHoverOverlayVariants = Object.freeze({
602
+ subtle: 'subtle',
603
+ default: 'default',
604
+ strong: 'strong',
605
+ });
606
+
607
+ const vHoverOverlayCSS = `
608
+ .v-hover-root {
609
+ position: relative;
610
+ overflow: hidden;
611
+ }
612
+ .v-hover-overlay {
613
+ position: absolute;
614
+ inset: 0;
615
+ z-index: 0;
616
+ border-radius: inherit;
617
+ pointer-events: none;
618
+ opacity: 0;
619
+ mix-blend-mode: overlay;
620
+ transition: opacity 0.2s ease;
621
+ }
622
+ .v-hover-root > :not(.v-hover-overlay) {
623
+ position: relative;
624
+ z-index: 1;
625
+ }
626
+ .v-hover-overlay[data-v-hover-variant="subtle"] {
627
+ background: linear-gradient(
628
+ 0deg,
629
+ oklch(var(--overlay-hover-subtle, 0% 0 0 / 20%)) 0%,
630
+ oklch(var(--overlay-hover-subtle, 0% 0 0 / 20%)) 100%
631
+ );
632
+ }
633
+ .v-hover-overlay[data-v-hover-variant="default"] {
634
+ background: linear-gradient(
635
+ 0deg,
636
+ oklch(var(--overlay-hover-default, 0% 0 0 / 50%)) 0%,
637
+ oklch(var(--overlay-hover-default, 0% 0 0 / 50%)) 100%
638
+ );
639
+ }
640
+ .v-hover-overlay[data-v-hover-variant="strong"] {
641
+ background: linear-gradient(
642
+ 0deg,
643
+ oklch(var(--overlay-hover-strong, 0% 0 0 / 70%)) 0%,
644
+ oklch(var(--overlay-hover-strong, 0% 0 0 / 70%)) 100%
645
+ );
646
+ }
647
+ @media (hover: hover) {
648
+ .v-hover-root:hover .v-hover-overlay {
649
+ opacity: 1;
650
+ }
651
+ }
652
+ .v-hover-root:focus-visible .v-hover-overlay {
653
+ opacity: 1;
654
+ }
655
+ @media (prefers-reduced-motion: reduce) {
656
+ .v-hover-overlay {
657
+ transition: none;
658
+ }
659
+ }
660
+ /* Link variant: mix subtle overlay into text color (not background overlay). */
661
+ .overlay-link-hover-subtle {
662
+ transition: color 0.2s ease;
663
+ }
664
+ @media (hover: hover) {
665
+ .overlay-link-hover-subtle:hover {
666
+ color: color-mix(
667
+ in oklch,
668
+ oklch(var(--content-on-surface-link, var(--link))) 88%,
669
+ oklch(var(--overlay-hover-subtle, 0% 0 0 / 20%)) 12%
670
+ );
671
+ }
672
+ }
673
+ .overlay-link-hover-subtle:focus-visible {
674
+ color: color-mix(
675
+ in oklch,
676
+ oklch(var(--content-on-surface-link, var(--link))) 88%,
677
+ oklch(var(--overlay-hover-subtle, 0% 0 0 / 20%)) 12%
678
+ );
679
+ }
680
+ @media (prefers-reduced-motion: reduce) {
681
+ .overlay-link-hover-subtle {
682
+ transition: none;
683
+ }
684
+ }
685
+ `.trim();
686
+
589
687
  /**
590
688
  * UnoCSS preset with utility rules required by the UI library's components.
591
689
  * Adds Tailwind v4 CSS variable syntax (w-(--var), h-(--var), etc.)
@@ -594,6 +692,7 @@ export const presetUiLibraryThemeFromTokens = (options = {}) => {
594
692
  export const presetUiLibraryUtils = () =>
595
693
  definePreset(() => ({
596
694
  name: '@aleph-alpha/ui-library-utils',
695
+ preflights: [{ getCSS: () => vHoverOverlayCSS }],
597
696
  rules: [
598
697
  [/^w-\(--(.+)\)$/, ([, name]) => ({ width: `var(--${name})` })],
599
698
  [/^max-w-\(--(.+)\)$/, ([, name]) => ({ 'max-width': `var(--${name})` })],
@@ -643,6 +742,7 @@ export const defineUiLibraryConfig = (options = {}) => {
643
742
 
644
743
  return defineConfig({
645
744
  ...getUiLibraryContentConfig(),
745
+ safelist: ['overlay-link-hover-subtle'],
646
746
  presets: [
647
747
  presetWind(),
648
748
  presetAnimations(),
@@ -24,6 +24,7 @@ import { getLocalTimeZone } from '@internationalized/date';
24
24
  import { HTMLAttributes } from 'vue';
25
25
  import { ImgHTMLAttributes } from 'vue';
26
26
  import { Matcher } from 'reka-ui/date';
27
+ import { ObjectDirective } from 'vue';
27
28
  import { PointerDownOutsideEvent } from 'reka-ui';
28
29
  import { PublicProps } from 'vue';
29
30
  import { Ref } from 'vue';
@@ -4506,6 +4507,7 @@ export declare const UiDatePicker: DefineComponent<__VLS_PublicProps_20, {}, {},
4506
4507
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
4507
4508
  }>, {
4508
4509
  disabled: boolean;
4510
+ mode: UiDatePickerMode;
4509
4511
  pagedNavigation: boolean;
4510
4512
  preventDeselect: boolean;
4511
4513
  weekStartsOn: UiDatePickerWeekStartsOn;
@@ -4514,7 +4516,6 @@ fixedWeeks: boolean;
4514
4516
  locale: string;
4515
4517
  numberOfMonths: number;
4516
4518
  readonly: boolean;
4517
- mode: UiDatePickerMode;
4518
4519
  dateFormat: Intl.DateTimeFormatOptions;
4519
4520
  closeOnSelect: boolean;
4520
4521
  rangeSeparator: string;
@@ -7582,4 +7583,12 @@ export declare const useSidebar: <T extends {
7582
7583
  toggleSidebar: () => void;
7583
7584
  };
7584
7585
 
7586
+ export declare const vHover: ObjectDirective<HTMLElement, VHoverBinding>;
7587
+
7588
+ declare type VHoverBinding = VHoverVariant | false | null | undefined | {
7589
+ variant: VHoverVariant;
7590
+ };
7591
+
7592
+ export declare type VHoverVariant = 'subtle' | 'default' | 'strong';
7593
+
7585
7594
  export { }