@webority/ui-react 0.53.0 → 0.54.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/dist/components/AppActionIcon.js +1 -1
- package/dist/components/AppAvatar.js +1 -1
- package/dist/components/AppButton.js +1 -1
- package/dist/components/AppButtonGroup.js +1 -0
- package/dist/components/AppCarousel.js +1 -0
- package/dist/components/AppChipGroup.js +1 -0
- package/dist/components/AppCodeBlock.js +1 -0
- package/dist/components/AppCommandPalette.js +1 -1
- package/dist/components/AppCommentThread.js +1 -0
- package/dist/components/AppDataTable.js +1 -1
- package/dist/components/AppDateRangePicker.js +1 -1
- package/dist/components/AppDrawer.js +1 -0
- package/dist/components/AppDropdown.js +1 -1
- package/dist/components/AppEmptyState.js +1 -1
- package/dist/components/AppFilterBar.js +1 -1
- package/dist/components/AppHoverCard.js +1 -0
- package/dist/components/AppInlineEdit.js +1 -0
- package/dist/components/AppInputGroup.js +1 -0
- package/dist/components/AppKbd.js +1 -0
- package/dist/components/AppLightbox.js +1 -0
- package/dist/components/AppMentionInput.js +1 -0
- package/dist/components/AppMenubar.js +1 -0
- package/dist/components/AppNavigationMenu.js +1 -0
- package/dist/components/AppNotificationCenter.js +1 -0
- package/dist/components/AppOnboardingChecklist.js +1 -0
- package/dist/components/AppRating.js +1 -0
- package/dist/components/AppRecordPager.js +1 -0
- package/dist/components/AppRelativeTime.js +1 -0
- package/dist/components/AppResizable.js +1 -0
- package/dist/components/AppResizableHandle.js +1 -0
- package/dist/components/AppResizablePanel.js +1 -0
- package/dist/components/AppRollingNumber.js +1 -0
- package/dist/components/AppSectionCallToAction.js +1 -0
- package/dist/components/AppSectionFaq.js +1 -0
- package/dist/components/AppSectionFeatures.js +1 -0
- package/dist/components/AppSectionHero.js +1 -0
- package/dist/components/AppSectionLogos.js +1 -0
- package/dist/components/AppSectionPricing.js +1 -0
- package/dist/components/AppSectionTestimonials.js +1 -0
- package/dist/components/AppShortcutLegend.js +1 -0
- package/dist/components/AppShowMore.js +1 -0
- package/dist/components/AppSplitButton.js +1 -0
- package/dist/components/AppSplitView.js +1 -0
- package/dist/components/AppTableEmptyState.js +1 -1
- package/dist/components/AppTableToolbar.js +1 -1
- package/dist/components/AppTabs.js +1 -1
- package/dist/components/AppTooltip.js +1 -1
- package/dist/components/AppTruncate.js +1 -0
- package/dist/components/AppWhatsNew.js +1 -0
- package/dist/components/withTooltip.js +1 -1
- package/dist/lib/emptyIllustration.js +1 -0
- package/dist/lib/sectionShell.js +1 -0
- package/dist/lib/shortcutChip.js +1 -0
- package/dist/lib/useListShortcuts.js +1 -0
- package/dist/types/components/AppActionIcon.d.ts +4 -1
- package/dist/types/components/AppButton.d.ts +2 -1
- package/dist/types/components/AppButtonGroup.d.ts +23 -0
- package/dist/types/components/AppCarousel.d.ts +52 -0
- package/dist/types/components/AppChipGroup.d.ts +22 -0
- package/dist/types/components/AppCodeBlock.d.ts +28 -0
- package/dist/types/components/AppCommandPalette.d.ts +44 -2
- package/dist/types/components/AppCommentThread.d.ts +115 -0
- package/dist/types/components/AppDataTable.d.ts +44 -1
- package/dist/types/components/AppDateRangePicker.d.ts +5 -0
- package/dist/types/components/AppDrawer.d.ts +46 -0
- package/dist/types/components/AppDropdown.d.ts +4 -1
- package/dist/types/components/AppEmptyState.d.ts +4 -1
- package/dist/types/components/AppFilterBar.d.ts +9 -1
- package/dist/types/components/AppHoverCard.d.ts +35 -0
- package/dist/types/components/AppInlineEdit.d.ts +57 -0
- package/dist/types/components/AppInputGroup.d.ts +29 -0
- package/dist/types/components/AppKbd.d.ts +15 -0
- package/dist/types/components/AppLightbox.d.ts +40 -0
- package/dist/types/components/AppMentionInput.d.ts +41 -0
- package/dist/types/components/AppMenubar.d.ts +45 -0
- package/dist/types/components/AppNavigationMenu.d.ts +41 -0
- package/dist/types/components/AppNotificationCenter.d.ts +81 -0
- package/dist/types/components/AppOnboardingChecklist.d.ts +48 -0
- package/dist/types/components/AppRating.d.ts +48 -0
- package/dist/types/components/AppRecordPager.d.ts +38 -0
- package/dist/types/components/AppRelativeTime.d.ts +18 -0
- package/dist/types/components/AppResizable.d.ts +30 -0
- package/dist/types/components/AppResizableHandle.d.ts +13 -0
- package/dist/types/components/AppResizablePanel.d.ts +20 -0
- package/dist/types/components/AppRollingNumber.d.ts +27 -0
- package/dist/types/components/AppSectionCallToAction.d.ts +24 -0
- package/dist/types/components/AppSectionFaq.d.ts +28 -0
- package/dist/types/components/AppSectionFeatures.d.ts +37 -0
- package/dist/types/components/AppSectionHero.d.ts +32 -0
- package/dist/types/components/AppSectionLogos.d.ts +36 -0
- package/dist/types/components/AppSectionPricing.d.ts +28 -0
- package/dist/types/components/AppSectionTestimonials.d.ts +34 -0
- package/dist/types/components/AppShortcutLegend.d.ts +34 -0
- package/dist/types/components/AppShowMore.d.ts +29 -0
- package/dist/types/components/AppSplitButton.d.ts +53 -0
- package/dist/types/components/AppSplitView.d.ts +85 -0
- package/dist/types/components/AppTableEmptyState.d.ts +4 -1
- package/dist/types/components/AppTableToolbar.d.ts +13 -1
- package/dist/types/components/AppTabs.d.ts +12 -6
- package/dist/types/components/AppTooltip.d.ts +4 -1
- package/dist/types/components/AppTruncate.d.ts +21 -0
- package/dist/types/components/AppWhatsNew.d.ts +44 -0
- package/dist/types/components/withTooltip.d.ts +1 -1
- package/dist/types/index.d.ts +37 -0
- package/dist/types/lib/emptyIllustration.d.ts +22 -0
- package/dist/types/lib/sectionShell.d.ts +43 -0
- package/dist/types/lib/shortcutChip.d.ts +11 -0
- package/dist/types/lib/useListShortcuts.d.ts +24 -0
- package/dist/ui-react.js +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a product does: a grid of short points with an icon each, or rows that pair each point
|
|
3
|
+
* with an image (`layout="rows"`, the image side alternating). Renders the same markup as the
|
|
4
|
+
* Razor `<app-section-features>`.
|
|
5
|
+
*
|
|
6
|
+
* Each point's title is a heading one level under the section's (h3 under the default h2). An
|
|
7
|
+
* item's `media` image must carry `width` and `height` so its box is reserved before it loads.
|
|
8
|
+
*
|
|
9
|
+
* @param {object} props
|
|
10
|
+
* @param {import('react').ReactNode} props.title The section's heading.
|
|
11
|
+
* @param {{ key?: string, title: string, description?: import('react').ReactNode, icon?: string, media?: import('react').ReactNode }[]} [props.items]
|
|
12
|
+
* The points: a title, a description, a library icon name and an image.
|
|
13
|
+
* @param {"grid"|"rows"} [props.layout="grid"] Short points in columns, or one row per point with its image beside it.
|
|
14
|
+
* @param {"h1"|"h2"|"h3"|"h4"|"h5"|"h6"} [props.as="h2"] The heading element; each point's title is one level under it.
|
|
15
|
+
* @param {import('react').ReactNode} [props.eyebrow] A short label above the heading.
|
|
16
|
+
* @param {import('react').ReactNode} [props.subtitle] One or two sentences under the heading.
|
|
17
|
+
* @param {"start"|"center"} [props.align="center"] Where the heading block sits.
|
|
18
|
+
* @param {"default"|"muted"} [props.variant="default"] The section's background.
|
|
19
|
+
* @param {string} [props.className]
|
|
20
|
+
*/
|
|
21
|
+
export default function AppSectionFeatures({ title, items, layout, as, eyebrow, subtitle, align, variant, className, ...rest }: {
|
|
22
|
+
title: import('react').ReactNode;
|
|
23
|
+
items?: {
|
|
24
|
+
key?: string;
|
|
25
|
+
title: string;
|
|
26
|
+
description?: import('react').ReactNode;
|
|
27
|
+
icon?: string;
|
|
28
|
+
media?: import('react').ReactNode;
|
|
29
|
+
}[];
|
|
30
|
+
layout?: "grid" | "rows";
|
|
31
|
+
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
32
|
+
eyebrow?: import('react').ReactNode;
|
|
33
|
+
subtitle?: import('react').ReactNode;
|
|
34
|
+
align?: "start" | "center";
|
|
35
|
+
variant?: "default" | "muted";
|
|
36
|
+
className?: string;
|
|
37
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The opening section of a public page: an eyebrow, the page's heading (an h1 by default), a
|
|
3
|
+
* subtitle, the calls to action and an optional image beside them (below them when centred).
|
|
4
|
+
* Renders the same markup as the Razor `<app-section-hero>`.
|
|
5
|
+
*
|
|
6
|
+
* The `media` image must carry `width` and `height`: the kit sizes it to its column with
|
|
7
|
+
* `height: auto`, so those two attributes are what reserve its box before it loads. On the page's
|
|
8
|
+
* main image add `fetchPriority="high"` and leave `loading` unset. Pass an `id` to label the
|
|
9
|
+
* section by its heading (`{id}-title`).
|
|
10
|
+
*
|
|
11
|
+
* @param {object} props
|
|
12
|
+
* @param {import('react').ReactNode} props.title The page's heading.
|
|
13
|
+
* @param {"h1"|"h2"|"h3"|"h4"|"h5"|"h6"} [props.as="h1"] The heading element. Keep one h1 per page.
|
|
14
|
+
* @param {import('react').ReactNode} [props.eyebrow] A short label above the heading.
|
|
15
|
+
* @param {import('react').ReactNode} [props.subtitle] One or two sentences under the heading.
|
|
16
|
+
* @param {"start"|"center"} [props.align="start"] Centred copy with the media under it.
|
|
17
|
+
* @param {"default"|"muted"} [props.variant="default"] The section's background.
|
|
18
|
+
* @param {import('react').ReactNode} [props.actions] The calls to action, usually one or two `AppButton`s.
|
|
19
|
+
* @param {import('react').ReactNode} [props.media] An `<img>` with `width` and `height`, beside the copy.
|
|
20
|
+
* @param {string} [props.className]
|
|
21
|
+
*/
|
|
22
|
+
export default function AppSectionHero({ title, as, eyebrow, subtitle, align, variant, actions, media, className, ...rest }: {
|
|
23
|
+
title: import('react').ReactNode;
|
|
24
|
+
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
25
|
+
eyebrow?: import('react').ReactNode;
|
|
26
|
+
subtitle?: import('react').ReactNode;
|
|
27
|
+
align?: "start" | "center";
|
|
28
|
+
variant?: "default" | "muted";
|
|
29
|
+
actions?: import('react').ReactNode;
|
|
30
|
+
media?: import('react').ReactNode;
|
|
31
|
+
className?: string;
|
|
32
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A row of customer or partner logos under a short heading ("Trusted by 200+ teams"). The logos
|
|
3
|
+
* sit in a wrapping row at one height, muted until hovered. Renders the same markup as the Razor
|
|
4
|
+
* `<app-section-logos>`.
|
|
5
|
+
*
|
|
6
|
+
* Every logo needs `src`, `alt` (the company's name), `width` and `height`; one without them
|
|
7
|
+
* throws, because a logo with no size moves the page when it loads.
|
|
8
|
+
*
|
|
9
|
+
* @param {object} props
|
|
10
|
+
* @param {import('react').ReactNode} props.title The section's heading, set small above the logos.
|
|
11
|
+
* @param {{ key?: string, src: string, alt: string, width: number, height: number, href?: string }[]} [props.items]
|
|
12
|
+
* The logos, each with its intrinsic size in px and an optional link.
|
|
13
|
+
* @param {"h1"|"h2"|"h3"|"h4"|"h5"|"h6"} [props.as="h2"] The heading element.
|
|
14
|
+
* @param {import('react').ReactNode} [props.eyebrow] A short label above the heading.
|
|
15
|
+
* @param {import('react').ReactNode} [props.subtitle] A sentence under the heading.
|
|
16
|
+
* @param {"start"|"center"} [props.align="center"] Where the heading and the logos sit.
|
|
17
|
+
* @param {"default"|"muted"} [props.variant="default"] The section's background.
|
|
18
|
+
* @param {string} [props.className]
|
|
19
|
+
*/
|
|
20
|
+
export default function AppSectionLogos({ title, items, as, eyebrow, subtitle, align, variant, className, ...rest }: {
|
|
21
|
+
title: import('react').ReactNode;
|
|
22
|
+
items?: {
|
|
23
|
+
key?: string;
|
|
24
|
+
src: string;
|
|
25
|
+
alt: string;
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
href?: string;
|
|
29
|
+
}[];
|
|
30
|
+
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
31
|
+
eyebrow?: import('react').ReactNode;
|
|
32
|
+
subtitle?: import('react').ReactNode;
|
|
33
|
+
align?: "start" | "center";
|
|
34
|
+
variant?: "default" | "muted";
|
|
35
|
+
className?: string;
|
|
36
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pricing section of a public page: a heading block over a row of `AppPricingCard` tiers
|
|
3
|
+
* (`children`; one column on a phone, two, then three). Renders the same markup as the Razor
|
|
4
|
+
* `<app-section-pricing>`.
|
|
5
|
+
*
|
|
6
|
+
* The section writes no structured data: a page with prices adds its `Product` and `Offer`
|
|
7
|
+
* through its SEO layer, from the same figures it renders here.
|
|
8
|
+
*
|
|
9
|
+
* @param {object} props
|
|
10
|
+
* @param {import('react').ReactNode} props.title The section's heading.
|
|
11
|
+
* @param {"h1"|"h2"|"h3"|"h4"|"h5"|"h6"} [props.as="h2"] The heading element.
|
|
12
|
+
* @param {import('react').ReactNode} [props.eyebrow] A short label above the heading.
|
|
13
|
+
* @param {import('react').ReactNode} [props.subtitle] One or two sentences under the heading (a tax note, a trial offer).
|
|
14
|
+
* @param {"start"|"center"} [props.align="center"] Where the heading block sits.
|
|
15
|
+
* @param {"default"|"muted"} [props.variant="default"] The section's background.
|
|
16
|
+
* @param {import('react').ReactNode} [props.children] The `AppPricingCard` tiers.
|
|
17
|
+
* @param {string} [props.className]
|
|
18
|
+
*/
|
|
19
|
+
export default function AppSectionPricing({ title, as, eyebrow, subtitle, align, variant, children, className, ...rest }: {
|
|
20
|
+
title: import('react').ReactNode;
|
|
21
|
+
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
22
|
+
eyebrow?: import('react').ReactNode;
|
|
23
|
+
subtitle?: import('react').ReactNode;
|
|
24
|
+
align?: "start" | "center";
|
|
25
|
+
variant?: "default" | "muted";
|
|
26
|
+
children?: import('react').ReactNode;
|
|
27
|
+
className?: string;
|
|
28
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Customers' words: each a quote with the person's name, role and photo, in columns that wrap on
|
|
3
|
+
* a phone. Renders the same markup as the Razor `<app-section-testimonials>`.
|
|
4
|
+
*
|
|
5
|
+
* The photo is drawn as a 48px circle with `width` and `height` set, so any square image fits
|
|
6
|
+
* without moving the page; it is decorative (empty `alt`) because the name sits beside it.
|
|
7
|
+
*
|
|
8
|
+
* @param {object} props
|
|
9
|
+
* @param {import('react').ReactNode} props.title The section's heading.
|
|
10
|
+
* @param {{ key?: string, quote: import('react').ReactNode, name?: string, role?: string, avatar?: string }[]} [props.items]
|
|
11
|
+
* The quotes, each with the person's name, role and a square photo URL.
|
|
12
|
+
* @param {"h1"|"h2"|"h3"|"h4"|"h5"|"h6"} [props.as="h2"] The heading element.
|
|
13
|
+
* @param {import('react').ReactNode} [props.eyebrow] A short label above the heading.
|
|
14
|
+
* @param {import('react').ReactNode} [props.subtitle] One or two sentences under the heading.
|
|
15
|
+
* @param {"start"|"center"} [props.align="center"] Where the heading block sits.
|
|
16
|
+
* @param {"default"|"muted"} [props.variant="default"] The section's background.
|
|
17
|
+
* @param {string} [props.className]
|
|
18
|
+
*/
|
|
19
|
+
export default function AppSectionTestimonials({ title, items, as, eyebrow, subtitle, align, variant, className, ...rest }: {
|
|
20
|
+
title: import('react').ReactNode;
|
|
21
|
+
items?: {
|
|
22
|
+
key?: string;
|
|
23
|
+
quote: import('react').ReactNode;
|
|
24
|
+
name?: string;
|
|
25
|
+
role?: string;
|
|
26
|
+
avatar?: string;
|
|
27
|
+
}[];
|
|
28
|
+
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
|
|
29
|
+
eyebrow?: import('react').ReactNode;
|
|
30
|
+
subtitle?: import('react').ReactNode;
|
|
31
|
+
align?: "start" | "center";
|
|
32
|
+
variant?: "default" | "muted";
|
|
33
|
+
className?: string;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import "@webority/ui-elements/elements/shortcuts";
|
|
2
|
+
/**
|
|
3
|
+
* The keyboard shortcut list of a screen: a "? Keyboard shortcuts" button that opens a sheet of
|
|
4
|
+
* every shortcut, also opened with `?` and closed with Esc or a click outside. Put it under a
|
|
5
|
+
* list people work through, and show each key on its action too (`shortcut` on AppButton,
|
|
6
|
+
* AppTooltip and AppDropdown items).
|
|
7
|
+
*
|
|
8
|
+
* Each entry with `onPress` is a working shortcut: pressing its key calls it. An entry without
|
|
9
|
+
* one only lists a key the page binds itself (with `useListShortcuts`). `items` and `search` add
|
|
10
|
+
* the list keys: J and K move focus through the elements matching `items`, X ticks the checkbox
|
|
11
|
+
* in the focused item's row, `/` focuses `search`. Keys typed into a field, held with Ctrl, Cmd or
|
|
12
|
+
* Alt, or pressed while `<html data-wui-shortcuts="off">` is set do nothing. Inside an element
|
|
13
|
+
* marked `data-shortcut-scope` the keys count while focus is in it (or, with nothing focused, in
|
|
14
|
+
* the first scope on the page). Wraps `<wui-shortcuts>`, which Razor `<app-shortcut-legend>`
|
|
15
|
+
* renders too. A phone has no keyboard, so leave the legend out of phone-only screens.
|
|
16
|
+
*
|
|
17
|
+
* @param {object} props
|
|
18
|
+
* @param {{ key: string, label: string, onPress?: (itemKey: string|null) => void }[]} [props.shortcuts]
|
|
19
|
+
* The rows, in order ("?" is always the last row). `key` is one character or Enter, Esc, `/`;
|
|
20
|
+
* `onPress` gets the `data-key` of the item marked `aria-current="true"` in the scope, or null.
|
|
21
|
+
* @param {string} [props.items] CSS selector of the items J and K move between (inside the scope).
|
|
22
|
+
* @param {string} [props.search] CSS selector of the field `/` focuses.
|
|
23
|
+
* @param {string} [props.className]
|
|
24
|
+
*/
|
|
25
|
+
export default function AppShortcutLegend({ shortcuts, items, search, className, ...rest }: {
|
|
26
|
+
shortcuts?: {
|
|
27
|
+
key: string;
|
|
28
|
+
label: string;
|
|
29
|
+
onPress?: (itemKey: string | null) => void;
|
|
30
|
+
}[];
|
|
31
|
+
items?: string;
|
|
32
|
+
search?: string;
|
|
33
|
+
className?: string;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import "@webority/ui-elements/elements/show-more";
|
|
2
|
+
/**
|
|
3
|
+
* A long text block clamped to a few lines with a Show more toggle, for a description or a note
|
|
4
|
+
* that would otherwise push the rest of a detail page down. The toggle shows only when the text
|
|
5
|
+
* overflows `lines`. The clamp is visual: the full text stays in the page for screen readers, and
|
|
6
|
+
* the toggle announces its state (`aria-expanded`). Without script the text shows in full. Wraps
|
|
7
|
+
* `<wui-show-more>`, which Razor `<app-show-more>` renders too.
|
|
8
|
+
*
|
|
9
|
+
* Open and close state belongs to the element; `defaultExpanded` only sets where it starts, and a
|
|
10
|
+
* change of it after mount is ignored. Listen for `wui:show-more:toggle` on the root to follow it.
|
|
11
|
+
*
|
|
12
|
+
* @param {object} props
|
|
13
|
+
* @param {import('react').ReactNode} props.children The text (or markup) to clamp.
|
|
14
|
+
* @param {number} [props.lines=3] How many lines show while collapsed.
|
|
15
|
+
* @param {string} [props.moreLabel="Show more"] The toggle's text while collapsed.
|
|
16
|
+
* @param {string} [props.lessLabel="Show less"] The toggle's text while expanded.
|
|
17
|
+
* @param {boolean} [props.defaultExpanded=false] Start with the whole text showing.
|
|
18
|
+
* @param {string} [props.id] The root's id; the body's is `{id}-body`. Generated when omitted.
|
|
19
|
+
* @param {string} [props.className]
|
|
20
|
+
*/
|
|
21
|
+
export default function AppShowMore({ children, lines, moreLabel, lessLabel, defaultExpanded, id, className, ...rest }: {
|
|
22
|
+
children: import('react').ReactNode;
|
|
23
|
+
lines?: number;
|
|
24
|
+
moreLabel?: string;
|
|
25
|
+
lessLabel?: string;
|
|
26
|
+
defaultExpanded?: boolean;
|
|
27
|
+
id?: string;
|
|
28
|
+
className?: string;
|
|
29
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A button with a menu of related actions beside it: the main action runs on one click, the
|
|
3
|
+
* chevron opens the rest ("Save" and "Save and close", "Reply" and "Reply all"). The main button
|
|
4
|
+
* is an `AppButton` (so `shortcut`, `loading` and `leftIcon` work as there) and the menu is an
|
|
5
|
+
* `AppDropdown`, with the same keyboard behaviour: Enter or Space on the chevron opens it, arrows
|
|
6
|
+
* move, Esc closes and returns focus to the chevron. The two halves are one `role="group"` named
|
|
7
|
+
* by `label`. Razor counterpart: `<app-split-button>` with `<app-split-button-item>` children.
|
|
8
|
+
*
|
|
9
|
+
* @param {object} props
|
|
10
|
+
* @param {string} props.label The main button's text, also the group's accessible name.
|
|
11
|
+
* @param {{ key: string, label?: string, icon?: string|import('react').ReactNode, image?: string, to?: string, onClick?: () => void, danger?: boolean, shortcut?: string, divider?: true }[]} [props.items]
|
|
12
|
+
* The menu, as `AppDropdown` takes it.
|
|
13
|
+
* @param {() => void} [props.onClick] Called when the main button is pressed.
|
|
14
|
+
* @param {string} [props.href] Make the main button a link.
|
|
15
|
+
* @param {'button'|'submit'|'reset'} [props.type='button'] The main button's type.
|
|
16
|
+
* @param {'primary'|'secondary'|'outline'|'ghost'|'danger'|'success'|'secondary-danger'|'outline-danger'|'light'|'warning'|'subtle'|'outline-light'} [props.variant='primary'] Both halves share it.
|
|
17
|
+
* @param {'sm'|'md'|'lg'} [props.size='md']
|
|
18
|
+
* @param {boolean} [props.disabled=false] Disables both halves.
|
|
19
|
+
* @param {boolean} [props.loading=false] Shows the spinner on the main button and disables both halves.
|
|
20
|
+
* @param {string} [props.leftIcon] Icon name before the main label.
|
|
21
|
+
* @param {string} [props.shortcut] The key that runs the main action, drawn as a key chip after the label.
|
|
22
|
+
* @param {string} [props.menuLabel='More actions'] Accessible name of the chevron.
|
|
23
|
+
* @param {'start'|'end'} [props.align='end'] Which edge the menu lines up with.
|
|
24
|
+
* @param {import('react').ElementType} [props.linkComponent] Component for items with `to` (e.g. a router Link).
|
|
25
|
+
* @param {string} [props.className]
|
|
26
|
+
*/
|
|
27
|
+
export default function AppSplitButton({ label, items, onClick, href, type, variant, size, disabled, loading, leftIcon, shortcut, menuLabel, align, linkComponent, className, ...rest }: {
|
|
28
|
+
label: string;
|
|
29
|
+
items?: {
|
|
30
|
+
key: string;
|
|
31
|
+
label?: string;
|
|
32
|
+
icon?: string | import('react').ReactNode;
|
|
33
|
+
image?: string;
|
|
34
|
+
to?: string;
|
|
35
|
+
onClick?: () => void;
|
|
36
|
+
danger?: boolean;
|
|
37
|
+
shortcut?: string;
|
|
38
|
+
divider?: true;
|
|
39
|
+
}[];
|
|
40
|
+
onClick?: () => void;
|
|
41
|
+
href?: string;
|
|
42
|
+
type?: 'button' | 'submit' | 'reset';
|
|
43
|
+
variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' | 'success' | 'secondary-danger' | 'outline-danger' | 'light' | 'warning' | 'subtle' | 'outline-light';
|
|
44
|
+
size?: 'sm' | 'md' | 'lg';
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
loading?: boolean;
|
|
47
|
+
leftIcon?: string;
|
|
48
|
+
shortcut?: string;
|
|
49
|
+
menuLabel?: string;
|
|
50
|
+
align?: 'start' | 'end';
|
|
51
|
+
linkComponent?: import('react').ElementType;
|
|
52
|
+
className?: string;
|
|
53
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A list beside a reading pane: a queue on the left, the open item on the right, for inbox,
|
|
3
|
+
* approval and drafts screens that should not change page for every item. The open item carries
|
|
4
|
+
* `aria-current="true"` and the subtle primary background, the same treatment as the open row of
|
|
5
|
+
* `AppDataTable`. J and K move between items, Enter opens the focused one, X ticks it (with
|
|
6
|
+
* `selectable`), `?` lists every shortcut (the list footer is an `AppShortcutLegend`). The pane
|
|
7
|
+
* header carries an `AppRecordPager` ("3 of 12", previous and next) for the open item.
|
|
8
|
+
*
|
|
9
|
+
* Below `stackBelow` the list and the pane are two screens: the list shows until an item is open
|
|
10
|
+
* (`currentKey` set), then the pane does. There an item with an `href` follows it, so the item's own
|
|
11
|
+
* route renders the pane screen; put a link back to the list in `paneHeader`. At or above it a click
|
|
12
|
+
* calls `onSelect` instead (Ctrl/Cmd or middle click still opens the `href` in a new tab).
|
|
13
|
+
*
|
|
14
|
+
* Both columns scroll inside a height-capped box (`--wui-split-height` sets the cap). Razor
|
|
15
|
+
* counterpart: `<app-split-view>` with `<app-split-item>` children, whose `pane-src` loads each item
|
|
16
|
+
* into the pane without a page load.
|
|
17
|
+
*
|
|
18
|
+
* @param {object} props
|
|
19
|
+
* @param {{ key: string|number, title: import('react').ReactNode, href?: string,
|
|
20
|
+
* meta?: import('react').ReactNode, trailing?: import('react').ReactNode, badge?: string|number }[]} [props.items]
|
|
21
|
+
* The list. `meta` is the line under the title (sender, excerpt), `trailing` sits at the end (a
|
|
22
|
+
* date), `badge` is a short count or label. Keep links and buttons out of all three: the item is
|
|
23
|
+
* itself a link (with `href`) or a button.
|
|
24
|
+
* @param {string|number} [props.currentKey] The key of the open item.
|
|
25
|
+
* @param {(key: string|number) => void} [props.onSelect] Called with an item's key when it is opened in place.
|
|
26
|
+
* @param {boolean} [props.selectable=false] A checkbox on each item and a select-all box in the header.
|
|
27
|
+
* @param {Set<string|number>} [props.selectedKeys] The ticked items' keys.
|
|
28
|
+
* @param {(key: string|number) => void} [props.onToggle] Called when an item's checkbox changes.
|
|
29
|
+
* @param {(checked: boolean) => void} [props.onToggleAll] Called when the select-all box changes.
|
|
30
|
+
* @param {import('react').ReactNode} [props.bulkActions] Buttons shown in place of the header while
|
|
31
|
+
* items are ticked, beside "N selected", as `AppTableToolbar` does over a table.
|
|
32
|
+
* @param {import('react').ReactNode} [props.header] The list header: a count, a sort label, a filter trigger.
|
|
33
|
+
* @param {import('react').ReactNode} [props.chips] A row under the header for the active filters.
|
|
34
|
+
* @param {import('react').ReactNode} [props.pane] The open item's content.
|
|
35
|
+
* @param {import('react').ReactNode} [props.paneHeader] Above the pane, before the pager: the open
|
|
36
|
+
* item's title or status, a link back to the list for phones.
|
|
37
|
+
* @param {boolean} [props.pager=true] The record pager at the end of the pane header: "3 of 12"
|
|
38
|
+
* over the items on screen, and previous and next, which open the item before or after the open
|
|
39
|
+
* one as a click on it would. Turn it off to put your own `AppRecordPager` in `paneHeader` (a
|
|
40
|
+
* paged list whose total is larger than the items on screen).
|
|
41
|
+
* @param {{ key: string, label: string, onPress: (currentKey?: string|number) => void }[]} [props.shortcuts]
|
|
42
|
+
* Extra single-key shortcuts (archive, approve); `onPress` gets the open item's key. They are
|
|
43
|
+
* listed in the `?` sheet. J, K, Enter, `?` (and X with `selectable`) are built in and win over an
|
|
44
|
+
* extra with the same key.
|
|
45
|
+
* @param {boolean} [props.shortcutsEnabled=true] The keyboard shortcuts and their legend. They listen
|
|
46
|
+
* while focus is in the view, or nowhere (the page body) for the first view on the page.
|
|
47
|
+
* @param {import('react').ReactNode} [props.empty="Nothing here yet."] Shown when there are no items.
|
|
48
|
+
* @param {boolean} [props.loading=false] Placeholder items instead of the list.
|
|
49
|
+
* @param {3|4|5|6|7|8} [props.listWidth=5] The list's share of 12 columns when side by side.
|
|
50
|
+
* @param {'sm'|'md'|'lg'|'xl'|'xxl'} [props.stackBelow='xl'] Below this tier the list and pane are two screens.
|
|
51
|
+
* @param {string} [props.className]
|
|
52
|
+
*/
|
|
53
|
+
export default function AppSplitView({ items, currentKey, onSelect, selectable, selectedKeys, onToggle, onToggleAll, bulkActions, header, chips, pane, paneHeader, pager, shortcuts, shortcutsEnabled, empty, loading, listWidth, stackBelow, className, ...rest }: {
|
|
54
|
+
items?: {
|
|
55
|
+
key: string | number;
|
|
56
|
+
title: import('react').ReactNode;
|
|
57
|
+
href?: string;
|
|
58
|
+
meta?: import('react').ReactNode;
|
|
59
|
+
trailing?: import('react').ReactNode;
|
|
60
|
+
badge?: string | number;
|
|
61
|
+
}[];
|
|
62
|
+
currentKey?: string | number;
|
|
63
|
+
onSelect?: (key: string | number) => void;
|
|
64
|
+
selectable?: boolean;
|
|
65
|
+
selectedKeys?: Set<string | number>;
|
|
66
|
+
onToggle?: (key: string | number) => void;
|
|
67
|
+
onToggleAll?: (checked: boolean) => void;
|
|
68
|
+
bulkActions?: import('react').ReactNode;
|
|
69
|
+
header?: import('react').ReactNode;
|
|
70
|
+
chips?: import('react').ReactNode;
|
|
71
|
+
pane?: import('react').ReactNode;
|
|
72
|
+
paneHeader?: import('react').ReactNode;
|
|
73
|
+
pager?: boolean;
|
|
74
|
+
shortcuts?: {
|
|
75
|
+
key: string;
|
|
76
|
+
label: string;
|
|
77
|
+
onPress: (currentKey?: string | number) => void;
|
|
78
|
+
}[];
|
|
79
|
+
shortcutsEnabled?: boolean;
|
|
80
|
+
empty?: import('react').ReactNode;
|
|
81
|
+
loading?: boolean;
|
|
82
|
+
listWidth?: 3 | 4 | 5 | 6 | 7 | 8;
|
|
83
|
+
stackBelow?: 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
|
|
84
|
+
className?: string;
|
|
85
|
+
}): import("react").JSX.Element;
|
|
@@ -3,12 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @param {object} props
|
|
5
5
|
* @param {string|import('react').ReactNode} props.icon Icon name, or a custom node.
|
|
6
|
+
* @param {"no-results"|"no-data"|"empty-inbox"|"no-notifications"|"no-files"|"no-access"|"offline"|"error"} [props.illustration]
|
|
7
|
+
* Decorative drawing by name, in theme colours. Replaces the icon bubble when set.
|
|
6
8
|
* @param {import('react').ReactNode} props.title
|
|
7
9
|
* @param {import('react').ReactNode} [props.text]
|
|
8
10
|
* @param {import('react').ReactNode} [props.action]
|
|
9
11
|
*/
|
|
10
|
-
export default function AppTableEmptyState({ icon, title, text, action, ...rest }: {
|
|
12
|
+
export default function AppTableEmptyState({ icon, illustration, title, text, action, ...rest }: {
|
|
11
13
|
icon: string | import('react').ReactNode;
|
|
14
|
+
illustration?: "no-results" | "no-data" | "empty-inbox" | "no-notifications" | "no-files" | "no-access" | "offline" | "error";
|
|
12
15
|
title: import('react').ReactNode;
|
|
13
16
|
text?: import('react').ReactNode;
|
|
14
17
|
action?: import('react').ReactNode;
|
|
@@ -13,13 +13,25 @@
|
|
|
13
13
|
* @param {number} [props.selectedCount=0] Selected rows. Above 0, the bulk bar replaces the toolbar.
|
|
14
14
|
* @param {import('react').ReactNode} [props.bulkActions] Buttons shown in the bulk bar.
|
|
15
15
|
* @param {() => void} [props.onClearSelection] Shows a Clear button in the bulk bar that calls this.
|
|
16
|
+
* @param {number} [props.totalCount] Rows matching across every page. With `onSelectAllMatching`, the bulk
|
|
17
|
+
* bar offers "Select all 1,284 matching" once the page is selected and more rows match than it shows.
|
|
18
|
+
* @param {number} [props.pageCount] Rows on the current page. The offer waits until `selectedCount`
|
|
19
|
+
* reaches it; without it, any selection qualifies.
|
|
20
|
+
* @param {() => void} [props.onSelectAllMatching] Called when the offer is taken; the screen then runs
|
|
21
|
+
* its action on the query rather than on ids, and sets `allMatchingSelected`.
|
|
22
|
+
* @param {boolean} [props.allMatchingSelected=false] Every matching row is selected: the bar reads
|
|
23
|
+
* "All 1,284 selected" and Clear becomes "Clear selection". The screen resets it on any row change.
|
|
16
24
|
* @param {string} [props.className]
|
|
17
25
|
*/
|
|
18
|
-
export default function AppTableToolbar({ filters, actions, selectedCount, bulkActions, onClearSelection, className, ...rest }: {
|
|
26
|
+
export default function AppTableToolbar({ filters, actions, selectedCount, bulkActions, onClearSelection, totalCount, pageCount, onSelectAllMatching, allMatchingSelected, className, ...rest }: {
|
|
19
27
|
filters?: import('react').ReactNode;
|
|
20
28
|
actions?: import('react').ReactNode;
|
|
21
29
|
selectedCount?: number;
|
|
22
30
|
bulkActions?: import('react').ReactNode;
|
|
23
31
|
onClearSelection?: () => void;
|
|
32
|
+
totalCount?: number;
|
|
33
|
+
pageCount?: number;
|
|
34
|
+
onSelectAllMatching?: () => void;
|
|
35
|
+
allMatchingSelected?: boolean;
|
|
24
36
|
className?: string;
|
|
25
37
|
}): import("react").JSX.Element;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import "@webority/ui-elements/elements/overflow";
|
|
1
2
|
/**
|
|
2
3
|
* Shared tab strip (.app-tabs). A controlled component: the caller owns `value` +
|
|
3
4
|
* `onChange` and renders the panels. Razor's <app-tabs> renders the same strip markup
|
|
4
5
|
* (plus Bootstrap panels), so both surfaces look and behave alike.
|
|
5
6
|
*
|
|
6
7
|
* The active state is a sliding "ink bar" (`.app-tab-indicator`) — one element that is
|
|
7
|
-
* JS-measured against the active tab and
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `prefers-reduced-motion`.
|
|
8
|
+
* JS-measured against the active tab and slides between tabs with an ease-out (no overshoot).
|
|
9
|
+
* It becomes a moving pill in the `pills` variant and a moving left edge when
|
|
10
|
+
* `orientation="vertical"`, and it snaps (no slide) under `prefers-reduced-motion`.
|
|
11
11
|
*
|
|
12
12
|
* Keyboard (WAI-ARIA tablist): Arrow (Left/Right, or Up/Down when vertical) / Home / End
|
|
13
13
|
* roam the strip skipping disabled tabs. `activation="automatic"` (default) selects as
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
*
|
|
25
25
|
* @param {object} props
|
|
26
26
|
* @param {{ key: string, label: import('react').ReactNode, count?: number, tone?: string, icon?: string|import('react').ReactNode, image?: string, imageAlt?: string, tooltip?: import('react').ReactNode, danger?: boolean, disabled?: boolean, href?: string, to?: string, target?: string, rel?: string }[]} props.tabs
|
|
27
|
-
* `icon` is
|
|
27
|
+
* `icon` is an iconsax name from the library catalogue OR a custom node (e.g. an iconsax glyph); `image` is a
|
|
28
28
|
* picture URL (logo/avatar) rendered before the label — `image` wins over `icon`. `tooltip`
|
|
29
29
|
* is a hover/focus hint (text or node) shown on the tab via AppTooltip — the same branded
|
|
30
30
|
* tip the Razor `<app-tab tooltip="…">` renders. `href`/`to` turn the tab into a link (see
|
|
@@ -36,13 +36,17 @@
|
|
|
36
36
|
* @param {"horizontal"|"vertical"} [props.orientation="horizontal"] Vertical renders a side rail.
|
|
37
37
|
* @param {"sm"|"md"|"lg"} [props.size="md"]
|
|
38
38
|
* @param {boolean} [props.fitted=false] Tabs share the width equally instead of scrolling.
|
|
39
|
+
* @param {"scroll"|"menu"} [props.overflow="scroll"] What a horizontal strip does when the tabs do not fit:
|
|
40
|
+
* `scroll` scrolls it (chevrons and edge fades); `menu` moves the tabs that do not fit into a More menu
|
|
41
|
+
* (`<wui-overflow>`), always keeping the selected tab visible. Ignored when `orientation="vertical"`.
|
|
42
|
+
* @param {string} [props.moreLabel="More"] The More button's text when `overflow="menu"`.
|
|
39
43
|
* @param {"automatic"|"manual"} [props.activation="automatic"] Whether arrow keys also select.
|
|
40
44
|
* @param {string} [props.ariaLabel]
|
|
41
45
|
* @param {string} [props.className]
|
|
42
46
|
* @param {import('react').CSSProperties} [props.style]
|
|
43
47
|
* @param {"success"|"warning"|"danger"|"info"} [props.tone] Per-tab count-pill tint (set as `tabs[].tone`).
|
|
44
48
|
*/
|
|
45
|
-
export default function AppTabs({ tabs, value, onChange, linkComponent, variant, orientation, size, fitted, activation, ariaLabel, className, style, ...rest }: {
|
|
49
|
+
export default function AppTabs({ tabs, value, onChange, linkComponent, variant, orientation, size, fitted, overflow, moreLabel, activation, ariaLabel, className, style, ...rest }: {
|
|
46
50
|
tabs: {
|
|
47
51
|
key: string;
|
|
48
52
|
label: import('react').ReactNode;
|
|
@@ -66,6 +70,8 @@ export default function AppTabs({ tabs, value, onChange, linkComponent, variant,
|
|
|
66
70
|
orientation?: "horizontal" | "vertical";
|
|
67
71
|
size?: "sm" | "md" | "lg";
|
|
68
72
|
fitted?: boolean;
|
|
73
|
+
overflow?: "scroll" | "menu";
|
|
74
|
+
moreLabel?: string;
|
|
69
75
|
activation?: "automatic" | "manual";
|
|
70
76
|
ariaLabel?: string;
|
|
71
77
|
className?: string;
|
|
@@ -19,13 +19,16 @@
|
|
|
19
19
|
* @param {'sm'|'md'|'lg'} [props.size='md'] Preset size (font-size + padding + max-width). For a
|
|
20
20
|
* fully custom size, pass a `className` that sets the `--wui-tooltip-font-size` /
|
|
21
21
|
* `--wui-tooltip-padding-y` / `--wui-tooltip-padding-x` / `--wui-tooltip-max-width` CSS vars.
|
|
22
|
+
* @param {string} [props.shortcut] The key that runs the action ("A", "E", "/"), drawn as a key chip
|
|
23
|
+
* after the text ("Approve A"). One character is written in upper case.
|
|
22
24
|
* @param {string} [props.className] Extra class on the tooltip element.
|
|
23
25
|
*/
|
|
24
|
-
export default function AppTooltip({ content, children, placement, tone, size, className, ...rest }: {
|
|
26
|
+
export default function AppTooltip({ content, children, placement, tone, size, shortcut, className, ...rest }: {
|
|
25
27
|
content: import('react').ReactNode;
|
|
26
28
|
children: import('react').ReactElement;
|
|
27
29
|
placement?: 'auto' | 'top' | 'bottom' | 'start' | 'end';
|
|
28
30
|
tone?: 'default' | 'dark' | 'primary' | 'success' | 'warning' | 'danger';
|
|
29
31
|
size?: 'sm' | 'md' | 'lg';
|
|
32
|
+
shortcut?: string;
|
|
30
33
|
className?: string;
|
|
31
34
|
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import "@webority/ui-elements/elements/truncate";
|
|
2
|
+
/**
|
|
3
|
+
* Cuts long text with an ellipsis, by the width it has or by a number of lines, and gives the
|
|
4
|
+
* whole text on hover and on keyboard focus. Text that fits shows no tooltip and takes no tab
|
|
5
|
+
* stop. Put it where the width is set by the layout (a table cell, a card, a flex child with
|
|
6
|
+
* `.min-w-0`), or pass `width`. Wraps `<wui-truncate>`, which Razor `<app-truncate>` renders too.
|
|
7
|
+
*
|
|
8
|
+
* @param {object} props
|
|
9
|
+
* @param {import('react').ReactNode} props.children The text.
|
|
10
|
+
* @param {number} [props.lines=1] How many lines show before the cut; 1 is a single line cut by width.
|
|
11
|
+
* @param {string} [props.width] A CSS length the text never exceeds ("12rem", "240px"); without it the text takes the width it is given.
|
|
12
|
+
* @param {import('react').CSSProperties} [props.style]
|
|
13
|
+
* @param {string} [props.className]
|
|
14
|
+
*/
|
|
15
|
+
export default function AppTruncate({ children, lines, width, style, className, ...rest }: {
|
|
16
|
+
children: import('react').ReactNode;
|
|
17
|
+
lines?: number;
|
|
18
|
+
width?: string;
|
|
19
|
+
style?: import('react').CSSProperties;
|
|
20
|
+
className?: string;
|
|
21
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import "@webority/ui-elements/elements/whats-new";
|
|
2
|
+
/**
|
|
3
|
+
* A "what's new" entry point for a portal's top bar: a gift icon that carries a dot while there
|
|
4
|
+
* are release notes the person has not read, and a panel of dated entries under it, newest
|
|
5
|
+
* first as passed, each with an optional picture and link. Opening the panel marks everything
|
|
6
|
+
* read. Distinct from `AppPopover` (any floating content) and the shell's bell (notifications
|
|
7
|
+
* addressed to the person): this is the same list for everyone, read once per person.
|
|
8
|
+
*
|
|
9
|
+
* The newest date the person has seen is kept in the browser under `storageKey`, so build the
|
|
10
|
+
* key with the user's id ("whats-new:" + userId): without an id two people on one browser
|
|
11
|
+
* share the state, and without a `storageKey` it lasts only until the page is left. To keep it
|
|
12
|
+
* on your server as well, save `onRead`'s date and pass only the entries newer than it. Wraps
|
|
13
|
+
* `<wui-whats-new>`, which Razor `<app-whats-new>` renders too.
|
|
14
|
+
*
|
|
15
|
+
* @param {object} props
|
|
16
|
+
* @param {{ id?: string, date: string, title: string, body?: string, imageSrc?: string,
|
|
17
|
+
* imageAlt?: string, href?: string, linkLabel?: string }[]} [props.entries] The release notes.
|
|
18
|
+
* `date` is the day it shipped, "YYYY-MM-DD", shown as DD-MMM-YYYY. `imageAlt` describes the
|
|
19
|
+
* picture; leave it empty when the picture adds nothing. `linkLabel` defaults to "Learn more".
|
|
20
|
+
* @param {string} [props.storageKey] Names where read state is kept; include the user's id.
|
|
21
|
+
* @param {string} [props.label="What's new"] The trigger's name and the panel's heading.
|
|
22
|
+
* @param {string} [props.unreadLabel="unread"] Added to the trigger's name while there are unread entries.
|
|
23
|
+
* @param {string} [props.emptyText="Nothing new yet"] Shown when there are no entries.
|
|
24
|
+
* @param {(through: string) => void} [props.onRead] Called with the newest entry's date when opening marks entries read.
|
|
25
|
+
* @param {string} [props.className]
|
|
26
|
+
*/
|
|
27
|
+
export default function AppWhatsNew({ entries, storageKey, label, unreadLabel, emptyText, onRead, className, ...rest }: {
|
|
28
|
+
entries?: {
|
|
29
|
+
id?: string;
|
|
30
|
+
date: string;
|
|
31
|
+
title: string;
|
|
32
|
+
body?: string;
|
|
33
|
+
imageSrc?: string;
|
|
34
|
+
imageAlt?: string;
|
|
35
|
+
href?: string;
|
|
36
|
+
linkLabel?: string;
|
|
37
|
+
}[];
|
|
38
|
+
storageKey?: string;
|
|
39
|
+
label?: string;
|
|
40
|
+
unreadLabel?: string;
|
|
41
|
+
emptyText?: string;
|
|
42
|
+
onRead?: (through: string) => void;
|
|
43
|
+
className?: string;
|
|
44
|
+
}): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function withTooltip(element: any, tooltip: any, placement: any): any;
|
|
1
|
+
export default function withTooltip(element: any, tooltip: any, placement: any, shortcut: any): any;
|