neba 1.2.0 → 1.4.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 (107) hide show
  1. package/README.md +8 -8
  2. package/dist/components/alert/Alert.d.ts +7 -1
  3. package/dist/components/alert/Alert.js +1 -1
  4. package/dist/components/animate-appear/AnimateAppear.d.ts +55 -0
  5. package/dist/components/animate-appear/AnimateAppear.js +1 -0
  6. package/dist/components/animate-appear/index.d.ts +2 -0
  7. package/dist/components/animate-appear/index.js +1 -0
  8. package/dist/components/animate-blink/AnimateBlink.d.ts +31 -0
  9. package/dist/components/animate-blink/AnimateBlink.js +1 -0
  10. package/dist/components/animate-blink/index.d.ts +2 -0
  11. package/dist/components/animate-blink/index.js +1 -0
  12. package/dist/components/animate-fade/AnimateFade.d.ts +31 -0
  13. package/dist/components/animate-fade/AnimateFade.js +1 -0
  14. package/dist/components/animate-fade/index.d.ts +2 -0
  15. package/dist/components/animate-fade/index.js +1 -0
  16. package/dist/components/animate-grow/AnimateGrow.d.ts +41 -0
  17. package/dist/components/animate-grow/AnimateGrow.js +1 -0
  18. package/dist/components/animate-grow/index.d.ts +2 -0
  19. package/dist/components/animate-grow/index.js +1 -0
  20. package/dist/components/animate-headline/AnimateHeadline.d.ts +55 -0
  21. package/dist/components/animate-headline/AnimateHeadline.js +1 -0
  22. package/dist/components/animate-headline/index.d.ts +2 -0
  23. package/dist/components/animate-headline/index.js +1 -0
  24. package/dist/components/animate-lighting/AnimateLighting.d.ts +62 -0
  25. package/dist/components/animate-lighting/AnimateLighting.js +1 -0
  26. package/dist/components/animate-lighting/index.d.ts +2 -0
  27. package/dist/components/animate-lighting/index.js +1 -0
  28. package/dist/components/animate-marquee/AnimateMarquee.d.ts +65 -0
  29. package/dist/components/animate-marquee/AnimateMarquee.js +1 -0
  30. package/dist/components/animate-marquee/index.d.ts +2 -0
  31. package/dist/components/animate-marquee/index.js +1 -0
  32. package/dist/components/animate-rotate/AnimateRotate.d.ts +48 -0
  33. package/dist/components/animate-rotate/AnimateRotate.js +1 -0
  34. package/dist/components/animate-rotate/index.d.ts +2 -0
  35. package/dist/components/animate-rotate/index.js +1 -0
  36. package/dist/components/animate-slide/AnimateSlide.d.ts +46 -0
  37. package/dist/components/animate-slide/AnimateSlide.js +1 -0
  38. package/dist/components/animate-slide/index.d.ts +2 -0
  39. package/dist/components/animate-slide/index.js +1 -0
  40. package/dist/components/animate-typing/AnimateTyping.d.ts +58 -0
  41. package/dist/components/animate-typing/AnimateTyping.js +1 -0
  42. package/dist/components/animate-typing/index.d.ts +2 -0
  43. package/dist/components/animate-typing/index.js +1 -0
  44. package/dist/components/animate-zoom/AnimateZoom.d.ts +37 -0
  45. package/dist/components/animate-zoom/AnimateZoom.js +1 -0
  46. package/dist/components/animate-zoom/index.d.ts +2 -0
  47. package/dist/components/animate-zoom/index.js +1 -0
  48. package/dist/components/aspect-ratio/AspectRatio.d.ts +63 -0
  49. package/dist/components/aspect-ratio/AspectRatio.js +1 -0
  50. package/dist/components/aspect-ratio/index.d.ts +2 -0
  51. package/dist/components/aspect-ratio/index.js +1 -0
  52. package/dist/components/avatar/Avatar.d.ts +7 -1
  53. package/dist/components/avatar/Avatar.js +1 -1
  54. package/dist/components/blockquote/Blockquote.d.ts +7 -1
  55. package/dist/components/blockquote/Blockquote.js +1 -1
  56. package/dist/components/box/Box.d.ts +7 -1
  57. package/dist/components/box/Box.js +1 -1
  58. package/dist/components/chip/Chip.d.ts +7 -1
  59. package/dist/components/chip/Chip.js +1 -1
  60. package/dist/components/color-picker/ColorPicker.d.ts +102 -0
  61. package/dist/components/color-picker/ColorPicker.js +1 -0
  62. package/dist/components/color-picker/index.d.ts +2 -0
  63. package/dist/components/color-picker/index.js +1 -0
  64. package/dist/components/data-table/DataTable.d.ts +323 -0
  65. package/dist/components/data-table/DataTable.js +1 -0
  66. package/dist/components/data-table/index.d.ts +2 -0
  67. package/dist/components/data-table/index.js +1 -0
  68. package/dist/components/drawer/Drawer.d.ts +145 -0
  69. package/dist/components/drawer/Drawer.js +1 -0
  70. package/dist/components/drawer/index.d.ts +2 -0
  71. package/dist/components/drawer/index.js +1 -0
  72. package/dist/components/empty/Empty.d.ts +69 -0
  73. package/dist/components/empty/Empty.js +1 -0
  74. package/dist/components/empty/index.d.ts +2 -0
  75. package/dist/components/empty/index.js +1 -0
  76. package/dist/components/icon/Icon.d.ts +8 -1
  77. package/dist/components/icon/Icon.js +1 -1
  78. package/dist/components/mockup/Mockup.d.ts +151 -0
  79. package/dist/components/mockup/Mockup.js +1 -0
  80. package/dist/components/mockup/index.d.ts +2 -0
  81. package/dist/components/mockup/index.js +1 -0
  82. package/dist/components/popover/Popover.d.ts +109 -0
  83. package/dist/components/popover/Popover.js +1 -0
  84. package/dist/components/popover/index.d.ts +2 -0
  85. package/dist/components/popover/index.js +1 -0
  86. package/dist/components/skeleton/Skeleton.d.ts +76 -0
  87. package/dist/components/skeleton/Skeleton.js +1 -0
  88. package/dist/components/skeleton/index.d.ts +2 -0
  89. package/dist/components/skeleton/index.js +1 -0
  90. package/dist/components/typography/Typography.d.ts +7 -1
  91. package/dist/components/typography/Typography.js +1 -1
  92. package/dist/index.d.ts +19 -0
  93. package/dist/index.js +1 -1
  94. package/dist/internal/animate.d.ts +175 -0
  95. package/dist/internal/animate.js +1 -0
  96. package/dist/internal/color.d.ts +108 -0
  97. package/dist/internal/color.js +1 -0
  98. package/dist/internal/data-table.d.ts +170 -0
  99. package/dist/internal/data-table.js +1 -0
  100. package/dist/internal/i18n.d.ts +76 -0
  101. package/dist/internal/i18n.js +1 -1
  102. package/dist/internal/mockup.d.ts +193 -0
  103. package/dist/internal/mockup.js +1 -0
  104. package/dist/styles.css +1 -1
  105. package/dist/tailwind.css +405 -11
  106. package/dist/types.d.ts +112 -0
  107. package/package.json +12 -12
@@ -1 +1 @@
1
- import{jsx as e}from"react/jsx-runtime";import*as t from"react";import{iconSizeClasses as i}from"../../internal/styles";const n={xs:"text-[0.875rem]",sm:"text-[1rem]",md:"text-[1.25rem]",lg:"text-[1.5rem]",xl:"text-[1.75rem]"};export const Icon=t.forwardRef(function({icon:t,size:r="md",color:l="inherit",label:s,className:a,style:o,...c},m){const f=["inline-flex shrink-0 items-center justify-center align-middle",i[r],"[&>svg]:block [&>svg]:size-full [&>img]:block [&>img]:size-full",`leading-none ${n[r]}`,"inherit"===l?"":"text-(--n-accent)",a??""].filter(Boolean).join(" ");return e("span",{ref:m,className:f,style:"inherit"===l?o:{"--n-accent":`var(--neba-${l}-accent)`,...o},role:s?"img":void 0,"aria-label":s,"aria-hidden":!s||void 0,...c,children:t})});
1
+ import{jsx as e}from"react/jsx-runtime";import*as t from"react";import{transitionProps as i}from"../../internal/animate";import{iconSizeClasses as n}from"../../internal/styles";const r={xs:"text-[0.875rem]",sm:"text-[1rem]",md:"text-[1.25rem]",lg:"text-[1.5rem]",xl:"text-[1.75rem]"};export const Icon=t.forwardRef(function({icon:t,size:l="md",color:a="inherit",label:s,transition:o,className:m,style:c,...f},x){const d=i(o),g=["inline-flex shrink-0 items-center justify-center align-middle",n[l],"[&>svg]:block [&>svg]:size-full [&>img]:block [&>img]:size-full",`leading-none ${r[l]}`,"inherit"===a?"":"text-(--n-accent)",d.className,m??""].filter(Boolean).join(" ");return e("span",{ref:x,className:g,style:"inherit"===a?{...d.style,...c}:{"--n-accent":`var(--neba-${a}-accent)`,...d.style,...c},role:s?"img":void 0,"aria-label":s,"aria-hidden":!s||void 0,...f,children:t})});
@@ -0,0 +1,151 @@
1
+ import * as React from 'react';
2
+ import { useRender } from '@base-ui/react/use-render';
3
+ import type { NebaMockupBezel, NebaMockupDevice, NebaMockupFinish, NebaMockupHardware, NebaMockupNotch, NebaMockupOrientation, NebaMockupOs, NebaMockupResolution } from '../../internal/mockup';
4
+ import type { NebaColor, NebaElevation, NebaSize, NebaTransition } from '../../types';
5
+ export type { NebaMockupBezel, NebaMockupDevice, NebaMockupFinish, NebaMockupHardware, NebaMockupNotch, NebaMockupOrientation, NebaMockupOs, NebaMockupResolution } from '../../internal/mockup';
6
+ export interface MockupProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'color'> {
7
+ /**
8
+ * Which machine this is a picture of. The one prop with no default: a mockup
9
+ * that has not said what it is a mockup of has not said anything.
10
+ */
11
+ device: NebaMockupDevice;
12
+ /**
13
+ * The system whose chrome is drawn on the screen. A desktop runs `macos`,
14
+ * `windows` or `linux`; a tablet runs `ipados` or `android`; a phone runs `ios`
15
+ * or `android`. Anything else falls back to the device's own default —
16
+ * `macos`, `ipados` and `ios` respectively.
17
+ */
18
+ os?: NebaMockupOs;
19
+ /**
20
+ * What holds a desktop screen up: a stand under it, or a keyboard in front of
21
+ * it. Ignored on a tablet and a phone, which hold themselves up.
22
+ * @default 'monitor'
23
+ */
24
+ hardware?: NebaMockupHardware;
25
+ /**
26
+ * How big the device is, on a five-step ladder of real resolutions per device
27
+ * — from a 320-wide phone to a 430-wide one, from a 1024-wide desktop to a
28
+ * 1920-wide one.
29
+ *
30
+ * As on Box, `size` here does not set a height or a type scale. What it sets
31
+ * is the resolution of the screen, which is the only thing about a device
32
+ * there is to scale. `resolution` overrides it outright.
33
+ * @default 'md'
34
+ */
35
+ size?: NebaSize;
36
+ /**
37
+ * The screen's logical resolution in CSS pixels, when none of the five steps
38
+ * is the machine you mean. This is the viewport the content is laid out
39
+ * against, not the panel's physical pixel count.
40
+ */
41
+ resolution?: NebaMockupResolution;
42
+ /**
43
+ * Which way a handheld is held. Landscape turns the screen, the bezel and the
44
+ * cut-out together. Ignored on a desktop, whose stand does not turn with it.
45
+ * @default 'portrait'
46
+ */
47
+ orientation?: NebaMockupOrientation;
48
+ /**
49
+ * How much hardware there is around the screen. `none` is not a thinner
50
+ * bezel — it is no hardware at all, leaving the screen on its own with its
51
+ * corners cut, which is what a mockup that only wants the viewport asks for.
52
+ * `thick` is an older device: narrow sides, a forehead and a chin.
53
+ * @default 'standard'
54
+ */
55
+ bezel?: NebaMockupBezel;
56
+ /**
57
+ * What the hardware is made of. Fixed colours rather than theme tokens — a
58
+ * graphite phone stays graphite on a page switched to dark.
59
+ * @default 'graphite'
60
+ */
61
+ finish?: NebaMockupFinish;
62
+ /**
63
+ * The camera cut-out. Hardware rather than chrome, so it is drawn whether or
64
+ * not `systemUi` is on. Defaults to what the device would have: a dynamic
65
+ * island on an iOS phone, a punch hole on an Android one, nothing anywhere
66
+ * else.
67
+ */
68
+ notch?: NebaMockupNotch;
69
+ /**
70
+ * Draws the system's own bars — a status bar and a home indicator, a menu bar
71
+ * and a dock, a taskbar. Each one takes its own space rather than covering the
72
+ * content, so turning it off gives the screen back to `children` rather than
73
+ * uncovering anything.
74
+ * @default true
75
+ */
76
+ systemUi?: boolean;
77
+ /**
78
+ * Whether content taller than the screen scrolls. Off, it is clipped, which is
79
+ * what a still picture of a device wants.
80
+ * @default false
81
+ */
82
+ scroll?: boolean;
83
+ /**
84
+ * What is behind the content: any CSS `background` value — a colour, a
85
+ * gradient, a `url()`.
86
+ * @default the page's own surface colour
87
+ */
88
+ wallpaper?: string;
89
+ /**
90
+ * The clock in the status bar or the taskbar, and the only text the chrome
91
+ * draws. A string rather than a `Date`, because a mockup's clock is a prop of
92
+ * the picture and reading the real one would differ between the server that
93
+ * renders the page and the browser that hydrates it.
94
+ * @default '9:41'
95
+ */
96
+ time?: string;
97
+ /**
98
+ * The rendered width of the whole device on the page — a number in pixels or
99
+ * any CSS length. The device is laid out at its own resolution and then scaled
100
+ * to whatever this comes to, so the content inside is genuinely a screen's
101
+ * worth rather than a page's worth shrunk.
102
+ * @default '100%'
103
+ */
104
+ width?: number | string;
105
+ /**
106
+ * The rendered height. Given on its own it decides the size and the width
107
+ * follows the device's proportion, which is what a mockup in a row of fixed
108
+ * height wants.
109
+ */
110
+ height?: number | string;
111
+ /** Reaches the accent in the chrome — a dock's first icon, a taskbar's. */
112
+ color?: NebaColor;
113
+ /**
114
+ * How far off the page the device sits. Drawn as a silhouette rather than a
115
+ * box, so the shadow follows a lid on a neck on a foot, and it does not shrink
116
+ * with the device.
117
+ * @default 0
118
+ */
119
+ elevation?: NebaElevation;
120
+ /**
121
+ * An entrance animation, run once on mount: `transition="fade"`, or an object
122
+ * for the details.
123
+ */
124
+ transition?: NebaTransition;
125
+ /** Renders something other than a `<div>`: `render={<figure />}`. */
126
+ render?: useRender.RenderProp;
127
+ /** What is on the screen. */
128
+ children?: React.ReactNode;
129
+ }
130
+ /**
131
+ * A device with a screen you can put anything on: a phone, a tablet, a monitor
132
+ * or a laptop, with the system's own bars drawn on it.
133
+ *
134
+ * The screen is a viewport at the device's own resolution — a `md` phone is 390
135
+ * by 844 CSS pixels — and the whole device is then scaled once to whatever room
136
+ * it has been given. So the content inside is laid out against a screen rather
137
+ * than against the page: a 390-pixel column wraps where it would wrap on a
138
+ * phone, and the mockup can be 200 pixels wide on the page without the content
139
+ * knowing.
140
+ *
141
+ * That scale is a `transform`, and it is the one place in the library where one
142
+ * is used. The rule it is an exception to is about controls, where a scale
143
+ * resamples a label under the pointer that is pressing it. Nothing here is
144
+ * pressed and the scale never changes on an interaction: it is set once from the
145
+ * space available, which is the only way to draw a 1440-pixel desktop in a
146
+ * paragraph's width at all.
147
+ *
148
+ * The screen is also a container (`neba-screen`), so content inside can answer
149
+ * to the device's width with a container query rather than to the window's.
150
+ */
151
+ export declare const Mockup: React.ForwardRefExoticComponent<MockupProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as t,Fragment as i}from"react/jsx-runtime";import*as r from"react";import{useRender as n}from"@base-ui/react/use-render";import{transitionProps as a}from"../../internal/animate";import{MockupCutout as o,defaultNotch as s,elevationFilters as d,finishSlots as h,mockupChrome as l,mockupMetrics as c,resolveOs as u,shellClasses as f}from"../../internal/mockup";import{surfaceSlots as m}from"../../internal/styles";const p="undefined"==typeof document?r.useEffect:r.useLayoutEffect;export const Mockup=r.forwardRef(function({device:g,os:b,hardware:v="monitor",size:w="md",resolution:y,orientation:x="portrait",bezel:k="standard",finish:R="graphite",notch:N,systemUi:z=!0,scroll:$=!1,wallpaper:M,time:j="9:41",width:W,height:B,color:H="primary",elevation:C=0,transition:E,render:L,className:O,style:P,children:S,...F},I){const T=u(g,b),U=N??s(g,T),q="desktop"!==g&&"landscape"===x,A=c({device:g,size:w,resolution:y,orientation:x,bezel:k,hardware:v}),{screen:D,frame:G,body:J,stand:K,base:Q}=A,V=r.useRef(null),[X,Y]=r.useState(null);p(()=>{const e=V.current;if(!e)return;const t=()=>{const t=e.getBoundingClientRect();if(t.width<=0||t.height<=0)return;const i=Math.min(t.width/G.width,t.height/G.height);Y(e=>null!==e&&Math.abs(e-i)<1e-4?e:i)};if(t(),"undefined"==typeof ResizeObserver)return;const i=new ResizeObserver(t);return i.observe(e),()=>i.disconnect()},[G.width,G.height]);const Z=r.useCallback(e=>{V.current=e,"function"==typeof I?I(e):I&&(I.current=e)},[I]),_=z?l({os:T,notch:U,landscape:q,time:j}):{},ee=a(E),te="none"===k,ie=t("div",{className:"neba-mockup-screen relative flex flex-col overflow-hidden",style:{width:D.width,height:D.height,borderRadius:A.screenRadius,background:M??"var(--neba-surface)",boxShadow:te?void 0:"inset 0 0 0 1px var(--n-shell-shade)"},children:[_.top?.node,t("div",{className:"flex min-h-0 flex-1",children:[_.start?.node,e("div",{className:"min-w-0 flex-1 "+($?"overflow-auto":"overflow-hidden"),style:{containerType:"size",containerName:"neba-screen"},children:S})]}),_.bottom?.node,e(o,{notch:U,screen:D,landscape:q})]}),re=["neba-mockup relative block",ee.className,O??""].filter(Boolean).join(" ");return n({render:L,ref:Z,props:{className:re,style:{...m(H,C),...h[R],...ee.style,width:W??(void 0===B?"100%":"auto"),height:B??"auto",aspectRatio:`${G.width} / ${G.height}`,filter:d[C],...P},children:t("div",{className:"absolute top-1/2 left-1/2 flex flex-col items-center",style:{width:G.width,height:G.height,transform:`translate(-50%, -50%) scale(${X??1})`,visibility:null===X?"hidden":void 0},children:[e("div",{className:te?"":f,style:{width:J.width,height:J.height,borderRadius:A.frameRadius,paddingBlock:`${A.bezel.top}px ${A.bezel.bottom}px`,paddingInline:A.bezel.x},children:ie}),K?t(i,{children:[e("div",{"aria-hidden":"true",style:{width:K.neckWidth,height:K.neckHeight,background:"var(--n-shell-shade)",clipPath:"polygon(16% 0, 84% 0, 100% 100%, 0 100%)"}}),e("div",{"aria-hidden":"true",className:f,style:{width:K.footWidth,height:K.footHeight,borderRadius:K.footHeight/2}})]}):null,Q?e("div",{"aria-hidden":"true",className:`relative ${f}`,style:{width:Q.width,height:Q.height,borderRadius:`0 0 ${Math.round(.55*Q.height)}px ${Math.round(.55*Q.height)}px`,clipPath:"polygon(0 0, 100% 0, 98.5% 100%, 1.5% 100%)"},children:e("div",{className:"absolute top-0 left-1/2",style:{width:Q.lipWidth,height:Math.round(.34*Q.height),marginLeft:-Q.lipWidth/2,borderRadius:`0 0 ${Math.round(.2*Q.height)}px ${Math.round(.2*Q.height)}px`,background:"var(--n-shell-shade)"}})}):null]}),...F}})});
@@ -0,0 +1,2 @@
1
+ export { Mockup } from './Mockup';
2
+ export type { MockupProps, NebaMockupBezel, NebaMockupDevice, NebaMockupFinish, NebaMockupHardware, NebaMockupNotch, NebaMockupOrientation, NebaMockupOs, NebaMockupResolution } from './Mockup';
@@ -0,0 +1 @@
1
+ export{Mockup}from"./Mockup";
@@ -0,0 +1,109 @@
1
+ import * as React from 'react';
2
+ import { Popover as BaseUIPopover } from '@base-ui/react/popover';
3
+ import type { NebaAlign, NebaSide, NebaStyleProps } from '../../types';
4
+ /**
5
+ * A popover takes `size`, `color` and `density` and stops there.
6
+ *
7
+ * There is no `variant` — the three weights answer "how much does this surface
8
+ * assert itself against the page", and a popup that had to be asked for has
9
+ * already been asserted. There is no `elevation` either: a popover floats over
10
+ * the page by definition, so it carries a shadow at level 3 and a prop that
11
+ * could sit it flat would be a prop that could stop it being a popover.
12
+ */
13
+ export interface PopoverProps extends Pick<NebaStyleProps, 'size' | 'color' | 'density'> {
14
+ /**
15
+ * The element the popup hangs off and that opens it. Exactly one element,
16
+ * which must accept a ref and spread props — every Neba component does.
17
+ *
18
+ * Optional: a controlled popover anchored from elsewhere needs none, though it
19
+ * then has nothing to position against and will sit against the viewport.
20
+ */
21
+ trigger?: React.ReactElement;
22
+ /** The heading, rendered as the element that names the popup. */
23
+ title?: React.ReactNode;
24
+ /** A line under the title, and the popup's accessible description. */
25
+ description?: React.ReactNode;
26
+ /** The body. */
27
+ children?: React.ReactNode;
28
+ /**
29
+ * Which edge of the trigger it appears on. Flips to the opposite side when
30
+ * there is no room, which is Base UI's doing and is the right behaviour.
31
+ * @default 'bottom'
32
+ */
33
+ side?: NebaSide;
34
+ /** Where it sits along that edge. @default 'center' */
35
+ align?: NebaAlign;
36
+ /** Distance from the trigger, in pixels. @default 6 */
37
+ sideOffset?: number;
38
+ /** Shift along that edge, in pixels. @default 0 */
39
+ alignOffset?: number;
40
+ /**
41
+ * Draws the little wedge pointing at the trigger.
42
+ *
43
+ * Off by default, unlike on [Tooltip](../feedback/tooltip). A tooltip is a
44
+ * filled plate and its wedge is the same solid colour; this surface is
45
+ * translucent over a blurred backdrop, and a wedge sticking out past the
46
+ * popup's own box cannot carry that backdrop with it. Turn it on where the
47
+ * trigger is far enough away that the popup needs to say what it belongs to.
48
+ * @default false
49
+ */
50
+ arrow?: boolean;
51
+ /** Whether the popover is open. Use with `onOpenChange` for a controlled one. */
52
+ open?: boolean;
53
+ /** Whether it starts open, for an uncontrolled one. */
54
+ defaultOpen?: boolean;
55
+ onOpenChange?: (open: boolean) => void;
56
+ /**
57
+ * Whether the page behind is taken away. `false` — the default — leaves the
58
+ * page scrollable and clickable, which is what separates a popover from a
59
+ * [Dialog](../feedback/dialog): it is a detail beside the page, not instead of
60
+ * it. `'trap-focus'` holds focus inside without locking the scroll.
61
+ * @default false
62
+ */
63
+ modal?: boolean | 'trap-focus';
64
+ /**
65
+ * Whether pressing Escape or clicking outside closes the popup. Turn it off
66
+ * only for a popup with its own way out, because there will be no other.
67
+ * @default true
68
+ */
69
+ dismissible?: boolean;
70
+ /** Shows the × in the corner. @default false */
71
+ showClose?: boolean;
72
+ /** Accessible name of the × button. */
73
+ closeLabel?: string;
74
+ /**
75
+ * A hard cap on the popup's width, overriding the one `size` implies. Numbers
76
+ * are pixels. For the popover whose content decides its width — a form, a
77
+ * single line of help — rather than for tuning the scale, which is `size`.
78
+ */
79
+ width?: number | string;
80
+ className?: string;
81
+ style?: React.CSSProperties;
82
+ }
83
+ export type PopoverCloseProps = React.ComponentPropsWithoutRef<typeof BaseUIPopover.Close>;
84
+ /**
85
+ * Closes the popover it is inside.
86
+ *
87
+ * Exported for the reason `DialogClose` is: an uncontrolled popover has no
88
+ * `setOpen` for its Cancel button to call, and making every popover controlled
89
+ * is a piece of state per popover that exists only to answer a button.
90
+ *
91
+ * `render` is Base UI's own escape hatch, so a real Neba button dismisses:
92
+ * `<PopoverClose render={<Button variant="text">Cancel</Button>} />`.
93
+ */
94
+ export declare const PopoverClose: React.ForwardRefExoticComponent<Omit<import("@base-ui/react").PopoverCloseProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
95
+ /**
96
+ * A sheet that opens beside the thing that opened it.
97
+ *
98
+ * The difference from a [Tooltip](../feedback/tooltip) is that this one can be
99
+ * reached: it stays up until it is dismissed, it can be entered with the
100
+ * pointer or the keyboard, and what is inside it can be clicked and typed into.
101
+ * The difference from a [Dialog](../feedback/dialog) is that it does not take
102
+ * the page — it is anchored to a control, and the page behind goes on working.
103
+ *
104
+ * Base UI owns everything hard about it: the anchoring and the flip at the
105
+ * window edge, the click-outside and Escape, returning focus to the trigger, and
106
+ * the `aria-labelledby` / `aria-describedby` wiring. What is left here is the
107
+ * surface, the width ladder and the header.
108
+ */
109
+ export declare function Popover({ size, color, density, trigger, title, description, children, side, align, sideOffset, alignOffset, arrow, open, defaultOpen, onOpenChange, modal, dismissible, showClose, closeLabel, width, className, style }: PopoverProps): React.JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as a}from"react/jsx-runtime";import{Popover as o}from"@base-ui/react/popover";import{boxPaddingXClasses as t,boxPaddingYClasses as n}from"../box/Box";import{CloseIcon as s}from"../../internal/icons";import{hasContent as i,metaTextClasses as l,radiusClasses as r,sheetBodyClasses as d,sheetHeaderGapClasses as c,sheetSectionGapClasses as m,sheetTitleClasses as p,surfaceClasses as f,surfaceSlots as u}from"../../internal/styles";const h={xs:"max-w-56",sm:"max-w-64",md:"max-w-80",lg:"max-w-96",xl:"max-w-lg"},x=[f,"relative flex flex-col","border text-(--neba-fg) bg-(--n-panel-press)","[border-color:var(--n-line)]","[box-shadow:var(--neba-shadow-3),var(--neba-plate-glass)]","[outline:none]","[transition:opacity_var(--neba-duration)_var(--neba-ease)]","data-[starting-style]:opacity-0 data-[ending-style]:opacity-0"].join(" "),b={xs:8,sm:9,md:10,lg:11,xl:12};export const PopoverClose=o.Close;export function Popover({size:f="md",color:g="primary",density:v="default",trigger:w,title:y,description:N,children:_,side:k="bottom",align:j="center",sideOffset:O=6,alignOffset:C=0,arrow:P=!1,open:z,defaultOpen:$,onOpenChange:B,modal:L=!1,dismissible:M=!0,showClose:T=!1,closeLabel:W="Close",width:A,className:D,style:E}){const R=t[v][f],q=n[v][f],F=b[f],G=i(y)||i(N);return a(o.Root,{open:z,defaultOpen:$,modal:L,onOpenChange:(e,a)=>{M||e||"escape-key"!==a.reason&&"outside-press"!==a.reason&&"focus-out"!==a.reason?B?.(e):a.cancel()},children:[w?e(o.Trigger,{render:w}):null,e(o.Portal,{children:e(o.Positioner,{className:"neba-portal z-50 [outline:none]",side:k,align:j,sideOffset:O,alignOffset:C,children:a(o.Popup,{className:[x,r[f],d[f],m[f],R,q,void 0===A?h[f]:"",D??""].filter(Boolean).join(" "),style:{...u(g,3),...void 0===A?null:{maxWidth:"number"==typeof A?`${A}px`:A},...E},children:[P?e(o.Arrow,{className:["data-[side=top]:bottom-[-1px]","data-[side=bottom]:top-[-1px] data-[side=bottom]:rotate-180","data-[side=left]:right-[-1px] data-[side=left]:-rotate-90","data-[side=right]:left-[-1px] data-[side=right]:rotate-90"].join(" "),children:a("svg",{width:F,height:F/2,viewBox:"0 0 10 5","aria-hidden":"true",className:"block",children:[e("path",{d:"M0 0h10L5 5z",fill:"var(--n-panel-press)"}),e("path",{d:"M0 0 5 5 10 0",fill:"none",stroke:"var(--n-line)",strokeWidth:"1",vectorEffect:"non-scaling-stroke"})]})}):null,G||T?a("div",{className:"flex shrink-0 items-start gap-3",children:[a("div",{className:`flex min-w-0 flex-1 flex-col ${c[f]}`,children:[i(y)?e(o.Title,{className:`m-0 font-semibold ${p[f]}`,children:y}):null,i(N)?e(o.Description,{className:`m-0 text-(--neba-muted-fg) ${l[f]}`,children:N}):null]}),T?e(o.Close,{"aria-label":W,className:["flex size-[1.6em] shrink-0 cursor-pointer items-center justify-center","rounded-full text-(--neba-muted-fg)","[&_svg]:size-[1.1em] [&_svg]:shrink-0","[transition:background-color_var(--neba-duration)_var(--neba-ease),color_var(--neba-duration)_var(--neba-ease)]","hover:bg-(--n-soft) hover:text-(--neba-fg)","focus-visible:[outline:2px_solid_var(--n-ring)] focus-visible:outline-offset-2"].join(" "),children:e(s,{})}):null]}):null,i(_)?e("div",{className:"min-w-0",children:_}):null]})})})]})}
@@ -0,0 +1,2 @@
1
+ export { Popover, PopoverClose } from './Popover';
2
+ export type { PopoverCloseProps, PopoverProps } from './Popover';
@@ -0,0 +1 @@
1
+ export{Popover,PopoverClose}from"./Popover";
@@ -0,0 +1,76 @@
1
+ import * as React from 'react';
2
+ import { useRender } from '@base-ui/react/use-render';
3
+ import type { NebaColor, NebaSize } from '../../types';
4
+ /**
5
+ * What the placeholder is standing in for.
6
+ *
7
+ * - `line` — a run of text. Sized off the type scale, so a `md` line is exactly
8
+ * as tall as the `md` type it will be replaced by.
9
+ * - `rect` — a block: an image, a chart, a card, a map.
10
+ * - `circle` — an avatar, or anything else round.
11
+ */
12
+ export type NebaSkeletonShape = 'line' | 'rect' | 'circle';
13
+ export interface SkeletonProps extends Omit<React.ComponentPropsWithoutRef<'div'>, 'color'> {
14
+ /** @default 'line' */
15
+ shape?: NebaSkeletonShape;
16
+ /**
17
+ * How many lines to draw, for `shape="line"`. The last one is drawn short, the
18
+ * way the last line of a paragraph is, so a block of them reads as prose
19
+ * rather than as a barcode. Ignored by the other two shapes.
20
+ * @default 1
21
+ */
22
+ lines?: number;
23
+ /**
24
+ * The scale of the thing being stood in for: the type scale for a `line`, the
25
+ * diameter for a `circle`, the default block height for a `rect`.
26
+ * @default 'md'
27
+ */
28
+ size?: NebaSize;
29
+ /**
30
+ * Colour family. `secondary` by default, and it is worth leaving there: a
31
+ * placeholder that carries a semantic colour is saying something about content
32
+ * that has not arrived yet.
33
+ * @default 'secondary'
34
+ */
35
+ color?: NebaColor;
36
+ /** An explicit width. Numbers are pixels. */
37
+ width?: number | string;
38
+ /** An explicit height. Numbers are pixels. */
39
+ height?: number | string;
40
+ /**
41
+ * The travelling highlight. Turn it off for a page holding dozens of them, or
42
+ * where the wait is expected to be long enough that motion becomes noise.
43
+ *
44
+ * A reduced-motion preference already replaces the sweep with a colour pulse
45
+ * without being asked, so this is not the accessibility switch.
46
+ * @default true
47
+ */
48
+ animated?: boolean;
49
+ /**
50
+ * What a screen reader is told, if anything.
51
+ *
52
+ * Unset — the default — the placeholder is `aria-hidden`, because a dozen
53
+ * boxes each announcing themselves is worse than silence. Give the *one*
54
+ * skeleton that stands for the whole region a label and it becomes a live
55
+ * `status` instead.
56
+ */
57
+ label?: string;
58
+ /**
59
+ * Renders something other than a `<div>`. Base UI's own escape hatch.
60
+ */
61
+ render?: useRender.RenderProp;
62
+ }
63
+ /**
64
+ * The shape of something that has not loaded yet.
65
+ *
66
+ * It reserves the space the real thing will take, which is the whole job: a card
67
+ * that grows by 200px when its image arrives has moved everything below it while
68
+ * somebody was reading. A spinner cannot do that, which is why this is not a
69
+ * [ProgressCircular](../feedback/progress-circular) in a box.
70
+ *
71
+ * The three shapes are the three things a layout is made of — a run of text, a
72
+ * block and a circle — and each is sized off the ladder the real component uses,
73
+ * so a `md` line is as tall as `md` type and a `md` circle is exactly an
74
+ * [Avatar](../display/avatar) at `md`.
75
+ */
76
+ export declare const Skeleton: React.ForwardRefExoticComponent<SkeletonProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";import*as r from"react";import{useRender as l}from"@base-ui/react/use-render";import{controlHeightClasses as n,controlSquareClasses as d,surfaceSlots as o}from"../../internal/styles";const a={xs:"h-[0.6875rem]",sm:"h-[0.75rem]",md:"h-[0.8125rem]",lg:"h-[0.9375rem]",xl:"h-[1.0625rem]"},s={xs:"gap-[0.3125rem]",sm:"gap-[0.375rem]",md:"gap-[0.5625rem]",lg:"gap-[0.5625rem]",xl:"gap-[0.6875rem]"},m={xs:"rounded-[0.3125rem]",sm:"rounded-[0.3125rem]",md:"rounded-[0.375rem]",lg:"rounded-[0.4375rem]",xl:"rounded-[0.5rem]"},i={xs:"h-12",sm:"h-16",md:"h-20",lg:"h-28",xl:"h-36"},t={xs:"rounded-(--neba-radius-xs)",sm:"rounded-(--neba-radius-sm)",md:"rounded-(--neba-radius-md)",lg:"rounded-(--neba-radius-lg)",xl:"rounded-(--neba-radius-xl)"},u="relative overflow-hidden bg-(--n-soft-hover)";function f(e){if(void 0!==e)return"number"==typeof e?`${e}px`:e}export const Skeleton=r.forwardRef(function({shape:r="line",lines:h=1,size:c="md",color:x="secondary",width:g,height:p,animated:b=!0,label:w,render:y,className:$,style:v,...j},k){const N=b?"neba-skeleton":"",B="circle"===r?`rounded-full ${n[c]} ${d[c]} shrink-0`:"rect"===r?`w-full ${t[c]} ${void 0===p?i[c]:""}`:`w-full ${m[c]} ${a[c]}`,z=w?{role:"status","aria-busy":!0,"aria-label":w}:{"aria-hidden":!0},A="line"===r&&h>1;return l({render:y,ref:k,props:{className:(A?["flex w-full flex-col",s[c],$??""]:[u,N,B,$??""]).filter(Boolean).join(" "),style:{...o(x,0),width:f(g),height:f(p),...v},...z,...A?{children:Array.from({length:h},(r,l)=>e("div",{className:[u,N,m[c],a[c],l===h-1?"w-3/5":"w-full"].filter(Boolean).join(" ")},l))}:null,...j}})});
@@ -0,0 +1,2 @@
1
+ export { Skeleton } from './Skeleton';
2
+ export type { NebaSkeletonShape, SkeletonProps } from './Skeleton';
@@ -0,0 +1 @@
1
+ export{Skeleton}from"./Skeleton";
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { useRender } from '@base-ui/react/use-render';
3
- import type { NebaColor } from '../../types';
3
+ import type { NebaColor, NebaTransition } from '../../types';
4
4
  /**
5
5
  * What a piece of text *is*, which decides both its type scale and the element
6
6
  * it renders as.
@@ -19,6 +19,12 @@ export interface TypographyProps extends Omit<React.ComponentPropsWithoutRef<'p'
19
19
  * @default 'body'
20
20
  */
21
21
  level?: TypographyLevel;
22
+ /**
23
+ * An entrance animation, run once on mount: `transition="fade"`, or an object
24
+ * for the details. For a trigger, a replay or anything under your own
25
+ * control, wrap it in an `Animate*` component instead.
26
+ */
27
+ transition?: NebaTransition;
22
28
  /**
23
29
  * Semantic colour role. Unlike every other component this has **no default**:
24
30
  * text inherits the page's own colour unless a role is asked for, because the
@@ -1 +1 @@
1
- import*as e from"react";import{useRender as t}from"@base-ui/react/use-render";const r={h1:"text-[1.875rem]/[2.25rem] tracking-[-0.02em]",h2:"text-[1.5rem]/[1.875rem] tracking-[-0.015em]",h3:"text-[1.25rem]/[1.625rem] tracking-[-0.01em]",h4:"text-[1.0625rem]/[1.5rem]",h5:"text-[0.9375rem]/[1.375rem]",h6:"text-[0.8125rem]/[1.25rem]",lead:"text-[1.0625rem]/[1.75rem]",body:"text-[0.8125rem]/[1.375rem]",caption:"text-[0.75rem]/[1.125rem]",overline:"text-[0.6875rem]/[1rem] tracking-[0.08em] uppercase"},m={h1:"semibold",h2:"semibold",h3:"semibold",h4:"semibold",h5:"semibold",h6:"semibold",lead:"regular",body:"regular",caption:"regular",overline:"medium"},n={h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",lead:"p",body:"p",caption:"span",overline:"span"},a=new Set(["caption","overline"]),l={h1:"mb-4",h2:"mb-3.5",h3:"mb-3",h4:"mb-2.5",h5:"mb-2",h6:"mb-2",lead:"mb-4",body:"mb-3",caption:"mb-2",overline:"mb-2"},o={regular:"font-normal",medium:"font-medium",semibold:"font-semibold",bold:"font-bold"},i={start:"text-start",center:"text-center",end:"text-end",justify:"text-justify"},c={1:"truncate",2:"line-clamp-2",3:"line-clamp-3",4:"line-clamp-4",5:"line-clamp-5",6:"line-clamp-6"};export const Typography=e.forwardRef(function({level:h="body",color:d,weight:s,align:b,lines:p,gutter:x=!1,render:u,className:f,style:g,children:y,...v},k){const j=[r[h],o[s??m[h]],b?i[b]:"",p?c[p]??"line-clamp-6":"",x?l[h]:"",d?"text-(--n-accent)":a.has(h)?"text-(--neba-muted-fg)":"text-(--neba-fg)",f??""].filter(Boolean).join(" ");return t({render:u??e.createElement(n[h]),ref:k,props:{className:j,style:d?{"--n-accent":`var(--neba-${d}-accent)`,...g}:g,children:y,...v}})});
1
+ import*as e from"react";import{useRender as t}from"@base-ui/react/use-render";import{transitionProps as r}from"../../internal/animate";const m={h1:"text-[1.875rem]/[2.25rem] tracking-[-0.02em]",h2:"text-[1.5rem]/[1.875rem] tracking-[-0.015em]",h3:"text-[1.25rem]/[1.625rem] tracking-[-0.01em]",h4:"text-[1.0625rem]/[1.5rem]",h5:"text-[0.9375rem]/[1.375rem]",h6:"text-[0.8125rem]/[1.25rem]",lead:"text-[1.0625rem]/[1.75rem]",body:"text-[0.8125rem]/[1.375rem]",caption:"text-[0.75rem]/[1.125rem]",overline:"text-[0.6875rem]/[1rem] tracking-[0.08em] uppercase"},n={h1:"semibold",h2:"semibold",h3:"semibold",h4:"semibold",h5:"semibold",h6:"semibold",lead:"regular",body:"regular",caption:"regular",overline:"medium"},a={h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",lead:"p",body:"p",caption:"span",overline:"span"},l=new Set(["caption","overline"]),o={h1:"mb-4",h2:"mb-3.5",h3:"mb-3",h4:"mb-2.5",h5:"mb-2",h6:"mb-2",lead:"mb-4",body:"mb-3",caption:"mb-2",overline:"mb-2"},i={regular:"font-normal",medium:"font-medium",semibold:"font-semibold",bold:"font-bold"},c={start:"text-start",center:"text-center",end:"text-end",justify:"text-justify"},h={1:"truncate",2:"line-clamp-2",3:"line-clamp-3",4:"line-clamp-4",5:"line-clamp-5",6:"line-clamp-6"};export const Typography=e.forwardRef(function({level:s="body",color:d,weight:b,align:p,lines:x,gutter:u=!1,transition:f,render:g,className:y,style:v,children:k,...j},w){const N=r(f),B=[m[s],i[b??n[s]],p?c[p]:"",x?h[x]??"line-clamp-6":"",u?o[s]:"",d?"text-(--n-accent)":l.has(s)?"text-(--neba-muted-fg)":"text-(--neba-fg)",N.className,y??""].filter(Boolean).join(" ");return t({render:g??e.createElement(a[s]),ref:w,props:{className:B,style:d?{"--n-accent":`var(--neba-${d}-accent)`,...N.style,...v}:{...N.style,...v},children:k,...j}})});
package/dist/index.d.ts CHANGED
@@ -1,6 +1,18 @@
1
1
  export * from './types';
2
2
  export * from './components/accordion';
3
3
  export * from './components/alert';
4
+ export * from './components/animate-appear';
5
+ export * from './components/animate-blink';
6
+ export * from './components/animate-fade';
7
+ export * from './components/animate-grow';
8
+ export * from './components/animate-headline';
9
+ export * from './components/animate-lighting';
10
+ export * from './components/animate-marquee';
11
+ export * from './components/animate-rotate';
12
+ export * from './components/animate-slide';
13
+ export * from './components/animate-typing';
14
+ export * from './components/animate-zoom';
15
+ export * from './components/aspect-ratio';
4
16
  export * from './components/avatar';
5
17
  export * from './components/badge';
6
18
  export * from './components/blockquote';
@@ -13,13 +25,17 @@ export * from './components/carousel';
13
25
  export * from './components/chat-bubble';
14
26
  export * from './components/checkbox';
15
27
  export * from './components/chip';
28
+ export * from './components/color-picker';
16
29
  export * from './components/combobox';
17
30
  export * from './components/container';
31
+ export * from './components/data-table';
18
32
  export * from './components/date-picker';
19
33
  export * from './components/date-range-picker';
20
34
  export * from './components/date-time-picker';
21
35
  export * from './components/dialog';
22
36
  export * from './components/divider';
37
+ export * from './components/drawer';
38
+ export * from './components/empty';
23
39
  export * from './components/file-picker';
24
40
  export * from './components/grid';
25
41
  export * from './components/grid-container';
@@ -28,12 +44,14 @@ export * from './components/icon';
28
44
  export * from './components/icon-button';
29
45
  export * from './components/list';
30
46
  export * from './components/menu';
47
+ export * from './components/mockup';
31
48
  export * from './components/number-field';
32
49
  export * from './components/otp-field';
33
50
  export * from './components/overlay';
34
51
  export * from './components/pagination';
35
52
  export * from './components/panes';
36
53
  export * from './components/pill';
54
+ export * from './components/popover';
37
55
  export * from './components/progress-box';
38
56
  export * from './components/progress-circular';
39
57
  export * from './components/progress-linear';
@@ -41,6 +59,7 @@ export * from './components/radio-group';
41
59
  export * from './components/segmented-button';
42
60
  export * from './components/select';
43
61
  export * from './components/shortcut';
62
+ export * from './components/skeleton';
44
63
  export * from './components/slider';
45
64
  export * from './components/spoiler';
46
65
  export * from './components/statistic';
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export*from"./types";export*from"./components/accordion";export*from"./components/alert";export*from"./components/avatar";export*from"./components/badge";export*from"./components/blockquote";export*from"./components/box";export*from"./components/breadcrumb";export*from"./components/button";export*from"./components/button-group";export*from"./components/card";export*from"./components/carousel";export*from"./components/chat-bubble";export*from"./components/checkbox";export*from"./components/chip";export*from"./components/combobox";export*from"./components/container";export*from"./components/date-picker";export*from"./components/date-range-picker";export*from"./components/date-time-picker";export*from"./components/dialog";export*from"./components/divider";export*from"./components/file-picker";export*from"./components/grid";export*from"./components/grid-container";export*from"./components/highlight";export*from"./components/icon";export*from"./components/icon-button";export*from"./components/list";export*from"./components/menu";export*from"./components/number-field";export*from"./components/otp-field";export*from"./components/overlay";export*from"./components/pagination";export*from"./components/panes";export*from"./components/pill";export*from"./components/progress-box";export*from"./components/progress-circular";export*from"./components/progress-linear";export*from"./components/radio-group";export*from"./components/segmented-button";export*from"./components/select";export*from"./components/shortcut";export*from"./components/slider";export*from"./components/spoiler";export*from"./components/statistic";export*from"./components/switch";export*from"./components/table";export*from"./components/tabs";export*from"./components/text-field";export*from"./components/text-link";export*from"./components/time-picker";export*from"./components/timeline";export*from"./components/toast";export*from"./components/toolbar";export*from"./components/tooltip";export*from"./components/tree-view";export*from"./components/typography";
1
+ export*from"./types";export*from"./components/accordion";export*from"./components/alert";export*from"./components/animate-appear";export*from"./components/animate-blink";export*from"./components/animate-fade";export*from"./components/animate-grow";export*from"./components/animate-headline";export*from"./components/animate-lighting";export*from"./components/animate-marquee";export*from"./components/animate-rotate";export*from"./components/animate-slide";export*from"./components/animate-typing";export*from"./components/animate-zoom";export*from"./components/aspect-ratio";export*from"./components/avatar";export*from"./components/badge";export*from"./components/blockquote";export*from"./components/box";export*from"./components/breadcrumb";export*from"./components/button";export*from"./components/button-group";export*from"./components/card";export*from"./components/carousel";export*from"./components/chat-bubble";export*from"./components/checkbox";export*from"./components/chip";export*from"./components/color-picker";export*from"./components/combobox";export*from"./components/container";export*from"./components/data-table";export*from"./components/date-picker";export*from"./components/date-range-picker";export*from"./components/date-time-picker";export*from"./components/dialog";export*from"./components/divider";export*from"./components/drawer";export*from"./components/empty";export*from"./components/file-picker";export*from"./components/grid";export*from"./components/grid-container";export*from"./components/highlight";export*from"./components/icon";export*from"./components/icon-button";export*from"./components/list";export*from"./components/menu";export*from"./components/mockup";export*from"./components/number-field";export*from"./components/otp-field";export*from"./components/overlay";export*from"./components/pagination";export*from"./components/panes";export*from"./components/pill";export*from"./components/popover";export*from"./components/progress-box";export*from"./components/progress-circular";export*from"./components/progress-linear";export*from"./components/radio-group";export*from"./components/segmented-button";export*from"./components/select";export*from"./components/shortcut";export*from"./components/skeleton";export*from"./components/slider";export*from"./components/spoiler";export*from"./components/statistic";export*from"./components/switch";export*from"./components/table";export*from"./components/tabs";export*from"./components/text-field";export*from"./components/text-link";export*from"./components/time-picker";export*from"./components/timeline";export*from"./components/toast";export*from"./components/toolbar";export*from"./components/tooltip";export*from"./components/tree-view";export*from"./components/typography";