@12-apps/ui 6.75.0 → 6.76.1

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 (60) hide show
  1. package/dist/_internal/components/form/Textarea/Textarea.js +1 -1
  2. package/dist/_internal/components/form/index.js +1 -1
  3. package/dist/_internal/components/index.js +1 -1
  4. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.items.js +3 -3
  5. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +8 -8
  6. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.rail.js +4 -4
  7. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.styles.js +3 -1
  8. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +5 -5
  9. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +3 -3
  10. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionHeader.js +2 -2
  11. package/dist/_internal/components/layout/SettingsLayout/SettingsStatusMarker.js +2 -2
  12. package/dist/{chunk-DBFRCTI5.js → chunk-7Y2VWMGS.js} +2 -2
  13. package/dist/{chunk-F3Q4CMRB.js → chunk-GBVNY2LG.js} +3 -3
  14. package/dist/{chunk-KKVM723A.js → chunk-LY5I3ZSV.js} +4 -4
  15. package/dist/{chunk-NYFNF7I5.js → chunk-NK4T624E.js} +3 -1
  16. package/dist/chunk-NK4T624E.js.map +1 -0
  17. package/dist/{chunk-X47MWURD.js → chunk-Q6MZHT2F.js} +10 -8
  18. package/dist/chunk-Q6MZHT2F.js.map +1 -0
  19. package/dist/{chunk-V5EWCJBT.js → chunk-SL56MOKE.js} +29 -8
  20. package/dist/chunk-SL56MOKE.js.map +1 -0
  21. package/dist/{chunk-OKYYHBGS.js → chunk-SO5OU2ZV.js} +16 -7
  22. package/dist/chunk-SO5OU2ZV.js.map +1 -0
  23. package/dist/{chunk-TNYKM4UU.js → chunk-TJO4CBYT.js} +64 -22
  24. package/dist/chunk-TJO4CBYT.js.map +1 -0
  25. package/dist/{chunk-6KEXHOIF.js → chunk-WOXNVM52.js} +2 -2
  26. package/dist/form/Textarea.js +1 -1
  27. package/dist/layout/SettingsLayout.js +8 -8
  28. package/dist/types/components/form/Textarea/Textarea.d.ts.map +1 -1
  29. package/dist/types/components/form/Textarea/Textarea.types.d.ts +4 -2
  30. package/dist/types/components/form/Textarea/Textarea.types.d.ts.map +1 -1
  31. package/dist/types/components/layout/SettingsLayout/SettingsLayout.d.ts.map +1 -1
  32. package/dist/types/components/layout/SettingsLayout/SettingsLayout.items.d.ts +3 -1
  33. package/dist/types/components/layout/SettingsLayout/SettingsLayout.items.d.ts.map +1 -1
  34. package/dist/types/components/layout/SettingsLayout/SettingsLayout.rail.d.ts +6 -2
  35. package/dist/types/components/layout/SettingsLayout/SettingsLayout.rail.d.ts.map +1 -1
  36. package/dist/types/components/layout/SettingsLayout/SettingsLayout.styles.d.ts +2 -0
  37. package/dist/types/components/layout/SettingsLayout/SettingsLayout.styles.d.ts.map +1 -1
  38. package/dist/types/components/layout/SettingsLayout/SettingsLayout.types.d.ts +19 -0
  39. package/dist/types/components/layout/SettingsLayout/SettingsLayout.types.d.ts.map +1 -1
  40. package/dist/types/components/layout/SettingsLayout/index.d.ts +1 -1
  41. package/dist/types/components/layout/SettingsLayout/index.d.ts.map +1 -1
  42. package/package.json +1 -1
  43. package/src/components/form/Textarea/Textarea.tsx +14 -7
  44. package/src/components/form/Textarea/Textarea.types.ts +4 -2
  45. package/src/components/layout/SettingsLayout/SettingsLayout.items.tsx +38 -3
  46. package/src/components/layout/SettingsLayout/SettingsLayout.md +19 -0
  47. package/src/components/layout/SettingsLayout/SettingsLayout.rail.tsx +73 -24
  48. package/src/components/layout/SettingsLayout/SettingsLayout.styles.ts +3 -0
  49. package/src/components/layout/SettingsLayout/SettingsLayout.tsx +21 -3
  50. package/src/components/layout/SettingsLayout/SettingsLayout.types.ts +20 -0
  51. package/src/components/layout/SettingsLayout/index.ts +1 -0
  52. package/dist/chunk-NYFNF7I5.js.map +0 -1
  53. package/dist/chunk-OKYYHBGS.js.map +0 -1
  54. package/dist/chunk-TNYKM4UU.js.map +0 -1
  55. package/dist/chunk-V5EWCJBT.js.map +0 -1
  56. package/dist/chunk-X47MWURD.js.map +0 -1
  57. /package/dist/{chunk-DBFRCTI5.js.map → chunk-7Y2VWMGS.js.map} +0 -0
  58. /package/dist/{chunk-F3Q4CMRB.js.map → chunk-GBVNY2LG.js.map} +0 -0
  59. /package/dist/{chunk-KKVM723A.js.map → chunk-LY5I3ZSV.js.map} +0 -0
  60. /package/dist/{chunk-6KEXHOIF.js.map → chunk-WOXNVM52.js.map} +0 -0
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  SettingsRailGroup
3
- } from "./chunk-V5EWCJBT.js";
3
+ } from "./chunk-SL56MOKE.js";
4
4
  import {
5
5
  TOUCH_TARGET,
6
6
  atLeastRail,
7
7
  displayAcrossRail,
8
+ railCardWidth,
8
9
  railWidth
9
- } from "./chunk-NYFNF7I5.js";
10
+ } from "./chunk-NK4T624E.js";
10
11
  import {
11
12
  rem,
12
13
  sxRem
@@ -101,6 +102,29 @@ function SettingsSearchEmpty({
101
102
  ) : null
102
103
  ] });
103
104
  }
105
+ function RailSearch({
106
+ query,
107
+ onQueryChange,
108
+ searchPlaceholder,
109
+ testIdPrefix
110
+ }) {
111
+ return /* @__PURE__ */ jsx(
112
+ TextField,
113
+ {
114
+ value: query,
115
+ onChange: (event) => onQueryChange(event.target.value),
116
+ placeholder: searchPlaceholder,
117
+ size: "small",
118
+ fullWidth: true,
119
+ "aria-label": searchPlaceholder,
120
+ "data-testid": `${testIdPrefix}-search`,
121
+ InputProps: {
122
+ startAdornment: /* @__PURE__ */ jsx(InputAdornment, { position: "start", children: /* @__PURE__ */ jsx(SearchIcon, { fontSize: "small", sx: { color: "text.secondary" } }) })
123
+ },
124
+ sx: { mb: 2 }
125
+ }
126
+ );
127
+ }
104
128
  function SettingsRailBody({
105
129
  navOpen,
106
130
  query,
@@ -114,6 +138,7 @@ function SettingsRailBody({
114
138
  onSelectItem,
115
139
  onNavigate,
116
140
  testIdPrefix,
141
+ searchable,
117
142
  ...shape
118
143
  }) {
119
144
  const hidden = navOpen ? "block" : "none";
@@ -123,22 +148,15 @@ function SettingsRailBody({
123
148
  "data-testid": `${testIdPrefix}-rail-body`,
124
149
  sx: (theme) => shape.variant === "drilldown" ? { display: "block" } : displayAcrossRail(theme, shape.breakpoint, hidden, "block"),
125
150
  children: [
126
- /* @__PURE__ */ jsx(
127
- TextField,
151
+ searchable ? /* @__PURE__ */ jsx(
152
+ RailSearch,
128
153
  {
129
- value: query,
130
- onChange: (event) => onQueryChange(event.target.value),
131
- placeholder: searchPlaceholder,
132
- size: "small",
133
- fullWidth: true,
134
- "aria-label": searchPlaceholder,
135
- "data-testid": `${testIdPrefix}-search`,
136
- InputProps: {
137
- startAdornment: /* @__PURE__ */ jsx(InputAdornment, { position: "start", children: /* @__PURE__ */ jsx(SearchIcon, { fontSize: "small", sx: { color: "text.secondary" } }) })
138
- },
139
- sx: { mb: 2 }
154
+ query,
155
+ onQueryChange,
156
+ searchPlaceholder,
157
+ testIdPrefix
140
158
  }
141
- ),
159
+ ) : null,
142
160
  filteredGroups.length === 0 ? /* @__PURE__ */ jsx(
143
161
  SettingsSearchEmpty,
144
162
  {
@@ -164,6 +182,23 @@ function SettingsRailBody({
164
182
  }
165
183
  );
166
184
  }
185
+ function railColumnSx(theme, railVariant) {
186
+ if (railVariant === "card") {
187
+ const width2 = railCardWidth(theme);
188
+ return {
189
+ flex: `0 0 ${width2}`,
190
+ width: width2,
191
+ alignSelf: "flex-start",
192
+ border: `1px solid ${theme.palette.divider}`,
193
+ borderRadius: sxRem(14),
194
+ bgcolor: "background.paper",
195
+ px: sxRem(12),
196
+ py: sxRem(16)
197
+ };
198
+ }
199
+ const width = railWidth(theme);
200
+ return { flex: `0 0 ${width}`, width, borderRight: `1px solid ${theme.palette.divider}`, pr: sxRem(16) };
201
+ }
167
202
  function SettingsRail({
168
203
  title,
169
204
  activeLabel,
@@ -171,6 +206,7 @@ function SettingsRail({
171
206
  onToggleNav,
172
207
  testIdPrefix,
173
208
  fillHeight = false,
209
+ railVariant = "divided",
174
210
  ...bodyProps
175
211
  }) {
176
212
  const { variant, breakpoint, atIndex } = bodyProps;
@@ -181,16 +217,14 @@ function SettingsRail({
181
217
  component: "nav",
182
218
  "aria-label": typeof title === "string" ? title : "Settings",
183
219
  "data-testid": `${testIdPrefix}-rail`,
220
+ "data-rail-variant": railVariant,
184
221
  sx: (theme) => ({
185
222
  display: hiddenWhileInSection ? "none" : "block",
186
223
  flex: "0 0 auto",
187
224
  width: "100%",
188
225
  [atLeastRail(theme, breakpoint)]: {
189
226
  display: "block",
190
- flex: `0 0 ${railWidth(theme)}`,
191
- width: railWidth(theme),
192
- borderRight: `1px solid ${theme.palette.divider}`,
193
- pr: 2,
227
+ ...railColumnSx(theme, railVariant),
194
228
  // Its own scrollbar, so a settings area with twenty categories does
195
229
  // not make the thing you NAVIGATE with scroll away while you read the
196
230
  // panel. `minHeight: 0` is the load-bearing half: without it a flex
@@ -224,7 +258,15 @@ function SettingsRail({
224
258
  testIdPrefix
225
259
  }
226
260
  ) : null,
227
- /* @__PURE__ */ jsx(SettingsRailBody, { navOpen, testIdPrefix, ...bodyProps })
261
+ /* @__PURE__ */ jsx(
262
+ SettingsRailBody,
263
+ {
264
+ navOpen,
265
+ testIdPrefix,
266
+ card: railVariant === "card",
267
+ ...bodyProps
268
+ }
269
+ )
228
270
  ]
229
271
  }
230
272
  );
@@ -233,4 +275,4 @@ function SettingsRail({
233
275
  export {
234
276
  SettingsRail
235
277
  };
236
- //# sourceMappingURL=chunk-TNYKM4UU.js.map
278
+ //# sourceMappingURL=chunk-TJO4CBYT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/layout/SettingsLayout/SettingsLayout.rail.tsx"],"sourcesContent":["'use client';\n\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport SearchIcon from '@mui/icons-material/Search';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport InputAdornment from '@mui/material/InputAdornment/index.js';\nimport TextField from '@mui/material/TextField/index.js';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React from 'react';\n\nimport { SettingsRailGroup, type RailShape } from './SettingsLayout.items';\nimport { atLeastRail, displayAcrossRail, railCardWidth, railWidth, TOUCH_TARGET } from './SettingsLayout.styles';\nimport { rem, sxRem } from '../../../tokens/relative';\nimport type {\n SettingsEmptySearchAction,\n SettingsLayoutProps,\n SettingsNavGroup,\n SettingsRailBreakpoint,\n SettingsRailVariant,\n} from './SettingsLayout.types';\n\ninterface RailToggleProps {\n title?: React.ReactNode;\n activeLabel?: string;\n open: boolean;\n onToggle: () => void;\n breakpoint: SettingsRailBreakpoint;\n testIdPrefix: string;\n}\n\n/**\n * `switcher`-only collapse control: shows the current section (a compact\n * switcher) so the panel content stays at the top of the screen. Hidden once the\n * rail has its own column.\n */\nfunction SettingsRailToggle({\n title,\n activeLabel,\n open,\n onToggle,\n breakpoint,\n testIdPrefix,\n}: RailToggleProps): React.JSX.Element {\n return (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onToggle}\n aria-expanded={open}\n aria-label={typeof title === 'string' ? title : 'Settings'}\n data-testid={`${testIdPrefix}-toggle`}\n sx={(theme) => ({\n ...displayAcrossRail(theme, breakpoint, 'flex', 'none'),\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n width: '100%',\n minHeight: rem(theme, TOUCH_TARGET),\n px: 1.5,\n py: 1,\n mb: 1,\n textAlign: 'left',\n cursor: 'pointer',\n color: 'text.primary',\n background: 'transparent',\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 1.5,\n })}\n >\n <Box sx={{ minWidth: 0 }}>\n {title ? (\n <Typography variant=\"caption\" sx={{ display: 'block', color: 'text.secondary' }}>\n {title}\n </Typography>\n ) : null}\n <Typography variant=\"body2\" noWrap sx={{ fontWeight: 600 }}>\n {activeLabel ?? ''}\n </Typography>\n </Box>\n <ExpandMoreIcon\n fontSize=\"small\"\n sx={{\n flex: '0 0 auto',\n color: 'text.secondary',\n transition: 'transform 150ms ease',\n transform: open ? 'rotate(180deg)' : 'none',\n '@media (prefers-reduced-motion: reduce)': { transition: 'none' },\n }}\n />\n </Box>\n );\n}\n\n/** The empty-search state, with the way out of it rendered inside. */\nfunction SettingsSearchEmpty({\n label,\n action,\n onClear,\n testIdPrefix,\n}: {\n label: React.ReactNode;\n action?: SettingsEmptySearchAction;\n onClear: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Box data-testid={`${testIdPrefix}-empty`} sx={{ px: 1, py: 2 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {label}\n </Typography>\n {action ? (\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => {\n onClear();\n action.onClear?.();\n }}\n data-testid={`${testIdPrefix}-empty-action`}\n sx={{ mt: 1.5, minHeight: sxRem(TOUCH_TARGET) }}\n >\n {action.label}\n </Button>\n ) : null}\n </Box>\n );\n}\n\nexport interface RailBodyProps extends RailShape {\n navOpen: boolean;\n query: string;\n onQueryChange: (value: string) => void;\n searchPlaceholder: string;\n emptySearchLabel: React.ReactNode;\n emptySearchAction?: SettingsEmptySearchAction;\n filteredGroups: SettingsNavGroup[];\n activeItemId?: string;\n linkComponent?: SettingsLayoutProps['linkComponent'];\n onSelectItem?: (id: string) => void;\n onNavigate?: () => void;\n testIdPrefix: string;\n /** Whether the search field is drawn (`SettingsLayoutProps.searchable`). */\n searchable: boolean;\n}\n\n/** The rail's search field. */\nfunction RailSearch({\n query,\n onQueryChange,\n searchPlaceholder,\n testIdPrefix,\n}: Pick<RailBodyProps, 'query' | 'onQueryChange' | 'searchPlaceholder' | 'testIdPrefix'>): React.JSX.Element {\n return (\n <TextField\n value={query}\n onChange={(event) => onQueryChange(event.target.value)}\n placeholder={searchPlaceholder}\n size=\"small\"\n fullWidth\n aria-label={searchPlaceholder}\n data-testid={`${testIdPrefix}-search`}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" sx={{ color: 'text.secondary' }} />\n </InputAdornment>\n ),\n }}\n sx={{ mb: 2 }}\n />\n );\n}\n\n/** The rail body: the search field when the area has one, then the groups. */\nfunction SettingsRailBody({\n navOpen,\n query,\n onQueryChange,\n searchPlaceholder,\n emptySearchLabel,\n emptySearchAction,\n filteredGroups,\n activeItemId,\n linkComponent,\n onSelectItem,\n onNavigate,\n testIdPrefix,\n searchable,\n ...shape\n}: RailBodyProps): React.JSX.Element {\n // `drilldown` has no disclosure to be closed behind: below the breakpoint the\n // body is the page, above it the rail. Only `switcher` hides it.\n const hidden = navOpen ? 'block' : 'none';\n return (\n <Box\n data-testid={`${testIdPrefix}-rail-body`}\n sx={(theme) =>\n shape.variant === 'drilldown'\n ? { display: 'block' }\n : displayAcrossRail(theme, shape.breakpoint, hidden, 'block')\n }\n >\n {searchable ? (\n <RailSearch\n query={query}\n onQueryChange={onQueryChange}\n searchPlaceholder={searchPlaceholder}\n testIdPrefix={testIdPrefix}\n />\n ) : null}\n {filteredGroups.length === 0 ? (\n <SettingsSearchEmpty\n label={emptySearchLabel}\n action={emptySearchAction}\n onClear={() => onQueryChange('')}\n testIdPrefix={testIdPrefix}\n />\n ) : (\n filteredGroups.map((group) => (\n <SettingsRailGroup\n key={group.id}\n group={group}\n activeItemId={activeItemId}\n linkComponent={linkComponent}\n onSelectItem={onSelectItem}\n onNavigate={onNavigate}\n testIdPrefix={testIdPrefix}\n {...shape}\n />\n ))\n )}\n </Box>\n );\n}\n\n/** Props for {@link SettingsRail}: the rail body's inputs plus the mobile chrome. */\nexport type SettingsRailProps = RailBodyProps & {\n title?: React.ReactNode;\n activeLabel?: string;\n onToggleNav: () => void;\n /** Scroll inside the rail rather than with the page. See `fillHeight`. */\n fillHeight?: boolean;\n /** How the rail's own column is drawn. See `SettingsLayoutProps.railVariant`. */\n railVariant?: SettingsRailVariant;\n};\n\n/** The rail's own column, as the variant draws it: ruled off, or a card. */\nfunction railColumnSx(theme: Theme, railVariant: SettingsRailVariant): Record<string, unknown> {\n if (railVariant === 'card') {\n const width = railCardWidth(theme);\n return {\n flex: `0 0 ${width}`,\n width,\n alignSelf: 'flex-start',\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: sxRem(14),\n bgcolor: 'background.paper',\n px: sxRem(12),\n py: sxRem(16),\n };\n }\n const width = railWidth(theme);\n return { flex: `0 0 ${width}`, width, borderRight: `1px solid ${theme.palette.divider}`, pr: sxRem(16) };\n}\n\n/** The navigation column: title, the `switcher`'s disclosure, and the body. */\nexport function SettingsRail({\n title,\n activeLabel,\n navOpen,\n onToggleNav,\n testIdPrefix,\n fillHeight = false,\n railVariant = 'divided',\n ...bodyProps\n}: SettingsRailProps): React.JSX.Element {\n const { variant, breakpoint, atIndex } = bodyProps;\n // In `drilldown` the rail is the index's list below the breakpoint and the\n // left column above it — so inside a section it steps aside for the chip\n // strip. It is `display: none`, never unmounted: the two navigation forms\n // both stay in the DOM at every width, which is what makes \"the narrow width\n // offers what the wide one offers\" true by construction instead of by review.\n const hiddenWhileInSection = variant === 'drilldown' && !atIndex;\n\n return (\n <Box\n component=\"nav\"\n aria-label={typeof title === 'string' ? title : 'Settings'}\n data-testid={`${testIdPrefix}-rail`}\n data-rail-variant={railVariant}\n sx={(theme) => ({\n display: hiddenWhileInSection ? 'none' : 'block',\n flex: '0 0 auto',\n width: '100%',\n [atLeastRail(theme, breakpoint)]: {\n display: 'block',\n ...railColumnSx(theme, railVariant),\n // Its own scrollbar, so a settings area with twenty categories does\n // not make the thing you NAVIGATE with scroll away while you read the\n // panel. `minHeight: 0` is the load-bearing half: without it a flex\n // child refuses to shrink below its content and `overflow` never\n // engages.\n ...(fillHeight\n ? { height: '100%', minHeight: 0, overflowY: 'auto' as const, overscrollBehavior: 'contain' as const }\n : {}),\n },\n })}\n >\n {title ? (\n <Typography\n variant=\"h6\"\n data-testid={`${testIdPrefix}-title`}\n sx={(theme) => ({\n ...(variant === 'drilldown'\n ? { display: 'block' }\n : displayAcrossRail(theme, breakpoint, 'none', 'block')),\n fontWeight: 700,\n mb: 1.5,\n })}\n >\n {title}\n </Typography>\n ) : null}\n {variant === 'switcher' ? (\n <SettingsRailToggle\n title={title}\n activeLabel={activeLabel}\n open={navOpen}\n onToggle={onToggleNav}\n breakpoint={breakpoint}\n testIdPrefix={testIdPrefix}\n />\n ) : null}\n <SettingsRailBody\n navOpen={navOpen}\n testIdPrefix={testIdPrefix}\n card={railVariant === 'card'}\n {...bodyProps}\n />\n </Box>\n );\n}\n"],"mappings":"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","names":["width"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TOUCH_TARGET,
3
3
  displayAcrossRail
4
- } from "./chunk-NYFNF7I5.js";
4
+ } from "./chunk-NK4T624E.js";
5
5
  import {
6
6
  rem,
7
7
  sxRem
@@ -122,4 +122,4 @@ function SettingsSectionHeader({
122
122
  export {
123
123
  SettingsSectionHeader
124
124
  };
125
- //# sourceMappingURL=chunk-6KEXHOIF.js.map
125
+ //# sourceMappingURL=chunk-WOXNVM52.js.map
@@ -1,7 +1,7 @@
1
1
  import "../chunk-BH5GSBR3.js";
2
2
  import {
3
3
  Textarea
4
- } from "../chunk-X47MWURD.js";
4
+ } from "../chunk-Q6MZHT2F.js";
5
5
  import "../chunk-IPC426NS.js";
6
6
  import "../chunk-RGVNXES5.js";
7
7
  import "../chunk-GDN2LUTZ.js";
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  SettingsLayout
3
- } from "../chunk-OKYYHBGS.js";
3
+ } from "../chunk-SO5OU2ZV.js";
4
4
  import "../chunk-BXC6GRLE.js";
5
- import "../chunk-KKVM723A.js";
5
+ import "../chunk-LY5I3ZSV.js";
6
6
  import {
7
7
  SettingsSectionChips
8
- } from "../chunk-F3Q4CMRB.js";
8
+ } from "../chunk-GBVNY2LG.js";
9
9
  import "../chunk-AJUSBPWG.js";
10
- import "../chunk-TNYKM4UU.js";
11
- import "../chunk-V5EWCJBT.js";
10
+ import "../chunk-TJO4CBYT.js";
11
+ import "../chunk-SL56MOKE.js";
12
12
  import {
13
13
  SettingsStatusMarker
14
- } from "../chunk-DBFRCTI5.js";
15
- import "../chunk-6KEXHOIF.js";
16
- import "../chunk-NYFNF7I5.js";
14
+ } from "../chunk-7Y2VWMGS.js";
15
+ import "../chunk-WOXNVM52.js";
16
+ import "../chunk-NK4T624E.js";
17
17
  import "../chunk-HPK33ACY.js";
18
18
  import "../chunk-YKCAJ2TN.js";
19
19
  import "../chunk-PZ5AY32C.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/Textarea/Textarea.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAmC,MAAM,OAAO,CAAC;AAwBxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAoNtD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA0E5C,CAAC"}
1
+ {"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/Textarea/Textarea.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAmC,MAAM,OAAO,CAAC;AAwBxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA2NtD,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA0E5C,CAAC"}
@@ -65,11 +65,13 @@ export interface TextareaBaseProps extends Omit<TextareaAutosizeProps, 'variant'
65
65
  */
66
66
  gradient?: boolean;
67
67
  /**
68
- * Minimum number of rows for autosize variant
68
+ * How many lines of its own text the box opens at, in every variant.
69
+ * Defaults to 4; pass it to override.
69
70
  */
70
71
  minRows?: number;
71
72
  /**
72
- * Maximum number of rows for autosize variant
73
+ * The most lines the `autosize` variant grows to before it scrolls.
74
+ * The other variants ignore it.
73
75
  */
74
76
  maxRows?: number;
75
77
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/Textarea/Textarea.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;GAIG;AACH,KAAK,gBAAgB,GACjB;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAAC,cAAc,CAAC,EAAE,KAAK,CAAA;CAAE,GAC1E;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEjE,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACjE;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IAExD;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IAEnB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEvB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"Textarea.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/Textarea/Textarea.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;GAIG;AACH,KAAK,gBAAgB,GACjB;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAAC,cAAc,CAAC,EAAE,KAAK,CAAA;CAAE,GAC1E;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEjE,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,qBAAqB,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACjE;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IAExD;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,CAAC;IAEnB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEvB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsLayout.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAOjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAyDlE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA8ExD,CAAC"}
1
+ {"version":3,"file":"SettingsLayout.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAOjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AA0ElE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA+ExD,CAAC"}
@@ -5,6 +5,8 @@ export interface RailShape {
5
5
  variant: SettingsNavVariant;
6
6
  breakpoint: SettingsRailBreakpoint;
7
7
  atIndex: boolean;
8
+ /** The rail is drawn as a card (`railVariant="card"`): denser rows, darker text. */
9
+ card?: boolean;
8
10
  }
9
11
  interface RailItemProps extends RailShape {
10
12
  item: SettingsNavItem;
@@ -16,7 +18,7 @@ interface RailItemProps extends RailShape {
16
18
  testIdPrefix: string;
17
19
  }
18
20
  /** One rail entry — a link when it has `href`, inert text when it says so, else a button. */
19
- export declare function SettingsRailItem({ item, active, linkComponent, onSelectItem, onNavigate, testIdPrefix, variant, breakpoint, }: RailItemProps): React.JSX.Element;
21
+ export declare function SettingsRailItem({ item, active, linkComponent, onSelectItem, onNavigate, testIdPrefix, variant, breakpoint, card, }: RailItemProps): React.JSX.Element;
20
22
  interface RailGroupProps extends RailShape {
21
23
  group: SettingsNavGroup;
22
24
  activeItemId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsLayout.items.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.items.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAEhC,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,sBAAsB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,aAAc,SAAQ,SAAS;IACvC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAgCD,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,OAAO,EACP,UAAU,GACX,EAAE,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkEnC;AAED,UAAU,cAAe,SAAQ,SAAS;IACxC,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAsBD,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,GAAG,KAAK,EACT,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAyCpC"}
1
+ {"version":3,"file":"SettingsLayout.items.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.items.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAEhC,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,sBAAsB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,oFAAoF;IACpF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,aAAc,SAAQ,SAAS;IACvC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AA4DD,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,OAAO,EACP,UAAU,EACV,IAAY,GACb,EAAE,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAoEnC;AAED,UAAU,cAAe,SAAQ,SAAS;IACxC,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAwBD,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,GAAG,KAAK,EACT,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAyCpC"}
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { type RailShape } from './SettingsLayout.items';
3
- import type { SettingsEmptySearchAction, SettingsLayoutProps, SettingsNavGroup } from './SettingsLayout.types';
3
+ import type { SettingsEmptySearchAction, SettingsLayoutProps, SettingsNavGroup, SettingsRailVariant } from './SettingsLayout.types';
4
4
  export interface RailBodyProps extends RailShape {
5
5
  navOpen: boolean;
6
6
  query: string;
@@ -14,6 +14,8 @@ export interface RailBodyProps extends RailShape {
14
14
  onSelectItem?: (id: string) => void;
15
15
  onNavigate?: () => void;
16
16
  testIdPrefix: string;
17
+ /** Whether the search field is drawn (`SettingsLayoutProps.searchable`). */
18
+ searchable: boolean;
17
19
  }
18
20
  /** Props for {@link SettingsRail}: the rail body's inputs plus the mobile chrome. */
19
21
  export type SettingsRailProps = RailBodyProps & {
@@ -22,7 +24,9 @@ export type SettingsRailProps = RailBodyProps & {
22
24
  onToggleNav: () => void;
23
25
  /** Scroll inside the rail rather than with the page. See `fillHeight`. */
24
26
  fillHeight?: boolean;
27
+ /** How the rail's own column is drawn. See `SettingsLayoutProps.railVariant`. */
28
+ railVariant?: SettingsRailVariant;
25
29
  };
26
30
  /** The navigation column: title, the `switcher`'s disclosure, and the body. */
27
- export declare function SettingsRail({ title, activeLabel, navOpen, onToggleNav, testIdPrefix, fillHeight, ...bodyProps }: SettingsRailProps): React.JSX.Element;
31
+ export declare function SettingsRail({ title, activeLabel, navOpen, onToggleNav, testIdPrefix, fillHeight, railVariant, ...bodyProps }: SettingsRailProps): React.JSX.Element;
28
32
  //# sourceMappingURL=SettingsLayout.rail.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsLayout.rail.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.rail.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AA6GhC,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;IAC9C,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAwED,qFAAqF;AACrF,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;IAC9C,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,OAAO,EACP,WAAW,EACX,YAAY,EACZ,UAAkB,EAClB,GAAG,SAAS,EACb,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+DvC"}
1
+ {"version":3,"file":"SettingsLayout.rail.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.rail.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAEhB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AA6GhC,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;IAC9C,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,UAAU,EAAE,OAAO,CAAC;CACrB;AA4FD,qFAAqF;AACrF,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;IAC9C,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iFAAiF;IACjF,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC,CAAC;AAqBF,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,OAAO,EACP,WAAW,EACX,YAAY,EACZ,UAAkB,EAClB,WAAuB,EACvB,GAAG,SAAS,EACb,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkEvC"}
@@ -2,6 +2,8 @@ import type { CSSObject, SxProps, Theme } from '@mui/material/styles/index.js';
2
2
  import type { SettingsNavStatus, SettingsRailBreakpoint } from './SettingsLayout.types';
3
3
  /** Fixed width of the left navigation rail once it has its own column (300 design px). */
4
4
  export declare const railWidth: (theme: Theme) => string;
5
+ /** Width of the rail drawn as a card (`railVariant="card"`, 200 design px). */
6
+ export declare const railCardWidth: (theme: Theme) => string;
5
7
  /** Visually hidden, still read aloud — for text a marker's colour cannot carry. */
6
8
  export declare const SR_ONLY_SX: SxProps<Theme>;
7
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsLayout.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAExF,0FAA0F;AAC1F,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,KAAG,MAAyB,CAAC;AAEnE,mFAAmF;AACnF,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,KAAK,CAUrC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,sBAAsB,GAAG,MAAM,CAEpF;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,sBAAsB,EAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,SAAS,CAEX;AAED,iFAAiF;AACjF,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAI7E,CAAC"}
1
+ {"version":3,"file":"SettingsLayout.styles.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAExF,0FAA0F;AAC1F,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,KAAG,MAAyB,CAAC;AAEnE,+EAA+E;AAC/E,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,KAAG,MAAyB,CAAC;AAEvE,mFAAmF;AACnF,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,KAAK,CAUrC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,sBAAsB,GAAG,MAAM,CAEpF;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,sBAAsB,EAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,SAAS,CAEX;AAED,iFAAiF;AACjF,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAI7E,CAAC"}
@@ -83,6 +83,11 @@ export type SettingsRailBreakpoint = 'sm' | 'md' | 'lg' | 'xl' | number;
83
83
  * does, and what fits at 375px, where a 300px rail would leave 75px of content.
84
84
  */
85
85
  export type SettingsNavVariant = 'switcher' | 'drilldown';
86
+ /**
87
+ * How the rail is drawn once it has its own column: `divided` — a 300px column
88
+ * ruled off from the panel; `card` — a 200px bordered card beside it.
89
+ */
90
+ export type SettingsRailVariant = 'divided' | 'card';
86
91
  /** The exit offered inside the empty-search state, so the dead end has a door. */
87
92
  export interface SettingsEmptySearchAction {
88
93
  /** Button label, e.g. `"Limpar a busca"`. */
@@ -160,6 +165,20 @@ export interface SettingsLayoutProps {
160
165
  railBreakpoint?: SettingsRailBreakpoint;
161
166
  /** Narrow-width navigation shape. Defaults to `"switcher"`. */
162
167
  navVariant?: SettingsNavVariant;
168
+ /**
169
+ * Whether the rail carries its search field. Defaults to `true`.
170
+ *
171
+ * A settings area with twenty categories needs the field; an area of eight
172
+ * rows a reader takes in at a glance is better without one, which is how a
173
+ * storefront's own account area draws it. Off, the rail shows every group.
174
+ */
175
+ searchable?: boolean;
176
+ /**
177
+ * How the rail is drawn from `railBreakpoint` up. Defaults to `"divided"`
178
+ * (a 300px column ruled off from the panel); `"card"` draws it as a 200px
179
+ * bordered card. Below the breakpoint both look the same.
180
+ */
181
+ railVariant?: SettingsRailVariant;
163
182
  /**
164
183
  * True when the router is at the area's index rather than inside a section.
165
184
  *
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsLayout.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SettingsLayout.types.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/SettingsLayout.types.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,5 @@ export { SettingsSectionChips } from './SettingsSectionChips';
3
3
  export type { SettingsSectionChipsProps } from './SettingsSectionChips';
4
4
  export { SettingsStatusMarker } from './SettingsStatusMarker';
5
5
  export type { SettingsStatusMarkerProps } from './SettingsStatusMarker';
6
- export type { SettingsEmptySearchAction, SettingsLayoutProps, SettingsNavGroup, SettingsNavItem, SettingsNavStatus, SettingsNavVariant, SettingsRailBreakpoint, } from './SettingsLayout.types';
6
+ export type { SettingsEmptySearchAction, SettingsLayoutProps, SettingsNavGroup, SettingsNavItem, SettingsNavStatus, SettingsNavVariant, SettingsRailVariant, SettingsRailBreakpoint, } from './SettingsLayout.types';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,YAAY,EACV,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/layout/SettingsLayout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,YAAY,EACV,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/ui",
3
- "version": "6.75.0",
3
+ "version": "6.76.1",
4
4
  "license": "MIT",
5
5
  "packageManager": "pnpm@10.34.5",
6
6
  "type": "module",
@@ -65,12 +65,17 @@ const StyledTextarea = styled(TextareaAutosize, {
65
65
  const colorPalette = getColorFromTheme(theme, customColor);
66
66
  const errorColor = theme.palette.error;
67
67
 
68
+ // No min-height here: the box's height is counted in LINES of its own text
69
+ // (`minRows`). A pixel floor broke that twice over — it ignored the font, and
70
+ // `TextareaAutosize` measures one row on a hidden copy carrying this same
71
+ // class, so a "row" came out as the whole floor and `minRows={2}` drew about
72
+ // 200px (FUT-3504, FUT-3534).
68
73
  const sizeMap = {
69
- xs: { padding: rems(theme, 6, 8), fontSize: rem(theme, 12), minHeight: rem(theme, 60) },
70
- sm: { padding: rems(theme, 8, 10), fontSize: rem(theme, 14), minHeight: rem(theme, 80) },
71
- md: { padding: rems(theme, 10, 12), fontSize: rem(theme, 16), minHeight: rem(theme, 100) },
72
- lg: { padding: rems(theme, 12, 14), fontSize: rem(theme, 18), minHeight: rem(theme, 120) },
73
- xl: { padding: rems(theme, 14, 16), fontSize: rem(theme, 20), minHeight: rem(theme, 140) } };
74
+ xs: { padding: rems(theme, 6, 8), fontSize: rem(theme, 12) },
75
+ sm: { padding: rems(theme, 8, 10), fontSize: rem(theme, 14) },
76
+ md: { padding: rems(theme, 10, 12), fontSize: rem(theme, 16) },
77
+ lg: { padding: rems(theme, 12, 14), fontSize: rem(theme, 18) },
78
+ xl: { padding: rems(theme, 14, 16), fontSize: rem(theme, 20) } };
74
79
 
75
80
  const baseStyles = {
76
81
  width: '100%',
@@ -143,7 +148,9 @@ const TEXTAREA_DEFAULTS = {
143
148
  glass: false,
144
149
  gradient: false,
145
150
  iconPosition: 'start',
146
- minRows: 3 } satisfies Partial<TextareaProps>;
151
+ // Four lines of its own text, whatever the variant or size (FUT-3534); a
152
+ // screen that wants another height passes `minRows`.
153
+ minRows: 4 } satisfies Partial<TextareaProps>;
147
154
 
148
155
  // Strips explicitly-undefined props before the merge, so `prop={undefined}`
149
156
  // still falls back to the default as a destructuring default would.
@@ -304,7 +311,7 @@ export const Textarea: React.FC<TextareaProps> = (textareaProps) => {
304
311
  glass={glass}
305
312
  gradient={gradient}
306
313
  error={error}
307
- minRows={variant === 'autosize' ? minRows : undefined}
314
+ minRows={minRows}
308
315
  maxRows={variant === 'autosize' ? maxRows : undefined}
309
316
  style={textareaStyle}
310
317
  aria-label={label || props['aria-label']}
@@ -77,12 +77,14 @@ export interface TextareaBaseProps
77
77
  gradient?: boolean;
78
78
 
79
79
  /**
80
- * Minimum number of rows for autosize variant
80
+ * How many lines of its own text the box opens at, in every variant.
81
+ * Defaults to 4; pass it to override.
81
82
  */
82
83
  minRows?: number;
83
84
 
84
85
  /**
85
- * Maximum number of rows for autosize variant
86
+ * The most lines the `autosize` variant grows to before it scrolls.
87
+ * The other variants ignore it.
86
88
  */
87
89
  maxRows?: number;
88
90
 
@@ -12,7 +12,7 @@ import type { SxProps, Theme } from '@mui/material/styles/index.js';
12
12
  import React from 'react';
13
13
 
14
14
  import { atLeastRail, TOUCH_TARGET } from './SettingsLayout.styles';
15
- import { rem } from '../../../tokens/relative';
15
+ import { rem, sxRem } from '../../../tokens/relative';
16
16
  import { SettingsStatusMarker } from './SettingsStatusMarker';
17
17
  import type {
18
18
  SettingsLayoutProps,
@@ -27,6 +27,8 @@ export interface RailShape {
27
27
  variant: SettingsNavVariant;
28
28
  breakpoint: SettingsRailBreakpoint;
29
29
  atIndex: boolean;
30
+ /** The rail is drawn as a card (`railVariant="card"`): denser rows, darker text. */
31
+ card?: boolean;
30
32
  }
31
33
 
32
34
  interface RailItemProps extends RailShape {
@@ -69,6 +71,34 @@ function RailItemContent({
69
71
  );
70
72
  }
71
73
 
74
+ /**
75
+ * The row's text colour. On the card the active row's red is the darker one,
76
+ * since `primary.main` on its 12% wash measured 4.19:1 — under AA at 16px —
77
+ * and the rest read in the body colour, as the card's prototype draws them.
78
+ */
79
+ function railItemColor(active: boolean, card: boolean): string {
80
+ if (active) return card ? 'primary.dark' : 'primary.main';
81
+ return card ? 'text.primary' : 'text.secondary';
82
+ }
83
+
84
+ /**
85
+ * Keyboard focus as a ring, not MUI's grey fill: the fill measured 1.3:1
86
+ * against the rail, under the 3:1 a focus indicator needs.
87
+ */
88
+ const FOCUS_RING_SX = {
89
+ '&.Mui-focusVisible': {
90
+ outlineStyle: 'solid',
91
+ outlineWidth: sxRem(2),
92
+ outlineColor: 'primary.main',
93
+ outlineOffset: sxRem(-2),
94
+ },
95
+ } as const;
96
+
97
+ /** The card's rows from the breakpoint up: 36px, the prototype's rail density. */
98
+ function cardRowSx(theme: Theme, breakpoint: SettingsRailBreakpoint): Record<string, unknown> {
99
+ return { [atLeastRail(theme, breakpoint)]: { minHeight: rem(theme, 36), py: sxRem(6) } };
100
+ }
101
+
72
102
  /** One rail entry — a link when it has `href`, inert text when it says so, else a button. */
73
103
  export function SettingsRailItem({
74
104
  item,
@@ -79,6 +109,7 @@ export function SettingsRailItem({
79
109
  testIdPrefix,
80
110
  variant,
81
111
  breakpoint,
112
+ card = false,
82
113
  }: RailItemProps): React.JSX.Element {
83
114
  const theme = useTheme();
84
115
  // In `drilldown` the narrow rail IS the page's list, so its rows are the
@@ -95,11 +126,13 @@ export function SettingsRailItem({
95
126
  mb: 0.25,
96
127
  gap: 1.5,
97
128
  ...touchFloor,
98
- color: active ? 'primary.main' : 'text.secondary',
129
+ ...(card ? cardRowSx(theme, breakpoint) : null),
130
+ color: railItemColor(active, card),
99
131
  '&.Mui-selected': {
100
132
  bgcolor: alpha(theme.palette.primary.main, 0.12),
101
133
  '&:hover': { bgcolor: alpha(theme.palette.primary.main, 0.18) },
102
134
  },
135
+ ...FOCUS_RING_SX,
103
136
  },
104
137
  };
105
138
  const content = <RailItemContent item={item} active={active} testIdPrefix={testIdPrefix} />;
@@ -171,7 +204,9 @@ function indexListSx(shape: RailShape): Extract<SxProps<Theme>, (theme: Theme) =
171
204
  // One spacing unit (8px). This is an `sx` callback, where a bare 8 is
172
205
  // EIGHT units — it drew a 64px gutter between the two columns.
173
206
  columnGap: 1,
174
- [theme.breakpoints.up('sm')]: { gridTemplateColumns: '1fr 1fr' },
207
+ // From `md`, not `sm`: at 600 two columns of bare text rows read as one
208
+ // list with a hole in it, and a row's status dot sat nearer the next column.
209
+ [theme.breakpoints.up('md')]: { gridTemplateColumns: '1fr 1fr' },
175
210
  [atLeastRail(theme, shape.breakpoint)]: { gridTemplateColumns: '1fr' },
176
211
  });
177
212
  }
@@ -165,6 +165,23 @@ it: a `position: sticky` toolbar inside `children` pins to the top of the
165
165
  the scroll container.
166
166
 
167
167
 
168
+ ## A small area: no search, a card rail (`searchable`, `railVariant`)
169
+
170
+ The search field earns its place in an area of twenty categories. In one of
171
+ eight rows a reader takes in at a glance it is a control nobody needs, so
172
+ `searchable={false}` leaves it out and the rail shows every group.
173
+
174
+ `railVariant="card"` draws the rail, from `railBreakpoint` up, as a 200px
175
+ bordered card beside the panel instead of the default 300px column ruled off
176
+ from it. Below the breakpoint both variants look the same.
177
+
178
+ ```tsx
179
+ <SettingsLayout searchable={false} railVariant="card" …>
180
+ ```
181
+
182
+ Both default to today's shape, so an upgrade changes nothing for an area that
183
+ does not ask.
184
+
168
185
  ## Props
169
186
 
170
187
  ### SettingsLayoutProps
@@ -184,6 +201,8 @@ the scroll container.
184
201
  | railBreakpoint | `'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Width at which the rail takes its own column |
185
202
  | fillHeight | boolean | `false` | Rail and panel each scroll themselves (needs a definite height) |
186
203
  | navVariant | `'switcher' \| 'drilldown'` | `'switcher'` | Narrow-width navigation shape |
204
+ | searchable | boolean | `true` | Whether the rail carries its search field |
205
+ | railVariant | `'divided' \| 'card'` | `'divided'` | From the breakpoint up: a 300px ruled column, or a 200px card |
187
206
  | atIndex | boolean | `false` | `drilldown`: the router is at the area's index, not in a section |
188
207
  | indexHref | string | - | `drilldown`: where the back link goes |
189
208
  | backLabel | string | `'Back'` | Label on the back control |