@smwb/ui-react 2.8.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/AI_LESS_OVERRIDES.md +84 -21
  2. package/AI_THEMING.md +72 -28
  3. package/README.md +654 -0
  4. package/dist/assets/styles/less/components/appBar/appBar.entry.css +1 -1
  5. package/dist/assets/styles/less/components/button/button.entry.css +1 -1
  6. package/dist/assets/styles/less/components/checkbox/checkbox.entry.css +1 -1
  7. package/dist/assets/styles/less/components/chip/chip.entry.css +1 -1
  8. package/dist/assets/styles/less/components/commandPalette/commandPalette.entry.css +1 -0
  9. package/dist/assets/styles/less/components/composer/composer.entry.css +1 -0
  10. package/dist/assets/styles/less/components/dagView/dagView.entry.css +1 -0
  11. package/dist/assets/styles/less/components/diffStat/diffStat.entry.css +1 -0
  12. package/dist/assets/styles/less/components/kbd/kbd.entry.css +1 -0
  13. package/dist/assets/styles/less/components/list/list.entry.css +1 -1
  14. package/dist/assets/styles/less/components/qrCode/qrCode.entry.css +1 -0
  15. package/dist/assets/styles/less/components/radioButton/radioButton.entry.css +1 -1
  16. package/dist/assets/styles/less/components/selectField/selectField.entry.css +1 -1
  17. package/dist/assets/styles/less/components/sidebar/sidebar.entry.css +1 -1
  18. package/dist/assets/styles/less/components/statusDot/statusDot.entry.css +1 -0
  19. package/dist/assets/styles/less/components/swimlanes/swimlanes.entry.css +1 -0
  20. package/dist/assets/styles/less/components/tabGroups/tabGroups.entry.css +1 -0
  21. package/dist/assets/styles/less/components/tabs/tab/tab.entry.css +1 -1
  22. package/dist/assets/styles/less/components/tabs/tabPanel/tabPanel.entry.css +1 -0
  23. package/dist/assets/styles/less/components/tabs/tabs.entry.css +1 -1
  24. package/dist/assets/styles/less/components/textField/textField.entry.css +1 -1
  25. package/dist/assets/styles/less/components/toggle/toggle.entry.css +1 -1
  26. package/dist/assets/styles/less/components/treeView/treeView.entry.css +1 -1
  27. package/dist/assets/styles/less/tokens.entry.css +1 -1
  28. package/dist/components/dataDisplay/chat/chat.d.ts +43 -1
  29. package/dist/components/dataDisplay/chat/chat.js +179 -150
  30. package/dist/components/dataDisplay/chat/chat.js.map +1 -1
  31. package/dist/components/dataDisplay/chat/chatComposer.d.ts +17 -0
  32. package/dist/components/dataDisplay/chat/chatComposer.js +31 -29
  33. package/dist/components/dataDisplay/chat/chatComposer.js.map +1 -1
  34. package/dist/components/dataDisplay/chat/index.d.ts +1 -1
  35. package/dist/components/dataDisplay/chat/utils.d.ts +14 -0
  36. package/dist/components/dataDisplay/chat/utils.js.map +1 -1
  37. package/dist/components/dataDisplay/dagView/dagLayout.d.ts +74 -0
  38. package/dist/components/dataDisplay/dagView/dagLayout.js +289 -0
  39. package/dist/components/dataDisplay/dagView/dagLayout.js.map +1 -0
  40. package/dist/components/dataDisplay/dagView/dagView.d.ts +157 -0
  41. package/dist/components/dataDisplay/dagView/dagView.js +543 -0
  42. package/dist/components/dataDisplay/dagView/dagView.js.map +1 -0
  43. package/dist/components/dataDisplay/dagView/index.d.ts +4 -0
  44. package/dist/components/dataDisplay/dagView/panZoom.d.ts +75 -0
  45. package/dist/components/dataDisplay/dagView/panZoom.js +171 -0
  46. package/dist/components/dataDisplay/dagView/panZoom.js.map +1 -0
  47. package/dist/components/dataDisplay/diffStat/diffStat.d.ts +54 -0
  48. package/dist/components/dataDisplay/diffStat/diffStat.js +63 -0
  49. package/dist/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  50. package/dist/components/dataDisplay/diffStat/index.d.ts +2 -0
  51. package/dist/components/dataDisplay/kbd/index.d.ts +4 -0
  52. package/dist/components/dataDisplay/kbd/kbd.d.ts +40 -0
  53. package/dist/components/dataDisplay/kbd/kbd.js +27 -0
  54. package/dist/components/dataDisplay/kbd/kbd.js.map +1 -0
  55. package/dist/components/dataDisplay/kbd/kbdKeys.d.ts +18 -0
  56. package/dist/components/dataDisplay/kbd/kbdKeys.js +72 -0
  57. package/dist/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  58. package/dist/components/dataDisplay/list/listItem.d.ts +34 -0
  59. package/dist/components/dataDisplay/list/listItem.js +47 -24
  60. package/dist/components/dataDisplay/list/listItem.js.map +1 -1
  61. package/dist/components/dataDisplay/qrCode/index.d.ts +2 -0
  62. package/dist/components/dataDisplay/qrCode/qrCode.d.ts +28 -0
  63. package/dist/components/dataDisplay/qrCode/qrCode.js +78 -0
  64. package/dist/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  65. package/dist/components/dataDisplay/qrCode/qrCodePath.d.ts +7 -0
  66. package/dist/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  67. package/dist/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  68. package/dist/components/dataDisplay/statusDot/index.d.ts +2 -0
  69. package/dist/components/dataDisplay/statusDot/statusDot.d.ts +35 -0
  70. package/dist/components/dataDisplay/statusDot/statusDot.js +30 -0
  71. package/dist/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  72. package/dist/components/dataDisplay/swimlanes/index.d.ts +2 -0
  73. package/dist/components/dataDisplay/swimlanes/swimlanes.d.ts +53 -0
  74. package/dist/components/dataDisplay/swimlanes/swimlanes.js +357 -0
  75. package/dist/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  76. package/dist/components/dataDisplay/treeView/treeView.d.ts +17 -1
  77. package/dist/components/dataDisplay/treeView/treeView.js +113 -92
  78. package/dist/components/dataDisplay/treeView/treeView.js.map +1 -1
  79. package/dist/components/feedBack/modal/modal.js +84 -63
  80. package/dist/components/feedBack/modal/modal.js.map +1 -1
  81. package/dist/components/inputs/button/button.d.ts +13 -1
  82. package/dist/components/inputs/button/button.js +57 -51
  83. package/dist/components/inputs/button/button.js.map +1 -1
  84. package/dist/components/inputs/composer/composer.d.ts +149 -0
  85. package/dist/components/inputs/composer/composer.js +219 -0
  86. package/dist/components/inputs/composer/composer.js.map +1 -0
  87. package/dist/components/inputs/composer/composerFiles.d.ts +26 -0
  88. package/dist/components/inputs/composer/composerFiles.js +19 -0
  89. package/dist/components/inputs/composer/composerFiles.js.map +1 -0
  90. package/dist/components/inputs/composer/composerKeys.d.ts +29 -0
  91. package/dist/components/inputs/composer/composerKeys.js +7 -0
  92. package/dist/components/inputs/composer/composerKeys.js.map +1 -0
  93. package/dist/components/inputs/composer/index.d.ts +3 -0
  94. package/dist/components/layout/sheet/sheet.d.ts +12 -0
  95. package/dist/components/layout/sheet/sheet.js +152 -137
  96. package/dist/components/layout/sheet/sheet.js.map +1 -1
  97. package/dist/components/layout/tabGroups/index.d.ts +4 -0
  98. package/dist/components/layout/tabGroups/tabGroups.d.ts +94 -0
  99. package/dist/components/layout/tabGroups/tabGroups.js +783 -0
  100. package/dist/components/layout/tabGroups/tabGroups.js.map +1 -0
  101. package/dist/components/layout/tabGroups/tabGroupsFocus.d.ts +55 -0
  102. package/dist/components/layout/tabGroups/tabGroupsFocus.js +199 -0
  103. package/dist/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  104. package/dist/components/layout/tabGroups/tabGroupsLayout.d.ts +250 -0
  105. package/dist/components/layout/tabGroups/tabGroupsLayout.js +497 -0
  106. package/dist/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  107. package/dist/components/navigation/appBar/appBar.d.ts +22 -0
  108. package/dist/components/navigation/appBar/appBar.js +31 -26
  109. package/dist/components/navigation/appBar/appBar.js.map +1 -1
  110. package/dist/components/navigation/commandPalette/commandPalette.d.ts +111 -0
  111. package/dist/components/navigation/commandPalette/commandPalette.js +337 -0
  112. package/dist/components/navigation/commandPalette/commandPalette.js.map +1 -0
  113. package/dist/components/navigation/commandPalette/commandPaletteFilter.d.ts +11 -0
  114. package/dist/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  115. package/dist/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  116. package/dist/components/navigation/commandPalette/commandPaletteNavigation.d.ts +13 -0
  117. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  118. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  119. package/dist/components/navigation/commandPalette/commandPaletteTypes.d.ts +39 -0
  120. package/dist/components/navigation/commandPalette/index.d.ts +4 -0
  121. package/dist/components/navigation/sidebar/sidebar.d.ts +10 -0
  122. package/dist/components/navigation/sidebar/sidebar.js +61 -59
  123. package/dist/components/navigation/sidebar/sidebar.js.map +1 -1
  124. package/dist/components/navigation/tabs/index.d.ts +3 -1
  125. package/dist/components/navigation/tabs/tab/tab.d.ts +88 -1
  126. package/dist/components/navigation/tabs/tab/tab.js +121 -42
  127. package/dist/components/navigation/tabs/tab/tab.js.map +1 -1
  128. package/dist/components/navigation/tabs/tabPanel/tabPanel.d.ts +19 -0
  129. package/dist/components/navigation/tabs/tabPanel/tabPanel.js +27 -0
  130. package/dist/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  131. package/dist/components/navigation/tabs/tabs.d.ts +75 -5
  132. package/dist/components/navigation/tabs/tabs.js +369 -145
  133. package/dist/components/navigation/tabs/tabs.js.map +1 -1
  134. package/dist/components/navigation/tabs/tabs.utils.d.ts +20 -0
  135. package/dist/components/navigation/tabs/tabs.utils.js +11 -0
  136. package/dist/components/navigation/tabs/tabs.utils.js.map +1 -0
  137. package/dist/components/navigation/tabs/tabsContext.d.ts +11 -0
  138. package/dist/components/navigation/tabs/tabsContext.js +6 -0
  139. package/dist/components/navigation/tabs/tabsContext.js.map +1 -0
  140. package/dist/headless/components/dataDisplay/chat/chat.js +179 -150
  141. package/dist/headless/components/dataDisplay/chat/chat.js.map +1 -1
  142. package/dist/headless/components/dataDisplay/chat/chatComposer.js +31 -29
  143. package/dist/headless/components/dataDisplay/chat/chatComposer.js.map +1 -1
  144. package/dist/headless/components/dataDisplay/chat/utils.js.map +1 -1
  145. package/dist/headless/components/dataDisplay/dagView/dagLayout.js +289 -0
  146. package/dist/headless/components/dataDisplay/dagView/dagLayout.js.map +1 -0
  147. package/dist/headless/components/dataDisplay/dagView/dagView.js +541 -0
  148. package/dist/headless/components/dataDisplay/dagView/dagView.js.map +1 -0
  149. package/dist/headless/components/dataDisplay/dagView/panZoom.js +171 -0
  150. package/dist/headless/components/dataDisplay/dagView/panZoom.js.map +1 -0
  151. package/dist/headless/components/dataDisplay/diffStat/diffStat.js +61 -0
  152. package/dist/headless/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  153. package/dist/headless/components/dataDisplay/kbd/kbd.js +25 -0
  154. package/dist/headless/components/dataDisplay/kbd/kbd.js.map +1 -0
  155. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js +72 -0
  156. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  157. package/dist/headless/components/dataDisplay/list/listItem.js +47 -24
  158. package/dist/headless/components/dataDisplay/list/listItem.js.map +1 -1
  159. package/dist/headless/components/dataDisplay/qrCode/qrCode.js +76 -0
  160. package/dist/headless/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  161. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  162. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  163. package/dist/headless/components/dataDisplay/statusDot/statusDot.js +28 -0
  164. package/dist/headless/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  165. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js +355 -0
  166. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  167. package/dist/headless/components/dataDisplay/treeView/treeView.js +113 -92
  168. package/dist/headless/components/dataDisplay/treeView/treeView.js.map +1 -1
  169. package/dist/headless/components/feedBack/modal/modal.js +85 -64
  170. package/dist/headless/components/feedBack/modal/modal.js.map +1 -1
  171. package/dist/headless/components/inputs/button/button.js +56 -50
  172. package/dist/headless/components/inputs/button/button.js.map +1 -1
  173. package/dist/headless/components/inputs/composer/composer.js +217 -0
  174. package/dist/headless/components/inputs/composer/composer.js.map +1 -0
  175. package/dist/headless/components/inputs/composer/composerFiles.js +19 -0
  176. package/dist/headless/components/inputs/composer/composerFiles.js.map +1 -0
  177. package/dist/headless/components/inputs/composer/composerKeys.js +7 -0
  178. package/dist/headless/components/inputs/composer/composerKeys.js.map +1 -0
  179. package/dist/headless/components/layout/sheet/sheet.js +160 -145
  180. package/dist/headless/components/layout/sheet/sheet.js.map +1 -1
  181. package/dist/headless/components/layout/tabGroups/tabGroups.js +781 -0
  182. package/dist/headless/components/layout/tabGroups/tabGroups.js.map +1 -0
  183. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js +199 -0
  184. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  185. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js +497 -0
  186. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  187. package/dist/headless/components/navigation/appBar/appBar.js +35 -30
  188. package/dist/headless/components/navigation/appBar/appBar.js.map +1 -1
  189. package/dist/headless/components/navigation/commandPalette/commandPalette.js +335 -0
  190. package/dist/headless/components/navigation/commandPalette/commandPalette.js.map +1 -0
  191. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  192. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  193. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  194. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  195. package/dist/headless/components/navigation/sidebar/sidebar.js +56 -54
  196. package/dist/headless/components/navigation/sidebar/sidebar.js.map +1 -1
  197. package/dist/headless/components/navigation/tabs/tab/tab.js +121 -42
  198. package/dist/headless/components/navigation/tabs/tab/tab.js.map +1 -1
  199. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js +25 -0
  200. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  201. package/dist/headless/components/navigation/tabs/tabs.js +369 -145
  202. package/dist/headless/components/navigation/tabs/tabs.js.map +1 -1
  203. package/dist/headless/components/navigation/tabs/tabs.utils.js +11 -0
  204. package/dist/headless/components/navigation/tabs/tabs.utils.js.map +1 -0
  205. package/dist/headless/components/navigation/tabs/tabsContext.js +6 -0
  206. package/dist/headless/components/navigation/tabs/tabsContext.js.map +1 -0
  207. package/dist/headless/hooks/useFocusTrap.js +24 -21
  208. package/dist/headless/hooks/useFocusTrap.js.map +1 -1
  209. package/dist/headless/hooks/useKeyboardShortcut.js +19 -0
  210. package/dist/headless/hooks/useKeyboardShortcut.js.map +1 -0
  211. package/dist/headless/index.js +360 -316
  212. package/dist/headless/index.js.map +1 -1
  213. package/dist/headless/utils/keyboardShortcut.js +49 -0
  214. package/dist/headless/utils/keyboardShortcut.js.map +1 -0
  215. package/dist/headless/utils/linkAttrs.js +13 -0
  216. package/dist/headless/utils/linkAttrs.js.map +1 -0
  217. package/dist/headless/utils/restoreFocus.js +10 -0
  218. package/dist/headless/utils/restoreFocus.js.map +1 -0
  219. package/dist/hooks/useFocusTrap.d.ts +6 -1
  220. package/dist/hooks/useFocusTrap.js +24 -21
  221. package/dist/hooks/useFocusTrap.js.map +1 -1
  222. package/dist/hooks/useKeyboardShortcut.d.ts +30 -0
  223. package/dist/hooks/useKeyboardShortcut.js +19 -0
  224. package/dist/hooks/useKeyboardShortcut.js.map +1 -0
  225. package/dist/index.cjs +3 -2
  226. package/dist/index.cjs.map +1 -1
  227. package/dist/index.d.ts +24 -3
  228. package/dist/index.js +360 -316
  229. package/dist/index.js.map +1 -1
  230. package/dist/utils/keyboardShortcut.d.ts +12 -0
  231. package/dist/utils/keyboardShortcut.js +49 -0
  232. package/dist/utils/keyboardShortcut.js.map +1 -0
  233. package/dist/utils/linkAttrs.d.ts +13 -0
  234. package/dist/utils/linkAttrs.js +13 -0
  235. package/dist/utils/linkAttrs.js.map +1 -0
  236. package/dist/utils/restoreFocus.d.ts +8 -0
  237. package/dist/utils/restoreFocus.js +10 -0
  238. package/dist/utils/restoreFocus.js.map +1 -0
  239. package/package.json +5 -3
@@ -10,7 +10,29 @@ export interface AppBarProps extends Omit<React.HTMLAttributes<HTMLElement>, "ti
10
10
  midContent?: React.ReactNode;
11
11
  rightContent?: React.ReactNode;
12
12
  title?: React.ReactNode | string;
13
+ /**
14
+ * Tag the `title` is rendered in: a `div` (default) or a heading, `h1`–`h6`,
15
+ * for the page's main heading. Only the tag changes — a heading is drawn with
16
+ * the bar's own font size, weight and no margins, so it looks exactly like the
17
+ * div. The heading's text is the `title` itself, so pass a string or plain
18
+ * markup rather than a `Typography` heading.
19
+ */
20
+ titleAs?: "div" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
13
21
  midContentAlign?: "middle" | "left" | "right";
22
+ /**
23
+ * `window`: the bar is the title bar of a desktop app window (Electron, Tauri, an installed PWA with Window
24
+ * Controls Overlay). The bar drags the window; buttons, links, fields and other controls in it stay clickable,
25
+ * and room is left for the OS window buttons (`windowControls`). In a plain browser tab it looks like `default`.
26
+ */
27
+ variant?: "default" | "window";
28
+ /**
29
+ * With `variant="window"`: where the OS window buttons are, so the bar's content keeps clear of them.
30
+ * `auto` (default) takes the area from the shell's `env(titlebar-area-*)` (Window Controls Overlay, Electron
31
+ * `titleBarOverlay`) and reserves nothing without it; `left` is macOS (traffic lights, `titleBarStyle: "hiddenInset"`),
32
+ * `right` is Windows/Linux caption buttons drawn by the OS; `none` reserves nothing. The reserved width is
33
+ * the `--smui-appBarWindowControlsWidth` custom property (64px on the left, 138px on the right by default).
34
+ */
35
+ windowControls?: "auto" | "left" | "right" | "none";
14
36
  /** Semantic background color. */
15
37
  color?: AppBarColor;
16
38
  /** Test id of the root (`<header>`, or `<footer>` at the bottom); `app-bar` unless given. */
@@ -1,50 +1,55 @@
1
1
  import { jsx as a, jsxs as m } from "react/jsx-runtime";
2
2
  import '../../../assets/styles/less/components/appBar/appBar.entry.css';import '../../../assets/styles/less/tokens.entry.css';/* empty css */
3
3
  /* empty css */
4
- import { forwardRef as h } from "react";
5
- import t from "clsx";
6
- const A = h(function({
7
- className: i,
4
+ import { forwardRef as v } from "react";
5
+ import d from "clsx";
6
+ const T = v(function({
7
+ className: b,
8
8
  children: s,
9
- dense: d,
10
- position: b = "static",
9
+ dense: o,
10
+ position: w = "static",
11
11
  placement: r = "top",
12
- leftContent: o,
13
- midContent: l,
12
+ leftContent: l,
13
+ midContent: n,
14
14
  midContentAlign: c = "middle",
15
- rightContent: n,
15
+ rightContent: _,
16
16
  title: p,
17
+ titleAs: f = "div",
18
+ variant: t = "default",
19
+ windowControls: i = "auto",
17
20
  color: e = "default",
18
- "data-testid": _ = "app-bar",
19
- ...f
20
- }, w) {
21
+ "data-testid": u = "app-bar",
22
+ ...h
23
+ }, N) {
21
24
  return /* @__PURE__ */ a(
22
25
  r === "top" ? "header" : "footer",
23
26
  {
24
- ref: w,
25
- className: t(
27
+ ref: N,
28
+ className: d(
26
29
  "smwb-appbar",
27
- i,
28
- `smwb-${b}`,
30
+ b,
31
+ `smwb-${w}`,
29
32
  `smwb-${r}`,
30
- { "smwb-dense": d },
31
- e !== "default" && `smwb-appbar_color-${e}`
33
+ { "smwb-dense": o },
34
+ e !== "default" && `smwb-appbar_color-${e}`,
35
+ t === "window" && "smwb-appbar_variant-window",
36
+ t === "window" && i !== "auto" && `smwb-appbar_window-controls-${i}`
32
37
  ),
33
- "data-testid": _,
34
- ...f,
38
+ "data-testid": u,
39
+ ...h,
35
40
  children: s || /* @__PURE__ */ m("div", { className: "smwb-appbar__inner", children: [
36
41
  /* @__PURE__ */ m("div", { className: "smwb-appbar__left", children: [
37
- p && /* @__PURE__ */ a("div", { className: "smwb-appbar__left__title", children: p }),
38
- o
42
+ p && /* @__PURE__ */ a(f, { className: "smwb-appbar__left__title", children: p }),
43
+ l
39
44
  ] }),
40
- /* @__PURE__ */ a("div", { className: t("smwb-appbar__mid", `smwb-${c}`), children: l }),
41
- /* @__PURE__ */ a("div", { className: "smwb-appbar__right", children: n })
45
+ /* @__PURE__ */ a("div", { className: d("smwb-appbar__mid", `smwb-${c}`), children: n }),
46
+ /* @__PURE__ */ a("div", { className: "smwb-appbar__right", children: _ })
42
47
  ] })
43
48
  }
44
49
  );
45
50
  });
46
51
  export {
47
- A as AppBar,
48
- A as default
52
+ T as AppBar,
53
+ T as default
49
54
  };
50
55
  //# sourceMappingURL=appBar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appBar.js","sources":["../../../../src/components/navigation/appBar/appBar.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\nimport cn from \"clsx\";\n\nexport type AppBarColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface AppBarProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n children?: React.ReactNode;\n className?: string;\n dense?: boolean;\n position?: \"relative\" | \"static\" | \"absolute\" | \"sticky\" | \"fixed\";\n placement?: \"top\" | \"bottom\";\n leftContent?: React.ReactNode;\n midContent?: React.ReactNode;\n rightContent?: React.ReactNode;\n title?: React.ReactNode | string;\n midContentAlign?: \"middle\" | \"left\" | \"right\";\n /** Semantic background color. */\n color?: AppBarColor;\n /** Test id of the root (`<header>`, or `<footer>` at the bottom); `app-bar` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const AppBar = forwardRef<HTMLElement, AppBarProps>(function AppBar(\n {\n className,\n children,\n dense,\n position = \"static\",\n placement = \"top\",\n leftContent,\n midContent,\n midContentAlign = \"middle\",\n rightContent,\n title,\n color = \"default\",\n \"data-testid\": dataTestId = \"app-bar\",\n ...rest\n },\n ref\n) {\n const MainTag = placement === \"top\" ? \"header\" : \"footer\";\n\n return (\n <MainTag\n ref={ref}\n className={cn(\n \"smwb-appbar\",\n className,\n `smwb-${position}`,\n `smwb-${placement}`,\n { \"smwb-dense\": dense },\n color !== \"default\" && `smwb-appbar_color-${color}`\n )}\n data-testid={dataTestId}\n {...rest}\n >\n {children ? (\n children\n ) : (\n <div className=\"smwb-appbar__inner\">\n <div className=\"smwb-appbar__left\">\n {title && <div className=\"smwb-appbar__left__title\">{title}</div>}\n {leftContent}\n </div>\n <div className={cn(\"smwb-appbar__mid\", `smwb-${midContentAlign}`)}>{midContent}</div>\n <div className=\"smwb-appbar__right\">{rightContent}</div>\n </div>\n )}\n </MainTag>\n );\n});\n\nexport default AppBar;\n"],"names":["AppBar","forwardRef","className","children","dense","position","placement","leftContent","midContent","midContentAlign","rightContent","title","color","dataTestId","rest","ref","jsx","cn","jsxs"],"mappings":";;;;;AAwBO,MAAMA,IAASC,EAAqC,SACzD;AAAA,EACE,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,eAAeC,IAAa;AAAA,EAC5B,GAAGC;AACL,GACAC,GACA;AAGA,SACE,gBAAAC;AAAA,IAHcV,MAAc,QAAQ,WAAW;AAAA,IAG9C;AAAA,MACC,KAAAS;AAAA,MACA,WAAWE;AAAA,QACT;AAAA,QACAf;AAAA,QACA,QAAQG,CAAQ;AAAA,QAChB,QAAQC,CAAS;AAAA,QACjB,EAAE,cAAcF,EAAA;AAAA,QAChBQ,MAAU,aAAa,qBAAqBA,CAAK;AAAA,MAAA;AAAA,MAEnD,eAAaC;AAAA,MACZ,GAAGC;AAAA,MAEH,UAAAX,KAGC,gBAAAe,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,UAAAP,KAAS,gBAAAK,EAAC,OAAA,EAAI,WAAU,4BAA4B,UAAAL,GAAM;AAAA,UAC1DJ;AAAA,QAAA,GACH;AAAA,QACA,gBAAAS,EAAC,SAAI,WAAWC,EAAG,oBAAoB,QAAQR,CAAe,EAAE,GAAI,UAAAD,EAAA,CAAW;AAAA,QAC/E,gBAAAQ,EAAC,OAAA,EAAI,WAAU,sBAAsB,UAAAN,EAAA,CAAa;AAAA,MAAA,EAAA,CACpD;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
1
+ {"version":3,"file":"appBar.js","sources":["../../../../src/components/navigation/appBar/appBar.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\nimport cn from \"clsx\";\n\nexport type AppBarColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport interface AppBarProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n children?: React.ReactNode;\n className?: string;\n dense?: boolean;\n position?: \"relative\" | \"static\" | \"absolute\" | \"sticky\" | \"fixed\";\n placement?: \"top\" | \"bottom\";\n leftContent?: React.ReactNode;\n midContent?: React.ReactNode;\n rightContent?: React.ReactNode;\n title?: React.ReactNode | string;\n /**\n * Tag the `title` is rendered in: a `div` (default) or a heading, `h1`–`h6`,\n * for the page's main heading. Only the tag changes — a heading is drawn with\n * the bar's own font size, weight and no margins, so it looks exactly like the\n * div. The heading's text is the `title` itself, so pass a string or plain\n * markup rather than a `Typography` heading.\n */\n titleAs?: \"div\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n midContentAlign?: \"middle\" | \"left\" | \"right\";\n /**\n * `window`: the bar is the title bar of a desktop app window (Electron, Tauri, an installed PWA with Window\n * Controls Overlay). The bar drags the window; buttons, links, fields and other controls in it stay clickable,\n * and room is left for the OS window buttons (`windowControls`). In a plain browser tab it looks like `default`.\n */\n variant?: \"default\" | \"window\";\n /**\n * With `variant=\"window\"`: where the OS window buttons are, so the bar's content keeps clear of them.\n * `auto` (default) takes the area from the shell's `env(titlebar-area-*)` (Window Controls Overlay, Electron\n * `titleBarOverlay`) and reserves nothing without it; `left` is macOS (traffic lights, `titleBarStyle: \"hiddenInset\"`),\n * `right` is Windows/Linux caption buttons drawn by the OS; `none` reserves nothing. The reserved width is\n * the `--smui-appBarWindowControlsWidth` custom property (64px on the left, 138px on the right by default).\n */\n windowControls?: \"auto\" | \"left\" | \"right\" | \"none\";\n /** Semantic background color. */\n color?: AppBarColor;\n /** Test id of the root (`<header>`, or `<footer>` at the bottom); `app-bar` unless given. */\n \"data-testid\"?: string;\n}\n\nexport const AppBar = forwardRef<HTMLElement, AppBarProps>(function AppBar(\n {\n className,\n children,\n dense,\n position = \"static\",\n placement = \"top\",\n leftContent,\n midContent,\n midContentAlign = \"middle\",\n rightContent,\n title,\n titleAs: TitleTag = \"div\",\n variant = \"default\",\n windowControls = \"auto\",\n color = \"default\",\n \"data-testid\": dataTestId = \"app-bar\",\n ...rest\n },\n ref\n) {\n const MainTag = placement === \"top\" ? \"header\" : \"footer\";\n\n return (\n <MainTag\n ref={ref}\n className={cn(\n \"smwb-appbar\",\n className,\n `smwb-${position}`,\n `smwb-${placement}`,\n { \"smwb-dense\": dense },\n color !== \"default\" && `smwb-appbar_color-${color}`,\n variant === \"window\" && \"smwb-appbar_variant-window\",\n variant === \"window\" && windowControls !== \"auto\" && `smwb-appbar_window-controls-${windowControls}`\n )}\n data-testid={dataTestId}\n {...rest}\n >\n {children ? (\n children\n ) : (\n <div className=\"smwb-appbar__inner\">\n <div className=\"smwb-appbar__left\">\n {title && <TitleTag className=\"smwb-appbar__left__title\">{title}</TitleTag>}\n {leftContent}\n </div>\n <div className={cn(\"smwb-appbar__mid\", `smwb-${midContentAlign}`)}>{midContent}</div>\n <div className=\"smwb-appbar__right\">{rightContent}</div>\n </div>\n )}\n </MainTag>\n );\n});\n\nexport default AppBar;\n"],"names":["AppBar","forwardRef","className","children","dense","position","placement","leftContent","midContent","midContentAlign","rightContent","title","TitleTag","variant","windowControls","color","dataTestId","rest","ref","jsx","cn","jsxs"],"mappings":";;;;;AA8CO,MAAMA,IAASC,EAAqC,SACzD;AAAA,EACE,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC,IAAY;AAAA,EACZ,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,cAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAASC,IAAW;AAAA,EACpB,SAAAC,IAAU;AAAA,EACV,gBAAAC,IAAiB;AAAA,EACjB,OAAAC,IAAQ;AAAA,EACR,eAAeC,IAAa;AAAA,EAC5B,GAAGC;AACL,GACAC,GACA;AAGA,SACE,gBAAAC;AAAA,IAHcb,MAAc,QAAQ,WAAW;AAAA,IAG9C;AAAA,MACC,KAAAY;AAAA,MACA,WAAWE;AAAA,QACT;AAAA,QACAlB;AAAA,QACA,QAAQG,CAAQ;AAAA,QAChB,QAAQC,CAAS;AAAA,QACjB,EAAE,cAAcF,EAAA;AAAA,QAChBW,MAAU,aAAa,qBAAqBA,CAAK;AAAA,QACjDF,MAAY,YAAY;AAAA,QACxBA,MAAY,YAAYC,MAAmB,UAAU,+BAA+BA,CAAc;AAAA,MAAA;AAAA,MAEpG,eAAaE;AAAA,MACZ,GAAGC;AAAA,MAEH,UAAAd,KAGC,gBAAAkB,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,UAAAV,KAAS,gBAAAQ,EAACP,GAAA,EAAS,WAAU,4BAA4B,UAAAD,GAAM;AAAA,UAC/DJ;AAAA,QAAA,GACH;AAAA,QACA,gBAAAY,EAAC,SAAI,WAAWC,EAAG,oBAAoB,QAAQX,CAAe,EAAE,GAAI,UAAAD,EAAA,CAAW;AAAA,QAC/E,gBAAAW,EAAC,OAAA,EAAI,WAAU,sBAAsB,UAAAT,EAAA,CAAa;AAAA,MAAA,EAAA,CACpD;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
@@ -0,0 +1,111 @@
1
+ import React from "react";
2
+ import type { CommandPaletteFilter, CommandPaletteGroup, CommandPaletteItem, CommandPaletteSource } from "./commandPaletteTypes";
3
+ export interface CommandPaletteProps {
4
+ /** Controlled open state. The palette is controlled while this is not `undefined`. */
5
+ open?: boolean;
6
+ /** Open state used while `open` is `undefined`; `false` by default. */
7
+ defaultOpen?: boolean;
8
+ /**
9
+ * Called for every request to open or close: Escape, a backdrop click, and choosing an item
10
+ * while `closeOnSelect`. Called in the controlled and in the uncontrolled mode.
11
+ */
12
+ onOpenChange?: (open: boolean) => void;
13
+ /** Static groups, filtered locally by `filter`. A group left with no items is hidden, heading included. */
14
+ groups?: CommandPaletteGroup[];
15
+ /**
16
+ * Recently used items, kept by the app: it owns the list and updates it from `onSelect`. Shown as
17
+ * the first group while the trimmed query is empty, never filtered, and hidden while searching.
18
+ */
19
+ recent?: CommandPaletteItem[];
20
+ /** Heading of the recent group; `"Recent"` by default. That group is `{ id: "recent", label: recentLabel, items: recent }` in `onSelect`. */
21
+ recentLabel?: string;
22
+ /** Controlled query. The palette is controlled while this is not `undefined`. */
23
+ query?: string;
24
+ /**
25
+ * Query used while `query` is `undefined`; `""` by default. An uncontrolled field goes back to it
26
+ * each time the palette opens.
27
+ */
28
+ defaultQuery?: string;
29
+ /** Called for every edit of the field, in the controlled and in the uncontrolled mode. */
30
+ onQueryChange?: (query: string) => void;
31
+ /**
32
+ * Local matching of `groups`; {@link commandPaletteFilter} by default (every word of the query
33
+ * occurs in the label, the subtitle or a keyword, ignoring case and accents). `false` shows
34
+ * `groups` as given, for an app that filters or ranks them itself. Never applied to `recent` or
35
+ * to the results of `source`.
36
+ */
37
+ filter?: CommandPaletteFilter | false;
38
+ /**
39
+ * Loads results for the trimmed query, appended after the static groups. Called after `debounce`
40
+ * milliseconds of quiet typing and only for a query of at least `minQueryLength` characters;
41
+ * `signal` is aborted when a newer query, a close or an unmount makes the answer useless. While a
42
+ * request is pending its predecessors' groups are not shown, and a rejection that is not an abort
43
+ * shows `errorText`.
44
+ */
45
+ source?: CommandPaletteSource;
46
+ /** Milliseconds of quiet typing before `source` is called; `200` by default. */
47
+ debounce?: number;
48
+ /**
49
+ * `source` is called only when the trimmed query has at least this many characters; `1` by
50
+ * default, so an empty query loads nothing. `0` also loads for the empty query.
51
+ */
52
+ minQueryLength?: number;
53
+ /** App-driven loading: shows the skeleton like a pending `source`; `false` by default. */
54
+ loading?: boolean;
55
+ /**
56
+ * Called for every chosen item, after the item's own `onSelect`. The place for the app to run the
57
+ * command and to update its `recent` list.
58
+ */
59
+ onSelect?: (item: CommandPaletteItem, group: CommandPaletteGroup) => void;
60
+ /** Ask to close (`onOpenChange(false)`) when an item is chosen; `true` by default. */
61
+ closeOnSelect?: boolean;
62
+ /** Placeholder of the field; `"Type a command or search…"` by default. It is not the field's name. */
63
+ placeholder?: string;
64
+ /** Accessible name of the field and, through `aria-labelledby`, of the listbox; `"Search commands"` by default. */
65
+ searchLabel?: string;
66
+ /** Shown and announced when nothing matches; `"No results"` by default. */
67
+ noResultsText?: string;
68
+ /** Shown and announced when `source` rejects; `"Couldn't load results"` by default. */
69
+ errorText?: string;
70
+ /**
71
+ * Text of the polite status once a search has settled; `"1 result"` / `"N results"` by default.
72
+ * Not used for zero results, which announce `noResultsText`.
73
+ */
74
+ resultsAnnouncement?: (count: number) => string;
75
+ /** Slot under the results, e.g. key hints built with `Kbd`. Drawn only when given. */
76
+ footer?: React.ReactNode;
77
+ /** Added to the dialog element, after `smwb-command-palette`. */
78
+ className?: string;
79
+ /** Name of the dialog; `"Command palette"` by default. Not set when `aria-labelledby` is given. */
80
+ "aria-label"?: string;
81
+ /** Id of the element that names the dialog. Wins over `aria-label`. */
82
+ "aria-labelledby"?: string;
83
+ /** Id of the element that describes the dialog. */
84
+ "aria-describedby"?: string;
85
+ /** Test id of the dialog element; `"command-palette"` unless given. */
86
+ "data-testid"?: string;
87
+ }
88
+ /**
89
+ * The ⌘K palette: a modal dialog with one search field and grouped results, driven by the keyboard.
90
+ *
91
+ * ArrowUp/ArrowDown (and PageUp/PageDown) move the active option, Enter runs it, Escape closes the
92
+ * palette — all of it on the field, which keeps the focus the whole time (`aria-activedescendant`
93
+ * points at the active option). Results come from `groups`, filtered locally, from `recent` while
94
+ * the query is empty, and from an async `source` that is debounced and aborted on a newer query,
95
+ * with skeleton rows while it loads plus empty and error states.
96
+ *
97
+ * The palette does not bind ⌘K itself: the app does it once, with `useKeyboardShortcut`, and draws
98
+ * the same keys with `Kbd`.
99
+ *
100
+ * ```tsx
101
+ * const [open, setOpen] = useState(false);
102
+ * useKeyboardShortcut({ keys: ["Mod", "K"], onTrigger: () => setOpen((was) => !was) });
103
+ * <Button label="Search" onClick={() => setOpen(true)} endIcon={<Kbd keys={["Mod", "K"]} />} />
104
+ * <CommandPalette open={open} onOpenChange={setOpen} groups={groups} recent={recent} onSelect={run} />
105
+ * ```
106
+ *
107
+ * Filtering and rendering are linear, so an app with a long list should cap its groups (50 items is
108
+ * a good ceiling) or rank on the server and pass `filter={false}`.
109
+ */
110
+ export declare const CommandPalette: React.ForwardRefExoticComponent<CommandPaletteProps & React.RefAttributes<HTMLDivElement>>;
111
+ export default CommandPalette;
@@ -0,0 +1,337 @@
1
+ import { jsx as a, jsxs as p } from "react/jsx-runtime";
2
+ import '../../../assets/styles/less/components/commandPalette/commandPalette.entry.css';import '../../../assets/styles/less/tokens.entry.css';/* empty css */
3
+ /* empty css */
4
+ import { forwardRef as Je, useState as f, useRef as s, useCallback as z, useMemo as we, useEffect as E } from "react";
5
+ import F from "clsx";
6
+ import { useControllableState as Ne } from "../../../hooks/useControllableState.js";
7
+ import { useEventCallback as Ze } from "../../../hooks/useEventCallback.js";
8
+ import { useId as et } from "../../../hooks/useId.js";
9
+ import { useSafeLayoutEffect as tt } from "../../../hooks/useSafeLayoutEffect.js";
10
+ import { commandPaletteFilter as nt } from "./commandPaletteFilter.js";
11
+ import { firstOption as at, keepInView as lt, moveOption as ot } from "./commandPaletteNavigation.js";
12
+ import { Modal as st } from "../../feedBack/modal/modal.js";
13
+ import { Icon as Ce } from "../../base/icon/icon.js";
14
+ import { Kbd as rt } from "../../dataDisplay/kbd/kbd.js";
15
+ import { Skeleton as V } from "../../feedBack/skeleton/skeleton.js";
16
+ const it = "recent", D = [], xe = 10, ct = 500, dt = 3, mt = (r) => r === 1 ? "1 result" : `${r} results`, Re = (r) => {
17
+ var N;
18
+ return (N = r.id) != null ? N : r.label;
19
+ }, ut = (r) => typeof r == "object" && r !== null && r.name === "AbortError", Pt = Je(function(N, ke) {
20
+ const {
21
+ open: Oe,
22
+ defaultOpen: Pe = !1,
23
+ onOpenChange: Ae,
24
+ groups: Y = D,
25
+ recent: y,
26
+ recentLabel: X = "Recent",
27
+ query: $,
28
+ defaultQuery: I = "",
29
+ onQueryChange: Ee,
30
+ filter: T = nt,
31
+ source: H,
32
+ debounce: W = 200,
33
+ minQueryLength: J = 1,
34
+ loading: De = !1,
35
+ onSelect: S,
36
+ closeOnSelect: $e = !0,
37
+ placeholder: Ie = "Type a command or search…",
38
+ searchLabel: Te = "Search commands",
39
+ noResultsText: K = "No results",
40
+ errorText: L = "Couldn't load results",
41
+ resultsAnnouncement: Z,
42
+ footer: M,
43
+ className: Se,
44
+ "aria-label": Ke = "Command palette",
45
+ "aria-labelledby": ee,
46
+ "aria-describedby": te,
47
+ "data-testid": Le = "command-palette"
48
+ } = N, [i, ne] = Ne({
49
+ value: Oe,
50
+ defaultValue: Pe,
51
+ onChange: Ae
52
+ }), [b, Q] = Ne({
53
+ value: $,
54
+ defaultValue: I,
55
+ onChange: Ee
56
+ }), m = b.trim(), [ae, le] = f(D), [Me, C] = f(!1), [x, G] = f(!1), [q, R] = f(null), [Qe, oe] = f(""), [se, Ge] = f(0), re = et(void 0, "smwb-command-palette"), ie = `${re}-input`, k = `${re}-listbox`, ce = (e) => `${k}-option-${e}`, U = s(null), de = s(null), me = s([]), O = s(null), d = s(null), ue = s(null), [pe, qe] = f(null), Ue = z((e) => {
57
+ qe(e);
58
+ }, []), fe = s({ source: H, debounce: W, minQueryLength: J });
59
+ fe.current = { source: H, debounce: W, minQueryLength: J };
60
+ const be = s(Z);
61
+ be.current = Z;
62
+ const he = s(b);
63
+ he.current = b;
64
+ const ye = s({ defaultQuery: I, controlled: $ !== void 0 });
65
+ ye.current = { defaultQuery: I, controlled: $ !== void 0 };
66
+ const _e = s(-1), { sections: je, rows: c } = we(() => {
67
+ const e = [], n = [], l = (t, o) => {
68
+ if (o.length === 0)
69
+ return;
70
+ const v = [];
71
+ for (const w of o) {
72
+ const h = { group: t, item: w, key: `${Re(t)}\0${w.id}`, index: n.length };
73
+ n.push(h), v.push(h);
74
+ }
75
+ e.push({ group: t, rows: v });
76
+ };
77
+ m === "" && y !== void 0 && y.length > 0 && l({ id: it, label: X, items: y }, y);
78
+ for (const t of Y)
79
+ l(t, T === !1 ? t.items : t.items.filter((o) => T(o, b)));
80
+ for (const t of ae)
81
+ l(t, t.items);
82
+ return { sections: e, rows: n };
83
+ }, [m, y, X, Y, T, b, ae]), j = z((e) => {
84
+ var n;
85
+ return !((n = c[e]) != null && n.item.disabled);
86
+ }, [c]), u = we(() => {
87
+ if (q !== null) {
88
+ const e = c.find((n) => n.key === q);
89
+ if (e !== void 0 && !e.item.disabled)
90
+ return e.index;
91
+ }
92
+ return at(c.length, j);
93
+ }, [c, q, j]);
94
+ _e.current = u;
95
+ const _ = De || Me, P = c.length > 0, Be = u >= 0 ? ce(u) : void 0;
96
+ E(() => {
97
+ var e;
98
+ pe !== null && ((e = U.current) == null || e.focus({ preventScroll: !0 }));
99
+ }, [pe]);
100
+ const ge = s(i);
101
+ E(() => {
102
+ const e = i && !ge.current;
103
+ if (ge.current = i, e) {
104
+ R(null);
105
+ const { defaultQuery: n, controlled: l } = ye.current;
106
+ !l && he.current !== n && Q(n);
107
+ } else i || R(null);
108
+ }, [i, Q]);
109
+ const g = z(() => {
110
+ O.current !== null && (clearTimeout(O.current), O.current = null), d.current !== null && (d.current.abort(), d.current = null);
111
+ }, []);
112
+ E(() => {
113
+ if (g(), le((t) => t.length === 0 ? t : D), G((t) => t && !1), C((t) => t && !1), !i)
114
+ return g;
115
+ const { source: e, debounce: n, minQueryLength: l } = fe.current;
116
+ return e === void 0 || m.length < l || (C(!0), O.current = setTimeout(() => {
117
+ const t = new AbortController();
118
+ d.current = t, e(m, { signal: t.signal }).then(
119
+ (o) => {
120
+ d.current !== t || t.signal.aborted || (d.current = null, C(!1), G(!1), le(o != null ? o : D));
121
+ },
122
+ (o) => {
123
+ d.current !== t || t.signal.aborted || ut(o) || (d.current = null, C(!1), G(!0));
124
+ }
125
+ );
126
+ }, n)), g;
127
+ }, [i, m, g]);
128
+ const B = c.length;
129
+ E(() => {
130
+ let e = null;
131
+ return !i || m === "" ? oe("") : _ || (e = setTimeout(() => {
132
+ var n;
133
+ oe(
134
+ x ? L : B === 0 ? K : ((n = be.current) != null ? n : mt)(B)
135
+ );
136
+ }, ct)), () => {
137
+ e !== null && clearTimeout(e);
138
+ };
139
+ }, [i, m, _, x, L, K, B]), tt(() => {
140
+ if (se === 0)
141
+ return;
142
+ const e = me.current[_e.current];
143
+ e && lt(e, de.current);
144
+ }, [se]);
145
+ const ze = Ze(() => {
146
+ ne(!1);
147
+ }), Fe = (e) => {
148
+ Q(e.currentTarget.value);
149
+ }, Ve = (e) => {
150
+ const n = c[e];
151
+ n === void 0 || e === u || (R(n.key), Ge((l) => l + 1));
152
+ }, A = (e) => {
153
+ Ve(ot(c.length, j, u, e));
154
+ }, ve = (e) => {
155
+ var l, t;
156
+ const n = c[e];
157
+ n === void 0 || n.item.disabled || ($e && ne(!1), (t = (l = n.item).onSelect) == null || t.call(l), S == null || S(n.item, n.group));
158
+ }, Ye = (e) => {
159
+ if (e.nativeEvent.isComposing || e.keyCode === 229) {
160
+ e.key === "Escape" && e.preventDefault();
161
+ return;
162
+ }
163
+ if (!(e.ctrlKey || e.metaKey || e.altKey || e.shiftKey))
164
+ switch (e.key) {
165
+ case "ArrowDown":
166
+ e.preventDefault(), A(1);
167
+ return;
168
+ case "ArrowUp":
169
+ e.preventDefault(), A(-1);
170
+ return;
171
+ case "PageDown":
172
+ e.preventDefault(), A(xe);
173
+ return;
174
+ case "PageUp":
175
+ e.preventDefault(), A(-xe);
176
+ return;
177
+ case "Enter":
178
+ e.preventDefault(), ve(u);
179
+ return;
180
+ default:
181
+ return;
182
+ }
183
+ }, Xe = (e) => {
184
+ e.target !== U.current && e.preventDefault();
185
+ }, He = (e, n) => {
186
+ const l = ue.current;
187
+ l !== null && l.x === e.clientX && l.y === e.clientY || (ue.current = { x: e.clientX, y: e.clientY }, !n.item.disabled && R(n.key));
188
+ }, We = { "data-testid": Le };
189
+ return /* @__PURE__ */ a(
190
+ st,
191
+ {
192
+ ref: ke,
193
+ open: i,
194
+ onClose: ze,
195
+ size: "medium",
196
+ animation: "fade",
197
+ backdrop: "dark",
198
+ closeOnEsc: !0,
199
+ closeOnOutsideClick: !0,
200
+ className: F("smwb-command-palette", Se),
201
+ ...ee === void 0 ? { "aria-label": Ke } : { "aria-labelledby": ee },
202
+ ...te === void 0 ? {} : { "aria-describedby": te },
203
+ ...We,
204
+ children: /* @__PURE__ */ p("div", { className: "smwb-command-palette__panel", ref: Ue, onMouseDown: Xe, children: [
205
+ /* @__PURE__ */ p("div", { className: "smwb-command-palette__search", children: [
206
+ /* @__PURE__ */ a("span", { className: "smwb-command-palette__search-icon", "aria-hidden": "true", children: /* @__PURE__ */ a(Ce, { name: "search", size: 20 }) }),
207
+ /* @__PURE__ */ a(
208
+ "input",
209
+ {
210
+ ref: U,
211
+ id: ie,
212
+ className: "smwb-command-palette__input",
213
+ type: "text",
214
+ role: "combobox",
215
+ "data-testid": "command-palette-input",
216
+ placeholder: Ie,
217
+ value: b,
218
+ "aria-label": Te,
219
+ "aria-autocomplete": "list",
220
+ "aria-expanded": P,
221
+ "aria-controls": P ? k : void 0,
222
+ "aria-activedescendant": Be,
223
+ autoComplete: "off",
224
+ autoCapitalize: "off",
225
+ enterKeyHint: "go",
226
+ spellCheck: !1,
227
+ onChange: Fe,
228
+ onKeyDown: Ye
229
+ }
230
+ )
231
+ ] }),
232
+ /* @__PURE__ */ p(
233
+ "div",
234
+ {
235
+ className: "smwb-command-palette__results",
236
+ ref: de,
237
+ tabIndex: -1,
238
+ "data-testid": "command-palette-results",
239
+ children: [
240
+ P ? /* @__PURE__ */ a(
241
+ "ul",
242
+ {
243
+ id: k,
244
+ className: "smwb-command-palette__listbox",
245
+ role: "listbox",
246
+ "aria-labelledby": ie,
247
+ "aria-busy": _ || void 0,
248
+ "data-testid": "command-palette-listbox",
249
+ children: je.map((e, n) => {
250
+ const l = `${k}-group-${n}`;
251
+ return /* @__PURE__ */ p(
252
+ "li",
253
+ {
254
+ className: "smwb-command-palette__group",
255
+ role: "group",
256
+ "aria-labelledby": l,
257
+ children: [
258
+ /* @__PURE__ */ a("div", { className: "smwb-command-palette__group-label", id: l, children: e.group.label }),
259
+ /* @__PURE__ */ a("ul", { className: "smwb-command-palette__group-options", role: "presentation", children: e.rows.map((t) => {
260
+ const o = ce(t.index), v = t.index === u, w = [
261
+ t.item.subtitle === void 0 ? "" : `${o}-subtitle`,
262
+ t.item.shortcut === void 0 ? "" : `${o}-shortcut`
263
+ ].filter(Boolean).join(" ");
264
+ return /* @__PURE__ */ p(
265
+ "li",
266
+ {
267
+ ref: (h) => {
268
+ me.current[t.index] = h;
269
+ },
270
+ id: o,
271
+ className: F(
272
+ "smwb-command-palette__item",
273
+ v && "smwb-command-palette__item_active",
274
+ t.item.disabled && "smwb-command-palette__item_disabled"
275
+ ),
276
+ role: "option",
277
+ "aria-labelledby": `${o}-label`,
278
+ "aria-describedby": w === "" ? void 0 : w,
279
+ "aria-selected": v || void 0,
280
+ "aria-disabled": t.item.disabled || void 0,
281
+ "data-item-id": t.item.id,
282
+ "data-testid": "command-palette-option",
283
+ onClick: () => ve(t.index),
284
+ onPointerMove: (h) => He(h, t),
285
+ children: [
286
+ t.item.icon === void 0 ? null : /* @__PURE__ */ a("span", { className: "smwb-command-palette__item-icon", "aria-hidden": "true", children: typeof t.item.icon == "string" ? /* @__PURE__ */ a(Ce, { name: t.item.icon }) : t.item.icon }),
287
+ /* @__PURE__ */ p("span", { className: "smwb-command-palette__item-text", children: [
288
+ /* @__PURE__ */ a("span", { className: "smwb-command-palette__item-label", id: `${o}-label`, children: t.item.label }),
289
+ t.item.subtitle === void 0 ? null : /* @__PURE__ */ a("span", { className: "smwb-command-palette__item-subtitle", id: `${o}-subtitle`, children: t.item.subtitle })
290
+ ] }),
291
+ t.item.shortcut === void 0 ? null : /* @__PURE__ */ a(
292
+ rt,
293
+ {
294
+ keys: t.item.shortcut,
295
+ id: `${o}-shortcut`,
296
+ className: "smwb-command-palette__item-shortcut"
297
+ }
298
+ )
299
+ ]
300
+ },
301
+ t.key
302
+ );
303
+ }) })
304
+ ]
305
+ },
306
+ `${Re(e.group)}-${n}`
307
+ );
308
+ })
309
+ }
310
+ ) : null,
311
+ _ ? /* @__PURE__ */ a("div", { className: "smwb-command-palette__loading", "aria-hidden": "true", "data-testid": "command-palette-loading", children: Array.from({ length: dt }, (e, n) => /* @__PURE__ */ p("div", { className: "smwb-command-palette__loading-row", children: [
312
+ /* @__PURE__ */ a(V, { variant: "circular", width: 20, height: 20 }),
313
+ /* @__PURE__ */ a(V, { variant: "text", width: "60%" }),
314
+ /* @__PURE__ */ a(V, { variant: "text", width: "40%" })
315
+ ] }, n)) }) : null,
316
+ x ? /* @__PURE__ */ a(
317
+ "div",
318
+ {
319
+ className: F("smwb-command-palette__message", "smwb-command-palette__message_error"),
320
+ "data-testid": "command-palette-error",
321
+ children: L
322
+ }
323
+ ) : null,
324
+ !_ && !x && !P ? /* @__PURE__ */ a("div", { className: "smwb-command-palette__message", "data-testid": "command-palette-empty", children: K }) : null
325
+ ]
326
+ }
327
+ ),
328
+ M == null ? null : /* @__PURE__ */ a("div", { className: "smwb-command-palette__footer", "data-testid": "command-palette-footer", children: M }),
329
+ /* @__PURE__ */ a("div", { className: "smwb-command-palette__status", role: "status", "data-testid": "command-palette-status", children: Qe })
330
+ ] })
331
+ }
332
+ );
333
+ });
334
+ export {
335
+ Pt as CommandPalette
336
+ };
337
+ //# sourceMappingURL=commandPalette.js.map