@setsquare/ui 0.2.4 → 0.5.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 (71) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/NOTICE +1 -1
  3. package/README.md +17 -7
  4. package/dist/index.d.ts +11 -4
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +5 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/page-items.d.ts +10 -0
  9. package/dist/lib/page-items.d.ts.map +1 -0
  10. package/dist/lib/page-items.js +26 -0
  11. package/dist/lib/page-items.js.map +1 -0
  12. package/dist/lint/index.d.ts +5 -0
  13. package/dist/lint/index.d.ts.map +1 -1
  14. package/dist/lint/index.js +84 -3
  15. package/dist/lint/index.js.map +1 -1
  16. package/dist/shell/sidebar.d.ts +23 -0
  17. package/dist/shell/sidebar.d.ts.map +1 -1
  18. package/dist/shell/sidebar.js +22 -3
  19. package/dist/shell/sidebar.js.map +1 -1
  20. package/dist/styles/theme.css +550 -0
  21. package/dist/styles/tokens.css +17 -0
  22. package/dist/testing/index.d.ts +57 -2
  23. package/dist/testing/index.d.ts.map +1 -1
  24. package/dist/testing/index.js +276 -11
  25. package/dist/testing/index.js.map +1 -1
  26. package/dist/tokens.json +45 -0
  27. package/dist/ui/breadcrumbs.d.ts +9 -1
  28. package/dist/ui/breadcrumbs.d.ts.map +1 -1
  29. package/dist/ui/breadcrumbs.js +3 -3
  30. package/dist/ui/breadcrumbs.js.map +1 -1
  31. package/dist/ui/button-styles.d.ts.map +1 -1
  32. package/dist/ui/button-styles.js +16 -6
  33. package/dist/ui/button-styles.js.map +1 -1
  34. package/dist/ui/combo-box.d.ts +6 -1
  35. package/dist/ui/combo-box.d.ts.map +1 -1
  36. package/dist/ui/combo-box.js +2 -2
  37. package/dist/ui/combo-box.js.map +1 -1
  38. package/dist/ui/drop-indicator.d.ts +21 -0
  39. package/dist/ui/drop-indicator.d.ts.map +1 -0
  40. package/dist/ui/drop-indicator.js +20 -0
  41. package/dist/ui/drop-indicator.js.map +1 -0
  42. package/dist/ui/feature-card.d.ts.map +1 -1
  43. package/dist/ui/feature-card.js.map +1 -1
  44. package/dist/ui/grid-list.d.ts +10 -3
  45. package/dist/ui/grid-list.d.ts.map +1 -1
  46. package/dist/ui/grid-list.js +18 -7
  47. package/dist/ui/grid-list.js.map +1 -1
  48. package/dist/ui/pagination.d.ts +69 -14
  49. package/dist/ui/pagination.d.ts.map +1 -1
  50. package/dist/ui/pagination.js +177 -32
  51. package/dist/ui/pagination.js.map +1 -1
  52. package/dist/ui/switch.d.ts +2 -1
  53. package/dist/ui/switch.d.ts.map +1 -1
  54. package/dist/ui/switch.js +5 -2
  55. package/dist/ui/switch.js.map +1 -1
  56. package/dist/ui/tabs.d.ts +82 -15
  57. package/dist/ui/tabs.d.ts.map +1 -1
  58. package/dist/ui/tabs.js +274 -16
  59. package/dist/ui/tabs.js.map +1 -1
  60. package/dist/ui/time-of-day-icon.d.ts.map +1 -1
  61. package/dist/ui/time-of-day-icon.js.map +1 -1
  62. package/dist/ui/toolbar.d.ts +22 -0
  63. package/dist/ui/toolbar.d.ts.map +1 -0
  64. package/dist/ui/toolbar.js +22 -0
  65. package/dist/ui/toolbar.js.map +1 -0
  66. package/dist/ui/tree.d.ts +98 -0
  67. package/dist/ui/tree.d.ts.map +1 -0
  68. package/dist/ui/tree.js +75 -0
  69. package/dist/ui/tree.js.map +1 -0
  70. package/package.json +21 -25
  71. package/templates/next/page-transition.tsx +1 -1
package/dist/ui/tabs.d.ts CHANGED
@@ -1,43 +1,110 @@
1
- import { type TabListProps as RACTabListProps, type TabPanelProps as RACTabPanelProps, type TabProps as RACTabProps, type TabsProps as RACTabsProps } from 'react-aria-components';
2
- export interface TabsProps extends Omit<RACTabsProps, 'className'> {
1
+ import * as React from 'react';
2
+ import { type ReactNode } from 'react';
3
+ import { type Key, type TabListProps as RACTabListProps, type TabPanelProps as RACTabPanelProps, type TabProps as RACTabProps, type TabsProps as RACTabsProps } from 'react-aria-components';
4
+ import { type IconProp } from './icon.js';
5
+ /** Tabs' words, for the `labels` prop. `{name}` is a tab's name. */
6
+ export interface TabsLabels {
7
+ /** Added to a tab's name for its count, which shows as a number only: "Files, 8". */
8
+ count: string;
9
+ /** Added to a tab's name for its badge's words: "Notes, 2 new notes". */
10
+ badge: string;
11
+ /** A tooltip for a tab with a count: "Files (8)". */
12
+ tipCount: string;
13
+ /** A tooltip for a tab with a badge: "Settings · 1 to check". */
14
+ tipBadge: string;
15
+ /** Said politely when an important badge rises, with `announceBadges`: "Settings: 2 settings need attention". */
16
+ badgeRise: string;
17
+ }
18
+ /**
19
+ * What a closed tab shows. `expanding`: icons, and the selected tab opens to show its name. `text`: every name,
20
+ * no icons. `icon`: icons only; names are in tooltips. A tab without an icon always shows its name.
21
+ */
22
+ export type TabsDisplay = 'expanding' | 'text' | 'icon';
23
+ /**
24
+ * What happens to a panel you leave. `visited`: kept once it has been shown, with its state, scroll position and
25
+ * drafts. `all`: every panel rendered from the start, hidden until chosen. `unmount`: gone until it is chosen
26
+ * again. Kept panels are hidden with React's `<Activity>`, which also stops their effects.
27
+ */
28
+ export type TabsHiddenPanels = 'visited' | 'all' | 'unmount';
29
+ /** Something new on a tab, shown while it is closed: a count or a dot. */
30
+ export interface TabBadge {
31
+ /** The number shown; above 99 it shows "99+". Leave it out, with `dot`, for a dot. */
32
+ count?: number;
33
+ dot?: boolean;
34
+ /** What a screen reader hears after the tab's name: "2 new notes". */
35
+ label: string;
36
+ /** What the tooltip says after the name: "2 new". Defaults to `label`. */
37
+ short?: string;
38
+ /** The destructive colour and a ring that stays, and a pulse that plays three times when it appears or rises. */
39
+ important?: boolean;
40
+ /** Fades out a second after the tab is opened, then calls `onBadgeClear` so the app can mark the items read. */
41
+ clearOnOpen?: boolean;
42
+ }
43
+ export interface TabsProps extends Omit<RACTabsProps, 'className' | 'children'> {
44
+ children: ReactNode;
45
+ /** Default `expanding`. */
46
+ display?: TabsDisplay;
47
+ /** Default `visited`. */
48
+ hiddenPanels?: TabsHiddenPanels;
49
+ /** Called once a `clearOnOpen` badge has gone, with its tab's id. */
50
+ onBadgeClear?: (id: Key) => void;
51
+ /** Politely announce a rise in an important badge ("Settings: 2 settings need attention"). Default off. */
52
+ announceBadges?: boolean;
53
+ labels?: Partial<TabsLabels>;
3
54
  className?: string;
4
55
  }
5
56
  /**
6
57
  * Views of the same thing, one at a time: a TabList and a TabPanel for each tab. Arrow keys move between tabs and
7
58
  * show each as focus reaches it; Tab moves on to the panel. Use them for peers people switch between, not for
8
59
  * steps in order (that's a form) or for navigation between pages (that's links).
60
+ *
61
+ * `orientation="vertical"` puts the tabs in a rail beside the panel. Narrower than 480px the rail becomes a row
62
+ * above it, and the arrow keys and `aria-orientation` follow.
9
63
  */
10
- export declare function Tabs({ className, ...props }: TabsProps): import("react").JSX.Element;
64
+ export declare function Tabs({ display, hiddenPanels, orientation, onBadgeClear, announceBadges, labels: given, className, children, ...props }: TabsProps): React.JSX.Element;
11
65
  export interface TabListProps<T extends object> extends Omit<RACTabListProps<T>, 'className'> {
12
66
  /** What the tabs switch between: "Project details". */
13
67
  'aria-label': string;
14
68
  className?: string;
15
69
  }
16
70
  /**
17
- * The row of tabs, on a rule. It wraps rather than scrolls when the tabs don't fit, so no tab is ever hidden off
18
- * the edge at 320px (1.4.10).
71
+ * The tabs. In a row they wrap rather than scroll when they don't fit, so no tab is ever hidden off the edge at
72
+ * 320px (1.4.10). In a rail they are 104px wide tiles, and the selected one grows downwards to show its name.
19
73
  */
20
- export declare function TabList<T extends object>({ className, ...props }: TabListProps<T>): import("react").JSX.Element;
21
- export interface TabProps extends Omit<RACTabProps, 'className'> {
74
+ export declare function TabList<T extends object>({ className, ...props }: TabListProps<T>): React.JSX.Element;
75
+ export interface TabProps extends Omit<RACTabProps, 'className' | 'children'> {
76
+ /** The tab's name. */
77
+ children: ReactNode;
78
+ /** The name as plain text, for its tooltip and announcements, when `children` isn't a string. */
79
+ textValue?: string;
80
+ /** Shown closed; the name opens beside it when the tab is selected. A server component passes the element. */
81
+ icon?: IconProp;
82
+ /** A number after the name ("Files 8"), and in its name as ", 8". Not shown in a rail. */
83
+ count?: number;
84
+ badge?: TabBadge;
22
85
  /** Layer 1, the target. */
23
86
  className?: string;
24
87
  /** Layer 2, the painted tab. */
25
88
  visualClassName?: string;
26
89
  }
27
90
  /**
28
- * A tab in three layers. The tab is the target (Layer 1), at least --target-min both ways. The painted tab
29
- * inside it (Layer 2) takes the hover ground and the focus ring, and the selected one is bold with a brand bar on
30
- * the rule: weight and the bar, never colour alone. The bar is the brand colour, which clears 3:1 against every
31
- * surface because it is also the focus ring.
91
+ * A tab in three layers. The tab is the target (Layer 1), at least --target-min both ways. The pill inside it
92
+ * (Layer 2) takes the hover ground and the focus ring. Selected, it takes the brand-subtle ground and a bold name,
93
+ * and its icon turns brand; where the name doesn't open to mark it (text and icon only), a brand marker does, so
94
+ * selection never rests on the fill alone.
95
+ *
96
+ * A tab whose name isn't showing has a tooltip: on hover after 500ms (at once if another just closed), on keyboard
97
+ * focus at once, closed by Escape from anywhere. The tooltip is hidden from assistive tech, because the tab's name
98
+ * is already its own collapsed label.
32
99
  */
33
- export declare function Tab({ className, visualClassName, children, ...props }: TabProps): import("react").JSX.Element;
34
- export interface TabPanelProps extends Omit<RACTabPanelProps, 'className'> {
100
+ export declare function Tab({ id, icon, count, badge, className, visualClassName, children, textValue, ...props }: TabProps): React.JSX.Element;
101
+ export interface TabPanelProps extends Omit<RACTabPanelProps, 'className' | 'shouldForceMount'> {
35
102
  className?: string;
36
103
  }
37
104
  /**
38
105
  * A tab's content. With nothing focusable inside, React Aria makes the panel itself a tab stop so a keyboard
39
106
  * reaches it after the tabs; it shows the focus ring then. Positioned, so hidden text inside it is placed against
40
- * it.
107
+ * it. It comes in from the side the selection moved towards (a fade alone at AAA).
41
108
  */
42
- export declare function TabPanel({ className, ...props }: TabPanelProps): import("react").JSX.Element;
109
+ export declare function TabPanel({ className, id, ...props }: TabPanelProps): React.JSX.Element | null;
43
110
  //# sourceMappingURL=tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/ui/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,YAAY,IAAI,eAAe,EACpC,KAAK,aAAa,IAAI,gBAAgB,EACtC,KAAK,QAAQ,IAAI,WAAW,EAC5B,KAAK,SAAS,IAAI,YAAY,EAC/B,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,+BAEtD;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;IAC3F,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,+BAOjF;AAED,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;IAC9D,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,QAAQ,+BAwB/E;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BAO9D"}
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/ui/tabs.tsx"],"names":[],"mappings":"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"}
package/dist/ui/tabs.js CHANGED
@@ -1,37 +1,295 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import { composeRenderProps, Tab as RACTab, TabList as RACTabList, TabPanel as RACTabPanel, Tabs as RACTabs, } from 'react-aria-components';
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { createContext, useCallback, useContext, useEffect, useRef, useState, } from 'react';
5
+ import { Tab as RACTab, TabList as RACTabList, TabListStateContext, TabPanel as RACTabPanel, Tabs as RACTabs, } from 'react-aria-components';
4
6
  import { cn } from '../lib/cn.js';
7
+ import { fill, withLabels } from '../lib/labels.js';
8
+ import { renderIcon } from './icon.js';
9
+ const tabsLabels = {
10
+ count: ', {count}',
11
+ badge: ', {badge}',
12
+ tipCount: '{name} ({count})',
13
+ tipBadge: '{name} · {badge}',
14
+ badgeRise: '{name}: {badge}',
15
+ };
16
+ const SharedContext = createContext(null);
17
+ const TravelContext = createContext({ moved: false, direction: 'forward' });
18
+ /** React 19.2's `<Activity>`. A canvas that renders the bundle with React 18 has none; there the panel's `hidden`. */
19
+ const Activity = React.Activity ?? (({ children }) => _jsx(_Fragment, { children: children }));
20
+ /** Below this width a vertical tablist becomes a row above its panel (1.4.10). */
21
+ const RAIL_MIN = 480;
5
22
  /**
6
23
  * Views of the same thing, one at a time: a TabList and a TabPanel for each tab. Arrow keys move between tabs and
7
24
  * show each as focus reaches it; Tab moves on to the panel. Use them for peers people switch between, not for
8
25
  * steps in order (that's a form) or for navigation between pages (that's links).
26
+ *
27
+ * `orientation="vertical"` puts the tabs in a rail beside the panel. Narrower than 480px the rail becomes a row
28
+ * above it, and the arrow keys and `aria-orientation` follow.
9
29
  */
10
- export function Tabs({ className, ...props }) {
11
- return _jsx(RACTabs, { ...props, className: cn('flex flex-col gap-4', className) });
30
+ export function Tabs({ display = 'expanding', hiddenPanels = 'visited', orientation = 'horizontal', onBadgeClear, announceBadges = false, labels: given, className, children, ...props }) {
31
+ const ref = useRef(null);
32
+ const [narrow, setNarrow] = useState(false);
33
+ useEffect(() => {
34
+ const el = ref.current;
35
+ if (orientation !== 'vertical' || !el || typeof ResizeObserver === 'undefined')
36
+ return;
37
+ const observer = new ResizeObserver(([entry]) => {
38
+ const width = entry?.contentRect.width ?? el.clientWidth;
39
+ setNarrow(width > 0 && width < RAIL_MIN);
40
+ });
41
+ observer.observe(el);
42
+ return () => observer.disconnect();
43
+ }, [orientation]);
44
+ const effective = orientation === 'vertical' && !narrow ? 'vertical' : 'horizontal';
45
+ const [tip, setTipState] = useState(null);
46
+ const tipClosed = useRef(0);
47
+ const setTip = useCallback((id) => setTipState((open) => {
48
+ if (id == null && open != null)
49
+ tipClosed.current = Date.now();
50
+ return id;
51
+ }), []);
52
+ const closeTip = useCallback((id) => setTipState((open) => {
53
+ if (open !== id)
54
+ return open;
55
+ tipClosed.current = Date.now();
56
+ return null;
57
+ }), []);
58
+ // Escape closes a tooltip wherever focus is (1.4.13).
59
+ useEffect(() => {
60
+ if (tip == null)
61
+ return;
62
+ const onKey = (e) => {
63
+ if (e.key === 'Escape')
64
+ setTip(null);
65
+ };
66
+ document.addEventListener('keydown', onKey);
67
+ return () => document.removeEventListener('keydown', onKey);
68
+ }, [tip, setTip]);
69
+ const [message, setMessage] = useState('');
70
+ const shared = {
71
+ display,
72
+ hiddenPanels,
73
+ orientation: effective,
74
+ labels: withLabels(tabsLabels, given),
75
+ onBadgeClear,
76
+ announce: (text) => announceBadges && setMessage(text),
77
+ tip,
78
+ setTip,
79
+ closeTip,
80
+ tipClosed,
81
+ };
82
+ return (_jsxs(RACTabs, { ...props, ref: ref, orientation: effective, className: cn('relative flex', effective === 'vertical' ? 'flex-row items-start gap-7' : 'flex-col gap-5', className), children: [_jsx(SharedContext.Provider, { value: shared, children: _jsx(TravelTracker, { children: children }) }), announceBadges && (_jsx("span", { role: "status", className: "sr-only", children: message }))] }));
83
+ }
84
+ /** Which way the selection last moved, so the panel can come in from that side. */
85
+ function TravelTracker({ children }) {
86
+ const state = useContext(TabListStateContext);
87
+ const key = state?.selectedKey ?? null;
88
+ const [seen, setSeen] = useState({ key, from: null });
89
+ if (state && seen.key !== key)
90
+ setSeen({ key, from: seen.key });
91
+ const index = (k) => (k == null ? -1 : (state?.collection.getItem(k)?.index ?? -1));
92
+ const travel = {
93
+ moved: seen.from != null,
94
+ direction: index(seen.key) >= index(seen.from) ? 'forward' : 'back',
95
+ };
96
+ return _jsx(TravelContext.Provider, { value: travel, children: children });
97
+ }
98
+ function useShared() {
99
+ const shared = useContext(SharedContext);
100
+ if (!shared)
101
+ throw new Error('TabList, Tab and TabPanel go inside Tabs.');
102
+ return shared;
12
103
  }
13
104
  /**
14
- * The row of tabs, on a rule. It wraps rather than scrolls when the tabs don't fit, so no tab is ever hidden off
15
- * the edge at 320px (1.4.10).
105
+ * The tabs. In a row they wrap rather than scroll when they don't fit, so no tab is ever hidden off the edge at
106
+ * 320px (1.4.10). In a rail they are 104px wide tiles, and the selected one grows downwards to show its name.
16
107
  */
17
108
  export function TabList({ className, ...props }) {
18
- return (_jsx(RACTabList, { ...props, className: cn('flex flex-wrap gap-x-1 border-b border-border', className) }));
109
+ return _jsx(RACTabList, { ...props, className: cn('tabs-list', className) });
110
+ }
111
+ /**
112
+ * A tab in three layers. The tab is the target (Layer 1), at least --target-min both ways. The pill inside it
113
+ * (Layer 2) takes the hover ground and the focus ring. Selected, it takes the brand-subtle ground and a bold name,
114
+ * and its icon turns brand; where the name doesn't open to mark it (text and icon only), a brand marker does, so
115
+ * selection never rests on the fill alone.
116
+ *
117
+ * A tab whose name isn't showing has a tooltip: on hover after 500ms (at once if another just closed), on keyboard
118
+ * focus at once, closed by Escape from anywhere. The tooltip is hidden from assistive tech, because the tab's name
119
+ * is already its own collapsed label.
120
+ */
121
+ export function Tab({ id, icon, count, badge, className, visualClassName, children, textValue, ...props }) {
122
+ const shared = useShared();
123
+ const state = useContext(TabListStateContext);
124
+ const name = textValue ?? (typeof children === 'string' ? children : '');
125
+ const display = icon ? shared.display : 'text';
126
+ const rail = shared.orientation === 'vertical';
127
+ const { labels } = shared;
128
+ // A tooltip only where the name isn't showing: every tab in icon only, the closed ones when expanding.
129
+ const selected = state?.selectedKey === id;
130
+ const tip = useTip(id, display === 'icon' || (display === 'expanding' && !selected));
131
+ return (_jsx(RACTab, { ...props, ...tip.handlers, id: id, className: cn('group/tab relative inline-flex min-h-target min-w-target cursor-pointer items-center outline-none data-disabled:cursor-not-allowed', rail && 'flex w-full', className), children: ({ isSelected }) => (_jsx(TabInner, { id: id, name: name, display: display, rail: rail, icon: icon, count: count, badge: badge, isSelected: isSelected, tipOpen: tip.open, visualClassName: visualClassName, labels: labels, children: children })) }));
132
+ }
133
+ function TabInner({ id, name, display, rail, icon, count, badge, isSelected, tipOpen, visualClassName, labels, children, }) {
134
+ const mark = useBadge(id, name, badge, isSelected);
135
+ const shown = mark.shown;
136
+ // Never over text: open in a row, the name sits beside the icon, so the badge follows the name. In a rail the name
137
+ // is under the icon, clear of it. With no icon (text) it always follows the name.
138
+ const inline = shown && (display === 'text' || (display === 'expanding' && isSelected && !rail));
139
+ // Back on the icon after following the name: it waits for the name to fade first.
140
+ const [wasInline, setWasInline] = useState(inline);
141
+ const [returning, setReturning] = useState(false);
142
+ if (wasInline !== inline) {
143
+ setWasInline(inline);
144
+ setReturning(!inline);
145
+ }
146
+ const badgeText = badge?.short ?? badge?.label ?? '';
147
+ const tip = shown && badge
148
+ ? fill(labels.tipBadge, { name, badge: badgeText })
149
+ : count != null
150
+ ? fill(labels.tipCount, { name, count })
151
+ : name;
152
+ return (_jsxs(_Fragment, { children: [_jsxs("span", { "data-display": display, className: cn('tabs-paint group-data-focus-visible/tab:focus-ring group-data-disabled/tab:opacity-50', visualClassName), children: [display !== 'text' && icon && (_jsxs("span", { className: "tabs-icon", children: [renderIcon(icon, 'size-5'), shown && badge && !inline && (_jsx(BadgeMark, { badge: badge, ...mark, returning: returning }))] })), _jsx("span", { className: "tabs-name", children: _jsxs("span", { className: "tabs-name-row", children: [_jsxs("span", { className: "tabs-name-text", children: [_jsx("span", { children: children }), _jsx("span", { "aria-hidden": "true", children: children })] }), count != null && (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", className: "tabs-count", children: count }), _jsx("span", { className: "sr-only", children: fill(labels.count, { count }) })] })), shown && badge && inline && _jsx(BadgeMark, { badge: badge, ...mark, inline: true }), shown && badge && (_jsx("span", { className: "sr-only", children: fill(labels.badge, { badge: badge.label }) }))] }) })] }), tipOpen && (_jsx("span", { "aria-hidden": "true", "data-side": rail ? 'right' : 'bottom', className: "tabs-tip", children: tip }))] }));
153
+ }
154
+ /** Whether the badge shows, and the pulse and clearing bookkeeping behind it. */
155
+ function useBadge(id, name, badge, isSelected) {
156
+ const shared = useShared();
157
+ const present = !!badge && (!!badge.dot || (badge.count ?? 0) > 0);
158
+ const count = badge?.count;
159
+ const important = !!badge?.important;
160
+ const [s, setS] = useState(() => ({
161
+ count,
162
+ present,
163
+ pulse: present && important ? 1 : 0,
164
+ seen: present && important && isSelected ? 1 : 0,
165
+ cleared: false,
166
+ clearing: false,
167
+ }));
168
+ // From the last render to this one: a badge that appears or rises pulses again, unless its tab is open.
169
+ let next = s;
170
+ if (count !== s.count || present !== s.present) {
171
+ const appeared = present && !s.present;
172
+ const rose = present && s.present && (count ?? 0) > (s.count ?? 0);
173
+ const pulse = important && (appeared || rose) ? s.pulse + 1 : s.pulse;
174
+ next = { ...s, count, present, pulse, cleared: false, clearing: false };
175
+ }
176
+ if (isSelected && next.seen !== next.pulse)
177
+ next = { ...next, seen: next.pulse };
178
+ if (next !== s)
179
+ setS(next);
180
+ // A rise in an important badge is announced, when Tabs asks for it.
181
+ const lastCount = useRef(count);
182
+ useEffect(() => {
183
+ if (important &&
184
+ present &&
185
+ count != null &&
186
+ lastCount.current != null &&
187
+ count > lastCount.current)
188
+ shared.announce(fill(shared.labels.badgeRise, { name, badge: badge?.label ?? '' }));
189
+ lastCount.current = count;
190
+ });
191
+ // Clear on open: it fades after a moment, is gone at 1s, and the app is told. Leaving the tab doesn't stop it.
192
+ const clearable = present && !!badge?.clearOnOpen && !next.cleared;
193
+ const timer = useRef(undefined);
194
+ const onClear = useRef(shared.onBadgeClear);
195
+ useEffect(() => {
196
+ onClear.current = shared.onBadgeClear;
197
+ });
198
+ useEffect(() => {
199
+ if (!isSelected || !clearable || timer.current)
200
+ return;
201
+ setS((p) => ({ ...p, clearing: true }));
202
+ timer.current = setTimeout(() => {
203
+ timer.current = undefined;
204
+ setS((p) => ({ ...p, clearing: false, cleared: true }));
205
+ onClear.current?.(id);
206
+ }, 1000);
207
+ }, [isSelected, clearable, id]);
208
+ useEffect(() => () => clearTimeout(timer.current), []);
209
+ return {
210
+ shown: present && !next.cleared,
211
+ pulse: next.pulse,
212
+ pulsing: important && !isSelected && next.seen !== next.pulse,
213
+ clearing: next.clearing,
214
+ };
215
+ }
216
+ function BadgeMark({ badge, inline, pulse, pulsing, clearing, returning, }) {
217
+ const dot = !!badge.dot && badge.count == null;
218
+ return (_jsx("span", { "aria-hidden": "true", "data-place": inline ? 'inline' : 'pinned', "data-dot": dot ? '' : undefined, "data-important": badge.important ? '' : undefined, "data-pulse": pulsing ? '' : undefined, "data-clearing": clearing ? '' : undefined, "data-returning": returning && !pulsing ? '' : undefined, className: "tabs-badge", children: dot ? null : (badge.count ?? 0) > 99 ? '99+' : badge.count }, pulse));
19
219
  }
220
+ // ---------------------------------------------------------------- tooltips
20
221
  /**
21
- * A tab in three layers. The tab is the target (Layer 1), at least --target-min both ways. The painted tab
22
- * inside it (Layer 2) takes the hover ground and the focus ring, and the selected one is bold with a brand bar on
23
- * the rule: weight and the bar, never colour alone. The bar is the brand colour, which clears 3:1 against every
24
- * surface because it is also the focus ring.
222
+ * Hover: after 500ms, or at once if a tooltip is open or closed in the last 500ms; it closes 120ms after the
223
+ * pointer leaves, and the pointer can move onto it (it sits inside the tab, over an 8px bridge). Keyboard focus:
224
+ * at once. A press closes it, and touch never opens it (React Aria's hover ignores touch).
25
225
  */
26
- export function Tab({ className, visualClassName, children, ...props }) {
27
- return (_jsx(RACTab, { ...props, className: cn('group/tab relative -mb-px inline-flex min-h-target min-w-target cursor-pointer items-stretch outline-none data-disabled:cursor-not-allowed', className), children: composeRenderProps(children, (kids) => (_jsx("span", { className: cn('inline-flex h-control items-center gap-2 rounded-t-md border-b-[3px] border-transparent px-(--control-pad-x) text-sm font-medium whitespace-nowrap text-muted-foreground', 'group-data-hovered/tab:bg-accent group-data-hovered/tab:text-foreground group-data-focus-visible/tab:focus-ring-inset', 'group-data-selected/tab:border-brand group-data-selected/tab:font-bold group-data-selected/tab:text-foreground', 'group-data-disabled/tab:opacity-50', visualClassName), children: kids }))) }));
226
+ function useTip(id, allowed) {
227
+ const { tip, setTip, closeTip, tipClosed } = useShared();
228
+ const open = tip === id;
229
+ const timer = useRef(undefined);
230
+ const pressed = useRef(false);
231
+ const focused = useRef(false);
232
+ useEffect(() => () => clearTimeout(timer.current), []);
233
+ useEffect(() => {
234
+ if (!allowed && open)
235
+ closeTip(id);
236
+ }, [allowed, open, closeTip, id]);
237
+ const handlers = {
238
+ onHoverStart: (e) => {
239
+ if (e.pointerType !== 'mouse' || pressed.current || !allowed)
240
+ return;
241
+ clearTimeout(timer.current);
242
+ if (tip != null || Date.now() - tipClosed.current < 500)
243
+ setTip(id);
244
+ else
245
+ timer.current = setTimeout(() => setTip(id), 500);
246
+ },
247
+ onHoverEnd: () => {
248
+ pressed.current = false;
249
+ clearTimeout(timer.current);
250
+ if (!focused.current)
251
+ timer.current = setTimeout(() => closeTip(id), 120);
252
+ },
253
+ onFocus: (e) => {
254
+ if (!allowed || !e.target.matches(':focus-visible'))
255
+ return;
256
+ focused.current = true;
257
+ clearTimeout(timer.current);
258
+ setTip(id);
259
+ },
260
+ onBlur: () => {
261
+ focused.current = false;
262
+ clearTimeout(timer.current);
263
+ closeTip(id);
264
+ },
265
+ onPressStart: (e) => {
266
+ if (e.pointerType === 'keyboard')
267
+ return;
268
+ pressed.current = true;
269
+ clearTimeout(timer.current);
270
+ closeTip(id);
271
+ },
272
+ };
273
+ return { open: open && allowed, handlers };
28
274
  }
29
275
  /**
30
276
  * A tab's content. With nothing focusable inside, React Aria makes the panel itself a tab stop so a keyboard
31
277
  * reaches it after the tabs; it shows the focus ring then. Positioned, so hidden text inside it is placed against
32
- * it.
278
+ * it. It comes in from the side the selection moved towards (a fade alone at AAA).
33
279
  */
34
- export function TabPanel({ className, ...props }) {
35
- return (_jsx(RACTabPanel, { ...props, className: cn('relative rounded-md outline-none data-focus-visible:focus-ring', className) }));
280
+ export function TabPanel({ className, id, ...props }) {
281
+ const { hiddenPanels } = useShared();
282
+ const travel = useContext(TravelContext);
283
+ const state = useContext(TabListStateContext);
284
+ const selected = state?.selectedKey === id;
285
+ const [visited, setVisited] = useState(false);
286
+ if (selected && !visited)
287
+ setVisited(true);
288
+ const panel = (_jsx(RACTabPanel, { ...props, id: id, shouldForceMount: hiddenPanels !== 'unmount', "data-travel": selected && travel.moved ? travel.direction : undefined, className: cn('tabs-panel relative rounded-md outline-none data-focus-visible:focus-ring data-inert:hidden', className) }));
289
+ if (hiddenPanels === 'unmount')
290
+ return panel;
291
+ if (!selected && hiddenPanels === 'visited' && !visited)
292
+ return null;
293
+ return _jsx(Activity, { mode: selected ? 'visible' : 'hidden', children: panel });
36
294
  }
37
295
  //# sourceMappingURL=tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/ui/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,kBAAkB,EAClB,GAAG,IAAI,MAAM,EACb,OAAO,IAAI,UAAU,EACrB,QAAQ,IAAI,WAAW,EACvB,IAAI,IAAI,OAAO,GAKhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAMlC;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAa;IACrD,OAAO,KAAC,OAAO,OAAK,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,GAAI,CAAC;AACjF,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAmB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAmB;IAChF,OAAO,CACL,KAAC,UAAU,OACL,KAAK,EACT,SAAS,EAAE,EAAE,CAAC,+CAA+C,EAAE,SAAS,CAAC,GACzE,CACH,CAAC;AACJ,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAY;IAC9E,OAAO,CACL,KAAC,MAAM,OACD,KAAK,EACT,SAAS,EAAE,EAAE,CACX,4IAA4I,EAC5I,SAAS,CACV,YAEA,kBAAkB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CACtC,eACE,SAAS,EAAE,EAAE,CACX,0KAA0K,EAC1K,uHAAuH,EACvH,gHAAgH,EAChH,oCAAoC,EACpC,eAAe,CAChB,YAEA,IAAI,GACA,CACR,CAAC,GACK,CACV,CAAC;AACJ,CAAC;AAMD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAiB;IAC7D,OAAO,CACL,KAAC,WAAW,OACN,KAAK,EACT,SAAS,EAAE,EAAE,CAAC,gEAAgE,EAAE,SAAS,CAAC,GAC1F,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/ui/tabs.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"time-of-day-icon.d.ts","sourceRoot":"","sources":["../../src/ui/time-of-day-icon.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG7C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,IAAiB,GAAG,SAAS,CAK5D;AAED,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IACnF,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,+BAsEhF"}
1
+ {"version":3,"file":"time-of-day-icon.d.ts","sourceRoot":"","sources":["../../src/ui/time-of-day-icon.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG7C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,IAAiB,GAAG,SAAS,CAK5D;AAED,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;IACnF,MAAM,EAAE,SAAS,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,+BAoFhF"}
@@ -1 +1 @@
1
- {"version":3,"file":"time-of-day-icon.js","sourceRoot":"","sources":["../../src/ui/time-of-day-icon.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"time-of-day-icon.js","sourceRoot":"","sources":["../../src/ui/time-of-day-icon.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type ToolbarProps as RACToolbarProps } from 'react-aria-components';
2
+ export interface ToolbarProps extends Omit<RACToolbarProps, 'className' | 'aria-label'> {
3
+ /** Required: what the buttons act on, such as "Fixtures actions". */
4
+ 'aria-label': string;
5
+ className?: string;
6
+ }
7
+ /**
8
+ * A row of buttons that act on one thing: a block on a canvas, a selection, a rich text field. React Aria's
9
+ * Toolbar, so it is one stop in the tab order: ← → (↑ ↓ when vertical) move between its buttons, Home and End go to
10
+ * the ends, and Tab leaves it. It wraps instead of overflowing, so nothing is cut off at 320px (1.4.10); a toolbar
11
+ * that would wrap onto more than two lines should move its less-used commands into a `MenuTrigger` at its end.
12
+ * Buttons inside it are ordinary `IconButton`s and `Button`s, at least `--target-min` square, `--control-gap`
13
+ * apart. A button that can't act right now (Move up on the first block) is better left enabled with
14
+ * `aria-disabled="true"` and a reason in its description than `isDisabled`: React Aria skips disabled buttons,
15
+ * so a button that disables itself while focused would drop focus.
16
+ */
17
+ export declare function Toolbar({ className, orientation, ...props }: ToolbarProps): import("react").JSX.Element;
18
+ /** A line between groups of buttons in a Toolbar. Decorative to sight, a separator to a screen reader. */
19
+ export declare function ToolbarSeparator({ className }: {
20
+ className?: string;
21
+ }): import("react").JSX.Element;
22
+ //# sourceMappingURL=toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../src/ui/toolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,YAAY,IAAI,eAAe,EACrC,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,YAAY,CAAC;IACrF,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,EAAE,SAAS,EAAE,WAA0B,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,+BAWxF;AAED,0GAA0G;AAC1G,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAOrE"}
@@ -0,0 +1,22 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Separator as RACSeparator, Toolbar as RACToolbar, } from 'react-aria-components';
4
+ import { cn } from '../lib/cn.js';
5
+ /**
6
+ * A row of buttons that act on one thing: a block on a canvas, a selection, a rich text field. React Aria's
7
+ * Toolbar, so it is one stop in the tab order: ← → (↑ ↓ when vertical) move between its buttons, Home and End go to
8
+ * the ends, and Tab leaves it. It wraps instead of overflowing, so nothing is cut off at 320px (1.4.10); a toolbar
9
+ * that would wrap onto more than two lines should move its less-used commands into a `MenuTrigger` at its end.
10
+ * Buttons inside it are ordinary `IconButton`s and `Button`s, at least `--target-min` square, `--control-gap`
11
+ * apart. A button that can't act right now (Move up on the first block) is better left enabled with
12
+ * `aria-disabled="true"` and a reason in its description than `isDisabled`: React Aria skips disabled buttons,
13
+ * so a button that disables itself while focused would drop focus.
14
+ */
15
+ export function Toolbar({ className, orientation = 'horizontal', ...props }) {
16
+ return (_jsx(RACToolbar, { orientation: orientation, ...props, className: cn('flex flex-wrap items-center gap-(--control-gap) outline-none aria-[orientation=vertical]:flex-col', className) }));
17
+ }
18
+ /** A line between groups of buttons in a Toolbar. Decorative to sight, a separator to a screen reader. */
19
+ export function ToolbarSeparator({ className }) {
20
+ return (_jsx(RACSeparator, { orientation: "vertical", className: cn('mx-0.5 h-6 w-px self-center bg-border', className) }));
21
+ }
22
+ //# sourceMappingURL=toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../../src/ui/toolbar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,SAAS,IAAI,YAAY,EACzB,OAAO,IAAI,UAAU,GAEtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAQlC;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW,GAAG,YAAY,EAAE,GAAG,KAAK,EAAgB;IACvF,OAAO,CACL,KAAC,UAAU,IACT,WAAW,EAAE,WAAW,KACpB,KAAK,EACT,SAAS,EAAE,EAAE,CACX,mGAAmG,EACnG,SAAS,CACV,GACD,CACH,CAAC;AACJ,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,gBAAgB,CAAC,EAAE,SAAS,EAA0B;IACpE,OAAO,CACL,KAAC,YAAY,IACX,WAAW,EAAC,UAAU,EACtB,SAAS,EAAE,EAAE,CAAC,uCAAuC,EAAE,SAAS,CAAC,GACjE,CACH,CAAC;AACJ,CAAC"}