@orianatech/pire 0.16.0 → 0.18.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/data/DataTable.d.cts +36 -1
- package/dist/components/data/DataTable.d.ts +36 -1
- package/dist/components/data/DataTable.d.ts.map +1 -1
- package/dist/components/feedback/Dialog.d.cts +14 -1
- package/dist/components/feedback/Dialog.d.ts +14 -1
- package/dist/components/feedback/Dialog.d.ts.map +1 -1
- package/dist/components/feedback/Tooltip.d.cts +14 -2
- package/dist/components/feedback/Tooltip.d.ts +14 -2
- package/dist/components/feedback/Tooltip.d.ts.map +1 -1
- package/dist/components/layout/SplitPane.d.cts +34 -0
- package/dist/components/layout/SplitPane.d.ts +35 -0
- package/dist/components/layout/SplitPane.d.ts.map +1 -0
- package/dist/components.css +47 -0
- package/dist/i18n/messages.d.cts +8 -0
- package/dist/i18n/messages.d.ts +8 -0
- package/dist/i18n/messages.d.ts.map +1 -1
- package/dist/index.cjs +253 -133
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +249 -134
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,12 +7,28 @@ export interface DataTableColumn<T = any> {
|
|
|
7
7
|
/** Right-aligns and switches to tabular mono. Use for every amount, quantity and ID. */
|
|
8
8
|
numeric?: boolean;
|
|
9
9
|
sortable?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Keeps `label` for assistive tech but not on screen. For a utility column — a disclosure or
|
|
12
|
+
* row-action column — where a visible header is noise. An *empty* label is not the answer: a
|
|
13
|
+
* header with no text leaves its column unnamed for anyone using a screen reader.
|
|
14
|
+
*/
|
|
15
|
+
hideLabel?: boolean;
|
|
10
16
|
render?: (row: T) => React.ReactNode;
|
|
11
17
|
}
|
|
12
18
|
export interface DataTableSort {
|
|
13
19
|
key: string;
|
|
14
20
|
dir: 'asc' | 'desc';
|
|
15
21
|
}
|
|
22
|
+
export interface DataTableRowProps {
|
|
23
|
+
/** Extra class on the `<tr>`. */
|
|
24
|
+
className?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Greys the row and takes it out of selection and row actions. Use it when a row is present for
|
|
27
|
+
* context but cannot be acted on — and pair it with a cell that says *why*, since a greyed row
|
|
28
|
+
* on its own does not explain itself.
|
|
29
|
+
*/
|
|
30
|
+
isDisabled?: boolean;
|
|
31
|
+
}
|
|
16
32
|
export interface DataTableProps<T extends {
|
|
17
33
|
id: string | number;
|
|
18
34
|
} = any> {
|
|
@@ -29,6 +45,25 @@ export interface DataTableProps<T extends {
|
|
|
29
45
|
onSortChange?: (sort: DataTableSort) => void;
|
|
30
46
|
onRowAction?: (row: T) => void;
|
|
31
47
|
emptyLabel?: React.ReactNode;
|
|
48
|
+
/**
|
|
49
|
+
* Summary cells keyed by column, rendered in a real `<tfoot>`.
|
|
50
|
+
*
|
|
51
|
+
* Keyed rather than free-form so a total sits under the column it totals, and stays there when
|
|
52
|
+
* columns are reordered or resized. Columns missing from the map get an empty cell. Hidden while
|
|
53
|
+
* `isLoading`, since a total from the previous response next to skeleton rows reads as current.
|
|
54
|
+
*/
|
|
55
|
+
footer?: Record<string, React.ReactNode>;
|
|
56
|
+
/** Per-row presentation and interactivity. Called for every row on every render — keep it cheap. */
|
|
57
|
+
rowProps?: (row: T) => DataTableRowProps;
|
|
58
|
+
/**
|
|
59
|
+
* Detail rendered in a full-width row beneath its parent, for the rows named by `expandedIds`.
|
|
60
|
+
*
|
|
61
|
+
* Expansion is controlled: put the trigger in a column's `render` and track the ids yourself.
|
|
62
|
+
* The table has no opinion on what opens a row, because the affordance differs per screen.
|
|
63
|
+
*/
|
|
64
|
+
renderExpanded?: (row: T) => React.ReactNode;
|
|
65
|
+
/** Ids whose `renderExpanded` content is currently shown. */
|
|
66
|
+
expandedIds?: Array<string | number>;
|
|
32
67
|
/** Swaps the body for skeleton rows derived from `columns` and `density`, keeping the header. */
|
|
33
68
|
isLoading?: boolean;
|
|
34
69
|
/** Skeleton row count. Defaults to the current `rows` length, or 5 when there are none. */
|
|
@@ -43,4 +78,4 @@ export interface DataTableProps<T extends {
|
|
|
43
78
|
* screen-reader row/column announcements — do not hand-roll a <table> in product code. */
|
|
44
79
|
export declare function DataTable<T extends {
|
|
45
80
|
id: string | number;
|
|
46
|
-
}>({ columns, rows, density, selectable, selected, onSelectionChange, sort, onSortChange, onRowAction, stickyHeader, emptyLabel, isLoading, loadingRowCount, loadingLabel, className, style, ...rest }: DataTableProps<T>): React.JSX.Element;
|
|
81
|
+
}>({ columns, rows, density, selectable, selected, onSelectionChange, sort, onSortChange, onRowAction, stickyHeader, emptyLabel, isLoading, loadingRowCount, loadingLabel, footer, rowProps, renderExpanded, expandedIds, className, style, ...rest }: DataTableProps<T>): React.JSX.Element;
|
|
@@ -7,12 +7,28 @@ export interface DataTableColumn<T = any> {
|
|
|
7
7
|
/** Right-aligns and switches to tabular mono. Use for every amount, quantity and ID. */
|
|
8
8
|
numeric?: boolean;
|
|
9
9
|
sortable?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Keeps `label` for assistive tech but not on screen. For a utility column — a disclosure or
|
|
12
|
+
* row-action column — where a visible header is noise. An *empty* label is not the answer: a
|
|
13
|
+
* header with no text leaves its column unnamed for anyone using a screen reader.
|
|
14
|
+
*/
|
|
15
|
+
hideLabel?: boolean;
|
|
10
16
|
render?: (row: T) => React.ReactNode;
|
|
11
17
|
}
|
|
12
18
|
export interface DataTableSort {
|
|
13
19
|
key: string;
|
|
14
20
|
dir: 'asc' | 'desc';
|
|
15
21
|
}
|
|
22
|
+
export interface DataTableRowProps {
|
|
23
|
+
/** Extra class on the `<tr>`. */
|
|
24
|
+
className?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Greys the row and takes it out of selection and row actions. Use it when a row is present for
|
|
27
|
+
* context but cannot be acted on — and pair it with a cell that says *why*, since a greyed row
|
|
28
|
+
* on its own does not explain itself.
|
|
29
|
+
*/
|
|
30
|
+
isDisabled?: boolean;
|
|
31
|
+
}
|
|
16
32
|
export interface DataTableProps<T extends {
|
|
17
33
|
id: string | number;
|
|
18
34
|
} = any> {
|
|
@@ -29,6 +45,25 @@ export interface DataTableProps<T extends {
|
|
|
29
45
|
onSortChange?: (sort: DataTableSort) => void;
|
|
30
46
|
onRowAction?: (row: T) => void;
|
|
31
47
|
emptyLabel?: React.ReactNode;
|
|
48
|
+
/**
|
|
49
|
+
* Summary cells keyed by column, rendered in a real `<tfoot>`.
|
|
50
|
+
*
|
|
51
|
+
* Keyed rather than free-form so a total sits under the column it totals, and stays there when
|
|
52
|
+
* columns are reordered or resized. Columns missing from the map get an empty cell. Hidden while
|
|
53
|
+
* `isLoading`, since a total from the previous response next to skeleton rows reads as current.
|
|
54
|
+
*/
|
|
55
|
+
footer?: Record<string, React.ReactNode>;
|
|
56
|
+
/** Per-row presentation and interactivity. Called for every row on every render — keep it cheap. */
|
|
57
|
+
rowProps?: (row: T) => DataTableRowProps;
|
|
58
|
+
/**
|
|
59
|
+
* Detail rendered in a full-width row beneath its parent, for the rows named by `expandedIds`.
|
|
60
|
+
*
|
|
61
|
+
* Expansion is controlled: put the trigger in a column's `render` and track the ids yourself.
|
|
62
|
+
* The table has no opinion on what opens a row, because the affordance differs per screen.
|
|
63
|
+
*/
|
|
64
|
+
renderExpanded?: (row: T) => React.ReactNode;
|
|
65
|
+
/** Ids whose `renderExpanded` content is currently shown. */
|
|
66
|
+
expandedIds?: Array<string | number>;
|
|
32
67
|
/** Swaps the body for skeleton rows derived from `columns` and `density`, keeping the header. */
|
|
33
68
|
isLoading?: boolean;
|
|
34
69
|
/** Skeleton row count. Defaults to the current `rows` length, or 5 when there are none. */
|
|
@@ -43,5 +78,5 @@ export interface DataTableProps<T extends {
|
|
|
43
78
|
* screen-reader row/column announcements — do not hand-roll a <table> in product code. */
|
|
44
79
|
export declare function DataTable<T extends {
|
|
45
80
|
id: string | number;
|
|
46
|
-
}>({ columns, rows, density, selectable, selected, onSelectionChange, sort, onSortChange, onRowAction, stickyHeader, emptyLabel, isLoading, loadingRowCount, loadingLabel, className, style, ...rest }: DataTableProps<T>): React.JSX.Element;
|
|
81
|
+
}>({ columns, rows, density, selectable, selected, onSelectionChange, sort, onSortChange, onRowAction, stickyHeader, emptyLabel, isLoading, loadingRowCount, loadingLabel, footer, rowProps, renderExpanded, expandedIds, className, style, ...rest }: DataTableProps<T>): React.JSX.Element;
|
|
47
82
|
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AASpC,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE;AAEnE,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,GAAG;IACrE,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,oEAAoE;IACpE,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAClC,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IAC1D,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,iGAAiG;IACjG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2FAA2F;IAC3F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;2FAC2F;AAC3F,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAmB,EAC/F,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,YAAmB,EAC7F,UAAoD,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAC9F,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface DialogSlotProps {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
/** The dialog's heading. Wires itself to the dialog's accessible name through React Aria's
|
|
7
|
+
* `slot="title"`, which is why it cannot be replaced by a bare heading element. */
|
|
8
|
+
export declare function DialogTitle({ children, className }: DialogSlotProps): React.JSX.Element;
|
|
9
|
+
/** One line under the title. Say what the action affects, not what the button is called. */
|
|
10
|
+
export declare function DialogDescription({ children, className }: DialogSlotProps): React.JSX.Element;
|
|
11
|
+
/** The scrollable middle. Omit it entirely when the title and description say everything. */
|
|
12
|
+
export declare function DialogBody({ children, className }: DialogSlotProps): React.JSX.Element;
|
|
13
|
+
/** The action row. Cancel first, the commit or destructive action last. */
|
|
14
|
+
export declare function DialogActions({ children, className }: DialogSlotProps): React.JSX.Element;
|
|
2
15
|
export interface DialogProps {
|
|
3
16
|
isOpen?: boolean;
|
|
4
17
|
onOpenChange?: (open: boolean) => void;
|
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface DialogSlotProps {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
/** The dialog's heading. Wires itself to the dialog's accessible name through React Aria's
|
|
7
|
+
* `slot="title"`, which is why it cannot be replaced by a bare heading element. */
|
|
8
|
+
export declare function DialogTitle({ children, className }: DialogSlotProps): React.JSX.Element;
|
|
9
|
+
/** One line under the title. Say what the action affects, not what the button is called. */
|
|
10
|
+
export declare function DialogDescription({ children, className }: DialogSlotProps): React.JSX.Element;
|
|
11
|
+
/** The scrollable middle. Omit it entirely when the title and description say everything. */
|
|
12
|
+
export declare function DialogBody({ children, className }: DialogSlotProps): React.JSX.Element;
|
|
13
|
+
/** The action row. Cancel first, the commit or destructive action last. */
|
|
14
|
+
export declare function DialogActions({ children, className }: DialogSlotProps): React.JSX.Element;
|
|
2
15
|
export interface DialogProps {
|
|
3
16
|
isOpen?: boolean;
|
|
4
17
|
onOpenChange?: (open: boolean) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;oFACoF;AACpF,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,qBAEnE;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,qBAEzE;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,qBAElE;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,qBAErE;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,mEAAmE;IACnE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,oEAAoE;IACpE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,yFAAyF;IACzF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED;0DAC0D;AAC1D,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EACvF,IAAW,EAAE,aAAoB,EAAE,SAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,WAAW,qBAwDrF"}
|
|
@@ -1,11 +1,23 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
export interface TooltipProps {
|
|
3
3
|
/** Short clarifying text — never the only source of an instruction. */
|
|
4
4
|
label: React.ReactNode;
|
|
5
5
|
placement?: 'top' | 'bottom' | 'left' | 'right';
|
|
6
6
|
/** Hover delay in ms. Keyboard focus always shows it immediately. */
|
|
7
7
|
delay?: number;
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Anything — a Button, a Badge, a span, plain text.
|
|
10
|
+
*
|
|
11
|
+
* A child that cannot take focus on its own is made focusable for you. That is the point: a
|
|
12
|
+
* tooltip on something unreachable by keyboard is invisible to anyone not using a mouse, and it
|
|
13
|
+
* fails silently — a dead tooltip is indistinguishable from a live one until somebody hovers it.
|
|
14
|
+
*/
|
|
9
15
|
children: React.ReactNode;
|
|
10
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Explains something without adding a step. Shows on hover after `delay`, and immediately on
|
|
19
|
+
* keyboard focus.
|
|
20
|
+
*
|
|
21
|
+
* Never put an instruction here that is not available elsewhere: there is no hover on touch.
|
|
22
|
+
*/
|
|
11
23
|
export declare function Tooltip({ label, placement, delay, children }: TooltipProps): React.JSX.Element;
|
|
@@ -1,12 +1,24 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
export interface TooltipProps {
|
|
3
3
|
/** Short clarifying text — never the only source of an instruction. */
|
|
4
4
|
label: React.ReactNode;
|
|
5
5
|
placement?: 'top' | 'bottom' | 'left' | 'right';
|
|
6
6
|
/** Hover delay in ms. Keyboard focus always shows it immediately. */
|
|
7
7
|
delay?: number;
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Anything — a Button, a Badge, a span, plain text.
|
|
10
|
+
*
|
|
11
|
+
* A child that cannot take focus on its own is made focusable for you. That is the point: a
|
|
12
|
+
* tooltip on something unreachable by keyboard is invisible to anyone not using a mouse, and it
|
|
13
|
+
* fails silently — a dead tooltip is indistinguishable from a live one until somebody hovers it.
|
|
14
|
+
*/
|
|
9
15
|
children: React.ReactNode;
|
|
10
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Explains something without adding a step. Shows on hover after `delay`, and immediately on
|
|
19
|
+
* keyboard focus.
|
|
20
|
+
*
|
|
21
|
+
* Never put an instruction here that is not available elsewhere: there is no hover on touch.
|
|
22
|
+
*/
|
|
11
23
|
export declare function Tooltip({ label, placement, delay, children }: TooltipProps): React.JSX.Element;
|
|
12
24
|
//# sourceMappingURL=Tooltip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/components/feedback/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,SAAiB,EAAE,KAAW,EAAE,QAAQ,EAAE,EAAE,YAAY,qBAwBxF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
export interface SplitPaneProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
3
|
+
/** The narrow column: a list of records, kept in view while one of them is read. */
|
|
4
|
+
list: React.ReactNode;
|
|
5
|
+
/** The wide column. Leave it out when nothing is selected — `emptyDetail` fills the space. */
|
|
6
|
+
detail?: React.ReactNode;
|
|
7
|
+
/** Width of the list column. A number is pixels. */
|
|
8
|
+
listWidth?: number | string;
|
|
9
|
+
/** Names the list region for assistive tech. Both panes are landmarks, so both want a name. */
|
|
10
|
+
listLabel?: string;
|
|
11
|
+
detailLabel?: string;
|
|
12
|
+
/** Shown in place of the detail column when there is no `detail`. */
|
|
13
|
+
emptyDetail?: React.ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* Returns to the list on a narrow container, where only one column fits at a time.
|
|
16
|
+
*
|
|
17
|
+
* Without it a narrow layout can reach the detail and never leave it, so pass it whenever the
|
|
18
|
+
* pane can be seen on a small screen.
|
|
19
|
+
*/
|
|
20
|
+
onBack?: () => void;
|
|
21
|
+
backLabel?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Two columns that live side by side and scroll independently — a list on the left, the selected
|
|
25
|
+
* record on the right.
|
|
26
|
+
*
|
|
27
|
+
* Distinct from `SidePanel`, which is an overlay: this one is a layout, the panes coexist, and
|
|
28
|
+
* nothing is dismissed to get back to the list.
|
|
29
|
+
*
|
|
30
|
+
* It fills the box it is given and owns the scrolling inside it, so give it a parent with a
|
|
31
|
+
* definite height and no padding of its own. A wrapper that scrolls as well produces two nested
|
|
32
|
+
* scrollbars, which is the usual way this pattern goes wrong.
|
|
33
|
+
*/
|
|
34
|
+
export declare function SplitPane({ list, detail, listWidth, listLabel, detailLabel, emptyDetail, onBack, backLabel, className, style, ...rest }: SplitPaneProps): React.JSX.Element;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
export interface SplitPaneProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
3
|
+
/** The narrow column: a list of records, kept in view while one of them is read. */
|
|
4
|
+
list: React.ReactNode;
|
|
5
|
+
/** The wide column. Leave it out when nothing is selected — `emptyDetail` fills the space. */
|
|
6
|
+
detail?: React.ReactNode;
|
|
7
|
+
/** Width of the list column. A number is pixels. */
|
|
8
|
+
listWidth?: number | string;
|
|
9
|
+
/** Names the list region for assistive tech. Both panes are landmarks, so both want a name. */
|
|
10
|
+
listLabel?: string;
|
|
11
|
+
detailLabel?: string;
|
|
12
|
+
/** Shown in place of the detail column when there is no `detail`. */
|
|
13
|
+
emptyDetail?: React.ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* Returns to the list on a narrow container, where only one column fits at a time.
|
|
16
|
+
*
|
|
17
|
+
* Without it a narrow layout can reach the detail and never leave it, so pass it whenever the
|
|
18
|
+
* pane can be seen on a small screen.
|
|
19
|
+
*/
|
|
20
|
+
onBack?: () => void;
|
|
21
|
+
backLabel?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Two columns that live side by side and scroll independently — a list on the left, the selected
|
|
25
|
+
* record on the right.
|
|
26
|
+
*
|
|
27
|
+
* Distinct from `SidePanel`, which is an overlay: this one is a layout, the panes coexist, and
|
|
28
|
+
* nothing is dismissed to get back to the list.
|
|
29
|
+
*
|
|
30
|
+
* It fills the box it is given and owns the scrolling inside it, so give it a parent with a
|
|
31
|
+
* definite height and no padding of its own. A wrapper that scrolls as well produces two nested
|
|
32
|
+
* scrollbars, which is the usual way this pattern goes wrong.
|
|
33
|
+
*/
|
|
34
|
+
export declare function SplitPane({ list, detail, listWidth, listLabel, detailLabel, emptyDetail, onBack, backLabel, className, style, ...rest }: SplitPaneProps): React.JSX.Element;
|
|
35
|
+
//# sourceMappingURL=SplitPane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SplitPane.d.ts","sourceRoot":"","sources":["../../../src/components/layout/SplitPane.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAKpC,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzF,oFAAoF;IACpF,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAmB,EAAE,SAAS,EAAE,WAAW,EACnF,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,qBAsB5E"}
|
package/dist/components.css
CHANGED
|
@@ -283,6 +283,10 @@
|
|
|
283
283
|
.pire-progress[data-status="positive"] .pire-progress-fill{background:var(--status-positive-fg)}
|
|
284
284
|
.pire-progress[data-status="critical"] .pire-progress-fill{background:var(--status-critical-fg)}
|
|
285
285
|
.pire-progress[data-status="negative"] .pire-progress-fill{background:var(--status-negative-fg)}
|
|
286
|
+
/* A tooltip target takes focus so the tip is reachable by keyboard, and React Aria sets only
|
|
287
|
+
`tabindex` on it — no `data-focus-visible`. The ring therefore lives here rather than relying on
|
|
288
|
+
base.css's `[tabindex]:focus-visible`, which a consumer skipping the resets would not have. */
|
|
289
|
+
.pire-tooltip-target:focus-visible{outline:var(--focus-w) solid var(--focus-color);outline-offset:var(--focus-offset)}
|
|
286
290
|
.pire-tooltip{max-width:240px;padding:var(--sp-1) var(--sp-2);border-radius:var(--radius-1);background:var(--gray-90);color:var(--text-inverse);font:var(--type-caption);box-shadow:var(--shadow-2);animation:pire-fade-in var(--dur-fast) var(--ease-entrance)}
|
|
287
291
|
|
|
288
292
|
/* ---- Skeleton ---------------------------------------------------------- */
|
|
@@ -330,6 +334,22 @@
|
|
|
330
334
|
top-to-bottom in source order rather than relying on specificity alone. */
|
|
331
335
|
.pire-table[data-density="condensed"] .pire-th,.pire-table[data-density="condensed"] .pire-td{padding:0 var(--sp-2)}
|
|
332
336
|
.pire-table-empty{padding:var(--sp-10);text-align:center;color:var(--text-secondary)}
|
|
337
|
+
/* A disabled row is present for context but cannot be acted on. It recedes rather than
|
|
338
|
+
disappearing, and drops the pointer cue so the row does not look pressable. */
|
|
339
|
+
.pire-tr[data-disabled]{color:var(--text-disabled);cursor:default}
|
|
340
|
+
.pire-tr[data-disabled] .pire-td{color:var(--text-disabled)}
|
|
341
|
+
.pire-tr[data-disabled][data-hovered]{background:transparent}
|
|
342
|
+
/* Detail rows sit under their record and read as part of it: sunken, no bottom rule between the
|
|
343
|
+
two, and free of the fixed row height since the content decides how tall they are. */
|
|
344
|
+
.pire-tr-expanded{height:auto;background:var(--surface-sunken);border-bottom:1px solid var(--border-subtle)}
|
|
345
|
+
.pire-tr-expanded[data-hovered]{background:var(--surface-sunken)}
|
|
346
|
+
.pire-td-expanded{padding:var(--sp-3);color:var(--text-primary);white-space:normal;outline:none}
|
|
347
|
+
/* Totals. `position:sticky` keeps them in view while the body scrolls, which is the whole reason
|
|
348
|
+
they are in a <tfoot> rather than under the table. */
|
|
349
|
+
.pire-tfoot .pire-tr-footer{height:var(--row-h-regular);background:var(--surface-sunken)}
|
|
350
|
+
.pire-tf{position:sticky;bottom:0;padding:0 var(--sp-3);background:var(--surface-sunken);border-top:1px solid var(--border-default);font:var(--type-body-strong);color:var(--text-primary);white-space:nowrap;outline:none}
|
|
351
|
+
.pire-tf[data-numeric="true"]{font:var(--type-numeric);font-weight:600;font-variant-numeric:tabular-nums;text-align:right}
|
|
352
|
+
.pire-table[data-density="condensed"] .pire-td-expanded,.pire-table[data-density="condensed"] .pire-tf{padding-inline:var(--sp-2)}
|
|
333
353
|
.pire-kpi{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-4);background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-2);text-align:left;min-width:0;transition:var(--transition-surface)}
|
|
334
354
|
.pire-kpi[data-pressable="true"]{cursor:pointer}
|
|
335
355
|
.pire-kpi[data-hovered]{box-shadow:var(--shadow-2)}
|
|
@@ -722,6 +742,33 @@
|
|
|
722
742
|
command the user cannot run. */
|
|
723
743
|
.pire-menu-item[data-disabled] .pire-kbd{color:var(--text-disabled);border-color:var(--border-subtle)}
|
|
724
744
|
|
|
745
|
+
/* ---- SplitPane ---------------------------------------------------------- */
|
|
746
|
+
/* A **container** query, not a media query: this is a layout primitive that can sit inside a shell
|
|
747
|
+
with a nav rail, a dialog or a card, and the viewport width says nothing about how much room it
|
|
748
|
+
actually has. The container is named so a nested SplitPane cannot answer the outer one's query.
|
|
749
|
+
|
|
750
|
+
45rem is the width below which two columns stop being two columns — the list at its default
|
|
751
|
+
24rem plus a detail pane narrow enough to be useless. */
|
|
752
|
+
.pire-split{container-type:inline-size;container-name:pire-split;display:flex;min-height:0;height:100%;overflow:hidden;background:var(--surface-card)}
|
|
753
|
+
/* Each pane scrolls on its own. `min-height:0` on both is what lets them do that inside a flex
|
|
754
|
+
parent, which otherwise sizes them to their content and pushes the scroll up to the page. */
|
|
755
|
+
.pire-split-list{flex:0 0 var(--pire-split-list-w,24rem);min-width:0;min-height:0;overflow:auto;border-inline-end:1px solid var(--border-subtle)}
|
|
756
|
+
/* Block, not flex. As a flex column its children shrank to fit instead of overflowing, so tall
|
|
757
|
+
detail content was squashed into the pane rather than scrolling inside it. */
|
|
758
|
+
.pire-split-detail{flex:1;min-width:0;min-height:0;overflow:auto}
|
|
759
|
+
.pire-split-empty{min-height:100%;display:grid;place-items:center;padding:var(--sp-8);text-align:center;color:var(--text-secondary)}
|
|
760
|
+
/* Present in the markup at every size and revealed by the query below, so returning to the list
|
|
761
|
+
never depends on JavaScript having measured anything. */
|
|
762
|
+
.pire-split-back{display:none}
|
|
763
|
+
|
|
764
|
+
@container pire-split (max-width: 45rem){
|
|
765
|
+
/* One column at a time. Which one depends on whether there is a record to read. */
|
|
766
|
+
.pire-split-list{flex:1 1 auto;border-inline-end:0}
|
|
767
|
+
.pire-split[data-has-detail="true"] .pire-split-list{display:none}
|
|
768
|
+
.pire-split:not([data-has-detail="true"]) .pire-split-detail{display:none}
|
|
769
|
+
.pire-split-back{display:flex;flex:0 0 auto;padding:var(--sp-2);border-block-end:1px solid var(--border-subtle);background:var(--surface-card);position:sticky;top:0;z-index:1}
|
|
770
|
+
}
|
|
771
|
+
|
|
725
772
|
/* ---- CommandPalette ----------------------------------------------------- */
|
|
726
773
|
/* Anchored near the top rather than centred: the list grows downwards as it fills, and a centred
|
|
727
774
|
palette would shift its own input under the caret while the user is still typing. */
|
package/dist/i18n/messages.d.cts
CHANGED
|
@@ -21,6 +21,8 @@ export interface PireMessages {
|
|
|
21
21
|
dataTableSelectRow: string;
|
|
22
22
|
/** Announced while the table body is a skeleton. */
|
|
23
23
|
dataTableLoading: string;
|
|
24
|
+
/** Row header announced for the totals row when the first column carries no summary cell. */
|
|
25
|
+
dataTableSummaryRow: string;
|
|
24
26
|
/** Accessible name of the dialog's close affordance. */
|
|
25
27
|
dialogClose: string;
|
|
26
28
|
/** Accessible name of SidePanel's close affordance. */
|
|
@@ -78,6 +80,12 @@ export interface PireMessages {
|
|
|
78
80
|
paginationRowsPerPage: string;
|
|
79
81
|
/** Landmark name of the main SideNav. Override it when a screen has more than one nav. */
|
|
80
82
|
sideNavLabel: string;
|
|
83
|
+
/** Names SplitPane's list column. */
|
|
84
|
+
splitPaneList: string;
|
|
85
|
+
/** Names SplitPane's detail column. */
|
|
86
|
+
splitPaneDetail: string;
|
|
87
|
+
/** Returns to the list when SplitPane is narrow enough to show one column. */
|
|
88
|
+
splitPaneBack: string;
|
|
81
89
|
/** Button that opens the OS file picker. */
|
|
82
90
|
fileUploadChoose: string;
|
|
83
91
|
/** Removes one picked file. `{name}` is replaced with the file name. */
|
package/dist/i18n/messages.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface PireMessages {
|
|
|
21
21
|
dataTableSelectRow: string;
|
|
22
22
|
/** Announced while the table body is a skeleton. */
|
|
23
23
|
dataTableLoading: string;
|
|
24
|
+
/** Row header announced for the totals row when the first column carries no summary cell. */
|
|
25
|
+
dataTableSummaryRow: string;
|
|
24
26
|
/** Accessible name of the dialog's close affordance. */
|
|
25
27
|
dialogClose: string;
|
|
26
28
|
/** Accessible name of SidePanel's close affordance. */
|
|
@@ -78,6 +80,12 @@ export interface PireMessages {
|
|
|
78
80
|
paginationRowsPerPage: string;
|
|
79
81
|
/** Landmark name of the main SideNav. Override it when a screen has more than one nav. */
|
|
80
82
|
sideNavLabel: string;
|
|
83
|
+
/** Names SplitPane's list column. */
|
|
84
|
+
splitPaneList: string;
|
|
85
|
+
/** Names SplitPane's detail column. */
|
|
86
|
+
splitPaneDetail: string;
|
|
87
|
+
/** Returns to the list when SplitPane is narrow enough to show one column. */
|
|
88
|
+
splitPaneBack: string;
|
|
81
89
|
/** Button that opens the OS file picker. */
|
|
82
90
|
fileUploadChoose: string;
|
|
83
91
|
/** Removes one picked file. `{name}` is replaced with the file name. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,iBAAiB,EAAE,MAAM,CAAC;IAE1B,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oDAAoD;IACpD,gBAAgB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/i18n/messages.ts"],"names":[],"mappings":"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"}
|