@spaced-out/ui-design-system 0.6.28 → 0.6.29

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/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.6.29](https://github.com/spaced-out/ui-design-system/compare/v0.6.28...v0.6.29) (2026-08-20)
6
+
7
+
8
+ ### Features
9
+
10
+ * **menu:** support variable row heights in virtualized menus ([#500](https://github.com/spaced-out/ui-design-system/issues/500)) ([623b86a](https://github.com/spaced-out/ui-design-system/commit/623b86afc56c2ea352a72888f590c8b8b43627e6))
11
+
5
12
  ### [0.6.28](https://github.com/spaced-out/ui-design-system/compare/v0.6.28-beta.1...v0.6.28) (2026-08-17)
6
13
 
7
14
  ### [0.6.28-beta.1](https://github.com/spaced-out/ui-design-system/compare/v0.6.28-beta.0...v0.6.28-beta.1) (2026-07-29)
@@ -8,7 +8,19 @@ type OptionClassNames = Readonly<{
8
8
  }>;
9
9
  export type Virtualization = Readonly<{
10
10
  enable: boolean;
11
- itemHeight?: number;
11
+ /**
12
+ * Height of an option row. A number applies to every row; pass a function
13
+ * for per-row heights (e.g. taller rows for options with descriptions).
14
+ * `index` is the position of the option in the filtered option list —
15
+ * group title rows are not counted.
16
+ */
17
+ itemHeight?: number | ((option: MenuOption, index: number) => number);
18
+ /**
19
+ * Height of a group title row when virtualizing `groupTitleOptions`.
20
+ * A number applies to every title; pass a function for per-title heights
21
+ * (e.g. taller custom title nodes).
22
+ */
23
+ groupTitleHeight?: number | ((groupTitle: React.ReactNode, groupIndex: number) => number);
12
24
  menuHeight?: number;
13
25
  }>;
14
26
  export interface MenuOption {
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,4BAA4B,CAAC;AAOrD,OAAO,KAAK,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAYrE,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAQvD,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC,KAAK,gBAAgB,GAAG,QAAQ,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACtE;;;;OAIG;IACH,gBAAgB,CAAC,EACb,MAAM,GACN,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,UAAU,EAClB,IAAI,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,KACxD,OAAO,CAAC;IACb,cAAc,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAChE,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IACzE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5B,cAAc,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1C,iBAAiB,CAAC,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;CACjD;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC/C,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,SAAU,SAAQ,aAAa,EAAE,eAAe;CAAG;AAEpE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8YD,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,CAmF/D,CAAC"}
@@ -22,7 +22,37 @@ const menuSizeMedium = 276,
22
22
  menuSizeSmall = 228;
23
23
  const buttonSizeMedium = 40,
24
24
  buttonSizeSmall = 32;
25
- const RenderOption = _ref => {
25
+
26
+ // default group title row height when virtualizing groupTitleOptions
27
+ const groupTitleSize = 32;
28
+ // VariableSizeList caches row offsets, so the cache must be flushed whenever
29
+ // the rows or their heights change. `heightSignature` encodes every row's
30
+ // key and height; when it changes, resetAfterIndex invalidates the cache in
31
+ // place without remounting the list (a remount would drop scroll position).
32
+ const MenuVariableSizeList = _ref => {
33
+ let {
34
+ heightSignature,
35
+ height,
36
+ itemCount,
37
+ itemSize,
38
+ itemKey,
39
+ children
40
+ } = _ref;
41
+ const listRef = React.useRef(null);
42
+ React.useEffect(() => {
43
+ listRef.current?.resetAfterIndex(0, true);
44
+ }, [heightSignature]);
45
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactWindow.VariableSizeList, {
46
+ ref: listRef,
47
+ height: height,
48
+ itemSize: itemSize,
49
+ itemCount: itemCount,
50
+ itemKey: itemKey,
51
+ width: "initial",
52
+ children: children
53
+ });
54
+ };
55
+ const RenderOption = _ref2 => {
26
56
  let {
27
57
  options,
28
58
  composeOptions,
@@ -37,24 +67,45 @@ const RenderOption = _ref => {
37
67
  SEARCH_PLACEHOLDER: 'Search...'
38
68
  },
39
69
  ...restProps
40
- } = _ref;
70
+ } = _ref2;
41
71
  const {
42
72
  allowSearch,
43
73
  size,
44
- virtualization = {
45
- enable: false,
46
- menuHeight: null,
47
- itemHeight: null
48
- }
74
+ virtualization
49
75
  } = restProps;
76
+ const {
77
+ enable: isVirtualizationEnabled = false,
78
+ menuHeight,
79
+ itemHeight,
80
+ groupTitleHeight
81
+ } = virtualization ?? {
82
+ enable: false
83
+ };
84
+ const listHeight = menuHeight || (size === 'medium' ? menuSizeMedium : menuSizeSmall);
85
+ const resolveItemHeight = (option, index) => typeof itemHeight === 'function' ? itemHeight(option, index) : itemHeight || (size === 'medium' ? buttonSizeMedium : buttonSizeSmall);
86
+ const resolveGroupTitleHeight = (groupTitle, groupIndex) => typeof groupTitleHeight === 'function' ? groupTitleHeight(groupTitle, groupIndex) : groupTitleHeight || groupTitleSize;
50
87
  if (options && Array.isArray(options) && options.length) {
51
88
  const optionsFiltered = !allowSearch ? options : (0, _menu.getFilteredOptionsFromSearchText)(options, searchText);
52
89
  const finalResultText = !allowSearch ? '' : (0, _menu.getFilteredOptionsResultText)(optionsFiltered, staticLabels);
53
- const {
54
- enable: isVirtualizationEnabled,
55
- menuHeight,
56
- itemHeight
57
- } = virtualization;
90
+ const renderFlatRow = _ref3 => {
91
+ let {
92
+ index: idx,
93
+ style
94
+ } = _ref3;
95
+ const buttonOption = optionsFiltered[idx];
96
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuOptionButton.MenuOptionButton, {
97
+ option: buttonOption,
98
+ classNames: classNames,
99
+ style: style,
100
+ ...restProps,
101
+ isLastItem: idx === optionsFiltered.length - 1,
102
+ testId: (0, _qa.generateTestId)({
103
+ base: testId,
104
+ slot: 'option',
105
+ index: idx.toString()
106
+ })
107
+ });
108
+ };
58
109
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
59
110
  children: [allowSearch && showResultText && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.FormLabelSmall, {
60
111
  className: _MenuModule.default.filterOptionsResultText,
@@ -64,32 +115,20 @@ const RenderOption = _ref => {
64
115
  slot: 'result-text'
65
116
  }),
66
117
  children: finalResultText
67
- }), virtualization && isVirtualizationEnabled ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactWindow.FixedSizeList, {
68
- height: menuHeight || (size === 'medium' ? menuSizeMedium : menuSizeSmall),
118
+ }), virtualization && isVirtualizationEnabled ? typeof itemHeight === 'function' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(MenuVariableSizeList, {
119
+ heightSignature: optionsFiltered.map((option, idx) => `${option.key}:${resolveItemHeight(option, idx)}`).join('|'),
120
+ height: listHeight,
121
+ itemSize: idx => resolveItemHeight(optionsFiltered[idx], idx),
122
+ itemCount: optionsFiltered.length,
123
+ itemKey: idx => optionsFiltered[idx].key,
124
+ children: renderFlatRow
125
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactWindow.FixedSizeList, {
126
+ height: listHeight,
69
127
  itemSize: itemHeight || (size === 'medium' ? buttonSizeMedium : buttonSizeSmall),
70
128
  itemCount: optionsFiltered.length,
129
+ itemKey: idx => optionsFiltered[idx].key,
71
130
  width: "initial",
72
- children: _ref2 => {
73
- let {
74
- index: idx,
75
- style
76
- } = _ref2;
77
- const buttonOption = optionsFiltered[idx];
78
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(React.Fragment, {
79
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuOptionButton.MenuOptionButton, {
80
- option: buttonOption,
81
- classNames: classNames,
82
- style: style,
83
- ...restProps,
84
- isLastItem: idx === optionsFiltered.length - 1,
85
- testId: (0, _qa.generateTestId)({
86
- base: testId,
87
- slot: 'option',
88
- index: idx.toString()
89
- })
90
- })
91
- }, buttonOption.key);
92
- }
131
+ children: renderFlatRow
93
132
  }) : optionsFiltered.map((option, idx) => /*#__PURE__*/(0, _jsxRuntime.jsx)(React.Fragment, {
94
133
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuOptionButton.MenuOptionButton, {
95
134
  option: option,
@@ -141,16 +180,90 @@ const RenderOption = _ref => {
141
180
  if (groupTitleOptions && Array.isArray(groupTitleOptions) && groupTitleOptions.length) {
142
181
  const optionsFiltered = !allowSearch ? groupTitleOptions : (0, _menu.getFilteredGroupTitleOptionsFromSearchText)(groupTitleOptions, searchText);
143
182
  const finalResultText = !allowSearch ? '' : (0, _menu.getFilteredGroupTitleOptionsResultText)(optionsFiltered, staticLabels);
183
+ const resultText = allowSearch && showResultText && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.FormLabelSmall, {
184
+ className: _MenuModule.default.filterOptionsResultText,
185
+ color: "tertiary",
186
+ testId: (0, _qa.generateTestId)({
187
+ base: testId,
188
+ slot: 'result-text'
189
+ }),
190
+ children: finalResultText
191
+ });
192
+ if (isVirtualizationEnabled) {
193
+ // Mixed row heights (group titles vs options) rule out FixedSizeList —
194
+ // flatten the groups into one row list and size each row individually.
195
+ const rows = [];
196
+ let flatOptionIndex = 0;
197
+ optionsFiltered.forEach((optionsGroup, groupIndex) => {
198
+ if (optionsGroup.groupTitle) {
199
+ rows.push({
200
+ kind: 'title',
201
+ node: optionsGroup.groupTitle,
202
+ groupIndex
203
+ });
204
+ }
205
+ optionsGroup.options?.forEach((option, optionIndex) => {
206
+ rows.push({
207
+ kind: 'option',
208
+ option,
209
+ groupIndex,
210
+ optionIndex,
211
+ flatOptionIndex
212
+ });
213
+ flatOptionIndex += 1;
214
+ });
215
+ });
216
+ const rowHeight = idx => {
217
+ const row = rows[idx];
218
+ return row.kind === 'title' ? resolveGroupTitleHeight(row.node, row.groupIndex) : resolveItemHeight(row.option, row.flatOptionIndex);
219
+ };
220
+ const rowKey = idx => {
221
+ const row = rows[idx];
222
+ return row.kind === 'title' ? `group-title-${row.groupIndex}` : row.option.key;
223
+ };
224
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
225
+ children: [resultText, /*#__PURE__*/(0, _jsxRuntime.jsx)(MenuVariableSizeList, {
226
+ heightSignature: rows.map((_row, idx) => `${rowKey(idx)}:${rowHeight(idx)}`).join('|'),
227
+ height: listHeight,
228
+ itemSize: rowHeight,
229
+ itemCount: rows.length,
230
+ itemKey: rowKey,
231
+ children: _ref4 => {
232
+ let {
233
+ index: idx,
234
+ style
235
+ } = _ref4;
236
+ const row = rows[idx];
237
+ if (row.kind === 'title') {
238
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
239
+ style: style,
240
+ className: (0, _classify.classify)(_MenuModule.default.groupTitleWrapper, classNames?.groupTitle),
241
+ "data-testid": (0, _qa.generateTestId)({
242
+ base: testId,
243
+ slot: 'group-title',
244
+ index: row.groupIndex.toString()
245
+ }),
246
+ children: row.node
247
+ });
248
+ }
249
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuOptionButton.MenuOptionButton, {
250
+ option: row.option,
251
+ classNames: classNames,
252
+ style: style,
253
+ ...restProps,
254
+ isLastItem: idx === rows.length - 1,
255
+ testId: (0, _qa.generateTestId)({
256
+ base: testId,
257
+ slot: 'option',
258
+ index: `${row.groupIndex}-${row.optionIndex}`
259
+ })
260
+ });
261
+ }
262
+ })]
263
+ });
264
+ }
144
265
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
145
- children: [allowSearch && showResultText && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.FormLabelSmall, {
146
- className: _MenuModule.default.filterOptionsResultText,
147
- color: "tertiary",
148
- testId: (0, _qa.generateTestId)({
149
- base: testId,
150
- slot: 'result-text'
151
- }),
152
- children: finalResultText
153
- }), optionsFiltered.map((optionsGroup, index) =>
266
+ children: [resultText, optionsFiltered.map((optionsGroup, index) =>
154
267
  /*#__PURE__*/
155
268
  // eslint-disable-next-line react/no-array-index-key
156
269
  (0, _jsxRuntime.jsxs)(React.Fragment, {
package/mcp/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spaced-out/genesis-mcp",
3
- "version": "1.0.42",
3
+ "version": "1.0.43",
4
4
  "description": "MCP server for Genesis UI Design System - provides AI assistants with access to components, hooks, and design tokens",
5
5
  "type": "module",
6
6
  "main": "index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spaced-out/ui-design-system",
3
- "version": "0.6.28",
3
+ "version": "0.6.29",
4
4
  "description": "Sense UI components library",
5
5
  "author": {
6
6
  "name": "Spaced Out"