@almadar/ui 6.59.0 → 6.61.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.
Files changed (90) hide show
  1. package/dist/BehaviorValueFrame-3ORZHPWQ.css +1252 -0
  2. package/dist/BehaviorValueFrame-QTD7BWOI.js +18 -0
  3. package/dist/TraitValueFrame-2WMYJOA5.css +1252 -0
  4. package/dist/TraitValueFrame-WOXNLLMM.js +17 -0
  5. package/dist/Typography-BY4A2NBY.js +5 -0
  6. package/dist/{UISlotRenderer-YNY7V2UJ.js → UISlotRenderer-EEOXSJCI.js} +10 -8
  7. package/dist/avl/index.cjs +31974 -27856
  8. package/dist/avl/index.d.ts +36 -13
  9. package/dist/avl/index.js +296 -6128
  10. package/dist/{avl-3d-context-BpBKZIbc.d.ts → avl-3d-context-Dxun3-ri.d.ts} +2 -0
  11. package/dist/{chunk-E6MWYQVZ.js → chunk-6PV4LASE.js} +9493 -641
  12. package/dist/{chunk-723MJUU3.js → chunk-6ZCU3BQN.js} +1 -1
  13. package/dist/{chunk-7CVXM2KS.js → chunk-7NIU5GDC.js} +2 -2
  14. package/dist/{chunk-YYYHH5BA.js → chunk-CB64IOYD.js} +0 -4
  15. package/dist/{chunk-MZIDOJMD.js → chunk-EIIQGOZW.js} +2 -1
  16. package/dist/chunk-F7NZ3KZQ.js +434 -0
  17. package/dist/{chunk-LZRW6GXG.js → chunk-FYX64CDL.js} +0 -2
  18. package/dist/{chunk-4ZGXIW3B.js → chunk-KZRAMPM6.js} +1 -1
  19. package/dist/chunk-LUREMDI3.js +49 -0
  20. package/dist/{chunk-J755QADM.js → chunk-MGN6B6OQ.js} +318 -18
  21. package/dist/{chunk-Q47ZN2DW.js → chunk-N23SVGTH.js} +83 -1
  22. package/dist/{chunk-KJGVLXEN.js → chunk-N4IJS5DD.js} +50 -116
  23. package/dist/{chunk-I5QOYW2Z.js → chunk-UTSDPJUP.js} +205 -2
  24. package/dist/{chunk-V3FGTQUE.js → chunk-ZR45FGW3.js} +7 -1
  25. package/dist/{cn-DIql5232.d.ts → cn-CDIhHCUC.d.ts} +40 -16
  26. package/dist/components/index.cjs +14423 -4100
  27. package/dist/components/index.d.ts +160 -172
  28. package/dist/components/index.js +14 -15
  29. package/dist/context/index.cjs +9 -1
  30. package/dist/context/index.js +3 -1
  31. package/dist/hooks/index.cjs +72 -6
  32. package/dist/hooks/index.d.ts +43 -2
  33. package/dist/hooks/index.js +6 -7
  34. package/dist/lib/drawable/three/index.cjs +350 -26
  35. package/dist/lib/drawable/three/index.d.ts +2 -2
  36. package/dist/lib/drawable/three/index.js +28 -7
  37. package/dist/lib/index.cjs +90 -4
  38. package/dist/lib/index.d.ts +2 -2
  39. package/dist/lib/index.js +74 -6
  40. package/dist/locales/index.cjs +0 -6
  41. package/dist/locales/index.js +2 -2
  42. package/dist/providers/index.cjs +13846 -1062
  43. package/dist/providers/index.d.ts +36 -4
  44. package/dist/providers/index.js +35 -15
  45. package/dist/runtime/index.cjs +28395 -18308
  46. package/dist/runtime/index.d.ts +65 -3
  47. package/dist/runtime/index.js +13 -379
  48. package/dist/ssr/index.cjs +506 -133
  49. package/dist/ssr/index.d.cts +56 -4
  50. package/dist/ssr/index.d.ts +56 -4
  51. package/dist/ssr/index.js +444 -71
  52. package/dist/{verificationRegistry-B3dj1Zl8.d.ts → verificationRegistry-B5aGl7WF.d.ts} +2 -1
  53. package/locales/ar.json +0 -2
  54. package/locales/en.json +0 -2
  55. package/locales/sl.json +0 -2
  56. package/package.json +7 -7
  57. package/tailwind-preset.cjs +78 -8
  58. package/themes/_contract.md +6 -0
  59. package/themes/_fonts.css +4 -4
  60. package/themes/_foundation.css +11 -0
  61. package/themes/_presets.css +2 -0
  62. package/themes/almadar-website.css +10 -0
  63. package/themes/almadar.css +10 -0
  64. package/themes/atelier.css +10 -0
  65. package/themes/bauhaus.css +10 -0
  66. package/themes/bloomberg-dense.css +10 -0
  67. package/themes/clay.css +10 -0
  68. package/themes/corporate.css +10 -0
  69. package/themes/gazette.css +10 -0
  70. package/themes/glass.css +10 -0
  71. package/themes/kflow.css +5 -0
  72. package/themes/kiosk.css +10 -0
  73. package/themes/linear-clean.css +10 -0
  74. package/themes/material.css +10 -0
  75. package/themes/minimalist.css +10 -0
  76. package/themes/nata.css +304 -0
  77. package/themes/neon.css +10 -0
  78. package/themes/notion-editorial.css +10 -0
  79. package/themes/orb.css +10 -0
  80. package/themes/prism.css +10 -0
  81. package/themes/rawi.css +304 -0
  82. package/themes/retro.css +10 -0
  83. package/themes/risograph.css +10 -0
  84. package/themes/scandi.css +10 -0
  85. package/themes/solarpunk.css +10 -0
  86. package/themes/terminal.css +138 -128
  87. package/dist/Typography-LZTP72Y4.js +0 -5
  88. package/dist/chunk-D2E44ODB.js +0 -350
  89. package/dist/chunk-N7JIG57B.js +0 -138
  90. package/dist/chunk-QJIAJ6EH.js +0 -2256
@@ -2,6 +2,9 @@ import React from 'react';
2
2
  import { A11yProps, EventKey, EventPayload, EventEmit, Asset, AssetUrl, SurfaceMode, SkeletonSpec } from '@almadar/core';
3
3
  import { LucideIcon } from 'lucide-react';
4
4
 
5
+ type BandEdge = 'none' | 'curve' | 'wave' | 'arc' | 'tilt' | 'step' | 'scallop';
6
+ type BandEdgeColor = 'background' | 'muted' | 'surface' | 'gradient' | 'inverse';
7
+
5
8
  /**
6
9
  * Box Component
7
10
  *
@@ -11,7 +14,7 @@ import { LucideIcon } from 'lucide-react';
11
14
 
12
15
  type BoxPadding = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
13
16
  type BoxMargin = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "auto";
14
- type BoxBg = "transparent" | "primary" | "secondary" | "muted" | "accent" | "surface" | "overlay";
17
+ type BoxBg = "transparent" | "primary" | "secondary" | "muted" | "accent" | "surface" | "overlay" | "gradient" | "inverse";
15
18
  type BoxRounded = "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "full";
16
19
  type BoxShadow = "none" | "sm" | "md" | "lg" | "xl";
17
20
  interface BoxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof A11yProps>, A11yProps {
@@ -63,7 +66,10 @@ interface BoxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof A11y
63
66
  * @payloadFor action
64
67
  */
65
68
  actionPayload?: EventPayload;
66
- /** Declarative hover event — emits UI:{hoverEvent} with { hovered: true/false } on mouseEnter/mouseLeave */
69
+ /**
70
+ * Declarative hover event — emits UI:{hoverEvent} with { hovered: true/false } on mouseEnter/mouseLeave
71
+ * @notification
72
+ */
67
73
  hoverEvent?: EventEmit<{
68
74
  hovered: boolean;
69
75
  }>;
@@ -71,6 +77,20 @@ interface BoxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof A11y
71
77
  tapReveal?: boolean;
72
78
  /** Maximum width (CSS value, e.g., "550px", "80rem") */
73
79
  maxWidth?: string;
80
+ /** Shape cut into the top edge of a full-width band; "curve" uses the theme's shape */
81
+ edgeTop?: BandEdge;
82
+ /** Shape cut into the bottom edge of a full-width band; "curve" uses the theme's shape */
83
+ edgeBottom?: BandEdge;
84
+ /** Surface of the neighbouring band, which fills the cut */
85
+ edgeColor?: BandEdgeColor;
86
+ /** Mirror the edge shapes horizontally */
87
+ edgeFlip?: boolean;
88
+ /** Lay the theme's texture over the band */
89
+ texture?: boolean;
90
+ /** Content that appears or changes inside the box eases in instead of switching in one frame (new rows, swapped views, changed text), played in presentation motion (the theme's dramatic duration, standard easing) so it can be watched. Off under reduced motion. */
91
+ animateChanges?: boolean;
92
+ /** Scene behind the band's content (photo, illustration, pattern); never takes clicks */
93
+ backdrop?: React.ReactNode;
74
94
  /** Children elements */
75
95
  children?: React.ReactNode;
76
96
  }
@@ -115,7 +135,10 @@ interface StackProps extends Omit<React.AriaAttributes, keyof A11yProps>, A11yPr
115
135
  as?: React.ElementType;
116
136
  /** Click handler */
117
137
  onClick?: (e: React.MouseEvent) => void;
118
- /** Keyboard handler */
138
+ /**
139
+ * Keyboard handler
140
+ * @notification
141
+ */
119
142
  onKeyDown?: (e: React.KeyboardEvent) => void;
120
143
  /** Element id */
121
144
  id?: string;
@@ -292,7 +315,7 @@ declare const Icon: React.FC<IconProps>;
292
315
  type ButtonVariant = "primary" | "secondary" | "ghost" | "danger" | "success" | "warning" | "default" | "link";
293
316
  type ButtonSize = "sm" | "md" | "lg";
294
317
  /** @accessibleName label */
295
- interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, keyof A11yProps>, A11yProps {
318
+ interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, keyof A11yProps | 'onClick'>, A11yProps {
296
319
  /** Additional CSS classes applied to the root element. */
297
320
  className?: string;
298
321
  variant?: ButtonVariant;
@@ -323,6 +346,11 @@ interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>
323
346
  disabled?: boolean;
324
347
  /** Makes the button a link: `#anchor` scrolls, an absolute URL loads, a path navigates in-app */
325
348
  href?: string;
349
+ /**
350
+ * Runs on activation, on the button or, with `href`, on the link; calling
351
+ * `preventDefault()` there keeps a link from following its `href`.
352
+ */
353
+ onClick?: (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;
326
354
  /** Test identifier for automated tests */
327
355
  'data-testid'?: string;
328
356
  }
@@ -498,6 +526,7 @@ declare const Avatar: React.FC<AvatarProps>;
498
526
  type ImageFit = 'cover' | 'contain' | 'fill' | 'none';
499
527
  type ImageAspect = 'auto' | '1/1' | '4/3' | '3/2' | '16/9' | '21/9';
500
528
  type ImageRounded = 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';
529
+ type ImagePosition = 'center' | 'top' | 'bottom' | 'left' | 'right';
501
530
  /** @accessibleName alt */
502
531
  interface ImageProps extends A11yProps {
503
532
  /** Image source URL */
@@ -514,6 +543,14 @@ interface ImageProps extends A11yProps {
514
543
  bordered?: boolean;
515
544
  /** "lazy" defers off-screen images; "eager" for above-the-fold media */
516
545
  loading?: 'lazy' | 'eager';
546
+ /** Which part of the image stays visible when it is cropped */
547
+ position?: ImagePosition;
548
+ /** Candidate sources at different widths (the HTML `srcset`) */
549
+ srcSet?: string;
550
+ /** Rendered widths at each breakpoint (the HTML `sizes`) */
551
+ sizes?: string;
552
+ /** The page's main image: load it first */
553
+ priority?: boolean;
517
554
  /** Additional class names */
518
555
  className?: string;
519
556
  }
@@ -702,6 +739,21 @@ interface AnimatedRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
702
739
  delay?: number;
703
740
  /** How much of the element must be visible before triggering, 0-1 (default: 0.15) */
704
741
  threshold?: number;
742
+ /**
743
+ * scroll trigger: event emitted once (as UI:{revealEvent}) the first time the element scrolls into view; never under reduced motion
744
+ * @notification
745
+ */
746
+ revealEvent?: EventKey;
747
+ /**
748
+ * scroll trigger: event emitted (as UI:{enterEvent}) every time the element enters the view
749
+ * @notification
750
+ */
751
+ enterEvent?: EventKey;
752
+ /**
753
+ * scroll trigger: event emitted (as UI:{leaveEvent}) every time the element leaves the view after having entered it
754
+ * @notification
755
+ */
756
+ leaveEvent?: EventKey;
705
757
  /** Animate only the first time the element enters the viewport (default: true) */
706
758
  once?: boolean;
707
759
  /** Manual control: when trigger='manual', set this to true to animate */
@@ -2,6 +2,9 @@ import React from 'react';
2
2
  import { A11yProps, EventKey, EventPayload, EventEmit, Asset, AssetUrl, SurfaceMode, SkeletonSpec } from '@almadar/core';
3
3
  import { LucideIcon } from 'lucide-react';
4
4
 
5
+ type BandEdge = 'none' | 'curve' | 'wave' | 'arc' | 'tilt' | 'step' | 'scallop';
6
+ type BandEdgeColor = 'background' | 'muted' | 'surface' | 'gradient' | 'inverse';
7
+
5
8
  /**
6
9
  * Box Component
7
10
  *
@@ -11,7 +14,7 @@ import { LucideIcon } from 'lucide-react';
11
14
 
12
15
  type BoxPadding = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
13
16
  type BoxMargin = "none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "auto";
14
- type BoxBg = "transparent" | "primary" | "secondary" | "muted" | "accent" | "surface" | "overlay";
17
+ type BoxBg = "transparent" | "primary" | "secondary" | "muted" | "accent" | "surface" | "overlay" | "gradient" | "inverse";
15
18
  type BoxRounded = "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "full";
16
19
  type BoxShadow = "none" | "sm" | "md" | "lg" | "xl";
17
20
  interface BoxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof A11yProps>, A11yProps {
@@ -63,7 +66,10 @@ interface BoxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof A11y
63
66
  * @payloadFor action
64
67
  */
65
68
  actionPayload?: EventPayload;
66
- /** Declarative hover event — emits UI:{hoverEvent} with { hovered: true/false } on mouseEnter/mouseLeave */
69
+ /**
70
+ * Declarative hover event — emits UI:{hoverEvent} with { hovered: true/false } on mouseEnter/mouseLeave
71
+ * @notification
72
+ */
67
73
  hoverEvent?: EventEmit<{
68
74
  hovered: boolean;
69
75
  }>;
@@ -71,6 +77,20 @@ interface BoxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof A11y
71
77
  tapReveal?: boolean;
72
78
  /** Maximum width (CSS value, e.g., "550px", "80rem") */
73
79
  maxWidth?: string;
80
+ /** Shape cut into the top edge of a full-width band; "curve" uses the theme's shape */
81
+ edgeTop?: BandEdge;
82
+ /** Shape cut into the bottom edge of a full-width band; "curve" uses the theme's shape */
83
+ edgeBottom?: BandEdge;
84
+ /** Surface of the neighbouring band, which fills the cut */
85
+ edgeColor?: BandEdgeColor;
86
+ /** Mirror the edge shapes horizontally */
87
+ edgeFlip?: boolean;
88
+ /** Lay the theme's texture over the band */
89
+ texture?: boolean;
90
+ /** Content that appears or changes inside the box eases in instead of switching in one frame (new rows, swapped views, changed text), played in presentation motion (the theme's dramatic duration, standard easing) so it can be watched. Off under reduced motion. */
91
+ animateChanges?: boolean;
92
+ /** Scene behind the band's content (photo, illustration, pattern); never takes clicks */
93
+ backdrop?: React.ReactNode;
74
94
  /** Children elements */
75
95
  children?: React.ReactNode;
76
96
  }
@@ -115,7 +135,10 @@ interface StackProps extends Omit<React.AriaAttributes, keyof A11yProps>, A11yPr
115
135
  as?: React.ElementType;
116
136
  /** Click handler */
117
137
  onClick?: (e: React.MouseEvent) => void;
118
- /** Keyboard handler */
138
+ /**
139
+ * Keyboard handler
140
+ * @notification
141
+ */
119
142
  onKeyDown?: (e: React.KeyboardEvent) => void;
120
143
  /** Element id */
121
144
  id?: string;
@@ -292,7 +315,7 @@ declare const Icon: React.FC<IconProps>;
292
315
  type ButtonVariant = "primary" | "secondary" | "ghost" | "danger" | "success" | "warning" | "default" | "link";
293
316
  type ButtonSize = "sm" | "md" | "lg";
294
317
  /** @accessibleName label */
295
- interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, keyof A11yProps>, A11yProps {
318
+ interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, keyof A11yProps | 'onClick'>, A11yProps {
296
319
  /** Additional CSS classes applied to the root element. */
297
320
  className?: string;
298
321
  variant?: ButtonVariant;
@@ -323,6 +346,11 @@ interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>
323
346
  disabled?: boolean;
324
347
  /** Makes the button a link: `#anchor` scrolls, an absolute URL loads, a path navigates in-app */
325
348
  href?: string;
349
+ /**
350
+ * Runs on activation, on the button or, with `href`, on the link; calling
351
+ * `preventDefault()` there keeps a link from following its `href`.
352
+ */
353
+ onClick?: (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;
326
354
  /** Test identifier for automated tests */
327
355
  'data-testid'?: string;
328
356
  }
@@ -498,6 +526,7 @@ declare const Avatar: React.FC<AvatarProps>;
498
526
  type ImageFit = 'cover' | 'contain' | 'fill' | 'none';
499
527
  type ImageAspect = 'auto' | '1/1' | '4/3' | '3/2' | '16/9' | '21/9';
500
528
  type ImageRounded = 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';
529
+ type ImagePosition = 'center' | 'top' | 'bottom' | 'left' | 'right';
501
530
  /** @accessibleName alt */
502
531
  interface ImageProps extends A11yProps {
503
532
  /** Image source URL */
@@ -514,6 +543,14 @@ interface ImageProps extends A11yProps {
514
543
  bordered?: boolean;
515
544
  /** "lazy" defers off-screen images; "eager" for above-the-fold media */
516
545
  loading?: 'lazy' | 'eager';
546
+ /** Which part of the image stays visible when it is cropped */
547
+ position?: ImagePosition;
548
+ /** Candidate sources at different widths (the HTML `srcset`) */
549
+ srcSet?: string;
550
+ /** Rendered widths at each breakpoint (the HTML `sizes`) */
551
+ sizes?: string;
552
+ /** The page's main image: load it first */
553
+ priority?: boolean;
517
554
  /** Additional class names */
518
555
  className?: string;
519
556
  }
@@ -702,6 +739,21 @@ interface AnimatedRevealProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
702
739
  delay?: number;
703
740
  /** How much of the element must be visible before triggering, 0-1 (default: 0.15) */
704
741
  threshold?: number;
742
+ /**
743
+ * scroll trigger: event emitted once (as UI:{revealEvent}) the first time the element scrolls into view; never under reduced motion
744
+ * @notification
745
+ */
746
+ revealEvent?: EventKey;
747
+ /**
748
+ * scroll trigger: event emitted (as UI:{enterEvent}) every time the element enters the view
749
+ * @notification
750
+ */
751
+ enterEvent?: EventKey;
752
+ /**
753
+ * scroll trigger: event emitted (as UI:{leaveEvent}) every time the element leaves the view after having entered it
754
+ * @notification
755
+ */
756
+ leaveEvent?: EventKey;
705
757
  /** Animate only the first time the element enters the viewport (default: true) */
706
758
  once?: boolean;
707
759
  /** Manual control: when trigger='manual', set this to true to animate */