@kerfjs/ui 5.0.0-beta.55 → 5.0.0-beta.56

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 (235) hide show
  1. package/README.md +12 -10
  2. package/ai/compile-time-contracts-v1.json +2 -2
  3. package/ai/component-catalog-v2.json +149 -39
  4. package/ai/component-catalog.json +202 -51
  5. package/ai/public-api-signatures-v1.md +439 -97
  6. package/ai/skill.md +43 -40
  7. package/ai/webawesome-jsx-signatures-v1.md +8 -2
  8. package/dist/app-tab.js +1 -1
  9. package/dist/badge.d.ts +35 -7
  10. package/dist/badge.js +1 -1
  11. package/dist/browser/content-item.js +3 -0
  12. package/dist/browser/select.js +1 -0
  13. package/dist/catalog-resources.d.ts +12 -1
  14. package/dist/catalog.d.ts +14 -3
  15. package/dist/catalog.js +52 -43
  16. package/dist/catalog.js.map +1 -1
  17. package/dist/{chunk-WZ2GLEY4.js → chunk-2G2ZJQYK.js} +2 -14
  18. package/dist/chunk-2G2ZJQYK.js.map +1 -0
  19. package/dist/{chunk-D7GWXIAS.js → chunk-5I7QGQVT.js} +1 -1
  20. package/dist/chunk-5I7QGQVT.js.map +1 -0
  21. package/dist/{chunk-RNRUVPJ3.js → chunk-63ZWBGE3.js} +3 -2
  22. package/dist/chunk-63ZWBGE3.js.map +1 -0
  23. package/dist/{chunk-44IG7PFV.js → chunk-6CINWX2E.js} +3 -3
  24. package/dist/{chunk-44IG7PFV.js.map → chunk-6CINWX2E.js.map} +1 -1
  25. package/dist/{chunk-C2FAYFDE.js → chunk-AGXQQFKZ.js} +2 -2
  26. package/dist/{chunk-C2FAYFDE.js.map → chunk-AGXQQFKZ.js.map} +1 -1
  27. package/dist/{chunk-ATHXW6RP.js → chunk-AHEG27M7.js} +2 -2
  28. package/dist/{chunk-ATHXW6RP.js.map → chunk-AHEG27M7.js.map} +1 -1
  29. package/dist/{chunk-7GUQYHKA.js → chunk-AK67F6QN.js} +4 -1
  30. package/dist/chunk-AK67F6QN.js.map +1 -0
  31. package/dist/chunk-BFPBS5Y4.js +250 -0
  32. package/dist/chunk-BFPBS5Y4.js.map +1 -0
  33. package/dist/{chunk-5OLVUEND.js → chunk-DG6G5EPF.js} +4 -6
  34. package/dist/chunk-DG6G5EPF.js.map +1 -0
  35. package/dist/{chunk-MTM43SJO.js → chunk-G33XC2NB.js} +1 -1
  36. package/dist/chunk-G33XC2NB.js.map +1 -0
  37. package/dist/{chunk-TZ5IHWB2.js → chunk-K6UNVKDK.js} +3 -3
  38. package/dist/{chunk-TZ5IHWB2.js.map → chunk-K6UNVKDK.js.map} +1 -1
  39. package/dist/{chunk-HMQ2ZDGG.js → chunk-KROD7KZK.js} +3 -2
  40. package/dist/chunk-KROD7KZK.js.map +1 -0
  41. package/dist/{chunk-5NDQABWK.js → chunk-M7QV3IHH.js} +3 -1
  42. package/dist/chunk-M7QV3IHH.js.map +1 -0
  43. package/dist/{chunk-RNZAKSME.js → chunk-MA6Z6EIM.js} +3 -3
  44. package/dist/{chunk-RNZAKSME.js.map → chunk-MA6Z6EIM.js.map} +1 -1
  45. package/dist/chunk-MA73TA6D.js +42 -0
  46. package/dist/chunk-MA73TA6D.js.map +1 -0
  47. package/dist/{chunk-ZMBU522F.js → chunk-MEY33VWB.js} +2 -2
  48. package/dist/{chunk-ZMBU522F.js.map → chunk-MEY33VWB.js.map} +1 -1
  49. package/dist/{chunk-T22EM4ET.js → chunk-MOBRFZH3.js} +81 -31
  50. package/dist/chunk-MOBRFZH3.js.map +1 -0
  51. package/dist/chunk-MP2GDBQZ.js +50 -0
  52. package/dist/chunk-MP2GDBQZ.js.map +1 -0
  53. package/dist/{chunk-3NBL3OUQ.js → chunk-NAPE7WUS.js} +2 -2
  54. package/dist/chunk-NAPE7WUS.js.map +1 -0
  55. package/dist/{chunk-BSKEH3UC.js → chunk-NBYTIVHS.js} +2 -2
  56. package/dist/{chunk-BSKEH3UC.js.map → chunk-NBYTIVHS.js.map} +1 -1
  57. package/dist/chunk-O3EXIBEZ.js +114 -0
  58. package/dist/chunk-O3EXIBEZ.js.map +1 -0
  59. package/dist/{chunk-R754MHXX.js → chunk-PK4N5QTO.js} +7 -6
  60. package/dist/chunk-PK4N5QTO.js.map +1 -0
  61. package/dist/{chunk-EAX2GSS4.js → chunk-QQOTQTDD.js} +51 -20
  62. package/dist/chunk-QQOTQTDD.js.map +1 -0
  63. package/dist/{chunk-LZXQVUGN.js → chunk-T4UZTNZ4.js} +4 -4
  64. package/dist/{chunk-LZXQVUGN.js.map → chunk-T4UZTNZ4.js.map} +1 -1
  65. package/dist/{chunk-N7FHFNT6.js → chunk-V65EOWNF.js} +33 -5
  66. package/dist/chunk-V65EOWNF.js.map +1 -0
  67. package/dist/{chunk-GUIHMIT2.js → chunk-VNPQDCQZ.js} +3 -3
  68. package/dist/{chunk-GUIHMIT2.js.map → chunk-VNPQDCQZ.js.map} +1 -1
  69. package/dist/{chunk-5I22LMCV.js → chunk-VZOFZPSO.js} +2 -2
  70. package/dist/chunk-VZOFZPSO.js.map +1 -0
  71. package/dist/{chunk-4BIMLITI.js → chunk-WLG6SSNT.js} +5 -3
  72. package/dist/chunk-WLG6SSNT.js.map +1 -0
  73. package/dist/{chunk-NE5JAOQS.js → chunk-WOUF7YXM.js} +3 -3
  74. package/dist/{chunk-NE5JAOQS.js.map → chunk-WOUF7YXM.js.map} +1 -1
  75. package/dist/collapsible-panel.d.ts +14 -3
  76. package/dist/collapsible-panel.js +13 -16
  77. package/dist/collapsible-panel.js.map +1 -1
  78. package/dist/content-item.d.ts +46 -0
  79. package/dist/content-item.js +4 -0
  80. package/dist/content-item.js.map +1 -0
  81. package/dist/css-values.d.ts +5 -11
  82. package/dist/css-values.js +1 -1
  83. package/dist/disclosure-arrow.d.ts +4 -1
  84. package/dist/disclosure-arrow.js +1 -1
  85. package/dist/floating-toolbar.d.ts +17 -6
  86. package/dist/floating-toolbar.js +1 -1
  87. package/dist/grid.js +1 -1
  88. package/dist/help-tags-register.d.ts +13 -0
  89. package/dist/help-tags-register.js +9 -0
  90. package/dist/help-tags-register.js.map +1 -0
  91. package/dist/index.d.ts +6 -5
  92. package/dist/index.js +27 -26
  93. package/dist/list-action-row.js +1 -1
  94. package/dist/list-header.d.ts +14 -1
  95. package/dist/list-header.js +1 -1
  96. package/dist/list-inset-control.d.ts +1 -1
  97. package/dist/list-inset-control.js +1 -1
  98. package/dist/list-inset-text.d.ts +3 -10
  99. package/dist/list-inset-text.js +1 -1
  100. package/dist/list-item.js +1 -1
  101. package/dist/list.d.ts +10 -3
  102. package/dist/list.js +1 -1
  103. package/dist/nav-stack.d.ts +38 -5
  104. package/dist/nav-stack.js +4 -1
  105. package/dist/pane.d.ts +20 -2
  106. package/dist/pane.js +1 -1
  107. package/dist/{panel-toolbar-BFQxFITu.d.ts → panel-toolbar-C8sF-YZC.d.ts} +12 -1
  108. package/dist/popup-menu-register.js +3 -2
  109. package/dist/popup-menu-register.js.map +1 -1
  110. package/dist/popup-menu.js +1 -1
  111. package/dist/row.d.ts +1 -1
  112. package/dist/row.js +1 -1
  113. package/dist/select-register.js +70 -3
  114. package/dist/select-register.js.map +1 -1
  115. package/dist/select.d.ts +46 -8
  116. package/dist/select.js +2 -1
  117. package/dist/{divider-sides-BzB6rphT.d.ts → sides-BPSWde0A.d.ts} +1 -3
  118. package/dist/skeleton.js +1 -1
  119. package/dist/spacer.js +1 -1
  120. package/dist/split-view.d.ts +31 -3
  121. package/dist/split-view.js +33 -5
  122. package/dist/split-view.js.map +1 -1
  123. package/dist/state-banner.js +1 -1
  124. package/dist/styles/badge.css +13 -0
  125. package/dist/styles/catalog/components/catalog-example.css +1 -1
  126. package/dist/styles/catalog/components/catalog-stage.css +1 -1
  127. package/dist/styles/collapsible-panel.css +192 -39
  128. package/dist/styles/content-item.css +30 -0
  129. package/dist/styles/floating-toolbar.css +5 -0
  130. package/dist/styles/foundation.css +28 -19
  131. package/dist/styles/layout.css +1 -21
  132. package/dist/styles/list-action-row.css +13 -1
  133. package/dist/styles/list-inset-text.css +1 -2
  134. package/dist/styles/list-item.css +14 -1
  135. package/dist/styles/list.css +1 -1
  136. package/dist/styles/nav-stack.css +29 -64
  137. package/dist/styles/pane.css +33 -1
  138. package/dist/styles/popup-menu.css +78 -0
  139. package/dist/styles/resizable-region.css +53 -10
  140. package/dist/styles/select.css +39 -12
  141. package/dist/styles/split-view.css +21 -25
  142. package/dist/styles/tab-scaffold.css +36 -14
  143. package/dist/styles/text.css +1 -1
  144. package/dist/styles/token-search-field.css +4 -4
  145. package/dist/styles/toolbar-control-group.css +31 -12
  146. package/dist/styles/toolbar.css +14 -5
  147. package/dist/styles/value-table.css +19 -2
  148. package/dist/styles/webawesome.css +3 -1
  149. package/dist/styles/workbench.css +134 -31
  150. package/dist/tab-scaffold.d.ts +35 -1
  151. package/dist/tab-scaffold.js +50 -16
  152. package/dist/tab-scaffold.js.map +1 -1
  153. package/dist/token-search-field.d.ts +4 -2
  154. package/dist/token-search-field.js +1 -1
  155. package/dist/toolbar-text.js +1 -1
  156. package/dist/toolbar.d.ts +12 -4
  157. package/dist/toolbar.js +1 -1
  158. package/dist/{types-D6vzj-VT.d.ts → types-DXAGogOS.d.ts} +39 -6
  159. package/dist/value-table.js +1 -1
  160. package/dist/webawesome.d.ts +7 -1
  161. package/dist/wire-catalog.d.ts +12 -1
  162. package/dist/wire-catalog.js +10 -2
  163. package/dist/wire-catalog.js.map +1 -1
  164. package/dist/wire-token-search-fields.js +1 -1
  165. package/dist/workbench.d.ts +59 -22
  166. package/dist/workbench.js +1 -1
  167. package/docs/accessibility.md +116 -7
  168. package/docs/app-layouts.md +9 -7
  169. package/docs/catalog.md +17 -3
  170. package/docs/collapsible-panel.md +26 -7
  171. package/docs/component-contract.md +36 -10
  172. package/docs/component-selection.md +41 -40
  173. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  174. package/docs/design/templates/empty-state/with-action.svg +1 -1
  175. package/docs/design/templates/empty-state-dark.svg +1 -1
  176. package/docs/design/templates/empty-state.svg +1 -1
  177. package/docs/design/templates/list/compact-dark.svg +1 -1
  178. package/docs/design/templates/list/compact.svg +1 -1
  179. package/docs/design/templates/list/stack-dark.svg +1 -1
  180. package/docs/design/templates/list/stack.svg +1 -1
  181. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  182. package/docs/design/templates/list-action-row/default.svg +1 -1
  183. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  184. package/docs/design/templates/list-action-row/selected.svg +1 -1
  185. package/docs/design/templates/list-action-row-dark.svg +1 -1
  186. package/docs/design/templates/list-action-row.svg +1 -1
  187. package/docs/design/templates/list-dark.svg +1 -1
  188. package/docs/design/templates/list-item/default-dark.svg +1 -1
  189. package/docs/design/templates/list-item/default.svg +1 -1
  190. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  191. package/docs/design/templates/list-item/selected.svg +1 -1
  192. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  193. package/docs/design/templates/list-item/trailing.svg +1 -1
  194. package/docs/design/templates/list-item-dark.svg +1 -1
  195. package/docs/design/templates/list-item.svg +1 -1
  196. package/docs/design/templates/list.svg +1 -1
  197. package/docs/design/templates/value-table/details-dark.svg +1 -1
  198. package/docs/design/templates/value-table/details.svg +1 -1
  199. package/docs/design/templates/value-table-dark.svg +1 -1
  200. package/docs/design/templates/value-table.svg +1 -1
  201. package/docs/design-philosophy.md +1 -1
  202. package/docs/examples/command-palette-adapter.tsx +3 -2
  203. package/docs/layout.md +69 -29
  204. package/docs/nav-stack.md +45 -1
  205. package/docs/recipes.md +4 -3
  206. package/docs/split-view.md +46 -2
  207. package/docs/tab-scaffold.md +50 -1
  208. package/docs/type-contracts.md +17 -17
  209. package/docs/ux-demo.md +2 -2
  210. package/docs/webawesome-theme.md +1 -2
  211. package/docs/workbench.md +45 -9
  212. package/llms.txt +32 -4
  213. package/package.json +13 -2
  214. package/ux-demo/recipes/collapsible-sidebar.tsx +3 -2
  215. package/ux-demo/recipes/navigation-sidebar.tsx +3 -2
  216. package/ux-demo/recipes/navigation-stack.tsx +3 -2
  217. package/dist/chunk-3NBL3OUQ.js.map +0 -1
  218. package/dist/chunk-4BIMLITI.js.map +0 -1
  219. package/dist/chunk-5I22LMCV.js.map +0 -1
  220. package/dist/chunk-5NDQABWK.js.map +0 -1
  221. package/dist/chunk-5OLVUEND.js.map +0 -1
  222. package/dist/chunk-7GUQYHKA.js.map +0 -1
  223. package/dist/chunk-D7GWXIAS.js.map +0 -1
  224. package/dist/chunk-DQA5FMOX.js +0 -85
  225. package/dist/chunk-DQA5FMOX.js.map +0 -1
  226. package/dist/chunk-EAX2GSS4.js.map +0 -1
  227. package/dist/chunk-HMQ2ZDGG.js.map +0 -1
  228. package/dist/chunk-MTM43SJO.js.map +0 -1
  229. package/dist/chunk-N7FHFNT6.js.map +0 -1
  230. package/dist/chunk-R754MHXX.js.map +0 -1
  231. package/dist/chunk-RNRUVPJ3.js.map +0 -1
  232. package/dist/chunk-T22EM4ET.js.map +0 -1
  233. package/dist/chunk-WZ2GLEY4.js.map +0 -1
  234. package/dist/chunk-XD7DWYXG.js +0 -34
  235. package/dist/chunk-XD7DWYXG.js.map +0 -1
@@ -0,0 +1,42 @@
1
+ import { filterDataAttributes } from './chunk-SRSJO5QE.js';
2
+ import { jsx } from 'kerfjs/jsx-runtime';
3
+
4
+ var contentItemProtectedAttributes = /* @__PURE__ */ new Set(["data-component"]);
5
+ function ContentItem({
6
+ children,
7
+ frame = "none",
8
+ shape = "rounded",
9
+ ariaLabel,
10
+ focusTarget = false,
11
+ className = "",
12
+ rootAttributes = {},
13
+ slot
14
+ }) {
15
+ const safeRootAttributes = filterDataAttributes(
16
+ rootAttributes,
17
+ contentItemProtectedAttributes
18
+ );
19
+ const cls = [
20
+ "kui-content-item",
21
+ shape === "pill" ? "kui-content-item--pill" : "",
22
+ frame === "framed" ? "kui-content-item--framed" : "",
23
+ className
24
+ ].filter(Boolean).join(" ");
25
+ return /* @__PURE__ */ jsx(
26
+ "div",
27
+ {
28
+ ...safeRootAttributes,
29
+ class: cls,
30
+ "data-component": "content-item",
31
+ role: ariaLabel ? "region" : void 0,
32
+ "aria-label": ariaLabel,
33
+ tabindex: focusTarget ? "-1" : void 0,
34
+ slot,
35
+ children
36
+ }
37
+ );
38
+ }
39
+
40
+ export { ContentItem };
41
+
42
+ //# sourceMappingURL=chunk-MA73TA6D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/content-item.tsx"],"names":[],"mappings":";;;AASA,IAAM,8BAAA,mBAAiC,IAAI,GAAA,CAAI,CAAC,gBAAgB,CAAC,CAAA;AA0C1D,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR,KAAA,GAAQ,SAAA;AAAA,EACR,SAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,kBAAA,GAAqB,oBAAA;AAAA,IACzB,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,kBAAA;AAAA,IACA,KAAA,KAAU,SAAS,wBAAA,GAA2B,EAAA;AAAA,IAC9C,KAAA,KAAU,WAAW,0BAAA,GAA6B,EAAA;AAAA,IAClD;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,kBAAA;AAAA,MACJ,KAAA,EAAO,GAAA;AAAA,MACP,gBAAA,EAAe,cAAA;AAAA,MACf,IAAA,EAAM,YAAY,QAAA,GAAW,MAAA;AAAA,MAC7B,YAAA,EAAY,SAAA;AAAA,MACZ,QAAA,EAAU,cAAc,IAAA,GAAO,MAAA;AAAA,MAC/B,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-MA73TA6D.js","sourcesContent":["import { filterDataAttributes } from './extension-attributes.js';\nimport type { KerfUiContent } from './semantic-content.js';\n\n/** Whether the item's always-reserved 1px border is transparent or visible. */\nexport type ContentItemFrame = 'none' | 'framed';\n\n/** Corner shape: the 12px rounded rectangle or the 22px pill. */\nexport type ContentItemShape = 'rounded' | 'pill';\n\nconst contentItemProtectedAttributes = new Set(['data-component']);\n\ntype ContentItemRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n }\n>;\n\nexport interface ContentItemProps {\n /** Item content; a plain string is allowed for bare copy. */\n children?: KerfUiContent | string;\n /**\n * `framed` paints the standard neutral border in the 1px the item always\n * reserves, so framing never changes geometry. Frame only an item that\n * marks a real distinction. Defaults to `none` (transparent border).\n */\n frame?: ContentItemFrame;\n /** Corner shape. Defaults to `rounded`. */\n shape?: ContentItemShape;\n /**\n * Names the item as a distinct region (`role=\"region\"`). Omit it for an\n * ordinary item, which stays a non-landmark grouping.\n */\n ariaLabel?: string;\n /**\n * Makes the item a programmatic focus target (`tabindex=\"-1\"`, never a tab\n * stop), for example the preferred initial focus of a NavStack view when\n * combined with `data-nav-focus` in `rootAttributes`.\n */\n focusTarget?: boolean;\n className?: string;\n /** Safe `data-*` metadata; component-owned structural attributes stay protected. */\n rootAttributes?: ContentItemRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * One self-contained `.kui-content` child: an 8px inline margin, a real 1px\n * border (transparent unless `framed`), 8px padding, and a rounded or pill\n * radius. It owns that whole geometry, so wrappers must not add more.\n */\nexport function ContentItem({\n children,\n frame = 'none',\n shape = 'rounded',\n ariaLabel,\n focusTarget = false,\n className = '',\n rootAttributes = {},\n slot,\n}: ContentItemProps) {\n const safeRootAttributes = filterDataAttributes(\n rootAttributes,\n contentItemProtectedAttributes,\n );\n const cls = [\n 'kui-content-item',\n shape === 'pill' ? 'kui-content-item--pill' : '',\n frame === 'framed' ? 'kui-content-item--framed' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <div\n {...safeRootAttributes}\n class={cls}\n data-component=\"content-item\"\n role={ariaLabel ? 'region' : undefined}\n aria-label={ariaLabel}\n tabindex={focusTarget ? '-1' : undefined}\n slot={slot}\n >\n {children}\n </div>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { space } from './chunk-WZ2GLEY4.js';
1
+ import { space } from './chunk-2G2ZJQYK.js';
2
2
  import { jsx } from 'kerfjs/jsx-runtime';
3
3
 
4
4
  var spaceNames = [
@@ -41,4 +41,4 @@ function Spacer({
41
41
 
42
42
  export { Spacer };
43
43
 
44
- //# sourceMappingURL=chunk-ZMBU522F.js.map
44
+ //# sourceMappingURL=chunk-MEY33VWB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/spacer.tsx"],"names":[],"mappings":";;;AAEA,IAAM,UAAA,GAAqC;AAAA,EACzC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA;AAcA,SAAS,UAAU,KAAA,EAAwD;AACzE,EAAA,OAAO,WAAW,QAAA,CAAS,KAAoB,CAAA,GAC3C,KAAA,CAAM,KAAoB,CAAA,GACzB,KAAA;AACP;AAGO,SAAS,MAAA,CAAO;AAAA,EACrB,IAAA,GAAO,KAAA;AAAA,EACP,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,UAAA,GAAa,UAAU,KAAK,CAAA;AAClC,EAAA,MAAM,WAAA,GAAc,UAAU,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,UAAA,GAAa,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,GAAK,EAAA;AAAA,IACrC,WAAA,GAAc,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA,GAAK;AAAA,GAC1C,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACtC,gBAAA,EAAe,QAAA;AAAA,MACf,WAAA,EAAW,OAAO,IAAI,CAAA;AAAA,MACtB,aAAA,EAAY,MAAA;AAAA,MACZ,OAAO,KAAA,IAAS,MAAA;AAAA,MAChB;AAAA;AAAA,GACD;AAEL","file":"chunk-ZMBU522F.js","sourcesContent":["import { type CssLength, space, type UiSpaceName } from './css-values.js';\n\nconst spaceNames: readonly UiSpaceName[] = [\n 'none',\n '2xs',\n 'xs',\n 's',\n 'm',\n 'l',\n 'xl',\n];\n\nexport interface SpacerProps {\n /** Grow and shrink to fill the available space along a parent's flex axis. */\n flex?: boolean;\n /** A named UI spacing token or typed physical width. */\n width?: UiSpaceName | CssLength;\n /** A named UI spacing token or typed physical height. */\n height?: UiSpaceName | CssLength;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nfunction dimension(value?: UiSpaceName | CssLength): CssLength | undefined {\n return spaceNames.includes(value as UiSpaceName)\n ? space(value as UiSpaceName)\n : (value as CssLength | undefined);\n}\n\n/** A decorative fixed-size or flexible gap for Row, List, and other flex layouts. */\nexport function Spacer({\n flex = false,\n width,\n height,\n className = '',\n slot,\n}: SpacerProps) {\n const widthValue = dimension(width);\n const heightValue = dimension(height);\n const style = [\n widthValue ? `width:${widthValue}` : '',\n heightValue ? `height:${heightValue}` : '',\n ]\n .filter(Boolean)\n .join(';');\n\n return (\n <div\n class={`kui-spacer ${className}`.trim()}\n data-component=\"spacer\"\n data-flex={String(flex)}\n aria-hidden=\"true\"\n style={style || undefined}\n slot={slot}\n ></div>\n );\n}\n\nexport type { CssLength, UiSpaceName } from './css-values.js';\n"]}
1
+ {"version":3,"sources":["../src/spacer.tsx"],"names":[],"mappings":";;;AAEA,IAAM,UAAA,GAAqC;AAAA,EACzC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA;AAcA,SAAS,UAAU,KAAA,EAAwD;AACzE,EAAA,OAAO,WAAW,QAAA,CAAS,KAAoB,CAAA,GAC3C,KAAA,CAAM,KAAoB,CAAA,GACzB,KAAA;AACP;AAGO,SAAS,MAAA,CAAO;AAAA,EACrB,IAAA,GAAO,KAAA;AAAA,EACP,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAAgB;AACd,EAAA,MAAM,UAAA,GAAa,UAAU,KAAK,CAAA;AAClC,EAAA,MAAM,WAAA,GAAc,UAAU,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,UAAA,GAAa,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,GAAK,EAAA;AAAA,IACrC,WAAA,GAAc,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA,GAAK;AAAA,GAC1C,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACtC,gBAAA,EAAe,QAAA;AAAA,MACf,WAAA,EAAW,OAAO,IAAI,CAAA;AAAA,MACtB,aAAA,EAAY,MAAA;AAAA,MACZ,OAAO,KAAA,IAAS,MAAA;AAAA,MAChB;AAAA;AAAA,GACD;AAEL","file":"chunk-MEY33VWB.js","sourcesContent":["import { type CssLength, space, type UiSpaceName } from './css-values.js';\n\nconst spaceNames: readonly UiSpaceName[] = [\n 'none',\n '2xs',\n 'xs',\n 's',\n 'm',\n 'l',\n 'xl',\n];\n\nexport interface SpacerProps {\n /** Grow and shrink to fill the available space along a parent's flex axis. */\n flex?: boolean;\n /** A named UI spacing token or typed physical width. */\n width?: UiSpaceName | CssLength;\n /** A named UI spacing token or typed physical height. */\n height?: UiSpaceName | CssLength;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nfunction dimension(value?: UiSpaceName | CssLength): CssLength | undefined {\n return spaceNames.includes(value as UiSpaceName)\n ? space(value as UiSpaceName)\n : (value as CssLength | undefined);\n}\n\n/** A decorative fixed-size or flexible gap for Row, List, and other flex layouts. */\nexport function Spacer({\n flex = false,\n width,\n height,\n className = '',\n slot,\n}: SpacerProps) {\n const widthValue = dimension(width);\n const heightValue = dimension(height);\n const style = [\n widthValue ? `width:${widthValue}` : '',\n heightValue ? `height:${heightValue}` : '',\n ]\n .filter(Boolean)\n .join(';');\n\n return (\n <div\n class={`kui-spacer ${className}`.trim()}\n data-component=\"spacer\"\n data-flex={String(flex)}\n aria-hidden=\"true\"\n style={style || undefined}\n slot={slot}\n ></div>\n );\n}\n\nexport type { CssLength, UiSpaceName } from './css-values.js';\n"]}
@@ -1,31 +1,36 @@
1
- import { Skeleton } from './chunk-ATHXW6RP.js';
2
- import { em } from './chunk-WZ2GLEY4.js';
1
+ import { Skeleton } from './chunk-AHEG27M7.js';
2
+ import { Badge } from './chunk-MP2GDBQZ.js';
3
3
  import { LucideIcon } from './chunk-4R777DUZ.js';
4
+ import { em } from './chunk-2G2ZJQYK.js';
4
5
  import { jsxs, jsx, Fragment } from 'kerfjs/jsx-runtime';
5
6
 
6
7
  function SelectChevron() {
7
8
  return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 448 512", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z" }) });
8
9
  }
9
- function Select({
10
- name,
11
- value,
12
- label,
13
- ariaLabel,
14
- choices,
15
- className = "",
16
- placeholderText,
17
- hint,
18
- disabled = false,
19
- fitMenu = false,
20
- renderSelected,
21
- placeholder = false,
22
- presentation = "form",
23
- size = "default",
24
- selectedPresentation = "label",
25
- focusRingOwner = "select",
26
- labelMaxWidth,
27
- slot
28
- }) {
10
+ function Select(props) {
11
+ const {
12
+ name,
13
+ label,
14
+ ariaLabel,
15
+ choices,
16
+ className = "",
17
+ placeholderText,
18
+ hint,
19
+ disabled = false,
20
+ fitMenu = false,
21
+ placeholder = false,
22
+ presentation = "form",
23
+ size = "default",
24
+ focusRingOwner = "select",
25
+ labelMaxWidth,
26
+ slot
27
+ } = props;
28
+ const multiple = props.multiple === true;
29
+ const values = props.multiple ? props.value : [props.value];
30
+ const renderSelected = props.multiple ? void 0 : props.renderSelected;
31
+ const selectedPresentation = props.selectedPresentation ?? "label";
32
+ const iconTrigger = props.multiple && props.selectedPresentation === "icon-only";
33
+ const triggerIcon = iconTrigger ? props.triggerIcon : void 0;
29
34
  if (placeholder) {
30
35
  return /* @__PURE__ */ jsxs(
31
36
  "div",
@@ -59,7 +64,8 @@ function Select({
59
64
  }
60
65
  );
61
66
  }
62
- const selected = choices.find((choice) => choice.value === value);
67
+ const selected = multiple ? void 0 : choices.find((choice) => choice.value === values[0]);
68
+ const chosenCount = iconTrigger ? choices.filter((choice) => values.includes(choice.value)).length : 0;
63
69
  const icon = (choice, selectedIcon = false) => /* @__PURE__ */ jsx(
64
70
  "span",
65
71
  {
@@ -78,11 +84,25 @@ function Select({
78
84
  }
79
85
  );
80
86
  const option = (choice, index) => /* @__PURE__ */ jsxs(Fragment, { children: [
81
- choice.separatorBefore && index > 0 && /* @__PURE__ */ jsx("wa-divider", {}),
82
- /* @__PURE__ */ jsxs("wa-option", { value: choice.value, children: [
83
- choice.icon ? icon(choice) : null,
84
- choice.label
85
- ] })
87
+ choice.separatorBefore && index > 0 && /* @__PURE__ */ jsx(
88
+ "wa-divider",
89
+ {
90
+ orientation: "horizontal",
91
+ role: "separator",
92
+ "aria-orientation": "horizontal"
93
+ }
94
+ ),
95
+ /* @__PURE__ */ jsxs(
96
+ "wa-option",
97
+ {
98
+ value: choice.value,
99
+ selected: multiple && values.includes(choice.value),
100
+ children: [
101
+ choice.icon ? icon(choice) : null,
102
+ choice.label
103
+ ]
104
+ }
105
+ )
86
106
  ] });
87
107
  const groups = [
88
108
  ...new Set(
@@ -93,6 +113,9 @@ function Select({
93
113
  return /* @__PURE__ */ jsxs(
94
114
  "wa-select",
95
115
  {
116
+ size: "m",
117
+ appearance: "outlined",
118
+ placement: "bottom",
96
119
  class: `kui-select${renderSelected ? " kui-select--custom-selected" : ""}${fitMenu ? " kui-select--fit-menu" : ""}${!label ? " kui-select--label-hidden" : ""} ${className}`.trim(),
97
120
  "data-component": "select",
98
121
  "data-presentation": presentation,
@@ -102,17 +125,44 @@ function Select({
102
125
  name,
103
126
  label: label || ariaLabel,
104
127
  "aria-label": ariaLabel,
105
- value,
128
+ multiple,
129
+ value: multiple ? void 0 : values[0],
106
130
  placeholder: placeholderText,
107
131
  hint,
108
132
  disabled,
109
133
  style: labelMaxWidth === void 0 ? void 0 : `--kui-select-label-max-width:${labelMaxWidth}px`,
110
134
  slot,
111
135
  children: [
136
+ iconTrigger && /* @__PURE__ */ jsxs(Fragment, { children: [
137
+ /* @__PURE__ */ jsxs("span", { slot: "label", "data-key": `${name}:trigger-label`, children: [
138
+ label || ariaLabel,
139
+ /* @__PURE__ */ jsx("span", { class: "kui-select__name-summary", "data-morph-skip": true })
140
+ ] }),
141
+ /* @__PURE__ */ jsx(
142
+ "span",
143
+ {
144
+ "data-key": `${name}:trigger-icon`,
145
+ slot: "start",
146
+ class: "kui-select__icon kui-select__icon--selected kui-select__trigger-icon",
147
+ children: triggerIcon
148
+ }
149
+ ),
150
+ chosenCount > 0 && /* @__PURE__ */ jsx(
151
+ Badge,
152
+ {
153
+ slot: "end",
154
+ className: "kui-select__count",
155
+ tone: "brand",
156
+ size: "compact",
157
+ ariaHidden: true,
158
+ children: chosenCount
159
+ }
160
+ )
161
+ ] }),
112
162
  selected && (renderSelected ? /* @__PURE__ */ jsx(
113
163
  "span",
114
164
  {
115
- "data-key": `${name}:${value}:custom-selected`,
165
+ "data-key": `${name}:${values[0]}:custom-selected`,
116
166
  slot: "start",
117
167
  class: "kui-select__custom-selected",
118
168
  children: renderSelected(selected)
@@ -138,4 +188,4 @@ function Select({
138
188
 
139
189
  export { Select };
140
190
 
141
- //# sourceMappingURL=chunk-T22EM4ET.js.map
191
+ //# sourceMappingURL=chunk-MOBRFZH3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/select.tsx"],"names":[],"mappings":"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","file":"chunk-MOBRFZH3.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { Badge } from './badge.js';\nimport { type CssForegroundColor, em } from './css-values.js';\nimport { LucideIcon, type LucideNode } from './lucide-icon.js';\nimport type { KerfUiContent } from './semantic-content.js';\nimport { Skeleton } from './skeleton.js';\n\nexport interface SelectChoice<Value extends string = string> {\n value: Value;\n label: string;\n icon?: LucideNode;\n iconName?: string;\n /**\n * Foreground color for the optional icon: a semantic foreground token such\n * as `uiColor('success-on-quiet')`, or an application-owned\n * `foregroundColorVar('--app-icon-color')`. Fill tokens such as\n * `uiColor('success-fill-quiet')` are pale background tints and do not\n * type-check.\n */\n color?: CssForegroundColor;\n group?: string;\n /**\n * Draw a divider between this choice and the previous choice in the same\n * list. A group boundary is already a separator, so the first choice of a\n * group (or of the whole menu) never draws a second one.\n */\n separatorBefore?: boolean;\n}\n\ntype SelectAccessibleName =\n { label: string; ariaLabel?: string } | { label?: never; ariaLabel: string };\n\nexport type SelectPresentation = 'form' | 'toolbar-borderless' | 'navigation';\nexport type SelectSize = 'default' | 'compact';\nexport type SelectSelectedPresentation = 'label' | 'icon-only';\nexport type SelectFocusRingOwner = 'select' | 'group';\n\ninterface SelectBaseProps<Value extends string = string> {\n name: string;\n choices: readonly SelectChoice<Value>[];\n className?: string;\n /** Empty-value hint text shown in the closed control (the native select placeholder). */\n placeholderText?: string;\n /** Supporting text shown below the control and associated with its combobox. */\n hint?: string;\n disabled?: boolean;\n fitMenu?: boolean;\n /** Render as an unanimated loading skeleton: the label above a static, empty control box. */\n placeholder?: boolean;\n /** Form (default), borderless toolbar, or intrinsic navigation chrome. */\n presentation?: SelectPresentation;\n size?: SelectSize;\n /** Let an enclosing ToolbarControlGroup paint the composed focus ring. */\n focusRingOwner?: SelectFocusRingOwner;\n /** Maximum closed-control label width in CSS pixels before ellipsis. */\n labelMaxWidth?: number;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** One chosen value (the default). */\nexport interface SelectSingleValueProps<Value extends string = string> {\n multiple?: false;\n value: NoInfer<Value>;\n renderSelected?: (choice: SelectChoice<Value>) => SafeHtml;\n /** Show only the selected choice icon while retaining the Select's accessible name. */\n selectedPresentation?: SelectSelectedPresentation;\n triggerIcon?: never;\n}\n\n/**\n * Any number of chosen values. The popup stays open while the person toggles\n * choices and closes on an outside click, Escape, or focus leaving; the closed\n * control summarizes the chosen labels in choice order.\n */\nexport interface SelectMultipleLabelProps<Value extends string = string> {\n multiple: true;\n value: readonly NoInfer<Value>[];\n renderSelected?: never;\n selectedPresentation?: 'label';\n triggerIcon?: never;\n}\n\n/**\n * A multiple Select drawn as an icon-only toolbar trigger, such as a\n * \"Filter by label\" funnel. No single choice is selected, so the trigger shows\n * a fixed `triggerIcon` naming the menu's purpose; while any choice is chosen\n * a count badge sits beside it, and the combobox's accessible name ends with\n * the chosen labels in choice order.\n */\nexport interface SelectMultipleIconProps<Value extends string = string> {\n multiple: true;\n value: readonly NoInfer<Value>[];\n renderSelected?: never;\n selectedPresentation: 'icon-only';\n /**\n * The trigger's fixed icon, typically a `LucideIcon` naming the menu's\n * purpose (a funnel for a filter), independent of the selection.\n */\n triggerIcon: KerfUiContent;\n}\n\nexport type SelectMultipleValueProps<Value extends string = string> =\n SelectMultipleLabelProps<Value> | SelectMultipleIconProps<Value>;\n\nexport type SelectProps<Value extends string = string> =\n SelectBaseProps<Value> &\n SelectAccessibleName &\n (SelectSingleValueProps<Value> | SelectMultipleValueProps<Value>);\n\n// The closed wa-select's disclosure glyph: Web Awesome's system `chevron-down`,\n// Font Awesome Free 7.0.0 by @fontawesome (https://fontawesome.com), licensed\n// CC BY 4.0 (https://fontawesome.com/license/free). The placeholder draws the\n// same path so the loading box matches the live control without registering\n// Web Awesome.\nfunction SelectChevron() {\n return (\n <svg viewBox=\"0 0 448 512\" aria-hidden=\"true\">\n <path d=\"M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"></path>\n </svg>\n );\n}\n\nexport function Select<Value extends string>(props: SelectProps<Value>) {\n const {\n name,\n label,\n ariaLabel,\n choices,\n className = '',\n placeholderText,\n hint,\n disabled = false,\n fitMenu = false,\n placeholder = false,\n presentation = 'form',\n size = 'default',\n focusRingOwner = 'select',\n labelMaxWidth,\n slot,\n } = props;\n const multiple = props.multiple === true;\n const values: readonly Value[] = props.multiple ? props.value : [props.value];\n const renderSelected = props.multiple ? undefined : props.renderSelected;\n const selectedPresentation: SelectSelectedPresentation =\n props.selectedPresentation ?? 'label';\n // A multiple icon-only trigger shows a fixed icon naming the menu's\n // purpose instead of a selected choice's icon.\n const iconTrigger =\n props.multiple && props.selectedPresentation === 'icon-only';\n const triggerIcon = iconTrigger ? props.triggerIcon : undefined;\n if (placeholder) {\n return (\n <div\n class={`kui-select kui-select--placeholder ${className}`.trim()}\n data-component=\"select\"\n data-placeholder=\"true\"\n data-presentation={presentation}\n data-size={size}\n data-selected-presentation={selectedPresentation}\n data-focus-ring-owner={focusRingOwner}\n aria-busy=\"true\"\n style={\n labelMaxWidth === undefined\n ? undefined\n : `--kui-select-label-max-width:${labelMaxWidth}px`\n }\n slot={slot}\n >\n {label && <span class=\"kui-select__placeholder-label\">{label}</span>}\n <span\n class=\"kui-select__placeholder-box\"\n aria-label={ariaLabel}\n role=\"img\"\n >\n <Skeleton width={em(10)} />\n <span class=\"kui-select__placeholder-chevron\" aria-hidden=\"true\">\n <SelectChevron />\n </span>\n </span>\n {hint && <span class=\"kui-select__placeholder-hint\">{hint}</span>}\n </div>\n );\n }\n // A multiple Select summarizes its choices in the display text instead of\n // leading with one selected icon.\n const selected = multiple\n ? undefined\n : choices.find((choice) => choice.value === values[0]);\n const chosenCount = iconTrigger\n ? choices.filter((choice) => values.includes(choice.value)).length\n : 0;\n const icon = (choice: SelectChoice<Value>, selectedIcon = false) => (\n <span\n data-key={`${name}:${choice.value}:${selectedIcon ? 'selected' : 'option'}`}\n data-morph-skip\n slot=\"start\"\n class={`kui-select__icon${selectedIcon ? ' kui-select__icon--selected' : ''}`}\n style={choice.color ? `color:${choice.color}` : undefined}\n >\n {choice.icon ? (\n <LucideIcon\n icon={choice.icon}\n name={\n choice.iconName ?? choice.label.toLowerCase().replaceAll(' ', '-')\n }\n />\n ) : null}\n </span>\n );\n const option = (choice: SelectChoice<Value>, index: number) => (\n <>\n {/* Web Awesome sets the divider's role and aria-orientation on its\n host once, so a template that omits them would lose them to the\n next kerf re-render's morph for good. Render them explicitly, with\n the orientation it reflects (see the wa-select note below). */}\n {choice.separatorBefore && index > 0 && (\n <wa-divider\n orientation=\"horizontal\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n ></wa-divider>\n )}\n <wa-option\n value={choice.value}\n selected={multiple && values.includes(choice.value)}\n >\n {choice.icon ? icon(choice) : null}\n {choice.label}\n </wa-option>\n </>\n );\n const groups = [\n ...new Set(\n choices\n .map((choice) => choice.group)\n .filter((group): group is string => Boolean(group)),\n ),\n ];\n const ungrouped = choices.filter((choice) => !choice.group);\n // Web Awesome names its shadow combobox from the label, not the host's\n // aria-label. Keep ariaLabel-only names available without visible chrome.\n // A multiple Select's value is its selected options (the value attribute\n // holds only one string), kept in sync by @kerfjs/ui/select/register.\n // size/appearance/placement are Web Awesome's defaults, which it reflects\n // onto the host; rendering them keeps a re-render's morph from stripping\n // them and forcing a Lit update to put them back.\n return (\n <wa-select\n size=\"m\"\n appearance=\"outlined\"\n placement=\"bottom\"\n class={`kui-select${renderSelected ? ' kui-select--custom-selected' : ''}${fitMenu ? ' kui-select--fit-menu' : ''}${!label ? ' kui-select--label-hidden' : ''} ${className}`.trim()}\n data-component=\"select\"\n data-presentation={presentation}\n data-size={size}\n data-selected-presentation={selectedPresentation}\n data-focus-ring-owner={focusRingOwner}\n name={name}\n label={label || ariaLabel}\n aria-label={ariaLabel}\n multiple={multiple}\n value={multiple ? undefined : values[0]}\n placeholder={placeholderText}\n hint={hint}\n disabled={disabled}\n style={\n labelMaxWidth === undefined\n ? undefined\n : `--kui-select-label-max-width:${labelMaxWidth}px`\n }\n slot={slot}\n >\n {iconTrigger && (\n <>\n {/* The accessible name ends with the chosen labels, which\n @kerfjs/ui/select/register writes into the summary. */}\n <span slot=\"label\" data-key={`${name}:trigger-label`}>\n {label || ariaLabel}\n <span class=\"kui-select__name-summary\" data-morph-skip></span>\n </span>\n <span\n data-key={`${name}:trigger-icon`}\n slot=\"start\"\n class=\"kui-select__icon kui-select__icon--selected kui-select__trigger-icon\"\n >\n {triggerIcon}\n </span>\n {chosenCount > 0 && (\n <Badge\n slot=\"end\"\n className=\"kui-select__count\"\n tone=\"brand\"\n size=\"compact\"\n ariaHidden\n >\n {chosenCount}\n </Badge>\n )}\n </>\n )}\n {selected &&\n (renderSelected ? (\n <span\n data-key={`${name}:${values[0]}:custom-selected`}\n slot=\"start\"\n class=\"kui-select__custom-selected\"\n >\n {renderSelected(selected)}\n </span>\n ) : selected.icon ? (\n icon(selected, true)\n ) : null)}\n {ungrouped.map(option)}\n {groups.map((group, index) => (\n <div\n class={`kui-select__group${index > 0 || ungrouped.length > 0 ? ' kui-select__group--separated' : ''}`}\n role=\"group\"\n aria-label={group}\n >\n <span class=\"kui-select__group-title\">{group}</span>\n {choices.filter((choice) => choice.group === group).map(option)}\n </div>\n ))}\n </wa-select>\n );\n}\n"]}
@@ -0,0 +1,50 @@
1
+ import { jsx } from 'kerfjs/jsx-runtime';
2
+
3
+ // src/badge.tsx
4
+ function Badge(props) {
5
+ const { tone = "neutral", className = "", slot } = props;
6
+ if (props.size === "dot") {
7
+ const label2 = props.ariaHidden ? void 0 : props.label?.trim();
8
+ return /* @__PURE__ */ jsx(
9
+ "span",
10
+ {
11
+ class: `kui-badge ${className}`.trim(),
12
+ "data-component": "badge",
13
+ "data-tone": tone,
14
+ "data-appearance": "solid",
15
+ "data-size": "dot",
16
+ role: label2 ? "img" : void 0,
17
+ "aria-label": label2 || void 0,
18
+ "aria-hidden": label2 ? void 0 : "true",
19
+ slot
20
+ }
21
+ );
22
+ }
23
+ const {
24
+ children,
25
+ appearance = "quiet",
26
+ shape = "pill",
27
+ size = "default",
28
+ label,
29
+ ariaHidden = false
30
+ } = props;
31
+ return /* @__PURE__ */ jsx(
32
+ "span",
33
+ {
34
+ class: `kui-badge ${className}`.trim(),
35
+ "data-component": "badge",
36
+ "data-tone": tone,
37
+ "data-appearance": appearance,
38
+ "data-shape": shape,
39
+ "data-size": size,
40
+ "aria-label": ariaHidden ? void 0 : label,
41
+ "aria-hidden": ariaHidden ? "true" : void 0,
42
+ slot,
43
+ children
44
+ }
45
+ );
46
+ }
47
+
48
+ export { Badge };
49
+
50
+ //# sourceMappingURL=chunk-MP2GDBQZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/badge.tsx"],"names":["label"],"mappings":";;;AAyDO,SAAS,MAAM,KAAA,EAAmB;AACvC,EAAA,MAAM,EAAE,IAAA,GAAO,SAAA,EAAW,SAAA,GAAY,EAAA,EAAI,MAAK,GAAI,KAAA;AACnD,EAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AAExB,IAAA,MAAMA,SAAQ,KAAA,CAAM,UAAA,GAAa,MAAA,GAAY,KAAA,CAAM,OAAO,IAAA,EAAK;AAC/D,IAAA,uBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,QACrC,gBAAA,EAAe,OAAA;AAAA,QACf,WAAA,EAAW,IAAA;AAAA,QACX,iBAAA,EAAgB,OAAA;AAAA,QAChB,WAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAMA,SAAQ,KAAA,GAAQ,MAAA;AAAA,QACtB,cAAYA,MAAAA,IAAS,MAAA;AAAA,QACrB,aAAA,EAAaA,SAAQ,MAAA,GAAY,MAAA;AAAA,QACjC;AAAA;AAAA,KACD;AAAA,EAEL;AACA,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,UAAA,GAAa,OAAA;AAAA,IACb,KAAA,GAAQ,MAAA;AAAA,IACR,IAAA,GAAO,SAAA;AAAA,IACP,KAAA;AAAA,IACA,UAAA,GAAa;AAAA,GACf,GAAI,KAAA;AACJ,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACrC,gBAAA,EAAe,OAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,iBAAA,EAAiB,UAAA;AAAA,MACjB,YAAA,EAAY,KAAA;AAAA,MACZ,WAAA,EAAW,IAAA;AAAA,MACX,YAAA,EAAY,aAAa,MAAA,GAAY,KAAA;AAAA,MACrC,aAAA,EAAa,aAAa,MAAA,GAAS,MAAA;AAAA,MACnC,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-MP2GDBQZ.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nexport type BadgeTone =\n 'neutral' | 'brand' | 'pop' | 'success' | 'warning' | 'danger';\nexport type BadgeAppearance = 'quiet' | 'solid' | 'outline';\nexport type BadgeShape = 'pill' | 'rounded';\n/** Size of a text badge. A text-free dot is the separate `size: 'dot'` form. */\nexport type BadgeSize = 'compact' | 'default';\n\ninterface BadgeCommonProps {\n tone?: BadgeTone;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** A badge that shows a short status, count, or category as visible text. */\nexport interface BadgeTextProps extends BadgeCommonProps {\n children: SafeHtml | string | number;\n appearance?: BadgeAppearance;\n shape?: BadgeShape;\n size?: BadgeSize;\n /** Optional accessible name when the visible content is abbreviated. */\n label?: string;\n /** Hide a repeated visual badge from assistive technology. */\n ariaHidden?: boolean;\n}\n\n/** A labeled dot, announced as an image with its own accessible name. */\ninterface BadgeDotLabeled {\n /** Accessible name for the dot, for example `\"New activity\"`. */\n label: string;\n ariaHidden?: false;\n}\n\n/** A decorative dot whose meaning the owning component already announces. */\ninterface BadgeDotDecorative {\n label?: never;\n ariaHidden: true;\n}\n\n/**\n * A text-free status dot (the iOS \"new content\" dot): a small solid circle in\n * the badge's tone. It has no visible text, so it must either carry its own\n * accessible `label` (exposed as an image) or be `ariaHidden` because the\n * surrounding component already folds its meaning into an accessible name.\n */\nexport type BadgeDotProps = BadgeCommonProps & {\n size: 'dot';\n children?: never;\n appearance?: never;\n shape?: never;\n} & (BadgeDotLabeled | BadgeDotDecorative);\n\nexport type BadgeProps = BadgeTextProps | BadgeDotProps;\n\n/** Compact, non-interactive metadata whose tone, emphasis, and shape are configured by props. */\nexport function Badge(props: BadgeProps) {\n const { tone = 'neutral', className = '', slot } = props;\n if (props.size === 'dot') {\n // A dot without a usable label has no text fallback, so it is decorative.\n const label = props.ariaHidden ? undefined : props.label?.trim();\n return (\n <span\n class={`kui-badge ${className}`.trim()}\n data-component=\"badge\"\n data-tone={tone}\n data-appearance=\"solid\"\n data-size=\"dot\"\n role={label ? 'img' : undefined}\n aria-label={label || undefined}\n aria-hidden={label ? undefined : 'true'}\n slot={slot}\n ></span>\n );\n }\n const {\n children,\n appearance = 'quiet',\n shape = 'pill',\n size = 'default',\n label,\n ariaHidden = false,\n } = props;\n return (\n <span\n class={`kui-badge ${className}`.trim()}\n data-component=\"badge\"\n data-tone={tone}\n data-appearance={appearance}\n data-shape={shape}\n data-size={size}\n aria-label={ariaHidden ? undefined : label}\n aria-hidden={ariaHidden ? 'true' : undefined}\n slot={slot}\n >\n {children}\n </span>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { verticalAlignment, horizontalAlignment } from './chunk-AYUHMAI6.js';
2
2
  import { filterDataAttributes } from './chunk-SRSJO5QE.js';
3
- import { space } from './chunk-WZ2GLEY4.js';
3
+ import { space } from './chunk-2G2ZJQYK.js';
4
4
  import { jsx } from 'kerfjs/jsx-runtime';
5
5
 
6
6
  var listProtectedAttributes = /* @__PURE__ */ new Set([
@@ -72,4 +72,4 @@ function List({
72
72
 
73
73
  export { List };
74
74
 
75
- //# sourceMappingURL=chunk-3NBL3OUQ.js.map
75
+ //# sourceMappingURL=chunk-NAPE7WUS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/list.tsx"],"names":[],"mappings":";;;;;AAiBA,IAAM,uBAAA,uBAA8B,GAAA,CAAI;AAAA,EACtC,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAgBD,IAAM,UAAA,GAAqC;AAAA,EACzC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA;AA6CO,SAAS,IAAA,CAAK;AAAA,EACnB,QAAA;AAAA,EACA,GAAA,GAAM,KAAA;AAAA,EACN,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,MAAA,GAAS,MAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EACT,UAAA,GAAa,KAAA;AAAA,EACb,YAAA,GAAe,EAAA;AAAA,EACf,UAAA,GAAa,EAAA;AAAA,EACb,aAAA,GAAgB,EAAA;AAAA,EAChB,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAc;AACZ,EAAA,MAAM,kBAAA,GAAqB,oBAAA;AAAA,IACzB,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GACJ,GAAA,KAAQ,IAAA,GACJ,qBAAA,GACA,UAAA,CAAW,QAAA,CAAS,GAAkB,CAAA,GACpC,KAAA,CAAM,GAAkB,CAAA,GACxB,GAAA,IAAO,MAAA;AACf,EAAA,MAAM,SAAA,GAAY,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,IAAA,IAAQ,MAAA;AACvD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,QAAA,GAAW,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAA,GAAK,EAAA;AAAA,IAC3C,SAAA,GAAY,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,GAAK;AAAA,GAChD,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,kBAAA;AAAA,MACJ,KAAA,EAAO,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACpC,gBAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,MAC7B,WAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MAC/B,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,cAAA,EAAc,oBAAoB,MAAM,CAAA;AAAA,MACxC,cAAA,EAAc,kBAAkB,MAAM,CAAA;AAAA,MACtC,iBAAA,EAAiB,OAAO,UAAU,CAAA;AAAA,MAClC,iBAAe,YAAA,IAAgB,MAAA;AAAA,MAC/B,oBAAkB,UAAA,IAAc,MAAA;AAAA,MAChC,uBAAqB,aAAA,IAAiB,MAAA;AAAA,MACtC,OAAO,KAAA,IAAS,MAAA;AAAA,MAChB,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-NAPE7WUS.js","sourcesContent":["import {\n type CssFlex,\n type CssFlexKeyword,\n type CssLength,\n space,\n type UiSpaceName,\n} from './css-values.js';\nimport { filterDataAttributes } from './extension-attributes.js';\nimport {\n type HorizontalAlignment,\n horizontalAlignment,\n type ListVerticalAlignment,\n verticalAlignment,\n} from './flex-alignment.js';\nimport type { KerfUiContent } from './semantic-content.js';\nimport type { Sides } from './sides.js';\n\nconst listProtectedAttributes = new Set([\n 'data-component',\n 'data-gap',\n 'data-flex',\n 'data-fill',\n 'data-h-align',\n 'data-v-align',\n 'data-scrollable',\n 'data-text-insets',\n 'data-control-insets',\n]);\n\ntype ListRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-gap'?: never;\n 'data-flex'?: never;\n 'data-fill'?: never;\n 'data-h-align'?: never;\n 'data-v-align'?: never;\n 'data-scrollable'?: never;\n 'data-text-insets'?: never;\n 'data-control-insets'?: never;\n }\n>;\n\nconst spaceNames: readonly UiSpaceName[] = [\n 'none',\n '2xs',\n 'xs',\n 's',\n 'm',\n 'l',\n 'xl',\n];\n\nexport interface ListProps {\n children?: KerfUiContent;\n /** Use the standard item gap, a named UI spacing token, or a typed CSS length. Defaults to no gap. */\n gap?: boolean | UiSpaceName | CssLength;\n /** Allow this list to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */\n flex?: boolean | CssFlexKeyword | CssFlex;\n /**\n * Fill the height of a parent with a definite height, such as an app root or\n * a fixed-height frame, when this list is that parent's layout root. Inside a\n * flex layout use `flex` instead. Defaults to false.\n */\n fill?: boolean;\n /** Horizontal alignment. Defaults to full to preserve stretch-aligned list children. */\n hAlign?: HorizontalAlignment;\n /** Vertical distribution. Defaults to top. */\n vAlign?: ListVerticalAlignment;\n /** Own vertical scrolling and overscroll containment. */\n scrollable?: boolean;\n /** Physical divider edges in canonical top/right/bottom/left order. */\n dividerSides?: Sides;\n /** Physical sides that receive the standard 17px text inset. */\n textInsets?: Sides;\n /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */\n controlInsets?: Sides;\n className?: string;\n /** Safe `data-*` metadata; List-owned structural attributes remain protected. */\n rootAttributes?: ListRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A list's configuration, apart from its content and styling hooks: the props a\n * composite that renders a `List` for the app (the Workbench's `mainHeader` /\n * `mainFooter` chrome) forwards, so the app configures that list instead of\n * styling it. An omitted or `undefined` field keeps the composite's default.\n */\nexport type ListConfig = Pick<\n ListProps,\n 'gap' | 'hAlign' | 'vAlign' | 'dividerSides' | 'textInsets' | 'controlInsets'\n>;\n\n/** A stretch-aligned vertical stack with optional gap, flex, fill, scroll, and dividers. */\nexport function List({\n children,\n gap = false,\n flex = false,\n fill = false,\n hAlign = 'full',\n vAlign = 'top',\n scrollable = false,\n dividerSides = '',\n textInsets = '',\n controlInsets = '',\n className = '',\n rootAttributes = {},\n slot,\n}: ListProps) {\n const safeRootAttributes = filterDataAttributes(\n rootAttributes,\n listProtectedAttributes,\n );\n const gapValue =\n gap === true\n ? 'var(--kui-list-gap)'\n : spaceNames.includes(gap as UiSpaceName)\n ? space(gap as UiSpaceName)\n : gap || undefined;\n const flexValue = flex === true ? '1 1 auto' : flex || undefined;\n const style = [\n gapValue ? `--_kui-list-gap:${gapValue}` : '',\n flexValue ? `--_kui-list-flex:${flexValue}` : '',\n ]\n .filter(Boolean)\n .join(';');\n\n return (\n <div\n {...safeRootAttributes}\n class={`kui-list ${className}`.trim()}\n data-component=\"list\"\n data-gap={String(Boolean(gap))}\n data-flex={String(Boolean(flex))}\n data-fill={fill ? 'true' : undefined}\n data-h-align={horizontalAlignment(hAlign)}\n data-v-align={verticalAlignment(vAlign)}\n data-scrollable={String(scrollable)}\n divider-sides={dividerSides || undefined}\n data-text-insets={textInsets || undefined}\n data-control-insets={controlInsets || undefined}\n style={style || undefined}\n slot={slot}\n >\n {children}\n </div>\n );\n}\n\nexport type {\n CssFlex,\n CssFlexKeyword,\n CssLength,\n UiSpaceName,\n} from './css-values.js';\nexport type {\n HorizontalAlignment,\n ListVerticalAlignment,\n VerticalAlignment,\n} from './flex-alignment.js';\nexport type { Sides } from './sides.js';\n"]}
@@ -1,4 +1,4 @@
1
- import { placeTokenSearchCaret, readTokenSearchField } from './chunk-RNRUVPJ3.js';
1
+ import { placeTokenSearchCaret, readTokenSearchField } from './chunk-63ZWBGE3.js';
2
2
  import { delegate, delegateCapture, signal } from 'kerfjs';
3
3
 
4
4
  function editorFromEvent(root, event) {
@@ -512,4 +512,4 @@ function wireTokenSearchFields(root, {
512
512
 
513
513
  export { wireTokenSearchFields };
514
514
 
515
- //# sourceMappingURL=chunk-BSKEH3UC.js.map
515
+ //# sourceMappingURL=chunk-NBYTIVHS.js.map