@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
@@ -1,37 +1,60 @@
1
- import { jsxs as f, jsx as i } from "react/jsx-runtime";
2
- import { forwardRef as b } from "react";
3
- import c from "clsx";
4
- const N = b(function({ className: r, children: _, disabled: s, selected: m, dense: d, divider: n, startAdornment: l, endAdornment: o, onClick: t }, w) {
5
- const a = !!t && !s;
6
- return /* @__PURE__ */ f(
1
+ import { jsx as n, jsxs as a, Fragment as w } from "react/jsx-runtime";
2
+ import { forwardRef as R, useRef as y } from "react";
3
+ import I from "clsx";
4
+ import { resolveLinkRel as j, resolveLinkTarget as D } from "../../../utils/linkAttrs.js";
5
+ const A = R(function({ className: p, children: b, disabled: i, selected: r, dense: h, divider: u, startAdornment: g, endAdornment: k, href: m, target: N, rel: x, onClick: t }, L) {
6
+ const s = !!m, l = !!t && !i && !s, _ = D(N), o = y(null), d = /* @__PURE__ */ n("span", { className: "smwb-list__item__start", children: g }), c = /* @__PURE__ */ n("span", { className: "smwb-list__item__main", children: b }), f = /* @__PURE__ */ n("span", { className: "smwb-list__item__end", children: k });
7
+ return /* @__PURE__ */ n(
7
8
  "li",
8
9
  {
9
- ref: w,
10
+ ref: L,
10
11
  role: "listitem",
11
- tabIndex: a ? 0 : void 0,
12
- "aria-disabled": s || void 0,
13
- "aria-selected": m || void 0,
14
- onClick: s ? void 0 : t,
15
- onKeyDown: a ? (e) => {
12
+ tabIndex: l ? 0 : void 0,
13
+ "aria-disabled": i || void 0,
14
+ "aria-selected": !s && r || void 0,
15
+ onClick: i || !t ? void 0 : s ? (e) => {
16
+ var v;
17
+ (v = o.current) != null && v.contains(e.target) && t(e);
18
+ } : t,
19
+ onKeyDown: l ? (e) => {
16
20
  (e.key === "Enter" || e.key === " ") && (e.preventDefault(), t == null || t(e));
17
21
  } : void 0,
18
- className: c("smwb-list__item", r, {
19
- "smwb-disabled": s,
20
- "smwb-selected": m,
21
- "smwb-list__item_dense": d,
22
- "smwb-list__item_divider": n
22
+ className: I("smwb-list__item", p, {
23
+ "smwb-disabled": i,
24
+ "smwb-selected": r,
25
+ "smwb-list__item_link": s,
26
+ "smwb-list__item_dense": h,
27
+ "smwb-list__item_divider": u
23
28
  }),
24
29
  "data-testid": "list-item",
25
- children: [
26
- /* @__PURE__ */ i("span", { className: "smwb-list__item__start", children: l }),
27
- /* @__PURE__ */ i("span", { className: "smwb-list__item__main", children: _ }),
28
- /* @__PURE__ */ i("span", { className: "smwb-list__item__end", children: o })
29
- ]
30
+ children: s ? /* @__PURE__ */ a(w, { children: [
31
+ /* @__PURE__ */ a(
32
+ "a",
33
+ {
34
+ ref: o,
35
+ className: "smwb-list__item__link",
36
+ "data-testid": "list-item-link",
37
+ "aria-current": r ? "page" : void 0,
38
+ href: i ? void 0 : m,
39
+ target: _,
40
+ rel: j(x, _),
41
+ children: [
42
+ d,
43
+ c
44
+ ]
45
+ }
46
+ ),
47
+ f
48
+ ] }) : /* @__PURE__ */ a(w, { children: [
49
+ d,
50
+ c,
51
+ f
52
+ ] })
30
53
  }
31
54
  );
32
55
  });
33
56
  export {
34
- N as ListItem,
35
- N as default
57
+ A as ListItem,
58
+ A as default
36
59
  };
37
60
  //# sourceMappingURL=listItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"listItem.js","sources":["../../../../../src/components/dataDisplay/list/listItem.tsx"],"sourcesContent":["import React, { forwardRef, PropsWithChildren } from \"react\";\nimport cn from \"clsx\";\n\nexport interface ListItemProps {\n disabled?: boolean;\n className?: string;\n selected?: boolean;\n /** Compact row. */\n dense?: boolean;\n /** Render a bottom divider. */\n divider?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLLIElement>;\n}\n\nexport const ListItem = forwardRef<HTMLLIElement, PropsWithChildren<ListItemProps>>(function ListItem(\n { className, children, disabled, selected, dense, divider, startAdornment, endAdornment, onClick },\n ref\n) {\n const interactive = !!onClick && !disabled;\n\n return (\n <li\n ref={ref}\n role=\"listitem\"\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n aria-selected={selected || undefined}\n onClick={disabled ? undefined : onClick}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLLIElement>);\n }\n }\n : undefined\n }\n className={cn(\"smwb-list__item\", className, {\n \"smwb-disabled\": disabled,\n \"smwb-selected\": selected,\n \"smwb-list__item_dense\": dense,\n \"smwb-list__item_divider\": divider,\n })}\n data-testid=\"list-item\"\n >\n <span className=\"smwb-list__item__start\">{startAdornment}</span>\n <span className=\"smwb-list__item__main\">{children}</span>\n <span className=\"smwb-list__item__end\">{endAdornment}</span>\n </li>\n );\n});\n\nexport default ListItem;\n"],"names":["ListItem","forwardRef","className","children","disabled","selected","dense","divider","startAdornment","endAdornment","onClick","ref","interactive","jsxs","cn","jsx"],"mappings":";;;AAgBO,MAAMA,IAAWC,EAA4D,SAClF,EAAE,WAAAC,GAAW,UAAAC,GAAU,UAAAC,GAAU,UAAAC,GAAU,OAAAC,GAAO,SAAAC,GAAS,gBAAAC,GAAgB,cAAAC,GAAc,SAAAC,EAAA,GACzFC,GACA;AACA,QAAMC,IAAc,CAAC,CAACF,KAAW,CAACN;AAElC,SACE,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAF;AAAA,MACA,MAAK;AAAA,MACL,UAAUC,IAAc,IAAI;AAAA,MAC5B,iBAAeR,KAAY;AAAA,MAC3B,iBAAeC,KAAY;AAAA,MAC3B,SAASD,IAAW,SAAYM;AAAA,MAChC,WACEE,IACI,CAAC,MAAM;AACL,SAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,eAAA,GACFF,KAAA,QAAAA,EAAU;AAAA,MAEd,IACA;AAAA,MAEN,WAAWI,EAAG,mBAAmBZ,GAAW;AAAA,QAC1C,iBAAiBE;AAAA,QACjB,iBAAiBC;AAAA,QACjB,yBAAyBC;AAAA,QACzB,2BAA2BC;AAAA,MAAA,CAC5B;AAAA,MACD,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAQ,EAAC,QAAA,EAAK,WAAU,0BAA0B,UAAAP,GAAe;AAAA,QACzD,gBAAAO,EAAC,QAAA,EAAK,WAAU,yBAAyB,UAAAZ,EAAA,CAAS;AAAA,QAClD,gBAAAY,EAAC,QAAA,EAAK,WAAU,wBAAwB,UAAAN,EAAA,CAAa;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG3D,CAAC;"}
1
+ {"version":3,"file":"listItem.js","sources":["../../../../../src/components/dataDisplay/list/listItem.tsx"],"sourcesContent":["import React, { forwardRef, PropsWithChildren, useRef } from \"react\";\nimport cn from \"clsx\";\nimport { resolveLinkRel, resolveLinkTarget } from \"../../../utils/linkAttrs\";\n\nexport interface ListItemProps {\n disabled?: boolean;\n className?: string;\n /**\n * Paints the row as the current one. On a link row (with `href`) it also marks the link as the current page\n * with `aria-current=\"page\"`, because `aria-selected` is not a state a list item can have; on another row it\n * stays `aria-selected`.\n */\n selected?: boolean;\n /** Compact row. */\n dense?: boolean;\n /** Render a bottom divider. */\n divider?: boolean;\n startAdornment?: React.ReactNode;\n /**\n * Trailing content. On a link row (with `href`) it sits beside the link, not inside it, so it can hold a control\n * (a pin button, a toggle) without nesting it in the `<a>`; a click on it does not reach `onClick`.\n */\n endAdornment?: React.ReactNode;\n /**\n * Makes the row a link: the `startAdornment` and the children sit in an `<a href>` that fills the row, so it can be\n * focused with Tab, opened with middle click or copied. Keep the `startAdornment` non-interactive; a control\n * belongs in the `endAdornment`. A disabled row has no `href`. A router takes the\n * plain click in `onClick` with `event.preventDefault()`, and leaves a modified one (Ctrl, Meta, Shift,\n * Alt, or a button other than the main one) to the browser, as a router's `Link` does.\n */\n href?: string;\n /**\n * Where the link (with `href`) opens. By default `\"_blank\"`: a new tab, as for `Button`. Pass `null` for an\n * internal link: the `target` attribute is left out and the link opens in place. An empty string does the same; any other\n * string is used as is.\n */\n target?: string | null;\n /**\n * The `rel` of the link (with `href`). By default `\"noreferrer\"` for a link that opens another tab or window,\n * and none for one that opens in place. Your own value replaces the default, so add `noreferrer` yourself\n * if you still want it; an empty string drops the attribute.\n */\n rel?: string;\n /**\n * Click handler of the row. With an `href` it runs for a click on the link (not on the `endAdornment`), before the\n * browser follows it, so `event.preventDefault()` cancels the navigation; the row then is not a Tab stop of its\n * own, the link is.\n */\n onClick?: React.MouseEventHandler<HTMLLIElement>;\n}\n\nexport const ListItem = forwardRef<HTMLLIElement, PropsWithChildren<ListItemProps>>(function ListItem(\n { className, children, disabled, selected, dense, divider, startAdornment, endAdornment, href, target, rel, onClick },\n ref\n) {\n const link = !!href;\n // A link row is focused through its anchor, which Enter follows by itself.\n const interactive = !!onClick && !disabled && !link;\n const linkTarget = resolveLinkTarget(target);\n const linkRef = useRef<HTMLAnchorElement>(null);\n const start = <span className=\"smwb-list__item__start\">{startAdornment}</span>;\n const main = <span className=\"smwb-list__item__main\">{children}</span>;\n const end = <span className=\"smwb-list__item__end\">{endAdornment}</span>;\n const handleClick: React.MouseEventHandler<HTMLLIElement> | undefined =\n disabled || !onClick\n ? undefined\n : link\n ? (e) => {\n // The end adornment is beside the link, and its own clicks are not the row's.\n if (linkRef.current?.contains(e.target as Node)) onClick(e);\n }\n : onClick;\n\n return (\n <li\n ref={ref}\n role=\"listitem\"\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n aria-selected={(!link && selected) || undefined}\n onClick={handleClick}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick?.(e as unknown as React.MouseEvent<HTMLLIElement>);\n }\n }\n : undefined\n }\n className={cn(\"smwb-list__item\", className, {\n \"smwb-disabled\": disabled,\n \"smwb-selected\": selected,\n \"smwb-list__item_link\": link,\n \"smwb-list__item_dense\": dense,\n \"smwb-list__item_divider\": divider,\n })}\n data-testid=\"list-item\"\n >\n {link ? (\n <>\n <a\n ref={linkRef}\n className=\"smwb-list__item__link\"\n data-testid=\"list-item-link\"\n aria-current={selected ? \"page\" : undefined}\n // A disabled link has no href, so it is no link to follow or to focus.\n href={disabled ? undefined : href}\n target={linkTarget}\n rel={resolveLinkRel(rel, linkTarget)}\n >\n {start}\n {main}\n </a>\n {end}\n </>\n ) : (\n <>\n {start}\n {main}\n {end}\n </>\n )}\n </li>\n );\n});\n\nexport default ListItem;\n"],"names":["ListItem","forwardRef","className","children","disabled","selected","dense","divider","startAdornment","endAdornment","href","target","rel","onClick","ref","link","interactive","linkTarget","resolveLinkTarget","linkRef","useRef","start","jsx","main","end","_a","cn","jsxs","Fragment","resolveLinkRel"],"mappings":";;;;AAmDO,MAAMA,IAAWC,EAA4D,SAClF,EAAE,WAAAC,GAAW,UAAAC,GAAU,UAAAC,GAAU,UAAAC,GAAU,OAAAC,GAAO,SAAAC,GAAS,gBAAAC,GAAgB,cAAAC,GAAc,MAAAC,GAAM,QAAAC,GAAQ,KAAAC,GAAK,SAAAC,EAAA,GAC5GC,GACA;AACA,QAAMC,IAAO,CAAC,CAACL,GAETM,IAAc,CAAC,CAACH,KAAW,CAACT,KAAY,CAACW,GACzCE,IAAaC,EAAkBP,CAAM,GACrCQ,IAAUC,EAA0B,IAAI,GACxCC,IAAQ,gBAAAC,EAAC,QAAA,EAAK,WAAU,0BAA0B,UAAAd,GAAe,GACjEe,IAAO,gBAAAD,EAAC,QAAA,EAAK,WAAU,yBAAyB,UAAAnB,GAAS,GACzDqB,IAAM,gBAAAF,EAAC,QAAA,EAAK,WAAU,wBAAwB,UAAAb,GAAa;AAWjE,SACE,gBAAAa;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAR;AAAA,MACA,MAAK;AAAA,MACL,UAAUE,IAAc,IAAI;AAAA,MAC5B,iBAAeZ,KAAY;AAAA,MAC3B,iBAAgB,CAACW,KAAQV,KAAa;AAAA,MACtC,SAhBFD,KAAY,CAACS,IACT,SACAE,IACE,CAAC,MAAM;;AAEL,SAAIU,IAAAN,EAAQ,YAAR,QAAAM,EAAiB,SAAS,EAAE,aAAyB,CAAC;AAAA,MAC5D,IACAZ;AAAA,MAUJ,WACEG,IACI,CAAC,MAAM;AACL,SAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,eAAA,GACFH,KAAA,QAAAA,EAAU;AAAA,MAEd,IACA;AAAA,MAEN,WAAWa,EAAG,mBAAmBxB,GAAW;AAAA,QAC1C,iBAAiBE;AAAA,QACjB,iBAAiBC;AAAA,QACjB,wBAAwBU;AAAA,QACxB,yBAAyBT;AAAA,QACzB,2BAA2BC;AAAA,MAAA,CAC5B;AAAA,MACD,eAAY;AAAA,MAEX,cACC,gBAAAoB,EAAAC,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKR;AAAA,YACL,WAAU;AAAA,YACV,eAAY;AAAA,YACZ,gBAAcd,IAAW,SAAS;AAAA,YAElC,MAAMD,IAAW,SAAYM;AAAA,YAC7B,QAAQO;AAAA,YACR,KAAKY,EAAejB,GAAKK,CAAU;AAAA,YAElC,UAAA;AAAA,cAAAI;AAAA,cACAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEFC;AAAA,MAAA,EAAA,CACH,IAEA,gBAAAG,EAAAC,GAAA,EACG,UAAA;AAAA,QAAAP;AAAA,QACAE;AAAA,QACAC;AAAA,MAAA,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
@@ -0,0 +1,76 @@
1
+ import { jsxs as f, jsx as d } from "react/jsx-runtime";
2
+ import { forwardRef as A, useMemo as E } from "react";
3
+ import N from "clsx";
4
+ import { encode as q } from "uqr";
5
+ import { qrCodePath as v } from "./qrCodePath.js";
6
+ const x = {
7
+ "too-long": "QR code: value too long",
8
+ "encode-failed": "QR code: value could not be encoded"
9
+ }, M = 32, w = 256;
10
+ var _;
11
+ const r = (_ = globalThis.__smwbQrCodeWarnings) != null ? _ : globalThis.__smwbQrCodeWarnings = /* @__PURE__ */ new Set(), b = (e, o) => {
12
+ r.has(e) || r.size >= M || (r.add(e), console.error(`[smwb] QrCode: ${o}`));
13
+ }, S = (e, o) => {
14
+ if (e instanceof RangeError && /too long/i.test(e.message)) {
15
+ const s = Math.ceil(o.length / w);
16
+ return b(
17
+ `too-long:${s}`,
18
+ `value is too long to encode as a QR code (${o.length} characters; this notice is once per ${w}-character band)`
19
+ ), "too-long";
20
+ }
21
+ const n = e instanceof Error ? `${e.name}: ${e.message}` : String(e);
22
+ return b(`failed:${n}`, `value could not be encoded as a QR code (${n})`), "encode-failed";
23
+ }, P = A(function({
24
+ className: o,
25
+ value: n,
26
+ size: s = 192,
27
+ caption: l,
28
+ label: p = "QR code",
29
+ errorCorrection: i = "M",
30
+ quietZone: m = 4,
31
+ "data-testid": C = "qr-code",
32
+ ...R
33
+ }, $) {
34
+ var u, h;
35
+ const a = E(() => {
36
+ try {
37
+ return { modules: q(n, { ecc: i, border: 0 }).data, failure: null };
38
+ } catch (Q) {
39
+ return { modules: null, failure: S(Q, n) };
40
+ }
41
+ }, [n, i]), c = ((h = (u = a.modules) == null ? void 0 : u.length) != null ? h : 0) + 2 * m, g = a.modules ? v(a.modules, m) : "", t = a.failure;
42
+ return /* @__PURE__ */ f(
43
+ "figure",
44
+ {
45
+ ...R,
46
+ ref: $,
47
+ "data-testid": C,
48
+ "data-error": t != null ? t : void 0,
49
+ className: N("smwb-qr-code", o),
50
+ children: [
51
+ /* @__PURE__ */ f(
52
+ "svg",
53
+ {
54
+ className: "smwb-qr-code__image",
55
+ role: "img",
56
+ "aria-label": t === null ? p : x[t],
57
+ viewBox: `0 0 ${c} ${c}`,
58
+ width: s,
59
+ height: s,
60
+ shapeRendering: "crispEdges",
61
+ xmlns: "http://www.w3.org/2000/svg",
62
+ children: [
63
+ /* @__PURE__ */ d("rect", { className: "smwb-qr-code__light", width: c, height: c, fill: "rgb(255,255,255)" }),
64
+ g && /* @__PURE__ */ d("path", { className: "smwb-qr-code__dark", d: g, fill: "rgb(0,0,0)" })
65
+ ]
66
+ }
67
+ ),
68
+ l ? /* @__PURE__ */ d("figcaption", { className: "smwb-qr-code__caption", children: l }) : null
69
+ ]
70
+ }
71
+ );
72
+ });
73
+ export {
74
+ P as QrCode
75
+ };
76
+ //# sourceMappingURL=qrCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qrCode.js","sources":["../../../../../src/components/dataDisplay/qrCode/qrCode.tsx"],"sourcesContent":["import React, { forwardRef, useMemo } from \"react\";\nimport cn from \"clsx\";\nimport { encode } from \"uqr\";\nimport { qrCodePath } from \"./qrCodePath\";\n\n/** Error-correction level: L 7%, M 15%, Q 25%, H 30% of the code may be damaged or covered. */\nexport type QrCodeErrorCorrection = \"L\" | \"M\" | \"Q\" | \"H\";\n\nexport interface QrCodeProps extends Omit<React.HTMLAttributes<HTMLElement>, \"children\" | \"role\"> {\n /** Text encoded in the code (a URL, a pairing token). Encoded as UTF-8 bytes. */\n value: string;\n /** Side of the code, quiet zone included, in pixels. Default 192. */\n size?: number | undefined;\n /** Shown under the code (a `<figcaption>`), e.g. \"Scan with the phone app\". */\n caption?: React.ReactNode;\n /** Accessible name of the image. Default \"QR code\". */\n label?: string | undefined;\n /** Error-correction level: L 7%, M 15% (default), Q 25%, H 30% of the code may be damaged or covered. */\n errorCorrection?: QrCodeErrorCorrection | undefined;\n /** Light margin around the code in modules. Default 4, the minimum the QR spec asks for; smaller values hurt scanning. */\n quietZone?: number | undefined;\n /** Test id of the root; `qr-code` unless given. */\n \"data-testid\"?: string | undefined;\n}\n\n// Why the encoding failed, as the root's `data-error`, and the name the image takes then.\ntype QrCodeFailure = \"too-long\" | \"encode-failed\";\nconst FAILURE_LABEL: Record<QrCodeFailure, string> = {\n \"too-long\": \"QR code: value too long\",\n \"encode-failed\": \"QR code: value could not be encoded\",\n};\n\n// Warns once per distinct cause, never per value: the registry keys on the cause the\n// message reports — a capacity band, or the error text — not on the value, so a\n// `QrCode` bound to a text field neither keeps a multi-KB string alive per keystroke nor\n// logs a new line for every character typed. The cap bounds the registry itself: past it\n// the warning stays quiet instead of growing. It lives on globalThis so the server bundle\n// and the client module of one SSR runtime share it: the cause logs once per runtime, not\n// once per bundle. A process.env guard is deliberately not used — like dagView.tsx it\n// would silence only dev SSR.\nconst MAX_WARNED_CAUSES = 32;\nconst CAPACITY_BAND = 256; // characters: one notice per band, not per length\nconst warnedCauses = ((globalThis as { __smwbQrCodeWarnings?: Set<string> }).__smwbQrCodeWarnings ??= new Set());\nconst warnOnce = (cause: string, message: string): void => {\n if (warnedCauses.has(cause) || warnedCauses.size >= MAX_WARNED_CAUSES) {\n return;\n }\n warnedCauses.add(cause);\n // eslint-disable-next-line no-console\n console.error(`[smwb] QrCode: ${message}`);\n};\n\n// `uqr` reports a value past the QR capacity as a RangeError(\"Data too long\"); it throws\n// other errors for other inputs (a lone surrogate fails in `encodeURI`, an untyped\n// `errorCorrection` fails in its own lookup). Only the first of those is \"too long\", so\n// the failure is read off the error instead of assumed, and the rest are named as what\n// they are.\nconst noteEncodeFailure = (error: unknown, value: string): QrCodeFailure => {\n if (error instanceof RangeError && /too long/i.test(error.message)) {\n const band = Math.ceil(value.length / CAPACITY_BAND);\n warnOnce(\n `too-long:${band}`,\n `value is too long to encode as a QR code (${value.length} characters; this notice is once per ` +\n `${CAPACITY_BAND}-character band)`\n );\n return \"too-long\";\n }\n const reason = error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n warnOnce(`failed:${reason}`, `value could not be encoded as a QR code (${reason})`);\n return \"encode-failed\";\n};\n\n/**\n * A QR code of `value` as an SVG image (role=img): dark modules on a white square —\n * including the quiet zone — in every theme, so a phone camera reads it in dark mode\n * too. With `caption` the code sits in a `<figure>` named by the caption. A `value`\n * past the QR capacity renders an empty white square with `data-error=\"too-long\"`,\n * any other encode failure with `data-error=\"encode-failed\"`, instead of throwing.\n */\nexport const QrCode = forwardRef<HTMLElement, QrCodeProps>(function QrCode(\n {\n className,\n value,\n size = 192,\n caption,\n label = \"QR code\",\n errorCorrection = \"M\",\n quietZone = 4,\n \"data-testid\": dataTestId = \"qr-code\",\n ...rest\n },\n ref\n) {\n const encoded = useMemo(() => {\n try {\n return { modules: encode(value, { ecc: errorCorrection, border: 0 }).data, failure: null };\n } catch (error) {\n return { modules: null, failure: noteEncodeFailure(error, value) };\n }\n }, [value, errorCorrection]);\n\n // N: the whole canvas in modules — matrix plus the quiet zone on every side.\n const moduleCount = encoded.modules?.length ?? 0;\n const canvas = moduleCount + 2 * quietZone;\n const path = encoded.modules ? qrCodePath(encoded.modules, quietZone) : \"\";\n const failure = encoded.failure;\n\n return (\n <figure\n {...rest}\n ref={ref}\n data-testid={dataTestId}\n data-error={failure ?? undefined}\n className={cn(\"smwb-qr-code\", className)}\n >\n <svg\n className=\"smwb-qr-code__image\"\n role=\"img\"\n aria-label={failure === null ? label : FAILURE_LABEL[failure]}\n viewBox={`0 0 ${canvas} ${canvas}`}\n width={size}\n height={size}\n shapeRendering=\"crispEdges\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect className=\"smwb-qr-code__light\" width={canvas} height={canvas} fill=\"rgb(255,255,255)\" />\n {path && <path className=\"smwb-qr-code__dark\" d={path} fill=\"rgb(0,0,0)\" />}\n </svg>\n {caption ? <figcaption className=\"smwb-qr-code__caption\">{caption}</figcaption> : null}\n </figure>\n );\n});\n\nexport default QrCode;\n"],"names":["FAILURE_LABEL","MAX_WARNED_CAUSES","CAPACITY_BAND","warnedCauses","_a","warnOnce","cause","message","noteEncodeFailure","error","value","band","reason","QrCode","forwardRef","className","size","caption","label","errorCorrection","quietZone","dataTestId","rest","ref","encoded","useMemo","encode","canvas","_b","path","qrCodePath","failure","jsxs","cn","jsx"],"mappings":";;;;;AA2BA,MAAMA,IAA+C;AAAA,EACnD,YAAY;AAAA,EACZ,iBAAiB;AACnB,GAUMC,IAAoB,IACpBC,IAAgB;;AACtB,MAAMC,KAAiBC,IAAA,WAAsD,yBAAtD,OAAAA,IAAA,WAAsD,uBAAyB,oBAAI,IAAA,GACpGC,IAAW,CAACC,GAAeC,MAA0B;AACzD,EAAIJ,EAAa,IAAIG,CAAK,KAAKH,EAAa,QAAQF,MAGpDE,EAAa,IAAIG,CAAK,GAEtB,QAAQ,MAAM,kBAAkBC,CAAO,EAAE;AAC3C,GAOMC,IAAoB,CAACC,GAAgBC,MAAiC;AAC1E,MAAID,aAAiB,cAAc,YAAY,KAAKA,EAAM,OAAO,GAAG;AAClE,UAAME,IAAO,KAAK,KAAKD,EAAM,SAASR,CAAa;AACnD,WAAAG;AAAA,MACE,YAAYM,CAAI;AAAA,MAChB,6CAA6CD,EAAM,MAAM,wCACpDR,CAAa;AAAA,IAAA,GAEb;AAAA,EACT;AACA,QAAMU,IAASH,aAAiB,QAAQ,GAAGA,EAAM,IAAI,KAAKA,EAAM,OAAO,KAAK,OAAOA,CAAK;AACxF,SAAAJ,EAAS,UAAUO,CAAM,IAAI,4CAA4CA,CAAM,GAAG,GAC3E;AACT,GASaC,IAASC,EAAqC,SACzD;AAAA,EACE,WAAAC;AAAA,EACA,OAAAL;AAAA,EACA,MAAAM,IAAO;AAAA,EACP,SAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,iBAAAC,IAAkB;AAAA,EAClB,WAAAC,IAAY;AAAA,EACZ,eAAeC,IAAa;AAAA,EAC5B,GAAGC;AACL,GACAC,GACA;;AACA,QAAMC,IAAUC,EAAQ,MAAM;AAC5B,QAAI;AACF,aAAO,EAAE,SAASC,EAAOhB,GAAO,EAAE,KAAKS,GAAiB,QAAQ,EAAA,CAAG,EAAE,MAAM,SAAS,KAAA;AAAA,IACtF,SAASV,GAAO;AACd,aAAO,EAAE,SAAS,MAAM,SAASD,EAAkBC,GAAOC,CAAK,EAAA;AAAA,IACjE;AAAA,EACF,GAAG,CAACA,GAAOS,CAAe,CAAC,GAIrBQ,MADcC,KAAAxB,IAAAoB,EAAQ,YAAR,gBAAApB,EAAiB,WAAjB,OAAAwB,IAA2B,KAClB,IAAIR,GAC3BS,IAAOL,EAAQ,UAAUM,EAAWN,EAAQ,SAASJ,CAAS,IAAI,IAClEW,IAAUP,EAAQ;AAExB,SACE,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGV;AAAA,MACJ,KAAAC;AAAA,MACA,eAAaF;AAAA,MACb,cAAYU,KAAA,OAAAA,IAAW;AAAA,MACvB,WAAWE,EAAG,gBAAgBlB,CAAS;AAAA,MAEvC,UAAA;AAAA,QAAA,gBAAAiB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAYD,MAAY,OAAOb,IAAQlB,EAAc+B,CAAO;AAAA,YAC5D,SAAS,OAAOJ,CAAM,IAAIA,CAAM;AAAA,YAChC,OAAOX;AAAA,YACP,QAAQA;AAAA,YACR,gBAAe;AAAA,YACf,OAAM;AAAA,YAEN,UAAA;AAAA,cAAA,gBAAAkB,EAAC,QAAA,EAAK,WAAU,uBAAsB,OAAOP,GAAQ,QAAQA,GAAQ,MAAK,mBAAA,CAAmB;AAAA,cAC5FE,uBAAS,QAAA,EAAK,WAAU,sBAAqB,GAAGA,GAAM,MAAK,aAAA,CAAa;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAE1EZ,IAAU,gBAAAiB,EAAC,cAAA,EAAW,WAAU,yBAAyB,aAAQ,IAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGxF,CAAC;"}
@@ -0,0 +1,20 @@
1
+ function i(n, o) {
2
+ const r = [];
3
+ for (let l = 0; l < n.length; l += 1) {
4
+ const h = n[l];
5
+ let e = 0;
6
+ for (; h !== void 0 && e < h.length; )
7
+ if (h[e]) {
8
+ let t = 1;
9
+ for (; e + t < h.length && h[e + t]; )
10
+ t += 1;
11
+ r.push(`M${e + o} ${l + o}h${t}v1h-${t}z`), e += t;
12
+ } else
13
+ e += 1;
14
+ }
15
+ return r.join("");
16
+ }
17
+ export {
18
+ i as qrCodePath
19
+ };
20
+ //# sourceMappingURL=qrCodePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qrCodePath.js","sources":["../../../../../src/components/dataDisplay/qrCode/qrCodePath.ts"],"sourcesContent":["/**\n * The `d` string of the QR code's dark modules: one run-length subpath per horizontal\n * run of dark modules (`M{x} {y}h{n}v1h-{n}z`), in row order and offset by the quiet\n * zone. Pure and deterministic — the same matrix always yields the same string, on the\n * server and in the browser, in ui-react and ui-solid.\n */\nexport function qrCodePath(data: readonly (readonly boolean[])[], quietZone: number): string {\n const parts: string[] = [];\n for (let y = 0; y < data.length; y += 1) {\n const row = data[y];\n let x = 0;\n while (row !== undefined && x < row.length) {\n if (row[x]) {\n let run = 1;\n while (x + run < row.length && row[x + run]) {\n run += 1;\n }\n parts.push(`M${x + quietZone} ${y + quietZone}h${run}v1h-${run}z`);\n x += run;\n } else {\n x += 1;\n }\n }\n }\n return parts.join(\"\");\n}\n"],"names":["qrCodePath","data","quietZone","parts","y","row","x","run"],"mappings":"AAMO,SAASA,EAAWC,GAAuCC,GAA2B;AAC3F,QAAMC,IAAkB,CAAA;AACxB,WAASC,IAAI,GAAGA,IAAIH,EAAK,QAAQG,KAAK,GAAG;AACvC,UAAMC,IAAMJ,EAAKG,CAAC;AAClB,QAAIE,IAAI;AACR,WAAOD,MAAQ,UAAaC,IAAID,EAAI;AAClC,UAAIA,EAAIC,CAAC,GAAG;AACV,YAAIC,IAAM;AACV,eAAOD,IAAIC,IAAMF,EAAI,UAAUA,EAAIC,IAAIC,CAAG;AACxC,UAAAA,KAAO;AAET,QAAAJ,EAAM,KAAK,IAAIG,IAAIJ,CAAS,IAAIE,IAAIF,CAAS,IAAIK,CAAG,OAAOA,CAAG,GAAG,GACjED,KAAKC;AAAA,MACP;AACE,QAAAD,KAAK;AAAA,EAGX;AACA,SAAOH,EAAM,KAAK,EAAE;AACtB;"}
@@ -0,0 +1,28 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { forwardRef as b } from "react";
3
+ import f from "clsx";
4
+ const $ = b(function({ className: d, status: t, color: o, size: m = "md", pulse: s, label: i, "data-testid": r = "status-dot", ...n }, w) {
5
+ const a = t != null ? t : o === void 0 ? "unknown" : void 0;
6
+ return /* @__PURE__ */ e(
7
+ "span",
8
+ {
9
+ ...n,
10
+ ref: w,
11
+ role: "img",
12
+ "aria-label": i,
13
+ "data-testid": r,
14
+ className: f(
15
+ "smwb-status-dot",
16
+ `smwb-status-dot_size-${m}`,
17
+ a && `smwb-status-dot_status-${a}`,
18
+ o && `smwb-status-dot_color-${o}`,
19
+ { "smwb-status-dot_pulse": s != null ? s : t === "active" },
20
+ d
21
+ )
22
+ }
23
+ );
24
+ });
25
+ export {
26
+ $ as StatusDot
27
+ };
28
+ //# sourceMappingURL=statusDot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusDot.js","sources":["../../../../../src/components/dataDisplay/statusDot/statusDot.tsx"],"sourcesContent":["import React, { forwardRef, HTMLAttributes } from \"react\";\nimport cn from \"clsx\";\n\n/** What the marker says: `active` is under way, `attention` waits for someone, `idle` rests, `done` is finished. */\nexport type StatusDotStatus = \"active\" | \"attention\" | \"idle\" | \"done\" | \"error\" | \"unknown\";\n\n/** The theme colour names `Chip` takes; `default` is the neutral on-surface colour. */\nexport type StatusDotColor = \"default\" | \"primary\" | \"secondary\" | \"error\" | \"success\" | \"warning\" | \"info\";\n\nexport type StatusDotSize = \"sm\" | \"md\";\n\nexport interface StatusDotProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"role\" | \"children\" | \"aria-label\"> {\n /** Class name(s) for the dot's root `<span>`. */\n className?: string;\n /**\n * What the dot says, and so its colour: `active` info, `attention` warning, `idle` neutral, `done` success,\n * `error` error. `unknown` is a ring in the outline colour. Without `status` (and without `color`) the dot is\n * `unknown`.\n */\n status?: StatusDotStatus | undefined;\n /**\n * A theme colour instead of the status's own, or on its own with no `status` (a plain disc). Given with a\n * `status`, the status still sets the shape.\n */\n color?: StatusDotColor | undefined;\n /** `md` (12px) unless given; `sm` is 8px. */\n size?: StatusDotSize | undefined;\n /**\n * A ring spreads from the dot. On unless given for `active`, off for every other status. Never drawn while the\n * user prefers reduced motion.\n */\n pulse?: boolean | undefined;\n /** What the dot means in words, e.g. \"Working\": the accessible name, read by assistive technology. */\n label: string;\n /** Test id of the root; `status-dot` unless given. */\n \"data-testid\"?: string | undefined;\n}\n\n/** A small status marker: a dot coloured and shaped by `status`, named by `label`. */\nexport const StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(function StatusDot(\n { className, status, color, size = \"md\", pulse, label, \"data-testid\": dataTestId = \"status-dot\", ...rest },\n ref\n) {\n // A bare colour is a plain disc; with neither, the dot is \"unknown\".\n const shown = status ?? (color === undefined ? \"unknown\" : undefined);\n return (\n <span\n {...rest}\n ref={ref}\n role=\"img\"\n aria-label={label}\n data-testid={dataTestId}\n className={cn(\n \"smwb-status-dot\",\n `smwb-status-dot_size-${size}`,\n shown && `smwb-status-dot_status-${shown}`,\n color && `smwb-status-dot_color-${color}`,\n { \"smwb-status-dot_pulse\": pulse ?? status === \"active\" },\n className\n )}\n />\n );\n});\n\nexport default StatusDot;\n"],"names":["StatusDot","forwardRef","className","status","color","size","pulse","label","dataTestId","rest","ref","shown","jsx","cn"],"mappings":";;;AAuCO,MAAMA,IAAYC,EAA4C,SACnE,EAAE,WAAAC,GAAW,QAAAC,GAAQ,OAAAC,GAAO,MAAAC,IAAO,MAAM,OAAAC,GAAO,OAAAC,GAAO,eAAeC,IAAa,cAAc,GAAGC,EAAA,GACpGC,GACA;AAEA,QAAMC,IAAQR,KAAA,OAAAA,IAAWC,MAAU,SAAY,YAAY;AAC3D,SACE,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGH;AAAA,MACJ,KAAAC;AAAA,MACA,MAAK;AAAA,MACL,cAAYH;AAAA,MACZ,eAAaC;AAAA,MACb,WAAWK;AAAA,QACT;AAAA,QACA,wBAAwBR,CAAI;AAAA,QAC5BM,KAAS,0BAA0BA,CAAK;AAAA,QACxCP,KAAS,yBAAyBA,CAAK;AAAA,QACvC,EAAE,yBAAyBE,KAAA,OAAAA,IAASH,MAAW,SAAA;AAAA,QAC/CD;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN,CAAC;"}
@@ -0,0 +1,355 @@
1
+ import { jsx as F, jsxs as Me } from "react/jsx-runtime";
2
+ import s from "react";
3
+ import ie from "clsx";
4
+ import { useControllableState as He } from "../../../hooks/useControllableState.js";
5
+ import { useEventCallback as Q } from "../../../hooks/useEventCallback.js";
6
+ import { useForkRef as Te } from "../../../hooks/useForkRef.js";
7
+ import { useSafeLayoutEffect as D } from "../../../hooks/useSafeLayoutEffect.js";
8
+ import { useVirtualList as Ce } from "../../../hooks/useVirtualList.js";
9
+ import { isOwnClick as Le } from "../../../utils/ownClick.js";
10
+ const ke = 64, Ke = 480, De = 4, Fe = 'a[href], button, input, select, textarea, iframe, summary, audio[controls], video[controls], [tabindex], [contenteditable]:not([contenteditable="false"])', X = (w) => typeof w == "number" ? `${w}px` : w, Ne = (w, c) => w.length === c.length && w.every((a, p) => a === c[p]);
11
+ function ze(w, c, a, p) {
12
+ const x = p.count - 1;
13
+ if (x < 0) return null;
14
+ const u = (d) => Math.min(x, Math.max(0, d)), h = (d) => d === a.index ? null : { index: d, col: a.col }, b = (d) => d === a.col ? null : { index: a.index, col: d };
15
+ if (c.ctrlKey || c.metaKey || c.altKey)
16
+ return !c.ctrlKey || c.metaKey || c.altKey ? null : w === "Home" ? h(0) : w === "End" ? h(x) : null;
17
+ switch (w) {
18
+ case "ArrowDown":
19
+ return h(u(a.index + 1));
20
+ case "ArrowUp":
21
+ return h(u(a.index - 1));
22
+ case "ArrowRight":
23
+ return b(1);
24
+ case "ArrowLeft":
25
+ return b(0);
26
+ case "Home":
27
+ return b(0);
28
+ case "End":
29
+ return b(1);
30
+ case "PageDown":
31
+ return h(u(a.index + p.pageSize));
32
+ case "PageUp":
33
+ return h(u(a.index - p.pageSize));
34
+ default:
35
+ return null;
36
+ }
37
+ }
38
+ const Oe = s.memo(function({
39
+ lane: c,
40
+ index: a,
41
+ selected: p,
42
+ selectable: x,
43
+ tabCol: u,
44
+ rowHeight: h,
45
+ handlers: b
46
+ }) {
47
+ const d = (C, M, g, L) => /* @__PURE__ */ F(
48
+ "div",
49
+ {
50
+ className: M,
51
+ role: C,
52
+ tabIndex: u === g ? 0 : -1,
53
+ onClick: (R) => b.onCellClick(R, c.id, g),
54
+ onFocus: (R) => b.onCellFocus(R, c.id, g),
55
+ children: L
56
+ }
57
+ );
58
+ return /* @__PURE__ */ Me(
59
+ "div",
60
+ {
61
+ className: ie("smwb-swimlanes__row", {
62
+ "smwb-swimlanes__row_selected": p,
63
+ "smwb-swimlanes__row_disabled": !!c.disabled
64
+ }),
65
+ role: "row",
66
+ "aria-rowindex": a + 1,
67
+ "aria-selected": x ? p : void 0,
68
+ "aria-disabled": c.disabled ? !0 : void 0,
69
+ "data-lane-id": c.id,
70
+ style: { top: a * h },
71
+ ref: (C) => {
72
+ b.registerRow(c.id, C);
73
+ },
74
+ children: [
75
+ d("rowheader", "smwb-swimlanes__header", 0, c.header),
76
+ d("gridcell", "smwb-swimlanes__content", 1, c.content)
77
+ ]
78
+ }
79
+ );
80
+ }), Pe = s.forwardRef(function(c, a) {
81
+ const {
82
+ className: p,
83
+ style: x,
84
+ lanes: u,
85
+ label: h,
86
+ selectedId: b,
87
+ defaultSelectedId: d,
88
+ onSelectedChange: C,
89
+ selectable: M = !0,
90
+ rowHeight: g = ke,
91
+ headerWidth: L,
92
+ contentMinWidth: R,
93
+ height: k,
94
+ overscan: ue = De,
95
+ emptyLabel: ae,
96
+ onScroll: B,
97
+ onKeyDown: V,
98
+ "data-testid": de = "swimlanes",
99
+ ...fe
100
+ } = c, H = s.useRef(null), j = s.useRef(null), N = s.useRef(/* @__PURE__ */ new Map()), me = Te(a, H), G = u.length === 0, y = s.useMemo(() => {
101
+ const e = /* @__PURE__ */ new Map();
102
+ return u.forEach((t, n) => {
103
+ e.has(t.id) || e.set(t.id, n);
104
+ }), e;
105
+ }, [u]), $ = s.useMemo(() => [...y.keys()], [y]), q = s.useRef($);
106
+ Ne(q.current, $) || (q.current = $);
107
+ const E = q.current, [we, Y] = He({
108
+ value: b,
109
+ defaultValue: d != null ? d : null,
110
+ onChange: C
111
+ }), _ = M ? we : null, [T, z] = s.useState(null), S = s.useMemo(() => {
112
+ if (T !== null && y.has(T.laneId)) return T;
113
+ if (_ !== null && y.has(_)) return { laneId: _, col: 0 };
114
+ const e = E[0];
115
+ return e === void 0 ? null : { laneId: e, col: 0 };
116
+ }, [T, _, y, E]), Z = s.useRef(S);
117
+ Z.current = S;
118
+ const he = typeof k == "number" ? k : Ke, [ee, pe] = s.useState(0), J = ee > 0 ? ee : he, I = Ce({
119
+ itemCount: u.length,
120
+ itemHeight: g,
121
+ viewportHeight: J,
122
+ overscan: ue
123
+ }), P = s.useMemo(() => {
124
+ const e = /* @__PURE__ */ new Set();
125
+ for (let t = I.startIndex; t < I.endIndex; t++) e.add(t);
126
+ if (S !== null) {
127
+ const t = y.get(S.laneId);
128
+ t !== void 0 && e.add(t);
129
+ }
130
+ return [...e].sort((t, n) => t - n);
131
+ }, [I.startIndex, I.endIndex, S, y]), be = s.useMemo(() => P.map((e) => {
132
+ var t, n;
133
+ return (n = (t = u[e]) == null ? void 0 : t.id) != null ? n : "";
134
+ }).join("|"), [P, u]), f = s.useRef({
135
+ selectable: M,
136
+ selected: _,
137
+ setSelected: Y,
138
+ active: T,
139
+ viewportHeight: J,
140
+ rowHeight: g,
141
+ lanes: u,
142
+ indexById: y,
143
+ onScroll: I.onScroll
144
+ });
145
+ f.current = {
146
+ selectable: M,
147
+ selected: _,
148
+ setSelected: Y,
149
+ active: T,
150
+ viewportHeight: J,
151
+ rowHeight: g,
152
+ lanes: u,
153
+ indexById: y,
154
+ onScroll: I.onScroll
155
+ };
156
+ const ge = (e, t) => {
157
+ var o;
158
+ const n = (o = N.current.get(e)) == null ? void 0 : o.children[t];
159
+ return n instanceof HTMLElement ? n : null;
160
+ }, ye = (e) => {
161
+ const t = H.current, n = j.current;
162
+ if (t === null || n === null || !(e instanceof Element)) return null;
163
+ const o = e.getAttribute("role");
164
+ if (o !== "rowheader" && o !== "gridcell") return null;
165
+ const i = o === "rowheader" ? 0 : 1, r = e.parentElement;
166
+ if (r === null || r.parentElement !== n || n.parentElement !== t) return null;
167
+ const l = r.dataset.laneId;
168
+ return l === void 0 ? null : { laneId: l, col: i };
169
+ }, O = s.useRef(null), Se = (e) => {
170
+ const t = H.current;
171
+ if (t === null) return;
172
+ const { rowHeight: n, viewportHeight: o } = f.current, i = t.clientHeight || o, r = e * n, l = r < t.scrollTop ? r : r + n > t.scrollTop + i ? r + n - i : t.scrollTop;
173
+ l !== t.scrollTop && (t.scrollTop = l, f.current.onScroll({ currentTarget: { scrollTop: l } }));
174
+ }, ve = (e, t) => {
175
+ const n = f.current.lanes[e];
176
+ n !== void 0 && (Se(e), z({ laneId: n.id, col: t }), O.current = { laneId: n.id, col: t });
177
+ }, xe = () => {
178
+ var o;
179
+ const { rowHeight: e, viewportHeight: t } = f.current, n = ((o = H.current) == null ? void 0 : o.clientHeight) || t;
180
+ return Math.max(1, Math.floor(n / e) - 1);
181
+ }, te = (e) => {
182
+ const { selectable: t, selected: n, setSelected: o } = f.current;
183
+ if (!t) return;
184
+ const i = f.current.indexById.get(e), r = i === void 0 ? void 0 : f.current.lanes[i];
185
+ r === void 0 || r.disabled || n !== e && o(e);
186
+ }, ne = Q(
187
+ (e, t, n) => {
188
+ Le(e, e.currentTarget) && (z({ laneId: t, col: n }), te(t));
189
+ }
190
+ ), re = Q(
191
+ (e, t, n) => {
192
+ e.currentTarget.contains(e.target) && z({ laneId: t, col: n });
193
+ }
194
+ ), oe = Q((e, t) => {
195
+ t !== null ? N.current.set(e, t) : N.current.delete(e);
196
+ }), Ie = s.useMemo(
197
+ () => ({ onCellClick: ne, onCellFocus: re, registerRow: oe }),
198
+ [ne, re, oe]
199
+ ), Re = (e) => {
200
+ V == null || V(e);
201
+ const t = ye(e.target);
202
+ if (t === null) return;
203
+ const { ctrlKey: n, metaKey: o, altKey: i } = e;
204
+ if (!n && !o && !i) {
205
+ if (e.key === "Enter" || e.key === " ") {
206
+ e.preventDefault(), te(t.laneId);
207
+ return;
208
+ }
209
+ if (e.key === "Escape") {
210
+ if (f.current.selected === null) return;
211
+ e.preventDefault(), f.current.setSelected(null);
212
+ return;
213
+ }
214
+ }
215
+ const r = f.current.indexById.get(t.laneId);
216
+ if (r === void 0) return;
217
+ const l = ze(
218
+ e.key,
219
+ { ctrlKey: n, metaKey: o, altKey: i },
220
+ { index: r, col: t.col },
221
+ { count: f.current.lanes.length, pageSize: xe() }
222
+ );
223
+ l !== null && (e.preventDefault(), ve(l.index, l.col));
224
+ }, Ee = (e) => {
225
+ B == null || B(e), I.onScroll(e);
226
+ };
227
+ D(() => {
228
+ const e = H.current;
229
+ if (e === null || typeof ResizeObserver != "function") return;
230
+ const t = new ResizeObserver(() => {
231
+ pe(e.clientHeight);
232
+ });
233
+ return t.observe(e), () => t.disconnect();
234
+ }, []), D(() => {
235
+ var t;
236
+ const e = O.current;
237
+ e !== null && (O.current = null, (t = ge(e.laneId, e.col)) == null || t.focus({ preventScroll: !0 }));
238
+ });
239
+ const se = s.useRef(null);
240
+ D(() => {
241
+ var v;
242
+ const e = se.current;
243
+ if (se.current = E, e === null || e === E) return;
244
+ const t = new Set(E), { selected: n, setSelected: o, active: i } = f.current, r = n !== null && !t.has(n) && e.includes(n);
245
+ if (r && o(null), i === null || t.has(i.laneId)) return;
246
+ z(null);
247
+ const l = (v = H.current) == null ? void 0 : v.ownerDocument;
248
+ if (l === void 0 || l.activeElement !== null && l.activeElement !== l.body) return;
249
+ const A = !r && n !== null && t.has(n) ? n : E[0];
250
+ A !== void 0 && (O.current = { laneId: A, col: 0 });
251
+ }, [E]);
252
+ const le = s.useRef(/* @__PURE__ */ new WeakMap()), ce = s.useRef(/* @__PURE__ */ new WeakMap()), W = s.useCallback(() => {
253
+ var o, i, r, l;
254
+ const e = (i = (o = Z.current) == null ? void 0 : o.laneId) != null ? i : null, t = le.current, n = ce.current;
255
+ for (const [A, v] of N.current)
256
+ for (const U of Array.from(v.children))
257
+ for (const m of U.querySelectorAll(Fe)) {
258
+ t.has(m) || t.set(m, m.getAttribute("tabindex")), m.getAttribute("tabindex") !== ((r = n.get(m)) != null ? r : null) && t.set(m, m.getAttribute("tabindex"));
259
+ const K = A === e ? (l = t.get(m)) != null ? l : null : "-1";
260
+ if (m.getAttribute("tabindex") === K) {
261
+ n.set(m, K);
262
+ continue;
263
+ }
264
+ K === null ? m.removeAttribute("tabindex") : m.setAttribute("tabindex", K), n.set(m, K);
265
+ }
266
+ }, []);
267
+ D(() => {
268
+ W();
269
+ }, [S, be, W]), D(() => {
270
+ const e = j.current;
271
+ if (e === null || typeof MutationObserver != "function") return;
272
+ const t = new MutationObserver((n) => {
273
+ var l;
274
+ const o = le.current, i = ce.current;
275
+ let r = !1;
276
+ for (const A of n) {
277
+ if (A.type !== "attributes") {
278
+ r = !0;
279
+ continue;
280
+ }
281
+ const v = A.target;
282
+ if (!i.has(v)) continue;
283
+ const U = v.getAttribute("tabindex");
284
+ U !== ((l = i.get(v)) != null ? l : null) && (o.set(v, U), r = !0);
285
+ }
286
+ r && W();
287
+ });
288
+ return t.observe(e, {
289
+ childList: !0,
290
+ subtree: !0,
291
+ attributes: !0,
292
+ attributeFilter: ["tabindex"]
293
+ }), () => t.disconnect();
294
+ }, [W]);
295
+ const _e = G ? {} : {
296
+ role: "grid",
297
+ "aria-rowcount": u.length,
298
+ "aria-colcount": 2,
299
+ ...h === void 0 ? {} : { "aria-label": h }
300
+ }, Ae = s.useMemo(() => {
301
+ const e = {};
302
+ k !== void 0 && (e.height = X(k));
303
+ const t = e;
304
+ return t["--smwb-swimlanes-row-height"] = `${g}px`, L !== void 0 && (t["--smwb-swimlanes-header-width"] = X(L)), R !== void 0 && (t["--smwb-swimlanes-content-min-width"] = X(R)), { ...e, ...x };
305
+ }, [k, g, L, R, x]);
306
+ return /* @__PURE__ */ F(
307
+ "div",
308
+ {
309
+ ...fe,
310
+ ref: me,
311
+ "data-testid": de,
312
+ className: ie("smwb-swimlanes", { "smwb-swimlanes_empty": G }, p),
313
+ style: Ae,
314
+ ..._e,
315
+ onScroll: Ee,
316
+ onKeyDown: Re,
317
+ children: G ? (
318
+ // No grid role and no row count: an empty grid has no rows, which fails
319
+ // the role's required children.
320
+ /* @__PURE__ */ F("div", { className: "smwb-swimlanes__empty", children: ae })
321
+ ) : /* @__PURE__ */ F(
322
+ "div",
323
+ {
324
+ className: "smwb-swimlanes__sizer",
325
+ role: "presentation",
326
+ ref: j,
327
+ style: { height: I.totalHeight },
328
+ children: P.map((e) => {
329
+ const t = u[e];
330
+ return t === void 0 ? null : /* @__PURE__ */ F(
331
+ Oe,
332
+ {
333
+ lane: t,
334
+ index: e,
335
+ selected: _ === t.id,
336
+ selectable: M,
337
+ tabCol: S !== null && S.laneId === t.id ? S.col : -1,
338
+ rowHeight: g,
339
+ handlers: Ie
340
+ },
341
+ t.id
342
+ );
343
+ })
344
+ }
345
+ )
346
+ }
347
+ );
348
+ });
349
+ export {
350
+ Ke as SWIMLANES_DEFAULT_HEIGHT,
351
+ De as SWIMLANES_DEFAULT_OVERSCAN,
352
+ ke as SWIMLANES_DEFAULT_ROW_HEIGHT,
353
+ Pe as Swimlanes
354
+ };
355
+ //# sourceMappingURL=swimlanes.js.map