@spaced-out/ui-design-system 0.6.34 → 0.6.35-beta.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
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.35-beta.1](https://github.com/spaced-out/ui-design-system/compare/v0.6.35-beta.0...v0.6.35-beta.1) (2026-09-22)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **menu:** never cap the card below its furniture plus the first row ([#510](https://github.com/spaced-out/ui-design-system/issues/510)) ([b0597b0](https://github.com/spaced-out/ui-design-system/commit/b0597b0439a2e3e38671e7a44de854e53e4e6763))
11
+
12
+ ### [0.6.35-beta.0](https://github.com/spaced-out/ui-design-system/compare/v0.6.34...v0.6.35-beta.0) (2026-09-18)
13
+
14
+
15
+ ### Features
16
+
17
+ * **menu:** add keyboard navigation and ARIA semantics to the shared Menu ([#504](https://github.com/spaced-out/ui-design-system/issues/504)) ([eac2db6](https://github.com/spaced-out/ui-design-system/commit/eac2db6bb600d7d0396b751f14dfb7451356b205)), closes [#500](https://github.com/spaced-out/ui-design-system/issues/500) [#500](https://github.com/spaced-out/ui-design-system/issues/500)
18
+
5
19
  ### [0.6.34](https://github.com/spaced-out/ui-design-system/compare/v0.6.33...v0.6.34) (2026-09-16)
6
20
 
7
21
 
@@ -21,6 +21,7 @@ export type Virtualization = Readonly<{
21
21
  * (e.g. taller custom title nodes).
22
22
  */
23
23
  groupTitleHeight?: number | ((groupTitle: React.ReactNode, groupIndex: number) => number);
24
+ /** Max height of the whole card in px, search/header/footer included; never below the first row. */
24
25
  menuHeight?: number;
25
26
  }>;
26
27
  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":"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"}
@@ -22,14 +22,29 @@ const menuSizeMedium = 276,
22
22
  menuSizeSmall = 228;
23
23
  const buttonSizeMedium = 40,
24
24
  buttonSizeSmall = 32;
25
-
26
- // default group title row height when virtualizing groupTitleOptions
25
+ const searchInputSizeMedium = 42,
26
+ searchInputSizeSmall = 34;
27
+ const cardPadding = 8;
27
28
  const groupTitleSize = 32;
29
+ const resultTextSize = 41;
30
+ const headerFooterSize = 58;
31
+ const getMenuChromeHeight = _ref => {
32
+ let {
33
+ size,
34
+ allowSearch,
35
+ showResultText,
36
+ hasHeader,
37
+ hasFooter
38
+ } = _ref;
39
+ return (hasHeader ? headerFooterSize : cardPadding) + (hasFooter ? headerFooterSize : cardPadding) + (allowSearch ? size === 'medium' ? searchInputSizeMedium : searchInputSizeSmall : 0) + (allowSearch && showResultText ? resultTextSize : 0);
40
+ };
41
+ const makeItemHeightResolver = (itemHeight, size) => (option, index) => typeof itemHeight === 'function' ? itemHeight(option, index) : itemHeight || (size === 'medium' ? buttonSizeMedium : buttonSizeSmall);
42
+ const makeGroupTitleHeightResolver = groupTitleHeight => (groupTitle, groupIndex) => typeof groupTitleHeight === 'function' ? groupTitleHeight(groupTitle, groupIndex) : groupTitleHeight || groupTitleSize;
28
43
  // VariableSizeList caches row offsets, so the cache must be flushed whenever
29
44
  // the rows or their heights change. `heightSignature` encodes every row's
30
45
  // key and height; when it changes, resetAfterIndex invalidates the cache in
31
46
  // place without remounting the list (a remount would drop scroll position).
32
- const MenuVariableSizeList = _ref => {
47
+ const MenuVariableSizeList = _ref2 => {
33
48
  let {
34
49
  heightSignature,
35
50
  height,
@@ -37,7 +52,7 @@ const MenuVariableSizeList = _ref => {
37
52
  itemSize,
38
53
  itemKey,
39
54
  children
40
- } = _ref;
55
+ } = _ref2;
41
56
  const listRef = React.useRef(null);
42
57
  React.useEffect(() => {
43
58
  listRef.current?.resetAfterIndex(0, true);
@@ -52,7 +67,7 @@ const MenuVariableSizeList = _ref => {
52
67
  children: children
53
68
  });
54
69
  };
55
- const RenderOption = _ref2 => {
70
+ const RenderOption = _ref3 => {
56
71
  let {
57
72
  options,
58
73
  composeOptions,
@@ -67,7 +82,7 @@ const RenderOption = _ref2 => {
67
82
  SEARCH_PLACEHOLDER: 'Search...'
68
83
  },
69
84
  ...restProps
70
- } = _ref2;
85
+ } = _ref3;
71
86
  const {
72
87
  allowSearch,
73
88
  size,
@@ -82,16 +97,16 @@ const RenderOption = _ref2 => {
82
97
  enable: false
83
98
  };
84
99
  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;
100
+ const resolveItemHeight = makeItemHeightResolver(itemHeight, size);
101
+ const resolveGroupTitleHeight = makeGroupTitleHeightResolver(groupTitleHeight);
87
102
  if (options && Array.isArray(options) && options.length) {
88
103
  const optionsFiltered = !allowSearch ? options : (0, _menu.getFilteredOptionsFromSearchText)(options, searchText);
89
104
  const finalResultText = !allowSearch ? '' : (0, _menu.getFilteredOptionsResultText)(optionsFiltered, staticLabels);
90
- const renderFlatRow = _ref3 => {
105
+ const renderFlatRow = _ref4 => {
91
106
  let {
92
107
  index: idx,
93
108
  style
94
- } = _ref3;
109
+ } = _ref4;
95
110
  const buttonOption = optionsFiltered[idx];
96
111
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuOptionButton.MenuOptionButton, {
97
112
  option: buttonOption,
@@ -228,11 +243,11 @@ const RenderOption = _ref2 => {
228
243
  itemSize: rowHeight,
229
244
  itemCount: rows.length,
230
245
  itemKey: rowKey,
231
- children: _ref4 => {
246
+ children: _ref5 => {
232
247
  let {
233
248
  index: idx,
234
249
  style
235
- } = _ref4;
250
+ } = _ref5;
236
251
  const row = rows[idx];
237
252
  if (row.kind === 'title') {
238
253
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
@@ -300,10 +315,12 @@ const Menu = exports.Menu = /*#__PURE__*/React.forwardRef((props, ref) => {
300
315
  width,
301
316
  isFluid = true,
302
317
  allowSearch,
318
+ showResultText = true,
319
+ options,
320
+ composeOptions,
321
+ groupTitleOptions,
303
322
  virtualization = {
304
- enable: false,
305
- menuHeight: null,
306
- itemHeight: null
323
+ enable: false
307
324
  },
308
325
  header,
309
326
  footer,
@@ -312,10 +329,22 @@ const Menu = exports.Menu = /*#__PURE__*/React.forwardRef((props, ref) => {
312
329
  } = props;
313
330
  const [searchText, setSearchText] = React.useState('');
314
331
  const {
315
- menuHeight
332
+ menuHeight,
333
+ itemHeight,
334
+ groupTitleHeight
316
335
  } = virtualization;
317
336
  const hasHeader = header ? true : false;
318
337
  const hasFooter = footer ? true : false;
338
+ const firstOption = options?.[0] ?? composeOptions?.[0]?.[0] ?? groupTitleOptions?.[0]?.options?.[0];
339
+ const firstRowHeight = (groupTitleOptions?.length ? makeGroupTitleHeightResolver(groupTitleHeight)(groupTitleOptions[0].groupTitle, 0) : 0) + (firstOption ? makeItemHeightResolver(itemHeight, size)(firstOption, 0) : 0);
340
+ const minCardHeight = getMenuChromeHeight({
341
+ size,
342
+ allowSearch: Boolean(allowSearch),
343
+ showResultText,
344
+ hasHeader,
345
+ hasFooter
346
+ }) + firstRowHeight;
347
+ const cardMaxHeight = menuHeight ? Math.max(menuHeight, minCardHeight) : null;
319
348
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
320
349
  className: (0, _classify.classify)(_MenuModule.default.menuCard, {
321
350
  [_MenuModule.default.fluid]: isFluid,
@@ -332,7 +361,7 @@ const Menu = exports.Menu = /*#__PURE__*/React.forwardRef((props, ref) => {
332
361
  }, classNames?.wrapper),
333
362
  style: {
334
363
  width,
335
- maxHeight: menuHeight ? menuHeight + 'px' : ''
364
+ maxHeight: cardMaxHeight ? cardMaxHeight + 'px' : ''
336
365
  },
337
366
  ref: ref,
338
367
  "data-testid": (0, _qa.generateTestId)({
package/mcp/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spaced-out/genesis-mcp",
3
- "version": "1.0.46",
3
+ "version": "1.0.48",
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.34",
3
+ "version": "0.6.35-beta.1",
4
4
  "description": "Sense UI components library",
5
5
  "author": {
6
6
  "name": "Spaced Out"