@ttoss/fsl-ui 0.2.5 → 0.2.7
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/README.md +1 -1
- package/dist/components/AppShell/AppShell.cjs +8 -4
- package/dist/components/AppShell/AppShell.mjs +8 -4
- package/dist/components/Container/Container.cjs +2 -1
- package/dist/components/Container/Container.mjs +2 -1
- package/dist/components/Grid/Grid.cjs +20 -1
- package/dist/components/Grid/Grid.d.cts +5 -0
- package/dist/components/Grid/Grid.d.mts +5 -0
- package/dist/components/Grid/Grid.mjs +18 -1
- package/dist/components/Icon/Icon.cjs +2 -1
- package/dist/components/Icon/Icon.d.cts +59 -0
- package/dist/components/Icon/Icon.d.mts +59 -0
- package/dist/components/Icon/Icon.mjs +1 -1
- package/dist/components/Icon/glyphs.cjs +37 -10
- package/dist/components/Icon/glyphs.mjs +34 -10
- package/dist/components/Icon/intents.cjs +32 -0
- package/dist/components/Icon/intents.d.cts +33 -0
- package/dist/components/Icon/intents.d.mts +33 -0
- package/dist/components/Icon/intents.mjs +32 -0
- package/dist/components/Table/Table.cjs +248 -0
- package/dist/components/Table/Table.d.cts +128 -0
- package/dist/components/Table/Table.d.mts +128 -0
- package/dist/components/Table/Table.mjs +239 -0
- package/dist/components/Tabs/Tabs.cjs +70 -27
- package/dist/components/Tabs/Tabs.d.cts +0 -17
- package/dist/components/Tabs/Tabs.d.mts +0 -17
- package/dist/components/Tabs/Tabs.mjs +68 -27
- package/dist/components/Text/Text.cjs +1 -0
- package/dist/components/Text/Text.d.cts +7 -2
- package/dist/components/Text/Text.d.mts +7 -2
- package/dist/components/Text/Text.mjs +1 -0
- package/dist/index.cjs +16 -0
- package/dist/index.d.cts +4 -1
- package/dist/index.d.mts +4 -1
- package/dist/index.mjs +4 -1
- package/llms.txt +45 -9
- package/package.json +4 -4
- package/src/tokens/CONTRACT.md +5 -6
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
|
|
2
|
+
import { focusRingOutline } from "../../tokens/focusRing.mjs";
|
|
3
|
+
import { resolveInteractiveStyle } from "../../tokens/resolveInteractiveStyle.mjs";
|
|
4
|
+
import { Icon } from "../Icon/Icon.mjs";
|
|
5
|
+
import { vars } from "@ttoss/fsl-theme/vars";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { Cell, Column, Row, Table, TableBody, TableHeader } from "react-aria-components";
|
|
8
|
+
|
|
9
|
+
//#region src/components/Table/Table.tsx
|
|
10
|
+
/** Formal semantic identity — Table root (Collection entity, surface). */
|
|
11
|
+
var tableMeta = {
|
|
12
|
+
displayName: "Table",
|
|
13
|
+
entity: "Collection",
|
|
14
|
+
structure: "root"
|
|
15
|
+
};
|
|
16
|
+
/** Formal semantic identity — TableColumn header (Collection `title` role). */
|
|
17
|
+
var tableColumnMeta = {
|
|
18
|
+
displayName: "TableColumn",
|
|
19
|
+
entity: "Collection",
|
|
20
|
+
structure: "title"
|
|
21
|
+
};
|
|
22
|
+
/** Formal semantic identity — TableRow (Selection entity, selectable row). */
|
|
23
|
+
var tableRowMeta = {
|
|
24
|
+
displayName: "TableRow",
|
|
25
|
+
entity: "Selection",
|
|
26
|
+
structure: "item",
|
|
27
|
+
composition: "selection"
|
|
28
|
+
};
|
|
29
|
+
/** Formal semantic identity — TableCell (Collection `content` role). */
|
|
30
|
+
var tableCellMeta = {
|
|
31
|
+
displayName: "TableCell",
|
|
32
|
+
entity: "Collection",
|
|
33
|
+
structure: "content"
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A semantic data table built on React Aria's `Table` — column headers,
|
|
37
|
+
* keyboard grid navigation, sorting, and row selection.
|
|
38
|
+
*
|
|
39
|
+
* Per ADR-007 the CONTAINER is Entity = Collection (an `informational`
|
|
40
|
+
* surface) and each `TableRow` is Entity = Selection (`input` chrome, the
|
|
41
|
+
* `selected` State). Compose `TableHeader` + `TableColumn` for the header
|
|
42
|
+
* and `TableBody` + `TableRow` + `TableCell` for the data. Sorting is
|
|
43
|
+
* controlled via `sortDescriptor`/`onSortChange` with `allowsSorting` on the
|
|
44
|
+
* sortable columns. Row selection uses React Aria's `selectionMode`;
|
|
45
|
+
* clicking a row toggles it (there is no checkbox column yet — it ships
|
|
46
|
+
* when a consumer demands bulk actions).
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```tsx
|
|
50
|
+
* <Table aria-label="Team" sortDescriptor={sort} onSortChange={setSort}>
|
|
51
|
+
* <TableHeader>
|
|
52
|
+
* <TableColumn id="name" isRowHeader allowsSorting>Name</TableColumn>
|
|
53
|
+
* <TableColumn id="role">Role</TableColumn>
|
|
54
|
+
* </TableHeader>
|
|
55
|
+
* <TableBody>
|
|
56
|
+
* <TableRow id="ada">
|
|
57
|
+
* <TableCell>Ada Lovelace</TableCell>
|
|
58
|
+
* <TableCell>Admin</TableCell>
|
|
59
|
+
* </TableRow>
|
|
60
|
+
* </TableBody>
|
|
61
|
+
* </Table>
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
var Table$1 = props => {
|
|
65
|
+
const surface = vars.colors.informational.primary;
|
|
66
|
+
return /* @__PURE__ */jsx(Table, {
|
|
67
|
+
...props,
|
|
68
|
+
"data-scope": "table",
|
|
69
|
+
"data-part": "root",
|
|
70
|
+
style: {
|
|
71
|
+
boxSizing: "border-box",
|
|
72
|
+
inlineSize: "100%",
|
|
73
|
+
borderCollapse: "separate",
|
|
74
|
+
borderSpacing: 0,
|
|
75
|
+
borderRadius: vars.radii.surface,
|
|
76
|
+
borderWidth: vars.border.outline.surface.width,
|
|
77
|
+
borderStyle: vars.border.outline.surface.style,
|
|
78
|
+
borderColor: surface?.border?.default ?? "transparent",
|
|
79
|
+
backgroundColor: surface?.background?.default,
|
|
80
|
+
color: surface?.text?.default
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
Table$1.displayName = tableMeta.displayName;
|
|
85
|
+
/**
|
|
86
|
+
* The header row group. An internal frame part — place `TableColumn`s
|
|
87
|
+
* inside it.
|
|
88
|
+
*/
|
|
89
|
+
var TableHeader$1 = props => {
|
|
90
|
+
return /* @__PURE__ */jsx(TableHeader, {
|
|
91
|
+
...props,
|
|
92
|
+
"data-scope": "table",
|
|
93
|
+
"data-part": "header"
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
TableHeader$1.displayName = "TableHeader";
|
|
97
|
+
/**
|
|
98
|
+
* A column header (Collection `title` role). With `allowsSorting`, React
|
|
99
|
+
* Aria makes it a keyboard-operable sort control (`aria-sort` included) and
|
|
100
|
+
* the current direction renders as an arrow Icon
|
|
101
|
+
* (`action.sortAscending` / `action.sortDescending`).
|
|
102
|
+
*
|
|
103
|
+
* Set `isRowHeader` on the column whose cells name the row for assistive
|
|
104
|
+
* technology.
|
|
105
|
+
*/
|
|
106
|
+
var TableColumn = ({
|
|
107
|
+
children,
|
|
108
|
+
...props
|
|
109
|
+
}) => {
|
|
110
|
+
const colors = vars.colors.informational.muted;
|
|
111
|
+
return /* @__PURE__ */jsx(Column, {
|
|
112
|
+
...props,
|
|
113
|
+
"data-scope": "table",
|
|
114
|
+
"data-part": "title",
|
|
115
|
+
style: ({
|
|
116
|
+
allowsSorting,
|
|
117
|
+
isHovered,
|
|
118
|
+
isFocusVisible
|
|
119
|
+
}) => {
|
|
120
|
+
return {
|
|
121
|
+
boxSizing: "border-box",
|
|
122
|
+
textAlign: "start",
|
|
123
|
+
paddingBlock: vars.spacing.inset.control.sm,
|
|
124
|
+
paddingInline: vars.spacing.inset.control.md,
|
|
125
|
+
...vars.text.label.sm,
|
|
126
|
+
cursor: allowsSorting ? "pointer" : void 0,
|
|
127
|
+
transitionProperty: "color",
|
|
128
|
+
transitionDuration: vars.motion.feedback.duration,
|
|
129
|
+
transitionTimingFunction: vars.motion.feedback.easing,
|
|
130
|
+
color: allowsSorting ? resolveInteractiveStyle(colors?.text, {
|
|
131
|
+
isHovered
|
|
132
|
+
}) : colors?.text?.default,
|
|
133
|
+
borderBlockEndWidth: vars.border.divider.width,
|
|
134
|
+
borderBlockEndStyle: vars.border.divider.style,
|
|
135
|
+
borderBlockEndColor: colors?.border?.default ?? "transparent",
|
|
136
|
+
outline: focusRingOutline(isFocusVisible),
|
|
137
|
+
outlineOffset: "-2px"
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
children: ({
|
|
141
|
+
allowsSorting,
|
|
142
|
+
sortDirection
|
|
143
|
+
}) => {
|
|
144
|
+
return /* @__PURE__ */jsxs("span", {
|
|
145
|
+
style: {
|
|
146
|
+
display: "inline-flex",
|
|
147
|
+
alignItems: "center",
|
|
148
|
+
gap: vars.spacing.gap.inline.sm
|
|
149
|
+
},
|
|
150
|
+
children: [children, allowsSorting && sortDirection && /* @__PURE__ */jsx(Icon, {
|
|
151
|
+
intent: sortDirection === "ascending" ? "action.sortAscending" : "action.sortDescending",
|
|
152
|
+
size: "sm"
|
|
153
|
+
})]
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
TableColumn.displayName = tableColumnMeta.displayName;
|
|
159
|
+
/** The data row group. An internal frame part — place `TableRow`s inside. */
|
|
160
|
+
var TableBody$1 = props => {
|
|
161
|
+
return /* @__PURE__ */jsx(TableBody, {
|
|
162
|
+
...props,
|
|
163
|
+
"data-scope": "table",
|
|
164
|
+
"data-part": "body"
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
TableBody$1.displayName = "TableBody";
|
|
168
|
+
/**
|
|
169
|
+
* A single data row. Entity = Selection → reads `vars.colors.input.*` and
|
|
170
|
+
* surfaces the `selected` State when the parent Table has a `selectionMode`.
|
|
171
|
+
*/
|
|
172
|
+
var TableRow = props => {
|
|
173
|
+
const c = vars.colors.input.primary;
|
|
174
|
+
return /* @__PURE__ */jsx(Row, {
|
|
175
|
+
...props,
|
|
176
|
+
"data-scope": "table",
|
|
177
|
+
"data-part": "item",
|
|
178
|
+
style: ({
|
|
179
|
+
isSelected,
|
|
180
|
+
isHovered,
|
|
181
|
+
isFocusVisible,
|
|
182
|
+
isDisabled,
|
|
183
|
+
selectionMode
|
|
184
|
+
}) => {
|
|
185
|
+
return {
|
|
186
|
+
boxSizing: "border-box",
|
|
187
|
+
blockSize: vars.sizing.hit,
|
|
188
|
+
cursor: selectionMode === "none" ? void 0 : isDisabled ? "not-allowed" : "pointer",
|
|
189
|
+
opacity: isDisabled ? vars.opacity.disabled : void 0,
|
|
190
|
+
transitionProperty: "background-color, color",
|
|
191
|
+
transitionDuration: vars.motion.feedback.duration,
|
|
192
|
+
transitionTimingFunction: vars.motion.feedback.easing,
|
|
193
|
+
backgroundColor: resolveInteractiveStyle(c?.background, {
|
|
194
|
+
isDisabled,
|
|
195
|
+
isSelected,
|
|
196
|
+
isHovered: isHovered && selectionMode !== "none"
|
|
197
|
+
}),
|
|
198
|
+
color: resolveInteractiveStyle(c?.text, {
|
|
199
|
+
isDisabled,
|
|
200
|
+
isSelected
|
|
201
|
+
}),
|
|
202
|
+
outline: focusRingOutline(isFocusVisible),
|
|
203
|
+
outlineOffset: "-2px"
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
};
|
|
208
|
+
TableRow.displayName = tableRowMeta.displayName;
|
|
209
|
+
/**
|
|
210
|
+
* A data cell (Collection `content` role). Focusable during keyboard grid
|
|
211
|
+
* navigation; typography and color inherit from the row.
|
|
212
|
+
*/
|
|
213
|
+
var TableCell = props => {
|
|
214
|
+
const colors = vars.colors.informational.muted;
|
|
215
|
+
return /* @__PURE__ */jsx(Cell, {
|
|
216
|
+
...props,
|
|
217
|
+
"data-scope": "table",
|
|
218
|
+
"data-part": "content",
|
|
219
|
+
style: ({
|
|
220
|
+
isFocusVisible
|
|
221
|
+
}) => {
|
|
222
|
+
return {
|
|
223
|
+
boxSizing: "border-box",
|
|
224
|
+
paddingBlock: vars.spacing.inset.control.sm,
|
|
225
|
+
paddingInline: vars.spacing.inset.control.md,
|
|
226
|
+
...vars.text.body.sm,
|
|
227
|
+
borderBlockEndWidth: vars.border.divider.width,
|
|
228
|
+
borderBlockEndStyle: vars.border.divider.style,
|
|
229
|
+
borderBlockEndColor: colors?.border?.default ?? "transparent",
|
|
230
|
+
outline: focusRingOutline(isFocusVisible),
|
|
231
|
+
outlineOffset: "-2px"
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
};
|
|
236
|
+
TableCell.displayName = tableCellMeta.displayName;
|
|
237
|
+
|
|
238
|
+
//#endregion
|
|
239
|
+
export { Table$1 as Table, TableBody$1 as TableBody, TableCell, TableColumn, TableHeader$1 as TableHeader, TableRow, tableCellMeta, tableColumnMeta, tableMeta, tableRowMeta };
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
|
|
2
|
+
const require_runtime = require('../../_virtual/_rolldown/runtime.cjs');
|
|
2
3
|
const require_focusRing = require('../../tokens/focusRing.cjs');
|
|
3
4
|
const require_resolveInteractiveStyle = require('../../tokens/resolveInteractiveStyle.cjs');
|
|
4
5
|
let _ttoss_fsl_theme_vars = require("@ttoss/fsl-theme/vars");
|
|
5
6
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
7
|
let react_aria_components = require("react-aria-components");
|
|
8
|
+
let react = require("react");
|
|
9
|
+
react = require_runtime.__toESM(react);
|
|
7
10
|
|
|
8
11
|
//#region src/components/Tabs/Tabs.tsx
|
|
9
12
|
/** Formal semantic identity — Tabs root (Navigation entity). */
|
|
@@ -47,21 +50,30 @@ var tabPanelMeta = {
|
|
|
47
50
|
* </Tabs>
|
|
48
51
|
* ```
|
|
49
52
|
*/
|
|
53
|
+
/**
|
|
54
|
+
* Orientation reaches `Tab` through this context — RAC exposes it in
|
|
55
|
+
* `TabList`'s render props but not in `Tab`'s, and the selected-tab
|
|
56
|
+
* indicator must switch edges with the orientation (friction F-003).
|
|
57
|
+
*/
|
|
58
|
+
var TabsOrientationContext = react.createContext("horizontal");
|
|
50
59
|
var Tabs = ({
|
|
51
60
|
orientation = "horizontal",
|
|
52
61
|
...props
|
|
53
62
|
}) => {
|
|
54
|
-
return /* @__PURE__ */(0, react_jsx_runtime.jsx)(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
return /* @__PURE__ */(0, react_jsx_runtime.jsx)(TabsOrientationContext.Provider, {
|
|
64
|
+
value: orientation,
|
|
65
|
+
children: /* @__PURE__ */(0, react_jsx_runtime.jsx)(react_aria_components.Tabs, {
|
|
66
|
+
...props,
|
|
67
|
+
orientation,
|
|
68
|
+
"data-scope": "tabs",
|
|
69
|
+
"data-part": "root",
|
|
70
|
+
style: {
|
|
71
|
+
boxSizing: "border-box",
|
|
72
|
+
display: "flex",
|
|
73
|
+
flexDirection: orientation === "vertical" ? "row" : "column",
|
|
74
|
+
gap: _ttoss_fsl_theme_vars.vars.spacing.gap.stack.sm
|
|
75
|
+
}
|
|
76
|
+
})
|
|
65
77
|
});
|
|
66
78
|
};
|
|
67
79
|
Tabs.displayName = tabsMeta.displayName;
|
|
@@ -74,23 +86,62 @@ var TabList = props => {
|
|
|
74
86
|
...props,
|
|
75
87
|
"data-scope": "tabs",
|
|
76
88
|
"data-part": "control",
|
|
77
|
-
style: {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
89
|
+
style: ({
|
|
90
|
+
orientation
|
|
91
|
+
}) => {
|
|
92
|
+
const isVertical = orientation === "vertical";
|
|
93
|
+
return {
|
|
94
|
+
boxSizing: "border-box",
|
|
95
|
+
display: "flex",
|
|
96
|
+
flexDirection: isVertical ? "column" : "row",
|
|
97
|
+
gap: isVertical ? _ttoss_fsl_theme_vars.vars.spacing.gap.stack.sm : _ttoss_fsl_theme_vars.vars.spacing.gap.inline.sm,
|
|
98
|
+
...(isVertical ? {
|
|
99
|
+
borderInlineEndWidth: _ttoss_fsl_theme_vars.vars.border.divider.width,
|
|
100
|
+
borderInlineEndStyle: _ttoss_fsl_theme_vars.vars.border.divider.style,
|
|
101
|
+
borderInlineEndColor: _ttoss_fsl_theme_vars.vars.colors.navigation.muted?.border?.default ?? "transparent"
|
|
102
|
+
} : {
|
|
103
|
+
borderBlockEndWidth: _ttoss_fsl_theme_vars.vars.border.divider.width,
|
|
104
|
+
borderBlockEndStyle: _ttoss_fsl_theme_vars.vars.border.divider.style,
|
|
105
|
+
borderBlockEndColor: _ttoss_fsl_theme_vars.vars.colors.navigation.muted?.border?.default ?? "transparent"
|
|
106
|
+
})
|
|
107
|
+
};
|
|
84
108
|
}
|
|
85
109
|
});
|
|
86
110
|
};
|
|
87
111
|
TabList.displayName = tabListMeta.displayName;
|
|
88
112
|
/**
|
|
113
|
+
* Style for the decorative active-tab indicator line — block-end underline
|
|
114
|
+
* when horizontal, inline-start bar when vertical (F-003).
|
|
115
|
+
*/
|
|
116
|
+
var tabIndicatorStyle = orientation => {
|
|
117
|
+
const color = _ttoss_fsl_theme_vars.vars.colors.navigation.primary?.border?.current ?? _ttoss_fsl_theme_vars.vars.colors.navigation.primary?.border?.default;
|
|
118
|
+
const style = _ttoss_fsl_theme_vars.vars.border.outline.control.style;
|
|
119
|
+
if (orientation === "vertical") return {
|
|
120
|
+
position: "absolute",
|
|
121
|
+
insetBlockStart: 0,
|
|
122
|
+
insetBlockEnd: 0,
|
|
123
|
+
insetInlineStart: 0,
|
|
124
|
+
borderInlineStartWidth: _ttoss_fsl_theme_vars.vars.border.outline.selected.width,
|
|
125
|
+
borderInlineStartStyle: style,
|
|
126
|
+
borderInlineStartColor: color
|
|
127
|
+
};
|
|
128
|
+
return {
|
|
129
|
+
position: "absolute",
|
|
130
|
+
insetInlineStart: 0,
|
|
131
|
+
insetInlineEnd: 0,
|
|
132
|
+
insetBlockEnd: 0,
|
|
133
|
+
borderBlockEndWidth: _ttoss_fsl_theme_vars.vars.border.outline.selected.width,
|
|
134
|
+
borderBlockEndStyle: style,
|
|
135
|
+
borderBlockEndColor: color
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
89
139
|
* A single selectable tab. The selected tab reads the navigation `current`
|
|
90
140
|
* color and shows an underline indicator; others use hover/default.
|
|
91
141
|
*/
|
|
92
142
|
var Tab = props => {
|
|
93
143
|
const colors = _ttoss_fsl_theme_vars.vars.colors.navigation.primary;
|
|
144
|
+
const orientation = react.useContext(TabsOrientationContext);
|
|
94
145
|
return /* @__PURE__ */(0, react_jsx_runtime.jsx)(react_aria_components.Tab, {
|
|
95
146
|
...props,
|
|
96
147
|
"data-scope": "tabs",
|
|
@@ -131,15 +182,7 @@ var Tab = props => {
|
|
|
131
182
|
"data-scope": "tabs",
|
|
132
183
|
"data-part": "indicator",
|
|
133
184
|
"aria-hidden": true,
|
|
134
|
-
style:
|
|
135
|
-
position: "absolute",
|
|
136
|
-
insetInlineStart: 0,
|
|
137
|
-
insetInlineEnd: 0,
|
|
138
|
-
insetBlockEnd: 0,
|
|
139
|
-
borderBlockEndWidth: _ttoss_fsl_theme_vars.vars.border.outline.selected.width,
|
|
140
|
-
borderBlockEndStyle: _ttoss_fsl_theme_vars.vars.border.outline.control.style,
|
|
141
|
-
borderBlockEndColor: _ttoss_fsl_theme_vars.vars.colors.navigation.primary?.border?.current ?? _ttoss_fsl_theme_vars.vars.colors.navigation.primary?.border?.default
|
|
142
|
-
}
|
|
185
|
+
style: tabIndicatorStyle(orientation)
|
|
143
186
|
})]
|
|
144
187
|
});
|
|
145
188
|
}
|
|
@@ -28,23 +28,6 @@ declare const tabPanelMeta: {
|
|
|
28
28
|
};
|
|
29
29
|
/** Props for the Tabs root. */
|
|
30
30
|
type TabsProps$1 = Omit<TabsProps, 'style'>;
|
|
31
|
-
/**
|
|
32
|
-
* A tabbed navigation widget (Navigation entity). Compose with `TabList` +
|
|
33
|
-
* `Tab` for the switcher and `TabPanel` for each view. React Aria manages
|
|
34
|
-
* selection, arrow-key navigation, and panel association.
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```tsx
|
|
38
|
-
* <Tabs>
|
|
39
|
-
* <TabList aria-label="Sections">
|
|
40
|
-
* <Tab id="a">Overview</Tab>
|
|
41
|
-
* <Tab id="b">Details</Tab>
|
|
42
|
-
* </TabList>
|
|
43
|
-
* <TabPanel id="a">Overview content</TabPanel>
|
|
44
|
-
* <TabPanel id="b">Details content</TabPanel>
|
|
45
|
-
* </Tabs>
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
31
|
declare const Tabs: {
|
|
49
32
|
({
|
|
50
33
|
orientation,
|
|
@@ -28,23 +28,6 @@ declare const tabPanelMeta: {
|
|
|
28
28
|
};
|
|
29
29
|
/** Props for the Tabs root. */
|
|
30
30
|
type TabsProps$1 = Omit<TabsProps, 'style'>;
|
|
31
|
-
/**
|
|
32
|
-
* A tabbed navigation widget (Navigation entity). Compose with `TabList` +
|
|
33
|
-
* `Tab` for the switcher and `TabPanel` for each view. React Aria manages
|
|
34
|
-
* selection, arrow-key navigation, and panel association.
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```tsx
|
|
38
|
-
* <Tabs>
|
|
39
|
-
* <TabList aria-label="Sections">
|
|
40
|
-
* <Tab id="a">Overview</Tab>
|
|
41
|
-
* <Tab id="b">Details</Tab>
|
|
42
|
-
* </TabList>
|
|
43
|
-
* <TabPanel id="a">Overview content</TabPanel>
|
|
44
|
-
* <TabPanel id="b">Details content</TabPanel>
|
|
45
|
-
* </Tabs>
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
31
|
declare const Tabs$1: {
|
|
49
32
|
({
|
|
50
33
|
orientation,
|
|
@@ -4,6 +4,7 @@ import { resolveInteractiveStyle } from "../../tokens/resolveInteractiveStyle.mj
|
|
|
4
4
|
import { vars } from "@ttoss/fsl-theme/vars";
|
|
5
5
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
import { Tab, TabList, TabPanel, Tabs } from "react-aria-components";
|
|
7
|
+
import * as React from "react";
|
|
7
8
|
|
|
8
9
|
//#region src/components/Tabs/Tabs.tsx
|
|
9
10
|
/** Formal semantic identity — Tabs root (Navigation entity). */
|
|
@@ -47,21 +48,30 @@ var tabPanelMeta = {
|
|
|
47
48
|
* </Tabs>
|
|
48
49
|
* ```
|
|
49
50
|
*/
|
|
51
|
+
/**
|
|
52
|
+
* Orientation reaches `Tab` through this context — RAC exposes it in
|
|
53
|
+
* `TabList`'s render props but not in `Tab`'s, and the selected-tab
|
|
54
|
+
* indicator must switch edges with the orientation (friction F-003).
|
|
55
|
+
*/
|
|
56
|
+
var TabsOrientationContext = React.createContext("horizontal");
|
|
50
57
|
var Tabs$1 = ({
|
|
51
58
|
orientation = "horizontal",
|
|
52
59
|
...props
|
|
53
60
|
}) => {
|
|
54
|
-
return /* @__PURE__ */jsx(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
return /* @__PURE__ */jsx(TabsOrientationContext.Provider, {
|
|
62
|
+
value: orientation,
|
|
63
|
+
children: /* @__PURE__ */jsx(Tabs, {
|
|
64
|
+
...props,
|
|
65
|
+
orientation,
|
|
66
|
+
"data-scope": "tabs",
|
|
67
|
+
"data-part": "root",
|
|
68
|
+
style: {
|
|
69
|
+
boxSizing: "border-box",
|
|
70
|
+
display: "flex",
|
|
71
|
+
flexDirection: orientation === "vertical" ? "row" : "column",
|
|
72
|
+
gap: vars.spacing.gap.stack.sm
|
|
73
|
+
}
|
|
74
|
+
})
|
|
65
75
|
});
|
|
66
76
|
};
|
|
67
77
|
Tabs$1.displayName = tabsMeta.displayName;
|
|
@@ -74,23 +84,62 @@ var TabList$1 = props => {
|
|
|
74
84
|
...props,
|
|
75
85
|
"data-scope": "tabs",
|
|
76
86
|
"data-part": "control",
|
|
77
|
-
style: {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
style: ({
|
|
88
|
+
orientation
|
|
89
|
+
}) => {
|
|
90
|
+
const isVertical = orientation === "vertical";
|
|
91
|
+
return {
|
|
92
|
+
boxSizing: "border-box",
|
|
93
|
+
display: "flex",
|
|
94
|
+
flexDirection: isVertical ? "column" : "row",
|
|
95
|
+
gap: isVertical ? vars.spacing.gap.stack.sm : vars.spacing.gap.inline.sm,
|
|
96
|
+
...(isVertical ? {
|
|
97
|
+
borderInlineEndWidth: vars.border.divider.width,
|
|
98
|
+
borderInlineEndStyle: vars.border.divider.style,
|
|
99
|
+
borderInlineEndColor: vars.colors.navigation.muted?.border?.default ?? "transparent"
|
|
100
|
+
} : {
|
|
101
|
+
borderBlockEndWidth: vars.border.divider.width,
|
|
102
|
+
borderBlockEndStyle: vars.border.divider.style,
|
|
103
|
+
borderBlockEndColor: vars.colors.navigation.muted?.border?.default ?? "transparent"
|
|
104
|
+
})
|
|
105
|
+
};
|
|
84
106
|
}
|
|
85
107
|
});
|
|
86
108
|
};
|
|
87
109
|
TabList$1.displayName = tabListMeta.displayName;
|
|
88
110
|
/**
|
|
111
|
+
* Style for the decorative active-tab indicator line — block-end underline
|
|
112
|
+
* when horizontal, inline-start bar when vertical (F-003).
|
|
113
|
+
*/
|
|
114
|
+
var tabIndicatorStyle = orientation => {
|
|
115
|
+
const color = vars.colors.navigation.primary?.border?.current ?? vars.colors.navigation.primary?.border?.default;
|
|
116
|
+
const style = vars.border.outline.control.style;
|
|
117
|
+
if (orientation === "vertical") return {
|
|
118
|
+
position: "absolute",
|
|
119
|
+
insetBlockStart: 0,
|
|
120
|
+
insetBlockEnd: 0,
|
|
121
|
+
insetInlineStart: 0,
|
|
122
|
+
borderInlineStartWidth: vars.border.outline.selected.width,
|
|
123
|
+
borderInlineStartStyle: style,
|
|
124
|
+
borderInlineStartColor: color
|
|
125
|
+
};
|
|
126
|
+
return {
|
|
127
|
+
position: "absolute",
|
|
128
|
+
insetInlineStart: 0,
|
|
129
|
+
insetInlineEnd: 0,
|
|
130
|
+
insetBlockEnd: 0,
|
|
131
|
+
borderBlockEndWidth: vars.border.outline.selected.width,
|
|
132
|
+
borderBlockEndStyle: style,
|
|
133
|
+
borderBlockEndColor: color
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
89
137
|
* A single selectable tab. The selected tab reads the navigation `current`
|
|
90
138
|
* color and shows an underline indicator; others use hover/default.
|
|
91
139
|
*/
|
|
92
140
|
var Tab$1 = props => {
|
|
93
141
|
const colors = vars.colors.navigation.primary;
|
|
142
|
+
const orientation = React.useContext(TabsOrientationContext);
|
|
94
143
|
return /* @__PURE__ */jsx(Tab, {
|
|
95
144
|
...props,
|
|
96
145
|
"data-scope": "tabs",
|
|
@@ -131,15 +180,7 @@ var Tab$1 = props => {
|
|
|
131
180
|
"data-scope": "tabs",
|
|
132
181
|
"data-part": "indicator",
|
|
133
182
|
"aria-hidden": true,
|
|
134
|
-
style:
|
|
135
|
-
position: "absolute",
|
|
136
|
-
insetInlineStart: 0,
|
|
137
|
-
insetInlineEnd: 0,
|
|
138
|
-
insetBlockEnd: 0,
|
|
139
|
-
borderBlockEndWidth: vars.border.outline.selected.width,
|
|
140
|
-
borderBlockEndStyle: vars.border.outline.control.style,
|
|
141
|
-
borderBlockEndColor: vars.colors.navigation.primary?.border?.current ?? vars.colors.navigation.primary?.border?.default
|
|
142
|
-
}
|
|
183
|
+
style: tabIndicatorStyle(orientation)
|
|
143
184
|
})]
|
|
144
185
|
});
|
|
145
186
|
}
|
|
@@ -11,6 +11,7 @@ var textMeta = {
|
|
|
11
11
|
};
|
|
12
12
|
/** Typography token per variant — the scale reaches the DOM only here. */
|
|
13
13
|
var TYPE_BY_VARIANT = {
|
|
14
|
+
"display-sm": _ttoss_fsl_theme_vars.vars.text.display.sm,
|
|
14
15
|
"body-lg": _ttoss_fsl_theme_vars.vars.text.body.lg,
|
|
15
16
|
"body-md": _ttoss_fsl_theme_vars.vars.text.body.md,
|
|
16
17
|
"body-sm": _ttoss_fsl_theme_vars.vars.text.body.sm,
|
|
@@ -8,8 +8,13 @@ declare const textMeta: {
|
|
|
8
8
|
readonly entity: "Structure";
|
|
9
9
|
readonly structure: "root";
|
|
10
10
|
};
|
|
11
|
-
/**
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* A step of the body/label type scale (`{family}-{step}`). `display-sm` is
|
|
13
|
+
* the stat step: display-scale figures that are *data*, not document
|
|
14
|
+
* headings (KPI values, prices) — admitted on the Dashboard/Pricing blocks'
|
|
15
|
+
* evidence (friction F-014).
|
|
16
|
+
*/
|
|
17
|
+
type TextVariant = 'display-sm' | 'body-lg' | 'body-md' | 'body-sm' | 'label-lg' | 'label-md' | 'label-sm';
|
|
13
18
|
/** The tone of the text colour — default inherits; `muted` recedes. */
|
|
14
19
|
type TextTone = 'default' | 'muted';
|
|
15
20
|
/** Inline text alignment. */
|
|
@@ -8,8 +8,13 @@ declare const textMeta: {
|
|
|
8
8
|
readonly entity: "Structure";
|
|
9
9
|
readonly structure: "root";
|
|
10
10
|
};
|
|
11
|
-
/**
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* A step of the body/label type scale (`{family}-{step}`). `display-sm` is
|
|
13
|
+
* the stat step: display-scale figures that are *data*, not document
|
|
14
|
+
* headings (KPI values, prices) — admitted on the Dashboard/Pricing blocks'
|
|
15
|
+
* evidence (friction F-014).
|
|
16
|
+
*/
|
|
17
|
+
type TextVariant = 'display-sm' | 'body-lg' | 'body-md' | 'body-sm' | 'label-lg' | 'label-md' | 'label-sm';
|
|
13
18
|
/** The tone of the text colour — default inherits; `muted` recedes. */
|
|
14
19
|
type TextTone = 'default' | 'muted';
|
|
15
20
|
/** Inline text alignment. */
|
|
@@ -11,6 +11,7 @@ var textMeta = {
|
|
|
11
11
|
};
|
|
12
12
|
/** Typography token per variant — the scale reaches the DOM only here. */
|
|
13
13
|
var TYPE_BY_VARIANT = {
|
|
14
|
+
"display-sm": vars.text.display.sm,
|
|
14
15
|
"body-lg": vars.text.body.lg,
|
|
15
16
|
"body-md": vars.text.body.md,
|
|
16
17
|
"body-sm": vars.text.body.sm,
|
package/dist/index.cjs
CHANGED
|
@@ -9,6 +9,8 @@ const require_Badge = require('./components/Badge/Badge.cjs');
|
|
|
9
9
|
const require_Box = require('./components/Box/Box.cjs');
|
|
10
10
|
const require_Breadcrumbs = require('./components/Breadcrumbs/Breadcrumbs.cjs');
|
|
11
11
|
const require_Button = require('./components/Button/Button.cjs');
|
|
12
|
+
const require_Icon = require('./components/Icon/Icon.cjs');
|
|
13
|
+
const require_intents = require('./components/Icon/intents.cjs');
|
|
12
14
|
const require_Checkbox = require('./components/Checkbox/Checkbox.cjs');
|
|
13
15
|
const require_CheckboxGroup = require('./components/CheckboxGroup/CheckboxGroup.cjs');
|
|
14
16
|
const require_Code = require('./components/Code/Code.cjs');
|
|
@@ -30,6 +32,7 @@ const require_Slider = require('./components/Slider/Slider.cjs');
|
|
|
30
32
|
const require_Stack = require('./components/Stack/Stack.cjs');
|
|
31
33
|
const require_Surface = require('./components/Surface/Surface.cjs');
|
|
32
34
|
const require_Switch = require('./components/Switch/Switch.cjs');
|
|
35
|
+
const require_Table = require('./components/Table/Table.cjs');
|
|
33
36
|
const require_Tabs = require('./components/Tabs/Tabs.cjs');
|
|
34
37
|
const require_Text = require('./components/Text/Text.cjs');
|
|
35
38
|
const require_Toast = require('./components/Toast/Toast.cjs');
|
|
@@ -82,6 +85,8 @@ exports.GridList = require_GridList.GridList;
|
|
|
82
85
|
exports.GridListItem = require_GridList.GridListItem;
|
|
83
86
|
exports.Group = require_Group.Group;
|
|
84
87
|
exports.Heading = require_Heading.Heading;
|
|
88
|
+
exports.ICON_INTENTS = require_intents.ICON_INTENTS;
|
|
89
|
+
exports.Icon = require_Icon.Icon;
|
|
85
90
|
exports.Link = require_Link.Link;
|
|
86
91
|
exports.ListBox = require_ListBox.ListBox;
|
|
87
92
|
exports.ListBoxItem = require_ListBox.ListBoxItem;
|
|
@@ -108,6 +113,12 @@ exports.Switch = require_Switch.Switch;
|
|
|
108
113
|
exports.Tab = require_Tabs.Tab;
|
|
109
114
|
exports.TabList = require_Tabs.TabList;
|
|
110
115
|
exports.TabPanel = require_Tabs.TabPanel;
|
|
116
|
+
exports.Table = require_Table.Table;
|
|
117
|
+
exports.TableBody = require_Table.TableBody;
|
|
118
|
+
exports.TableCell = require_Table.TableCell;
|
|
119
|
+
exports.TableColumn = require_Table.TableColumn;
|
|
120
|
+
exports.TableHeader = require_Table.TableHeader;
|
|
121
|
+
exports.TableRow = require_Table.TableRow;
|
|
111
122
|
exports.Tabs = require_Tabs.Tabs;
|
|
112
123
|
exports.Tag = require_TagGroup.Tag;
|
|
113
124
|
exports.TagGroup = require_TagGroup.TagGroup;
|
|
@@ -166,6 +177,7 @@ exports.gridListMeta = require_GridList.gridListMeta;
|
|
|
166
177
|
exports.gridMeta = require_Grid.gridMeta;
|
|
167
178
|
exports.groupMeta = require_Group.groupMeta;
|
|
168
179
|
exports.headingMeta = require_Heading.headingMeta;
|
|
180
|
+
exports.iconMeta = require_Icon.iconMeta;
|
|
169
181
|
exports.linkMeta = require_Link.linkMeta;
|
|
170
182
|
exports.listBoxItemMeta = require_ListBox.listBoxItemMeta;
|
|
171
183
|
exports.listBoxMeta = require_ListBox.listBoxMeta;
|
|
@@ -190,6 +202,10 @@ exports.switchMeta = require_Switch.switchMeta;
|
|
|
190
202
|
exports.tabListMeta = require_Tabs.tabListMeta;
|
|
191
203
|
exports.tabMeta = require_Tabs.tabMeta;
|
|
192
204
|
exports.tabPanelMeta = require_Tabs.tabPanelMeta;
|
|
205
|
+
exports.tableCellMeta = require_Table.tableCellMeta;
|
|
206
|
+
exports.tableColumnMeta = require_Table.tableColumnMeta;
|
|
207
|
+
exports.tableMeta = require_Table.tableMeta;
|
|
208
|
+
exports.tableRowMeta = require_Table.tableRowMeta;
|
|
193
209
|
exports.tabsMeta = require_Tabs.tabsMeta;
|
|
194
210
|
exports.tagGroupMeta = require_TagGroup.tagGroupMeta;
|
|
195
211
|
exports.tagMeta = require_TagGroup.tagMeta;
|