@kerfjs/ui 4.4.1 → 5.0.0-beta.4

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 (158) hide show
  1. package/README.md +234 -5
  2. package/ai/component-catalog.json +4473 -0
  3. package/ai/component-catalog.schema.json +79 -0
  4. package/ai/public-api-signatures-v1.md +619 -0
  5. package/ai/skill.md +65 -11
  6. package/ai/webawesome-jsx-signatures-v1.md +106 -0
  7. package/dist/app-tab.d.ts +12 -2
  8. package/dist/app-tab.js +2 -1
  9. package/dist/browser/app-tab.js +2 -2
  10. package/dist/browser/dialog-header.js +4 -2
  11. package/dist/browser/disclosure-arrow.js +4 -0
  12. package/dist/browser/empty-state.js +3 -3
  13. package/dist/browser/loading-spinner.js +2 -2
  14. package/dist/browser/lucide-icon.js +2 -2
  15. package/dist/browser/menu-action-row.js +3 -0
  16. package/dist/browser/menu-header.js +4 -2
  17. package/dist/browser/menu-item.js +2 -2
  18. package/dist/browser/page-header.js +2 -2
  19. package/dist/browser/resizable-region.js +2 -2
  20. package/dist/browser/segmented-control.js +2 -2
  21. package/dist/browser/select.js +3 -3
  22. package/dist/browser/state-banner.js +2 -2
  23. package/dist/browser/tab-bar.js +2 -2
  24. package/dist/browser/token-search-field.js +4 -0
  25. package/dist/browser/toolbar-control-group.js +2 -2
  26. package/dist/browser/toolbar-text.js +2 -2
  27. package/dist/browser/toolbar.js +2 -2
  28. package/dist/browser/value-table.js +2 -2
  29. package/dist/chunk-56RJXPHG.js +43 -0
  30. package/dist/chunk-56RJXPHG.js.map +1 -0
  31. package/dist/chunk-7BR3DO2A.js +31 -0
  32. package/dist/chunk-7BR3DO2A.js.map +1 -0
  33. package/dist/chunk-7LDCTU7D.js +134 -0
  34. package/dist/chunk-7LDCTU7D.js.map +1 -0
  35. package/dist/{chunk-4HHCYSGT.js → chunk-AQNKJRFH.js} +2 -2
  36. package/dist/{chunk-4HHCYSGT.js.map → chunk-AQNKJRFH.js.map} +1 -1
  37. package/dist/{chunk-NHXX4JI5.js → chunk-CTQKI2XL.js} +3 -3
  38. package/dist/chunk-CTQKI2XL.js.map +1 -0
  39. package/dist/chunk-EGHL5S4P.js +33 -0
  40. package/dist/chunk-EGHL5S4P.js.map +1 -0
  41. package/dist/chunk-H5AGGVU5.js +75 -0
  42. package/dist/chunk-H5AGGVU5.js.map +1 -0
  43. package/dist/chunk-K3G72I6D.js +24 -0
  44. package/dist/chunk-K3G72I6D.js.map +1 -0
  45. package/dist/{chunk-3O7ZEUW2.js → chunk-M5JRI6MN.js} +3 -3
  46. package/dist/chunk-M5JRI6MN.js.map +1 -0
  47. package/dist/chunk-NPPD2A6O.js +40 -0
  48. package/dist/chunk-NPPD2A6O.js.map +1 -0
  49. package/dist/chunk-R6JHHBKQ.js +19 -0
  50. package/dist/chunk-R6JHHBKQ.js.map +1 -0
  51. package/dist/chunk-S3TPM2LP.js +23 -0
  52. package/dist/chunk-S3TPM2LP.js.map +1 -0
  53. package/dist/{chunk-T5XNMVOI.js → chunk-XZXRLY5Q.js} +14 -5
  54. package/dist/chunk-XZXRLY5Q.js.map +1 -0
  55. package/dist/dialog-header.d.ts +3 -2
  56. package/dist/dialog-header.js +3 -1
  57. package/dist/disclosure-arrow.d.ts +14 -0
  58. package/dist/disclosure-arrow.js +4 -0
  59. package/dist/disclosure-arrow.js.map +1 -0
  60. package/dist/index.d.ts +5 -1
  61. package/dist/index.js +16 -11
  62. package/dist/menu-action-row.d.ts +50 -0
  63. package/dist/menu-action-row.js +4 -0
  64. package/dist/menu-action-row.js.map +1 -0
  65. package/dist/menu-header.d.ts +28 -2
  66. package/dist/menu-header.js +4 -1
  67. package/dist/menu-item.d.ts +10 -1
  68. package/dist/menu-item.js +2 -1
  69. package/dist/resizable-region.d.ts +3 -1
  70. package/dist/resizable-region.js +1 -1
  71. package/dist/select.js +1 -1
  72. package/dist/styles/app-tab.css +152 -0
  73. package/dist/styles/dialog-header.css +87 -0
  74. package/dist/styles/disclosure-arrow.css +23 -0
  75. package/dist/styles/empty-state.css +47 -0
  76. package/dist/styles/foundation.css +326 -0
  77. package/dist/styles/layout.css +73 -0
  78. package/dist/styles/loading-spinner.css +21 -0
  79. package/dist/styles/lucide-icon.css +6 -0
  80. package/dist/styles/menu-action-row.css +160 -0
  81. package/dist/styles/menu-header.css +143 -0
  82. package/dist/styles/menu-item.css +123 -0
  83. package/dist/styles/page-header.css +33 -0
  84. package/dist/styles/resizable-region.css +111 -0
  85. package/{src → dist/styles}/segmented-control.css +62 -31
  86. package/dist/styles/select.css +96 -0
  87. package/dist/styles/state-banner.css +173 -0
  88. package/dist/styles/styles.css +22 -0
  89. package/dist/styles/tab-bar.css +45 -0
  90. package/dist/styles/token-search-field.css +281 -0
  91. package/dist/styles/toolbar-control-group.css +161 -0
  92. package/dist/styles/toolbar-text.css +29 -0
  93. package/dist/styles/toolbar.css +52 -0
  94. package/dist/styles/value-table.css +75 -0
  95. package/{src → dist/styles}/webawesome.css +119 -29
  96. package/dist/token-search-field.d.ts +43 -0
  97. package/dist/token-search-field.js +4 -0
  98. package/dist/token-search-field.js.map +1 -0
  99. package/dist/value-table.d.ts +10 -2
  100. package/dist/value-table.js +1 -1
  101. package/dist/webawesome.d.ts +100 -0
  102. package/dist/webawesome.js +3 -0
  103. package/dist/webawesome.js.map +1 -0
  104. package/dist/wire-resizable-regions.js +1 -1
  105. package/dist/wire-token-search-fields.d.ts +11 -0
  106. package/dist/wire-token-search-fields.js +5 -0
  107. package/dist/wire-token-search-fields.js.map +1 -0
  108. package/docs/accessibility.md +60 -3
  109. package/docs/component-contract.md +131 -3
  110. package/docs/component-selection.md +133 -0
  111. package/docs/design-philosophy.md +38 -0
  112. package/docs/examples/command-palette-adapter.tsx +70 -0
  113. package/docs/layout.md +106 -0
  114. package/docs/recipes.md +124 -0
  115. package/docs/ux-demo.md +23 -9
  116. package/docs/webawesome-theme.md +15 -0
  117. package/llms.txt +25 -2
  118. package/package.json +70 -27
  119. package/ux-demo/recipes/app-shell.tsx +32 -0
  120. package/ux-demo/recipes/compact-toolbar.tsx +43 -0
  121. package/ux-demo/recipes/composer-form.tsx +63 -0
  122. package/ux-demo/recipes/list-workspace-states.tsx +26 -0
  123. package/ux-demo/recipes/loaders.ts +27 -0
  124. package/ux-demo/recipes/master-detail-dialog.tsx +45 -0
  125. package/ux-demo/recipes/mount-recipe.ts +38 -0
  126. package/ux-demo/recipes/navigation-sidebar.tsx +26 -0
  127. package/ux-demo/recipes/recipes.css +344 -0
  128. package/ux-demo/recipes/types.ts +11 -0
  129. package/ux-demo/recipes/workspace-header.tsx +12 -0
  130. package/dist/chunk-3O7ZEUW2.js.map +0 -1
  131. package/dist/chunk-723YNJBH.js +0 -17
  132. package/dist/chunk-723YNJBH.js.map +0 -1
  133. package/dist/chunk-NHXX4JI5.js.map +0 -1
  134. package/dist/chunk-OPCJRCYO.js +0 -19
  135. package/dist/chunk-OPCJRCYO.js.map +0 -1
  136. package/dist/chunk-T5XNMVOI.js.map +0 -1
  137. package/dist/chunk-VKH2JLDZ.js +0 -10
  138. package/dist/chunk-VKH2JLDZ.js.map +0 -1
  139. package/dist/chunk-WY4CAEPG.js +0 -14
  140. package/dist/chunk-WY4CAEPG.js.map +0 -1
  141. package/src/app-tab.css +0 -20
  142. package/src/dialog-header.css +0 -9
  143. package/src/empty-state.css +0 -6
  144. package/src/foundation.css +0 -106
  145. package/src/loading-spinner.css +0 -4
  146. package/src/lucide-icon.css +0 -1
  147. package/src/menu-header.css +0 -13
  148. package/src/menu-item.css +0 -12
  149. package/src/page-header.css +0 -3
  150. package/src/resizable-region.css +0 -19
  151. package/src/select.css +0 -18
  152. package/src/state-banner.css +0 -31
  153. package/src/styles.css +0 -18
  154. package/src/tab-bar.css +0 -4
  155. package/src/toolbar-control-group.css +0 -25
  156. package/src/toolbar-text.css +0 -4
  157. package/src/toolbar.css +0 -9
  158. package/src/value-table.css +0 -5
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/menu-item.tsx"],"names":[],"mappings":";;;AAIA,IAAM,8BAAA,uBAAqC,GAAA,CAAI;AAAA,EAC7C,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAgCM,SAAS,QAAA,CAAS,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,WAAW,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,SAAA,GAAY,EAAA,EAAI,KAAA,EAAO,SAAS,eAAA,EAAiB,KAAA,EAAO,SAAA,GAAY,KAAA,EAAO,KAAA,EAAO,QAAA,GAAW,OAAO,QAAA,EAAU,cAAA,GAAiB,EAAC,EAAE,EAAkB;AACtO,EAAA,MAAM,mBAAA,GAAsB,oBAAA,CAAqB,cAAA,EAAgB,8BAA8B,CAAA;AAC/F,EAAA,uBAAO,IAAA,CAAC,YAAQ,GAAG,mBAAA,EAAqB,MAAK,QAAA,EAAS,KAAA,EAAO,iBAAiB,SAAS,CAAA,CAAA,CAAG,MAAK,EAAG,KAAA,EAAc,OAAc,QAAA,EAAoB,QAAA,EAAU,UAAU,gBAAA,EAAe,WAAA,EAAY,aAAA,EAAa,MAAA,EAAQ,cAAA,EAAc,MAAA,EAAQ,iBAAe,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG,kBAAgB,SAAA,GAAY,MAAA,GAAS,MAAA,EAAW,YAAA,EAAY,KAAA,EAAO,YAAA,EAAY,iBAAiB,cAAA,EAAc,QAAA,GAAW,SAAS,MAAA,EAAW,cAAA,EAAc,YAAY,MAAA,GAAY,MAAA,GAAY,MAAA,CAAO,OAAO,CAAA,EAC5d,QAAA,EAAA;AAAA,IAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,qBAAA,EAAuB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBACjD,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,sBAAA,EAAwB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACzC,QAAA,oBAAY,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,2BAA2B,QAAA,EAAA,QAAA,EAAS;AAAA,GAAA,EAC/D,CAAA;AACF","file":"chunk-S3TPM2LP.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { filterDataAttributes } from './extension-attributes.js';\n\nconst PROTECTED_ROOT_DATA_ATTRIBUTES = new Set([\n 'data-component',\n 'data-action',\n 'data-item-id',\n 'data-has-icon',\n 'data-multiline',\n 'data-state',\n]);\n\ntype MenuItemRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n 'data-item-id'?: never;\n 'data-has-icon'?: never;\n 'data-multiline'?: never;\n 'data-state'?: never;\n }\n>;\n\nexport interface MenuItemProps {\n label: string | SafeHtml;\n icon?: SafeHtml;\n trailing?: SafeHtml;\n selected?: boolean;\n action: string;\n itemId?: string;\n className?: string;\n style?: string;\n pressed?: boolean;\n accessibleLabel?: string;\n title?: string;\n multiline?: boolean;\n state?: string;\n disabled?: boolean;\n tabIndex?: number;\n rootAttributes?: MenuItemRootAttributes;\n}\n\nexport function MenuItem({ label, icon, trailing, selected = false, action, itemId, className = '', style, pressed, accessibleLabel, title, multiline = false, state, disabled = false, tabIndex, rootAttributes = {} }: MenuItemProps) {\n const extensionAttributes = filterDataAttributes(rootAttributes, PROTECTED_ROOT_DATA_ATTRIBUTES);\n return <button {...extensionAttributes} type=\"button\" class={`kui-menu-item ${className}`.trim()} style={style} title={title} disabled={disabled} tabindex={tabIndex} data-component=\"menu-item\" data-action={action} data-item-id={itemId} data-has-icon={String(Boolean(icon))} data-multiline={multiline ? 'true' : undefined} data-state={state} aria-label={accessibleLabel} aria-current={selected ? 'page' : undefined} aria-pressed={pressed === undefined ? undefined : String(pressed)}>\n {icon && <span class=\"kui-menu-item__icon\">{icon}</span>}\n <span class=\"kui-menu-item__label\">{label}</span>\n {trailing && <span class=\"kui-menu-item__trailing\">{trailing}</span>}\n </button>;\n}\n"]}
@@ -1,16 +1,25 @@
1
+ import { filterDataAttributes } from './chunk-7BR3DO2A.js';
1
2
  import { jsxs, jsx } from 'kerfjs/jsx-runtime';
2
3
 
3
- // src/app-tab.tsx
4
+ var PROTECTED_ROOT_DATA_ATTRIBUTES = /* @__PURE__ */ new Set([
5
+ "data-component",
6
+ "data-action",
7
+ "data-tab-id",
8
+ "data-selected",
9
+ "data-tab-dragging",
10
+ "data-tab-drop-position"
11
+ ]);
4
12
  function CloseIcon() {
5
13
  return /* @__PURE__ */ jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2.25", "stroke-linecap": "round", children: [
6
14
  /* @__PURE__ */ jsx("path", { d: "m7 7 10 10" }),
7
15
  /* @__PURE__ */ jsx("path", { d: "M17 7 7 17" })
8
16
  ] });
9
17
  }
10
- function AppTab({ id, name, selected = false, closable = true, draggable = false, leading, trailing, selectAction = "select-tab", closeAction = "close-tab", className = "", rootAttributes = {} }) {
18
+ function AppTab({ id, name, selected = false, closable = true, draggable = false, leading, trailing, closeIcon, selectAction = "select-tab", closeAction = "close-tab", className = "", rootAttributes = {} }) {
11
19
  const keyshortcuts = [closable ? "Delete Backspace" : "", draggable ? "Alt+Shift+ArrowLeft Alt+Shift+ArrowRight" : ""].filter(Boolean).join(" ");
12
- return /* @__PURE__ */ jsxs("div", { class: `kui-app-tab ${className}`.trim(), ...rootAttributes, "data-component": "app-tab", "data-tab-id": id, "data-selected": String(selected), draggable: draggable ? "true" : "false", children: [
13
- closable && /* @__PURE__ */ jsx("button", { type: "button", tabindex: "-1", class: "kui-app-tab__close", "data-action": closeAction, "data-tab-id": id, "aria-label": `Close ${name}`, title: `Close ${name}`, children: /* @__PURE__ */ jsx(CloseIcon, {}) }),
20
+ const extensionAttributes = filterDataAttributes(rootAttributes, PROTECTED_ROOT_DATA_ATTRIBUTES);
21
+ return /* @__PURE__ */ jsxs("div", { ...extensionAttributes, class: `kui-app-tab ${className}`.trim(), "data-component": "app-tab", "data-tab-id": id, "data-selected": String(selected), draggable: draggable ? "true" : "false", children: [
22
+ closable && /* @__PURE__ */ jsx("button", { type: "button", tabindex: "-1", class: "kui-app-tab__close", "data-action": closeAction, "data-tab-id": id, "aria-label": `Close ${name}`, title: `Close ${name}`, children: /* @__PURE__ */ jsx("span", { class: "kui-app-tab__close-icon", "aria-hidden": "true", children: closeIcon ?? /* @__PURE__ */ jsx(CloseIcon, {}) }) }),
14
23
  /* @__PURE__ */ jsxs("button", { type: "button", class: "kui-app-tab__select", role: "tab", "aria-selected": String(selected), "aria-keyshortcuts": keyshortcuts || void 0, "data-action": selectAction, "data-tab-id": id, tabindex: selected ? "0" : "-1", children: [
15
24
  leading,
16
25
  /* @__PURE__ */ jsx("span", { class: "kui-app-tab__name", children: name }),
@@ -21,4 +30,4 @@ function AppTab({ id, name, selected = false, closable = true, draggable = false
21
30
 
22
31
  export { AppTab };
23
32
 
24
- //# sourceMappingURL=chunk-T5XNMVOI.js.map
33
+ //# sourceMappingURL=chunk-XZXRLY5Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app-tab.tsx"],"names":[],"mappings":";;;AAIA,IAAM,8BAAA,uBAAqC,GAAA,CAAI;AAAA,EAC7C,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAC,CAAA;AA6BD,SAAS,SAAA,GAAY;AACnB,EAAA,uBAAO,IAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,cAAA,EAAa,MAAA,EAAO,kBAAe,OAAA,EAAQ,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,YAAA,EAAa,CAAA;AAAA,oBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA,GAAA,EAAO,CAAA;AAC1L;AAEO,SAAS,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,KAAA,EAAO,QAAA,GAAW,IAAA,EAAM,SAAA,GAAY,KAAA,EAAO,OAAA,EAAS,UAAU,SAAA,EAAW,YAAA,GAAe,cAAc,WAAA,GAAc,WAAA,EAAa,YAAY,EAAA,EAAI,cAAA,GAAiB,EAAC,EAAE,EAAgB;AACjO,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,GAAW,kBAAA,GAAqB,EAAA,EAAI,SAAA,GAAY,0CAAA,GAA6C,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAC/I,EAAA,MAAM,mBAAA,GAAsB,oBAAA,CAAqB,cAAA,EAAgB,8BAA8B,CAAA;AAC/F,EAAA,uBAAO,IAAA,CAAC,SAAK,GAAG,mBAAA,EAAqB,OAAO,CAAA,YAAA,EAAe,SAAS,GAAG,IAAA,EAAK,EAAG,kBAAe,SAAA,EAAU,aAAA,EAAa,IAAI,eAAA,EAAe,MAAA,CAAO,QAAQ,CAAA,EAAG,SAAA,EAAW,SAAA,GAAY,MAAA,GAAS,OAAA,EACvL,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAY,GAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,QAAA,EAAS,IAAA,EAAK,KAAA,EAAM,oBAAA,EAAqB,aAAA,EAAa,WAAA,EAAa,aAAA,EAAa,EAAA,EAAI,cAAY,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,KAAA,EAAO,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,yBAAA,EAA0B,aAAA,EAAY,MAAA,EAAQ,QAAA,EAAA,SAAA,oBAAa,GAAA,CAAC,SAAA,EAAA,EAAU,GAAG,CAAA,EAAO,CAAA;AAAA,oBACxQ,IAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,OAAM,qBAAA,EAAsB,IAAA,EAAK,KAAA,EAAM,eAAA,EAAe,MAAA,CAAO,QAAQ,GAAG,mBAAA,EAAmB,YAAA,IAAgB,QAAW,aAAA,EAAa,YAAA,EAAc,eAAa,EAAA,EAAI,QAAA,EAAU,QAAA,GAAW,GAAA,GAAM,IAAA,EAChN,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,sBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,mBAAA,EAAqB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,MAAQ,YAAY,QAAA,mBAAW,GAAA,CAAC,UAAK,KAAA,EAAM,uBAAA,EAAyB,oBAAS,CAAA,GAAU;AAAA,KAAA,EACxI;AAAA,GAAA,EACF,CAAA;AACF","file":"chunk-XZXRLY5Q.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { filterDataAttributes } from './extension-attributes.js';\n\nconst PROTECTED_ROOT_DATA_ATTRIBUTES = new Set([\n 'data-component',\n 'data-action',\n 'data-tab-id',\n 'data-selected',\n 'data-tab-dragging',\n 'data-tab-drop-position',\n]);\n\ntype AppTabRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n 'data-tab-id'?: never;\n 'data-selected'?: never;\n 'data-tab-dragging'?: never;\n 'data-tab-drop-position'?: never;\n }\n>;\n\nexport interface AppTabProps {\n id: string;\n name: string;\n selected?: boolean;\n closable?: boolean;\n draggable?: boolean;\n leading?: SafeHtml;\n trailing?: SafeHtml;\n /** Decorative dormant content for the close button. Must not contain interactive descendants. */\n closeIcon?: SafeHtml;\n selectAction?: string;\n closeAction?: string;\n className?: string;\n rootAttributes?: AppTabRootAttributes;\n}\n\nfunction CloseIcon() {\n return <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.25\" stroke-linecap=\"round\"><path d=\"m7 7 10 10\"></path><path d=\"M17 7 7 17\"></path></svg>;\n}\n\nexport function AppTab({ id, name, selected = false, closable = true, draggable = false, leading, trailing, closeIcon, selectAction = 'select-tab', closeAction = 'close-tab', className = '', rootAttributes = {} }: AppTabProps) {\n const keyshortcuts = [closable ? 'Delete Backspace' : '', draggable ? 'Alt+Shift+ArrowLeft Alt+Shift+ArrowRight' : ''].filter(Boolean).join(' ');\n const extensionAttributes = filterDataAttributes(rootAttributes, PROTECTED_ROOT_DATA_ATTRIBUTES);\n return <div {...extensionAttributes} class={`kui-app-tab ${className}`.trim()} data-component=\"app-tab\" data-tab-id={id} data-selected={String(selected)} draggable={draggable ? 'true' : 'false'}>\n {closable && <button type=\"button\" tabindex=\"-1\" class=\"kui-app-tab__close\" data-action={closeAction} data-tab-id={id} aria-label={`Close ${name}`} title={`Close ${name}`}><span class=\"kui-app-tab__close-icon\" aria-hidden=\"true\">{closeIcon ?? <CloseIcon />}</span></button>}\n <button type=\"button\" class=\"kui-app-tab__select\" role=\"tab\" aria-selected={String(selected)} aria-keyshortcuts={keyshortcuts || undefined} data-action={selectAction} data-tab-id={id} tabindex={selected ? '0' : '-1'}>\n {leading}<span class=\"kui-app-tab__name\">{name}</span>{closable || trailing ? <span class=\"kui-app-tab__trailing\">{trailing}</span> : undefined}\n </button>\n </div>;\n}\n"]}
@@ -3,12 +3,13 @@ import { SafeHtml } from 'kerfjs';
3
3
  interface DialogHeaderProps {
4
4
  title: string;
5
5
  titleId: string;
6
- summary: string;
6
+ summary?: string;
7
7
  summaryId?: string;
8
8
  icon?: SafeHtml;
9
9
  iconClassName?: string;
10
10
  actions?: SafeHtml;
11
+ actionsLabel?: string;
11
12
  }
12
- declare function DialogHeader({ title, titleId, summary, summaryId, icon, iconClassName, actions }: DialogHeaderProps): SafeHtml;
13
+ declare function DialogHeader({ title, titleId, summary, summaryId, icon, iconClassName, actions, actionsLabel }: DialogHeaderProps): SafeHtml;
13
14
 
14
15
  export { DialogHeader, type DialogHeaderProps };
@@ -1,3 +1,5 @@
1
- export { DialogHeader } from './chunk-723YNJBH.js';
1
+ export { DialogHeader } from './chunk-K3G72I6D.js';
2
+
3
+
2
4
 
3
5
  //# sourceMappingURL=dialog-header.js.map
@@ -0,0 +1,14 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ type DisclosureDirection = 'up' | 'down' | 'left' | 'right';
4
+ interface DisclosureArrowProps {
5
+ open: boolean;
6
+ openDirection?: DisclosureDirection;
7
+ closedDirection?: DisclosureDirection;
8
+ /** Replacement icons should use right as their unrotated orientation. */
9
+ icon?: SafeHtml;
10
+ className?: string;
11
+ }
12
+ declare function DisclosureArrow({ open, openDirection, closedDirection, icon, className, }: DisclosureArrowProps): SafeHtml;
13
+
14
+ export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
@@ -0,0 +1,4 @@
1
+ export { DisclosureArrow } from './chunk-56RJXPHG.js';
2
+
3
+
4
+ //# sourceMappingURL=disclosure-arrow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"disclosure-arrow.js"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  export { AppTab, AppTabProps } from './app-tab.js';
2
2
  export { DialogHeader, DialogHeaderProps } from './dialog-header.js';
3
+ export { DisclosureArrow, DisclosureArrowProps, DisclosureDirection } from './disclosure-arrow.js';
3
4
  export { EmptyState, EmptyStateProps } from './empty-state.js';
4
5
  export { LoadingSpinner, LoadingSpinnerProps } from './loading-spinner.js';
5
6
  export { LucideIcon, LucideIconProps, LucideNode } from './lucide-icon.js';
7
+ export { MenuActionRow, MenuActionRowProps } from './menu-action-row.js';
6
8
  export { MenuHeader, MenuHeaderProps } from './menu-header.js';
7
9
  export { MenuItem, MenuItemProps } from './menu-item.js';
8
10
  export { PageHeader, PageHeaderProps } from './page-header.js';
@@ -11,11 +13,13 @@ export { SegmentedControl, SegmentedControlAppearance, SegmentedControlChoice, S
11
13
  export { Select, SelectChoice, SelectProps } from './select.js';
12
14
  export { StateBanner, StateBannerProps, StateBannerTone } from './state-banner.js';
13
15
  export { TabBar, TabBarProps } from './tab-bar.js';
16
+ export { TokenSearchField, TokenSearchFieldProps, TokenSearchFieldValue, TokenSearchToken, placeTokenSearchCaret, readTokenSearchField } from './token-search-field.js';
14
17
  export { Toolbar, ToolbarProps } from './toolbar.js';
15
18
  export { ToolbarControlGroup, ToolbarControlGroupProps } from './toolbar-control-group.js';
16
19
  export { ToolbarText, ToolbarTextProps, ToolbarTextSize } from './toolbar-text.js';
17
- export { ValueTable, ValueTableProps } from './value-table.js';
20
+ export { ValueTable, ValueTableProps, ValueTableRow, ValueTableRowProps } from './value-table.js';
18
21
  export { ResizeCommit, WireResizableRegionsOptions, wireResizableRegions } from './wire-resizable-regions.js';
19
22
  export { TabDropPosition, TabReorder, TabReorderSource, WireTabBarsOptions, reorderTabs, wireTabBars } from './wire-tab-bars.js';
23
+ export { TokenSearchSubmit, WireTokenSearchFieldsOptions, wireTokenSearchFields } from './wire-token-search-fields.js';
20
24
  import 'kerfjs';
21
25
  import 'lucide';
package/dist/index.js CHANGED
@@ -1,21 +1,26 @@
1
- export { ToolbarText } from './chunk-GY5WH7TO.js';
2
- export { Toolbar } from './chunk-DAFFDO33.js';
3
- export { ValueTable } from './chunk-VKH2JLDZ.js';
4
- export { wireResizableRegions } from './chunk-4HHCYSGT.js';
5
1
  export { reorderTabs, wireTabBars } from './chunk-MQIZAD4A.js';
2
+ export { wireTokenSearchFields } from './chunk-H5AGGVU5.js';
3
+ export { TabBar } from './chunk-MBR3TYNL.js';
4
+ export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-7LDCTU7D.js';
5
+ export { ToolbarText } from './chunk-GY5WH7TO.js';
6
+ export { ValueTable, ValueTableRow } from './chunk-R6JHHBKQ.js';
7
+ export { wireResizableRegions } from './chunk-AQNKJRFH.js';
8
+ export { MenuHeader } from './chunk-NPPD2A6O.js';
9
+ export { MenuItem } from './chunk-S3TPM2LP.js';
6
10
  export { PageHeader } from './chunk-2PES33HS.js';
7
- export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-3O7ZEUW2.js';
11
+ export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-M5JRI6MN.js';
8
12
  export { SegmentedControl } from './chunk-TRNBHPNW.js';
9
- export { Select } from './chunk-NHXX4JI5.js';
13
+ export { Select } from './chunk-CTQKI2XL.js';
10
14
  export { StateBanner } from './chunk-VHW5YNIB.js';
11
- export { TabBar } from './chunk-MBR3TYNL.js';
15
+ export { AppTab } from './chunk-XZXRLY5Q.js';
16
+ export { DialogHeader } from './chunk-K3G72I6D.js';
12
17
  export { ToolbarControlGroup } from './chunk-MFKMHK5W.js';
13
- export { AppTab } from './chunk-T5XNMVOI.js';
14
- export { DialogHeader } from './chunk-723YNJBH.js';
18
+ export { Toolbar } from './chunk-DAFFDO33.js';
19
+ export { DisclosureArrow } from './chunk-56RJXPHG.js';
15
20
  export { EmptyState } from './chunk-WVPYVDXY.js';
16
21
  export { LoadingSpinner } from './chunk-55DATV3A.js';
17
22
  export { LucideIcon } from './chunk-W2FK7ZNY.js';
18
- export { MenuHeader } from './chunk-OPCJRCYO.js';
19
- export { MenuItem } from './chunk-WY4CAEPG.js';
23
+ export { MenuActionRow } from './chunk-EGHL5S4P.js';
24
+
20
25
 
21
26
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,50 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ type MenuActionRowRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
4
+ 'data-component'?: never;
5
+ 'data-action'?: never;
6
+ 'data-item-id'?: never;
7
+ 'data-has-icon'?: never;
8
+ 'data-multiline'?: never;
9
+ 'data-state'?: never;
10
+ 'data-selected'?: never;
11
+ 'data-pressed'?: never;
12
+ }>;
13
+ type MenuActionRowTrailingAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
14
+ 'data-component'?: never;
15
+ 'data-action'?: never;
16
+ 'data-item-id'?: never;
17
+ popoverTarget?: string;
18
+ popoverTargetAction?: 'toggle' | 'show' | 'hide';
19
+ 'aria-controls'?: string;
20
+ 'aria-haspopup'?: 'dialog' | 'menu' | 'listbox' | 'tree' | 'grid' | 'true';
21
+ }>;
22
+ interface MenuActionRowProps {
23
+ /** Visible dormant content for the primary button. Must not contain interactive descendants. */
24
+ label: string | SafeHtml;
25
+ /** Decorative dormant content for the primary button. Must not contain interactive descendants. */
26
+ icon?: SafeHtml;
27
+ action: string;
28
+ itemId?: string;
29
+ selected?: boolean;
30
+ pressed?: boolean;
31
+ accessibleLabel?: string;
32
+ title?: string;
33
+ multiline?: boolean;
34
+ state?: string;
35
+ disabled?: boolean;
36
+ tabIndex?: number;
37
+ trailingAction: string;
38
+ trailingActionLabel: string;
39
+ /** Decorative dormant content for the trailing button. Must not contain interactive descendants. */
40
+ trailingActionIcon: SafeHtml;
41
+ trailingActionDisabled?: boolean;
42
+ trailingActionTitle?: string;
43
+ className?: string;
44
+ style?: string;
45
+ rootAttributes?: MenuActionRowRootAttributes;
46
+ trailingActionAttributes?: MenuActionRowTrailingAttributes;
47
+ }
48
+ declare function MenuActionRow({ label, icon, action, itemId, selected, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, trailingAction, trailingActionLabel, trailingActionIcon, trailingActionDisabled, trailingActionTitle, className, style, rootAttributes, trailingActionAttributes }: MenuActionRowProps): SafeHtml;
49
+
50
+ export { MenuActionRow, type MenuActionRowProps };
@@ -0,0 +1,4 @@
1
+ export { MenuActionRow } from './chunk-EGHL5S4P.js';
2
+
3
+
4
+ //# sourceMappingURL=menu-action-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"menu-action-row.js"}
@@ -1,6 +1,20 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
- interface MenuHeaderProps {
3
+ type MenuHeaderRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
4
+ 'data-component'?: never;
5
+ 'data-action'?: never;
6
+ 'data-has-badge'?: never;
7
+ 'data-has-count'?: never;
8
+ 'data-toggle'?: never;
9
+ }>;
10
+ type MenuHeaderTriggerAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
11
+ 'data-action'?: never;
12
+ popoverTarget?: string;
13
+ popoverTargetAction?: 'toggle' | 'show' | 'hide';
14
+ 'aria-controls'?: string;
15
+ 'aria-haspopup'?: 'dialog' | 'menu' | 'listbox' | 'tree' | 'grid' | 'true';
16
+ }>;
17
+ interface MenuHeaderBaseProps {
4
18
  label: string;
5
19
  action?: string;
6
20
  actionLabel?: string;
@@ -9,7 +23,19 @@ interface MenuHeaderProps {
9
23
  disabledReason?: string;
10
24
  expanded?: boolean;
11
25
  toggle?: boolean;
26
+ rootAttributes?: MenuHeaderRootAttributes;
27
+ triggerAttributes?: MenuHeaderTriggerAttributes;
12
28
  }
13
- declare function MenuHeader({ label, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle }: MenuHeaderProps): SafeHtml;
29
+ type MenuHeaderIndicatorProps = {
30
+ count: number;
31
+ countLabel: string;
32
+ badge?: never;
33
+ } | {
34
+ count?: never;
35
+ countLabel?: never;
36
+ badge?: SafeHtml;
37
+ };
38
+ type MenuHeaderProps = MenuHeaderBaseProps & MenuHeaderIndicatorProps;
39
+ declare function MenuHeader({ label, count, countLabel, badge, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, rootAttributes, triggerAttributes }: MenuHeaderProps): SafeHtml;
14
40
 
15
41
  export { MenuHeader, type MenuHeaderProps };
@@ -1,3 +1,6 @@
1
- export { MenuHeader } from './chunk-OPCJRCYO.js';
1
+ export { MenuHeader } from './chunk-NPPD2A6O.js';
2
+
3
+
4
+
2
5
 
3
6
  //# sourceMappingURL=menu-header.js.map
@@ -1,5 +1,13 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
+ type MenuItemRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
4
+ 'data-component'?: never;
5
+ 'data-action'?: never;
6
+ 'data-item-id'?: never;
7
+ 'data-has-icon'?: never;
8
+ 'data-multiline'?: never;
9
+ 'data-state'?: never;
10
+ }>;
3
11
  interface MenuItemProps {
4
12
  label: string | SafeHtml;
5
13
  icon?: SafeHtml;
@@ -16,7 +24,8 @@ interface MenuItemProps {
16
24
  state?: string;
17
25
  disabled?: boolean;
18
26
  tabIndex?: number;
27
+ rootAttributes?: MenuItemRootAttributes;
19
28
  }
20
- declare function MenuItem({ label, icon, trailing, selected, action, itemId, className, style, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex }: MenuItemProps): SafeHtml;
29
+ declare function MenuItem({ label, icon, trailing, selected, action, itemId, className, style, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, rootAttributes }: MenuItemProps): SafeHtml;
21
30
 
22
31
  export { MenuItem, type MenuItemProps };
package/dist/menu-item.js CHANGED
@@ -1,3 +1,4 @@
1
- export { MenuItem } from './chunk-WY4CAEPG.js';
1
+ export { MenuItem } from './chunk-S3TPM2LP.js';
2
+
2
3
 
3
4
  //# sourceMappingURL=menu-item.js.map
@@ -12,10 +12,12 @@ interface ResizableRegionProps {
12
12
  edge?: ResizableRegionEdge;
13
13
  collapsed?: boolean;
14
14
  transitioning?: boolean;
15
+ /** Decorative dormant content for the separator handle. Must not contain interactive descendants. */
16
+ handleIcon?: SafeHtml;
15
17
  children: SafeHtml | SafeHtml[];
16
18
  }
17
19
  declare const clampRegionSize: (size: number, min: number, max: number) => number;
18
20
  declare const resizeRegionFromPointer: (startSize: number, delta: number, edge: ResizableRegionEdge) => number;
19
- declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, children }: ResizableRegionProps): SafeHtml;
21
+ declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, handleIcon, children }: ResizableRegionProps): SafeHtml;
20
22
 
21
23
  export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionEdge, type ResizableRegionProps, clampRegionSize, resizeRegionFromPointer };
@@ -1,3 +1,3 @@
1
- export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-3O7ZEUW2.js';
1
+ export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-M5JRI6MN.js';
2
2
 
3
3
  //# sourceMappingURL=resizable-region.js.map
package/dist/select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-NHXX4JI5.js';
1
+ export { Select } from './chunk-CTQKI2XL.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=select.js.map
@@ -0,0 +1,152 @@
1
+ .kui-app-tab {
2
+ --kui-app-tab-color: var(--kui-color-neutral-on-quiet);
3
+ --kui-app-tab-hover-background: color-mix(
4
+ in srgb,
5
+ var(--kui-color-surface) 72%,
6
+ transparent
7
+ );
8
+ --kui-app-tab-selected-color: var(--kui-color-brand-on-quiet);
9
+ --kui-app-tab-selected-background: var(--kui-color-surface);
10
+ --kui-app-tab-selected-border: color-mix(
11
+ in srgb,
12
+ var(--kui-color-neutral-border-normal) 80%,
13
+ transparent
14
+ );
15
+ --kui-app-tab-drop-indicator: var(--kui-color-brand-border-normal);
16
+ position: relative;
17
+ display: flex;
18
+ width: max-content;
19
+ min-width: max-content;
20
+ height: 2.5rem;
21
+ box-sizing: border-box;
22
+ border: 1px solid transparent;
23
+ border-radius: var(--kui-layout-pill-radius, calc(1px + 1.3125rem));
24
+ color: var(--kui-app-tab-color);
25
+ background: transparent;
26
+ align-items: center;
27
+ flex: none;
28
+ }
29
+ .kui-app-tab:hover {
30
+ border-color: var(--kui-color-neutral-border-normal);
31
+ background: var(--kui-app-tab-hover-background);
32
+ }
33
+ .kui-app-tab[data-selected="true"] {
34
+ border-color: var(--kui-app-tab-selected-border);
35
+ color: var(--kui-app-tab-selected-color);
36
+ background: var(--kui-app-tab-selected-background);
37
+ box-shadow: var(--kui-shadow-s);
38
+ }
39
+ .kui-app-tab[data-tab-dragging="true"] {
40
+ opacity: 0.55;
41
+ }
42
+ .kui-app-tab[data-tab-drop-position]::after {
43
+ position: absolute;
44
+ z-index: 2;
45
+ top: 0.2rem;
46
+ bottom: 0.2rem;
47
+ width: 2px;
48
+ border-radius: var(--kui-radius-pill);
49
+ background: var(--kui-app-tab-drop-indicator);
50
+ content: "";
51
+ pointer-events: none;
52
+ }
53
+ .kui-app-tab[data-tab-drop-position="before"]::after {
54
+ inset-inline-start: calc(var(--kui-space-2xs) * -1);
55
+ }
56
+ .kui-app-tab[data-tab-drop-position="after"]::after {
57
+ inset-inline-end: calc(var(--kui-space-2xs) * -1);
58
+ }
59
+ .kui-app-tab__select {
60
+ display: flex;
61
+ min-width: 0;
62
+ height: 100%;
63
+ padding: 0 var(--kui-layout-item-padding, 0.5rem);
64
+ border: 0;
65
+ appearance: none;
66
+ color: inherit;
67
+ background: transparent;
68
+ cursor: pointer;
69
+ font: inherit;
70
+ align-items: center;
71
+ gap: var(--kui-layout-item-gap, 0.5rem);
72
+ text-align: start;
73
+ }
74
+ .kui-app-tab:has(.kui-app-tab__close) .kui-app-tab__select {
75
+ padding-inline-start: var(--kui-layout-item-padding, 0.5rem);
76
+ }
77
+ .kui-app-tab:has(.kui-app-tab__select:focus-visible) {
78
+ outline: var(--kui-focus-ring);
79
+ outline-offset: -2px;
80
+ }
81
+ .kui-app-tab__select:focus-visible {
82
+ outline: none;
83
+ }
84
+ .kui-app-tab__close:focus-visible {
85
+ border-radius: var(--kui-radius-pill);
86
+ outline: var(--kui-focus-ring);
87
+ outline-offset: -2px;
88
+ }
89
+ .kui-app-tab__select > svg {
90
+ width: 1rem;
91
+ height: 1rem;
92
+ flex: none;
93
+ }
94
+ .kui-app-tab__name {
95
+ overflow: hidden;
96
+ font-size: var(--kui-font-xs);
97
+ font-weight: 650;
98
+ text-overflow: ellipsis;
99
+ white-space: nowrap;
100
+ }
101
+ .kui-app-tab__trailing {
102
+ display: grid;
103
+ min-width: 1.275rem;
104
+ min-height: 1.275rem;
105
+ flex: none;
106
+ place-items: center;
107
+ }
108
+ .kui-app-tab__close {
109
+ display: grid;
110
+ width: 1.275rem;
111
+ height: 1.275rem;
112
+ margin-inline-start: var(--kui-space-xs);
113
+ padding: 0;
114
+ border: 0;
115
+ appearance: none;
116
+ color: var(--kui-color-neutral-on-quiet);
117
+ background: transparent;
118
+ cursor: pointer;
119
+ flex: none;
120
+ place-items: center;
121
+ }
122
+ .kui-app-tab__close:hover {
123
+ color: var(--kui-color-text);
124
+ }
125
+ .kui-app-tab__close-icon {
126
+ display: grid;
127
+ width: 0.6375rem;
128
+ height: 0.6375rem;
129
+ pointer-events: none;
130
+ place-items: center;
131
+ }
132
+ .kui-app-tab__close-icon > svg {
133
+ width: 100%;
134
+ height: 100%;
135
+ }
136
+ @media (hover: hover) and (pointer: fine) {
137
+ .kui-app-tab__close {
138
+ opacity: 0;
139
+ pointer-events: none;
140
+ transition: opacity 0.12s ease;
141
+ }
142
+ .kui-app-tab:hover .kui-app-tab__close,
143
+ .kui-app-tab:focus-within .kui-app-tab__close {
144
+ opacity: 1;
145
+ pointer-events: auto;
146
+ }
147
+ }
148
+ @media (prefers-reduced-motion: reduce) {
149
+ .kui-app-tab__close {
150
+ transition: none;
151
+ }
152
+ }
@@ -0,0 +1,87 @@
1
+ .kui-dialog-header {
2
+ --kui-dialog-header-border: transparent;
3
+ --kui-dialog-header-icon-background: var(--kui-color-brand-fill-quiet);
4
+ --kui-dialog-header-icon-foreground: var(--kui-color-brand-on-quiet);
5
+ --kui-dialog-header-title-inset: 2px;
6
+ display: grid;
7
+ min-height: 2.75rem;
8
+ margin-inline: var(--kui-layout-inline-margin, 0.5rem);
9
+ padding: var(--kui-layout-item-padding, 0.5rem);
10
+ box-sizing: border-box;
11
+ border: 1px solid var(--kui-dialog-header-border);
12
+ border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
13
+ gap: 0;
14
+ }
15
+
16
+ .kui-dialog-header[data-has-icon="true"] {
17
+ --kui-dialog-header-title-inset: calc(
18
+ 2px + 2.125rem + var(--kui-layout-item-gap, 0.5rem)
19
+ );
20
+ }
21
+
22
+ .kui-dialog-header__toolbar {
23
+ min-height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
24
+ padding: 0;
25
+ }
26
+
27
+ .kui-dialog-header__identity {
28
+ max-width: 100%;
29
+ border-color: transparent;
30
+ background: transparent;
31
+ gap: var(--kui-layout-item-gap, 0.5rem);
32
+ }
33
+
34
+ .kui-dialog-header__icon {
35
+ display: grid;
36
+ width: 2.125rem;
37
+ height: 2.125rem;
38
+ border-radius: var(--kui-radius-circle);
39
+ color: var(--kui-dialog-header-icon-foreground);
40
+ background: var(--kui-dialog-header-icon-background);
41
+ flex: none;
42
+ place-items: center;
43
+ }
44
+
45
+ .kui-dialog-header__icon svg {
46
+ width: 1.5rem;
47
+ height: 1.5rem;
48
+ }
49
+
50
+ .kui-dialog-header__copy {
51
+ min-width: 0;
52
+ overflow: hidden;
53
+ }
54
+
55
+ .kui-dialog-header h2,
56
+ .kui-dialog-header__summary {
57
+ margin: 0;
58
+ }
59
+
60
+ .kui-dialog-header h2 {
61
+ overflow: hidden;
62
+ color: var(--kui-color-text);
63
+ font-size: var(--kui-font-l);
64
+ line-height: 1.2;
65
+ text-overflow: ellipsis;
66
+ white-space: nowrap;
67
+ }
68
+
69
+ .kui-dialog-header__summary {
70
+ min-width: 0;
71
+ margin-block-start: calc(-1 * var(--kui-layout-item-padding, 0.5rem));
72
+ padding-inline: var(--kui-layout-item-padding, 0.5rem);
73
+ padding-inline-start: var(--kui-dialog-header-title-inset);
74
+ color: var(--kui-color-text-quiet);
75
+ }
76
+
77
+ .kui-dialog-header__actions {
78
+ gap: 0;
79
+ }
80
+
81
+ .kui-dialog-header__actions:has(> .kui-toolbar-control-group) {
82
+ height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
83
+ padding: 0;
84
+ border-color: transparent;
85
+ background: transparent;
86
+ gap: var(--kui-layout-item-gap, 0.5rem);
87
+ }
@@ -0,0 +1,23 @@
1
+ .kui-disclosure-arrow {
2
+ display: inline-flex;
3
+ width: var(--kui-disclosure-arrow-size, 1.125rem);
4
+ height: var(--kui-disclosure-arrow-size, 1.125rem);
5
+ flex: none;
6
+ align-items: center;
7
+ justify-content: center;
8
+ transform: rotate(var(--_kui-disclosure-arrow-rotation, 0deg));
9
+ transform-origin: center;
10
+ transition: transform var(--kui-disclosure-arrow-duration, 0.2s) ease;
11
+ }
12
+
13
+ .kui-disclosure-arrow svg {
14
+ display: block;
15
+ width: 100%;
16
+ height: 100%;
17
+ }
18
+
19
+ @media (prefers-reduced-motion: reduce) {
20
+ .kui-disclosure-arrow {
21
+ transition-duration: 0s;
22
+ }
23
+ }
@@ -0,0 +1,47 @@
1
+ .kui-empty-state {
2
+ --kui-empty-state-foreground: var(--kui-color-neutral-on-quiet);
3
+ --kui-empty-state-title: var(--kui-color-text);
4
+ display: grid;
5
+ width: min(
6
+ calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem))),
7
+ 28rem
8
+ );
9
+ min-height: 12rem;
10
+ margin: auto;
11
+ padding: var(--kui-space-xl);
12
+ box-sizing: border-box;
13
+ border: 1px solid var(--kui-empty-state-border, transparent);
14
+ border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
15
+ color: var(--kui-empty-state-foreground);
16
+ background: var(--kui-empty-state-background, transparent);
17
+ place-items: center;
18
+ place-content: center;
19
+ gap: var(--kui-layout-item-gap, 0.5rem);
20
+ text-align: center;
21
+ }
22
+ .kui-empty-state__icon {
23
+ display: grid;
24
+ min-width: 2rem;
25
+ min-height: 2rem;
26
+ margin-block-end: var(--kui-space-xs);
27
+ color: inherit;
28
+ place-items: center;
29
+ }
30
+ .kui-empty-state__icon svg {
31
+ width: 2rem;
32
+ height: 2rem;
33
+ stroke-width: 1.5;
34
+ }
35
+ .kui-empty-state strong {
36
+ color: var(--kui-empty-state-title);
37
+ font-size: var(--kui-font-l);
38
+ font-weight: 650;
39
+ }
40
+ .kui-empty-state > span {
41
+ max-width: 24rem;
42
+ font-size: var(--kui-font-s);
43
+ line-height: 1.45;
44
+ }
45
+ .kui-empty-state__action {
46
+ margin-block-start: var(--kui-space-xs);
47
+ }