@kerfjs/ui 5.0.0-beta.18 → 5.0.0-beta.21

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 (137) hide show
  1. package/README.md +114 -3
  2. package/ai/application-ui-diagnostic-ids-v1.json +92 -0
  3. package/ai/application-ui-profile-sync.cjs +529 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +102 -0
  6. package/ai/application-ui-profile.defaults.json +41 -0
  7. package/ai/application-ui-profile.mjs +626 -0
  8. package/ai/application-ui-profile.schema.json +130 -0
  9. package/ai/catalog-authoring.json +25 -0
  10. package/ai/catalog-authoring.schema.json +61 -0
  11. package/ai/compile-time-contracts-v1.json +101 -0
  12. package/ai/compile-time-contracts-v1.schema.json +49 -0
  13. package/ai/component-catalog-extension-v2.d.ts +7 -0
  14. package/ai/component-catalog-extension-v2.schema.json +7 -0
  15. package/ai/component-catalog-v2-overrides.json +326 -0
  16. package/ai/component-catalog-v2.d.ts +67 -0
  17. package/ai/component-catalog-v2.json +4441 -0
  18. package/ai/component-catalog-v2.schema.json +246 -0
  19. package/ai/component-catalog.json +150 -6
  20. package/ai/public-api-signatures-v1.md +294 -64
  21. package/ai/skill.md +41 -5
  22. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  23. package/analyzer/cli.mjs +46 -0
  24. package/analyzer/index.d.mts +45 -0
  25. package/analyzer/index.mjs +743 -0
  26. package/analyzer/report.schema.json +66 -0
  27. package/dist/browser/pane.js +3 -0
  28. package/dist/browser/sunken-panel.js +3 -0
  29. package/dist/catalog-resources.d.ts +34 -0
  30. package/dist/catalog-resources.js +22 -0
  31. package/dist/catalog-resources.js.map +1 -0
  32. package/dist/catalog.d.ts +21 -3
  33. package/dist/catalog.js +239 -210
  34. package/dist/catalog.js.map +1 -1
  35. package/dist/{chunk-ZK2G3VR5.js → chunk-5VTB2BKP.js} +1 -1
  36. package/dist/chunk-5VTB2BKP.js.map +1 -0
  37. package/dist/{chunk-S3HKPI7I.js → chunk-7KEUJIIC.js} +1 -1
  38. package/dist/chunk-7KEUJIIC.js.map +1 -0
  39. package/dist/{chunk-NVWXKU37.js → chunk-AASLYRGE.js} +1 -1
  40. package/dist/chunk-AASLYRGE.js.map +1 -0
  41. package/dist/{chunk-ENVTNLYC.js → chunk-CN2XNTAM.js} +6 -6
  42. package/dist/chunk-CN2XNTAM.js.map +1 -0
  43. package/dist/{chunk-QIRXYKCE.js → chunk-DSNIYOZ3.js} +3 -2
  44. package/dist/chunk-DSNIYOZ3.js.map +1 -0
  45. package/dist/chunk-JRKSK2HX.js +79 -0
  46. package/dist/chunk-JRKSK2HX.js.map +1 -0
  47. package/dist/{chunk-U5IFGQCD.js → chunk-K57KRAOV.js} +1 -1
  48. package/dist/chunk-K57KRAOV.js.map +1 -0
  49. package/dist/{chunk-ZVI5YST2.js → chunk-M7JBER5U.js} +1 -1
  50. package/dist/chunk-M7JBER5U.js.map +1 -0
  51. package/dist/{chunk-43FUQH35.js → chunk-OHU6CI22.js} +2 -2
  52. package/dist/{chunk-43FUQH35.js.map → chunk-OHU6CI22.js.map} +1 -1
  53. package/dist/{chunk-4TRDV6RL.js → chunk-OZWU5ZPZ.js} +1 -1
  54. package/dist/chunk-OZWU5ZPZ.js.map +1 -0
  55. package/dist/{chunk-JTHUXDN2.js → chunk-RYRIFZCT.js} +3 -3
  56. package/dist/chunk-RYRIFZCT.js.map +1 -0
  57. package/dist/{chunk-6ETZKKAE.js → chunk-VLYV65LK.js} +1 -1
  58. package/dist/chunk-VLYV65LK.js.map +1 -0
  59. package/dist/chunk-W4CXQYSG.js +23 -0
  60. package/dist/chunk-W4CXQYSG.js.map +1 -0
  61. package/dist/{chunk-S3PCZ7NV.js → chunk-W7YD6E4N.js} +1 -1
  62. package/dist/chunk-W7YD6E4N.js.map +1 -0
  63. package/dist/index.d.ts +6 -4
  64. package/dist/index.js +14 -12
  65. package/dist/list-header.d.ts +29 -8
  66. package/dist/list-header.js +1 -1
  67. package/dist/nav-stack.js +1 -1
  68. package/dist/pane.d.ts +49 -0
  69. package/dist/pane.js +4 -0
  70. package/dist/pane.js.map +1 -0
  71. package/dist/panel-header.d.ts +9 -3
  72. package/dist/panel-header.js +1 -1
  73. package/dist/segmented-control.d.ts +6 -6
  74. package/dist/segmented-control.js +1 -1
  75. package/dist/select.d.ts +10 -4
  76. package/dist/select.js +1 -1
  77. package/dist/split-view.js +2 -2
  78. package/dist/state-banner.d.ts +3 -2
  79. package/dist/state-banner.js +1 -1
  80. package/dist/styles/catalog.css +6 -6
  81. package/dist/styles/layout.css +2 -20
  82. package/dist/styles/pane.css +62 -0
  83. package/dist/styles/segmented-control.css +3 -7
  84. package/dist/styles/sunken-panel.css +18 -0
  85. package/dist/sunken-panel.d.ts +16 -0
  86. package/dist/sunken-panel.js +3 -0
  87. package/dist/sunken-panel.js.map +1 -0
  88. package/dist/tab-bar.d.ts +3 -2
  89. package/dist/tab-bar.js +1 -1
  90. package/dist/tab-scaffold.d.ts +6 -6
  91. package/dist/tab-scaffold.js.map +1 -1
  92. package/dist/token-search-field.d.ts +25 -9
  93. package/dist/token-search-field.js +1 -1
  94. package/dist/toolbar-control-group.d.ts +9 -5
  95. package/dist/toolbar-control-group.js +1 -1
  96. package/dist/toolbar-text.d.ts +10 -11
  97. package/dist/toolbar-text.js +1 -1
  98. package/dist/wire-tab-bars.d.ts +5 -2
  99. package/dist/wire-tab-bars.js +1 -1
  100. package/dist/wire-token-search-fields.d.ts +11 -6
  101. package/dist/wire-token-search-fields.js +1 -1
  102. package/docs/catalog.md +186 -67
  103. package/docs/component-contract.md +102 -5
  104. package/docs/component-selection.md +9 -5
  105. package/docs/design-philosophy.md +2 -4
  106. package/docs/examples/application-ui-profile.json +60 -0
  107. package/docs/examples/component-catalog-extension-v2.json +81 -0
  108. package/docs/layout.md +42 -23
  109. package/docs/sunken-panel.md +43 -0
  110. package/docs/type-contracts.md +99 -0
  111. package/docs/ui-analyzer.md +81 -0
  112. package/docs/ui-doctor.md +77 -0
  113. package/docs/ui-evaluator.md +122 -0
  114. package/doctor/cli.mjs +115 -0
  115. package/doctor/config.schema.json +68 -0
  116. package/doctor/index.d.mts +116 -0
  117. package/doctor/index.mjs +1256 -0
  118. package/doctor/report.schema.json +118 -0
  119. package/evaluator/cli.mjs +89 -0
  120. package/evaluator/index.d.mts +90 -0
  121. package/evaluator/index.mjs +1138 -0
  122. package/evaluator/report.schema.json +152 -0
  123. package/llms.txt +40 -3
  124. package/package.json +66 -8
  125. package/ux-demo/recipes/compact-toolbar.tsx +2 -2
  126. package/ux-demo/recipes/composer-form.tsx +1 -1
  127. package/dist/chunk-4TRDV6RL.js.map +0 -1
  128. package/dist/chunk-6ETZKKAE.js.map +0 -1
  129. package/dist/chunk-ENVTNLYC.js.map +0 -1
  130. package/dist/chunk-JTHUXDN2.js.map +0 -1
  131. package/dist/chunk-NVWXKU37.js.map +0 -1
  132. package/dist/chunk-QIRXYKCE.js.map +0 -1
  133. package/dist/chunk-S3HKPI7I.js.map +0 -1
  134. package/dist/chunk-S3PCZ7NV.js.map +0 -1
  135. package/dist/chunk-U5IFGQCD.js.map +0 -1
  136. package/dist/chunk-ZK2G3VR5.js.map +0 -1
  137. package/dist/chunk-ZVI5YST2.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { ToolbarText } from './chunk-S3PCZ7NV.js';
1
+ import { ToolbarText } from './chunk-W7YD6E4N.js';
2
2
  import { jsxs, jsx } from 'kerfjs/jsx-runtime';
3
3
 
4
4
  function NavStack({
@@ -80,4 +80,4 @@ function NavStack({
80
80
 
81
81
  export { NavStack };
82
82
 
83
- //# sourceMappingURL=chunk-43FUQH35.js.map
83
+ //# sourceMappingURL=chunk-OHU6CI22.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/nav-stack.tsx"],"names":[],"mappings":"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","file":"chunk-43FUQH35.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { ToolbarText } from './toolbar-text.js';\n\n/**\n * One entry in a {@link NavStack}. The app owns the stack as an array (usually a\n * signal); `NavStack` renders it and `wireNavStack` animates the transitions.\n */\nexport interface NavStackView {\n /** Stable identity for keyed reconcile and transition direction. */\n key: string;\n content: SafeHtml;\n /** Title shown in the top toolbar for this view. */\n title?: string;\n /** Trailing actions for this view's top toolbar. */\n toolbar?: SafeHtml;\n}\n\nexport interface NavStackProps {\n id: string;\n /** Accessible name for the stack region. */\n label: string;\n /** The stack, root first; the last entry is the active top view. */\n views: NavStackView[];\n /** Accessible label for the back control (default \"Back\"). */\n backLabel?: string;\n /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */\n hideToolbar?: boolean;\n /** Optional persistent bottom toolbar. */\n bottomToolbar?: SafeHtml;\n className?: string;\n}\n\n/**\n * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last\n * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and\n * cross-fades the chrome across a change. A single-pane layout is a `NavStack`\n * with one entry. See `docs/23-app-layouts.md` §3.1.\n */\nexport function NavStack({\n id,\n label,\n views,\n backLabel = 'Back',\n hideToolbar = false,\n bottomToolbar,\n className = '',\n}: NavStackProps) {\n const topIndex = views.length - 1;\n const top = views[topIndex];\n const canPop = views.length > 1;\n return (\n <section\n class={`kui-nav-stack ${className}`.trim()}\n id={id}\n data-component=\"nav-stack\"\n data-nav-stack-id={id}\n data-depth={String(views.length)}\n aria-label={label}\n >\n {!hideToolbar && (\n <header class=\"kui-nav-stack__chrome\" data-nav-stack-chrome>\n <div class=\"kui-nav-stack__lead\">\n {canPop && (\n <button\n type=\"button\"\n class=\"kui-nav-stack__back\"\n data-nav-back\n aria-label={backLabel}\n >\n <svg\n class=\"kui-nav-stack__back-icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n aria-hidden=\"true\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n )}\n <ToolbarText\n text={top?.title ?? ''}\n size=\"large\"\n className=\"kui-nav-stack__title\"\n />\n </div>\n {top?.toolbar && (\n <div class=\"kui-nav-stack__actions\">{top.toolbar}</div>\n )}\n </header>\n )}\n <div class=\"kui-nav-stack__viewport\" data-nav-stack-viewport>\n {views.map((view, index) => (\n <article\n class=\"kui-nav-stack__view\"\n data-key={view.key}\n data-nav-key={view.key}\n data-nav-active={String(index === topIndex)}\n aria-hidden={String(index !== topIndex)}\n >\n {view.content}\n </article>\n ))}\n </div>\n {bottomToolbar && (\n <footer class=\"kui-nav-stack__bottom\" data-nav-stack-bottom>\n {bottomToolbar}\n </footer>\n )}\n </section>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/nav-stack.tsx"],"names":[],"mappings":";;;AAuCO,SAAS,QAAA,CAAS;AAAA,EACvB,EAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,MAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd,aAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAkB;AAChB,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,MAAM,QAAQ,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA;AAC9B,EAAA,uBACE,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACzC,EAAA;AAAA,MACA,gBAAA,EAAe,WAAA;AAAA,MACf,mBAAA,EAAmB,EAAA;AAAA,MACnB,YAAA,EAAY,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAAA,MAC/B,YAAA,EAAY,KAAA;AAAA,MAEX,QAAA,EAAA;AAAA,QAAA,CAAC,+BACA,IAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,uBAAA,EAAwB,yBAAqB,IAAA,EACzD,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAM,qBAAA,EACR,QAAA,EAAA;AAAA,YAAA,MAAA,oBACC,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,KAAA,EAAM,qBAAA;AAAA,gBACN,eAAA,EAAa,IAAA;AAAA,gBACb,YAAA,EAAY,SAAA;AAAA,gBAEZ,QAAA,kBAAA,GAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAM,0BAAA;AAAA,oBACN,OAAA,EAAQ,WAAA;AAAA,oBACR,KAAA,EAAM,IAAA;AAAA,oBACN,MAAA,EAAO,IAAA;AAAA,oBACP,aAAA,EAAY,MAAA;AAAA,oBACZ,IAAA,EAAK,MAAA;AAAA,oBACL,MAAA,EAAO,cAAA;AAAA,oBACP,cAAA,EAAa,GAAA;AAAA,oBACb,gBAAA,EAAe,OAAA;AAAA,oBACf,iBAAA,EAAgB,OAAA;AAAA,oBAEhB,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA;AAAA;AAC3B;AAAA,aACF;AAAA,4BAEF,GAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,KAAK,KAAA,IAAS,EAAA;AAAA,gBACpB,IAAA,EAAK,OAAA;AAAA,gBACL,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,UACC,KAAK,OAAA,oBACJ,GAAA,CAAC,SAAI,KAAA,EAAM,wBAAA,EAA0B,cAAI,OAAA,EAAQ;AAAA,SAAA,EAErD,CAAA;AAAA,wBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,yBAAA,EAA0B,yBAAA,EAAuB,MACzD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,qBAChB,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,qBAAA;AAAA,YACN,YAAU,IAAA,CAAK,GAAA;AAAA,YACf,gBAAc,IAAA,CAAK,GAAA;AAAA,YACnB,iBAAA,EAAiB,MAAA,CAAO,KAAA,KAAU,QAAQ,CAAA;AAAA,YAC1C,aAAA,EAAa,MAAA,CAAO,KAAA,KAAU,QAAQ,CAAA;AAAA,YAErC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,SAET,CAAA,EACH,CAAA;AAAA,QACC,iCACC,GAAA,CAAC,QAAA,EAAA,EAAO,OAAM,uBAAA,EAAwB,uBAAA,EAAqB,MACxD,QAAA,EAAA,aAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-OHU6CI22.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { ToolbarText } from './toolbar-text.js';\n\n/**\n * One entry in a {@link NavStack}. The app owns the stack as an array (usually a\n * signal); `NavStack` renders it and `wireNavStack` animates the transitions.\n */\nexport interface NavStackView {\n /** Stable identity for keyed reconcile and transition direction. */\n key: string;\n content: SafeHtml;\n /** Title shown in the top toolbar for this view. */\n title?: string;\n /** Trailing actions for this view's top toolbar. */\n toolbar?: SafeHtml;\n}\n\nexport interface NavStackProps {\n id: string;\n /** Accessible name for the stack region. */\n label: string;\n /** The stack, root first; the last entry is the active top view. */\n views: NavStackView[];\n /** Accessible label for the back control (default \"Back\"). */\n backLabel?: string;\n /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */\n hideToolbar?: boolean;\n /** Optional persistent bottom toolbar. */\n bottomToolbar?: SafeHtml;\n className?: string;\n}\n\n/**\n * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last\n * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and\n * cross-fades the chrome across a change. A single-pane layout is a `NavStack`\n * with one entry. See `docs/23-app-layouts.md` §3.1.\n */\nexport function NavStack({\n id,\n label,\n views,\n backLabel = 'Back',\n hideToolbar = false,\n bottomToolbar,\n className = '',\n}: NavStackProps) {\n const topIndex = views.length - 1;\n const top = views[topIndex];\n const canPop = views.length > 1;\n return (\n <section\n class={`kui-nav-stack ${className}`.trim()}\n id={id}\n data-component=\"nav-stack\"\n data-nav-stack-id={id}\n data-depth={String(views.length)}\n aria-label={label}\n >\n {!hideToolbar && (\n <header class=\"kui-nav-stack__chrome\" data-nav-stack-chrome>\n <div class=\"kui-nav-stack__lead\">\n {canPop && (\n <button\n type=\"button\"\n class=\"kui-nav-stack__back\"\n data-nav-back\n aria-label={backLabel}\n >\n <svg\n class=\"kui-nav-stack__back-icon\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n aria-hidden=\"true\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n )}\n <ToolbarText\n text={top?.title ?? ''}\n size=\"large\"\n className=\"kui-nav-stack__title\"\n />\n </div>\n {top?.toolbar && (\n <div class=\"kui-nav-stack__actions\">{top.toolbar}</div>\n )}\n </header>\n )}\n <div class=\"kui-nav-stack__viewport\" data-nav-stack-viewport>\n {views.map((view, index) => (\n <article\n class=\"kui-nav-stack__view\"\n data-key={view.key}\n data-nav-key={view.key}\n data-nav-active={String(index === topIndex)}\n aria-hidden={String(index !== topIndex)}\n >\n {view.content}\n </article>\n ))}\n </div>\n {bottomToolbar && (\n <footer class=\"kui-nav-stack__bottom\" data-nav-stack-bottom>\n {bottomToolbar}\n </footer>\n )}\n </section>\n );\n}\n"]}
@@ -54,4 +54,4 @@ function SegmentedControl({
54
54
 
55
55
  export { SegmentedControl };
56
56
 
57
- //# sourceMappingURL=chunk-4TRDV6RL.js.map
57
+ //# sourceMappingURL=chunk-OZWU5ZPZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/segmented-control.tsx"],"names":[],"mappings":";;;AAgCO,SAAS,gBAAA,CAAuC;AAAA,EACrD,EAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,gBAAA;AAAA,EACT,UAAA,GAAa,QAAA;AAAA,EACb,KAAA,GAAQ,SAAA;AAAA,EACR,IAAA,GAAO,SAAA;AAAA,EACP,MAAA,GAAS,SAAA;AAAA,EACT,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc;AAChB,CAAA,EAAiC;AAC/B,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACjD,gBAAA,EAAe,mBAAA;AAAA,MACf,2BAAA,EAA2B,EAAA;AAAA,MAC3B,YAAA,EAAY,KAAA;AAAA,MACZ,iBAAA,EAAiB,UAAA;AAAA,MACjB,YAAA,EAAY,KAAA;AAAA,MACZ,WAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAa,MAAA;AAAA,MACb,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,IAAA,EAAK,OAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,WAAA,EAAW,cAAc,MAAA,GAAS,MAAA;AAAA,MAEjC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACvB,QAAA,MAAM,QAAA,GAAW,OAAO,KAAA,KAAU,KAAA;AAClC,QAAA,uBACE,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,6BAAA;AAAA,YACN,aAAA,EAAa,cAAc,MAAA,GAAY,MAAA;AAAA,YACvC,sBAAoB,MAAA,CAAO,KAAA;AAAA,YAC3B,eAAA,EAAe,OAAO,QAAQ,CAAA;AAAA,YAC9B,cAAY,MAAA,CAAO,KAAA;AAAA,YACnB,cAAA,EAAc,OAAO,QAAQ,CAAA;AAAA,YAC7B,KAAA,EAAO,WAAA,GAAc,MAAA,GAAY,MAAA,CAAO,KAAA;AAAA,YACxC,QAAA,EAAU,OAAO,QAAA,IAAY,WAAA;AAAA,YAC7B,QAAA,EAAU,cAAc,IAAA,GAAO,GAAA;AAAA,YAE9B,QAAA,EAAA,WAAA,mBACC,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,KAAA,EAAM,CAAA,GAErB,MAAA,CAAO,OAAA,oBAAW,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM;AAAA;AAAA,SAE3C;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ","file":"chunk-OZWU5ZPZ.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { Skeleton } from './skeleton.js';\n\nexport type SegmentedControlAppearance = 'filled' | 'outlined' | 'toolbar';\nexport type SegmentedControlShape = 'rounded' | 'pill';\nexport type SegmentedControlSize = 'small' | 'default';\nexport type SegmentedControlLayout = 'content' | 'equal';\n\nexport interface SegmentedControlChoice<Value extends string = string> {\n value: Value;\n label: string;\n content?: SafeHtml;\n title?: string;\n disabled?: boolean;\n}\n\nexport interface SegmentedControlProps<Value extends string = string> {\n id: string;\n label: string;\n value: NoInfer<Value>;\n choices: readonly SegmentedControlChoice<Value>[];\n action?: string;\n appearance?: SegmentedControlAppearance;\n shape?: SegmentedControlShape;\n size?: SegmentedControlSize;\n layout?: SegmentedControlLayout;\n className?: string;\n /** Render as an unanimated loading skeleton, disabling every segment. */\n placeholder?: boolean;\n}\n\nexport function SegmentedControl<Value extends string>({\n id,\n label,\n value,\n choices,\n action = 'select-segment',\n appearance = 'filled',\n shape = 'rounded',\n size = 'default',\n layout = 'content',\n className = '',\n placeholder = false,\n}: SegmentedControlProps<Value>) {\n return (\n <div\n class={`kui-segmented-control ${className}`.trim()}\n data-component=\"segmented-control\"\n data-segmented-control-id={id}\n data-value={value}\n data-appearance={appearance}\n data-shape={shape}\n data-size={size}\n data-layout={layout}\n data-placeholder={placeholder ? 'true' : undefined}\n role=\"group\"\n aria-label={label}\n aria-busy={placeholder ? 'true' : undefined}\n >\n {choices.map((choice) => {\n const selected = choice.value === value;\n return (\n <button\n type=\"button\"\n class=\"kui-segmented-control__item\"\n data-action={placeholder ? undefined : action}\n data-segment-value={choice.value}\n data-selected={String(selected)}\n aria-label={choice.label}\n aria-pressed={String(selected)}\n title={placeholder ? undefined : choice.title}\n disabled={choice.disabled || placeholder}\n tabindex={placeholder ? '-1' : '0'}\n >\n {placeholder ? (\n <Skeleton width=\"4em\" />\n ) : (\n (choice.content ?? <span>{choice.label}</span>)\n )}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { ToolbarText } from './chunk-S3PCZ7NV.js';
2
- import { ToolbarControlGroup } from './chunk-ZK2G3VR5.js';
1
+ import { ToolbarText } from './chunk-W7YD6E4N.js';
3
2
  import { Toolbar } from './chunk-7L6EHUMV.js';
3
+ import { ToolbarControlGroup } from './chunk-5VTB2BKP.js';
4
4
  import { Skeleton } from './chunk-PZQVSDLH.js';
5
5
  import { jsxs, jsx, Fragment } from 'kerfjs/jsx-runtime';
6
6
 
@@ -55,4 +55,4 @@ function PanelHeader({
55
55
 
56
56
  export { PanelHeader };
57
57
 
58
- //# sourceMappingURL=chunk-JTHUXDN2.js.map
58
+ //# sourceMappingURL=chunk-RYRIFZCT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/panel-header.tsx"],"names":[],"mappings":";;;;;;AA0CO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA,GAAgB,EAAA;AAAA,EAChB,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAqB;AACnB,EAAA,MAAM,2BACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,IAAA,oBACC,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAM,IAAA;AAAA,QACN,SAAA,EAAW,CAAA,uBAAA,EAA0B,aAAa,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,QAEzD,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAEF,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,KAAA;AAAA,QACN,IAAA,EAAK,QAAA;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,SAAA,EAAU,yBAAA;AAAA,QACV,YAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAGF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,kBAAA;AAAA,MACN,gBAAA,EAAe,cAAA;AAAA,MACf,eAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MACnC,kBAAA,EAAkB,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,MACzC,kBAAA,EAAkB,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,MACzC,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MAEzC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAQ,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,SAAS,KAAA,EAAO,CAAA;AAAA,QAC9D,OAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAM,2BAAA,EAA4B,EAAA,EAAI,SAAA,EACtC,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,IAAK,OAAA,EAC7C;AAAA;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-RYRIFZCT.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { Skeleton } from './skeleton.js';\nimport { Toolbar } from './toolbar.js';\nimport { ToolbarControlGroup } from './toolbar-control-group.js';\nimport { type HeadingLevel, ToolbarText } from './toolbar-text.js';\n\ninterface PanelHeaderBaseProps {\n title: string;\n titleId: string;\n icon?: SafeHtml;\n iconClassName?: string;\n actions?: SafeHtml;\n /**\n * Expose the title as a heading landmark (`role=\"heading\"` + `aria-level`). Set it\n * for a PAGE or view heading so screen-reader heading navigation works and the view\n * has a primary heading; omit it (the default) for a dialog title, which is instead\n * referenced via `aria-labelledby={titleId}` and needs no heading landmark.\n */\n headingLevel?: HeadingLevel;\n /** Render the title and summary as unanimated loading skeletons, keeping the icon and actions. */\n placeholder?: boolean;\n}\n\ntype PanelHeaderSummaryProps =\n | { summary: string; summaryId?: string }\n | { summary?: never; summaryId?: never };\n\nexport type PanelHeaderProps = PanelHeaderBaseProps & PanelHeaderSummaryProps;\n\n/**\n * The heading of a panel, dialog, or page: a plain `Toolbar` whose leading zone\n * holds an optional icon control group and the title as extra-large `ToolbarText`,\n * whose trailing zone holds the app's action controls, and with an optional\n * subtitle on its own row, left-aligned with the title.\n *\n * PanelHeader overrides no Toolbar styles — it is just a Toolbar with an xl title.\n * The only styling it adds is the icon group's fill/border color and the subtitle.\n * When no icon is provided, the icon group is omitted entirely. The `actions` slot\n * is passed straight into the toolbar's trailing zone; the app supplies whatever\n * trailing controls it needs (typically a `ToolbarControlGroup`).\n */\nexport function PanelHeader({\n title,\n titleId,\n summary,\n summaryId,\n icon,\n iconClassName = '',\n actions,\n headingLevel,\n placeholder = false,\n}: PanelHeaderProps) {\n const identity = (\n <>\n {icon && (\n <ToolbarControlGroup\n single\n className={`kui-panel-header__icon ${iconClassName}`.trim()}\n >\n {icon}\n </ToolbarControlGroup>\n )}\n <ToolbarText\n text={title}\n size=\"xlarge\"\n id={titleId}\n className=\"kui-panel-header__title\"\n headingLevel={headingLevel}\n placeholder={placeholder}\n />\n </>\n );\n\n return (\n <div\n class=\"kui-panel-header\"\n data-component=\"panel-header\"\n data-has-icon={String(Boolean(icon))}\n data-has-actions={String(Boolean(actions))}\n data-has-summary={String(Boolean(summary))}\n data-placeholder={placeholder ? 'true' : undefined}\n >\n <Toolbar leading={identity} trailing={actions} divider={false} />\n {summary && (\n <p class=\"kui-panel-header__summary\" id={summaryId}>\n {placeholder ? <Skeleton width=\"18em\" /> : summary}\n </p>\n )}\n </div>\n );\n}\n"]}
@@ -35,4 +35,4 @@ function StateBanner({
35
35
 
36
36
  export { StateBanner };
37
37
 
38
- //# sourceMappingURL=chunk-6ETZKKAE.js.map
38
+ //# sourceMappingURL=chunk-VLYV65LK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/state-banner.tsx"],"names":[],"mappings":";;;AAoBO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,OAAA,GAAU,QAAA;AAAA,EACV,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc;AAChB,CAAA,EAAqB;AACnB,EAAA,uBACE,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,IAAA,EAAM,OAAA;AAAA,MACN,WAAA,EAAW,OAAA,KAAY,OAAA,GAAU,WAAA,GAAc,QAAA;AAAA,MAC/C,WAAA,EAAW,cAAc,MAAA,GAAS,MAAA;AAAA,MAEjC,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAA0B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBACpD,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,wBAAA,EACT,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAQ,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,YAAS,KAAA,EAAM,MAAA,EAAO,IAAK,KAAA,EAAM,CAAA;AAAA,UAAA,CACvD,WAAA,IAAe,MAAA,qBACf,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,uBAAe,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,CAAA,GAAK,MAAA,EAAO;AAAA,SAAA,EAE5D,CAAA;AAAA,QACC,MAAA,oBAAU,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAA4B,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,GAC3D;AAEJ","file":"chunk-VLYV65LK.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { Skeleton } from './skeleton.js';\n\nexport type StateBannerTone =\n 'neutral' | 'info' | 'success' | 'warning' | 'danger';\nexport type StateBannerUrgency = 'status' | 'alert';\n\nexport interface StateBannerProps {\n title: string;\n detail?: string;\n icon?: SafeHtml;\n action?: SafeHtml;\n tone?: StateBannerTone;\n urgency?: StateBannerUrgency;\n className?: string;\n /** Render the title and detail as unanimated loading skeletons, keeping the icon and tone. */\n placeholder?: boolean;\n}\n\nexport function StateBanner({\n title,\n detail,\n icon,\n action,\n tone = 'info',\n urgency = 'status',\n className = '',\n placeholder = false,\n}: StateBannerProps) {\n return (\n <section\n class={`kui-state-banner ${className}`.trim()}\n data-component=\"state-banner\"\n data-tone={tone}\n data-placeholder={placeholder ? 'true' : undefined}\n role={urgency}\n aria-live={urgency === 'alert' ? 'assertive' : 'polite'}\n aria-busy={placeholder ? 'true' : undefined}\n >\n {icon && <span class=\"kui-state-banner__icon\">{icon}</span>}\n <div class=\"kui-state-banner__copy\">\n <strong>{placeholder ? <Skeleton width=\"10em\" /> : title}</strong>\n {(placeholder || detail) && (\n <span>{placeholder ? <Skeleton width=\"16em\" /> : detail}</span>\n )}\n </div>\n {action && <div class=\"kui-state-banner__action\">{action}</div>}\n </section>\n );\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import { jsx } from 'kerfjs/jsx-runtime';
2
+
3
+ // src/sunken-panel.tsx
4
+ function SunkenPanel({
5
+ children,
6
+ ariaLabel,
7
+ className = ""
8
+ }) {
9
+ return /* @__PURE__ */ jsx(
10
+ "div",
11
+ {
12
+ class: `kui-sunken-panel ${className}`.trim(),
13
+ "data-component": "sunken-panel",
14
+ role: ariaLabel ? "region" : void 0,
15
+ "aria-label": ariaLabel,
16
+ children
17
+ }
18
+ );
19
+ }
20
+
21
+ export { SunkenPanel };
22
+
23
+ //# sourceMappingURL=chunk-W4CXQYSG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sunken-panel.tsx"],"names":[],"mappings":";;;AAcO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAqB;AACnB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,IAAA,EAAM,YAAY,QAAA,GAAW,MAAA;AAAA,MAC7B,YAAA,EAAY,SAAA;AAAA,MAEX;AAAA;AAAA,GACH;AAEJ","file":"chunk-W4CXQYSG.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nexport interface SunkenPanelProps {\n children?: SafeHtml | readonly SafeHtml[];\n /** Optional accessible landmark name for a distinct application region. */\n ariaLabel?: string;\n className?: string;\n}\n\n/**\n * A lowered application surface with one compact inset and a vertical content\n * stack. The panel owns its background and padding; children own their own\n * borders and internal geometry.\n */\nexport function SunkenPanel({\n children,\n ariaLabel,\n className = '',\n}: SunkenPanelProps) {\n return (\n <div\n class={`kui-sunken-panel ${className}`.trim()}\n data-component=\"sunken-panel\"\n role={ariaLabel ? 'region' : undefined}\n aria-label={ariaLabel}\n >\n {children}\n </div>\n );\n}\n"]}
@@ -35,4 +35,4 @@ function ToolbarText({
35
35
 
36
36
  export { ToolbarText };
37
37
 
38
- //# sourceMappingURL=chunk-S3PCZ7NV.js.map
38
+ //# sourceMappingURL=chunk-W7YD6E4N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/toolbar-text.tsx"],"names":[],"mappings":";;;AA2CO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,SAAA,GAAY,EAAA;AAAA,EACZ,EAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,IAAA,GAAO,KAAA;AAAA,EACP,QAAA,GAAW,IAAA;AAAA,EACX,QAAA,GAAW;AACb,CAAA,EAAqB;AACnB,EAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,QAAA,IAAY,IAAA,IAAQ,QAAA,GAAW,CAAA;AACtD,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,eAAA,EAAe,WAAW,MAAA,GAAY,OAAA;AAAA,MACtC,gBAAA,EAAgB,MAAA,GAAS,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAAA,MAC5C,KAAA,EAAO,MAAA,GAAS,CAAA,6BAAA,EAAgC,QAAQ,CAAA,CAAA,GAAK,MAAA;AAAA,MAC7D,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,EAAA;AAAA,MACA,IAAA,EAAM,eAAe,SAAA,GAAY,MAAA;AAAA,MACjC,YAAA,EAAY,YAAA,GAAe,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA;AAAA,MAClD,WAAA,EAAW,cAAc,MAAA,GAAS,MAAA;AAAA,MAEjC,QAAA,EAAA,WAAA,mBACC,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,KAAA,EAAM,oBAEtB,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAA0B,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA,GAE/C;AAEJ","file":"chunk-W7YD6E4N.js","sourcesContent":["import { Skeleton } from './skeleton.js';\n\nexport type ToolbarTextSize = 'xlarge' | 'large' | 'default' | 'small';\n\n/** ARIA heading level for a title exposed as a heading landmark. */\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\ninterface ToolbarTextBaseProps {\n text: string;\n size?: ToolbarTextSize;\n className?: string;\n /** Optional id, e.g. so a dialog can reference the title via aria-labelledby. */\n id?: string;\n /**\n * Expose heading semantics (`role=\"heading\"` + `aria-level`) so the text acts as\n * a heading landmark — e.g. a page's primary title. Omit to keep the plain span\n * (the default), which suits a dialog title referenced via `aria-labelledby`.\n */\n headingLevel?: HeadingLevel;\n /** Render the text as an unanimated loading skeleton instead of its value. */\n placeholder?: boolean;\n /**\n * Show a trailing ellipsis (…) where the text is truncated — on the single line\n * (default), or at the `maxLines` boundary when wrapping. Set false to hard-clip\n * instead. Default true.\n */\n ellipsis?: boolean;\n /**\n * Cap wrapped text to this many lines, truncating past it. Only takes effect with\n * `wrap`; ignored on a single line. `null`/omitted wraps without a line cap. Default null.\n */\n}\n\ntype ToolbarTextWrappingProps =\n | {\n /** Wrap onto multiple lines; combine with `maxLines` to cap them. */\n wrap: true;\n maxLines?: number | null;\n }\n | { wrap?: false; maxLines?: never };\n\nexport type ToolbarTextProps = ToolbarTextBaseProps & ToolbarTextWrappingProps;\n\nexport function ToolbarText({\n text,\n size = 'default',\n className = '',\n id,\n headingLevel,\n placeholder = false,\n wrap = false,\n ellipsis = true,\n maxLines = null,\n}: ToolbarTextProps) {\n const capped = wrap && maxLines != null && maxLines > 0;\n return (\n <span\n class={`kui-toolbar-text ${className}`.trim()}\n data-component=\"toolbar-text\"\n data-size={size}\n data-wrap={wrap ? 'true' : undefined}\n data-ellipsis={ellipsis ? undefined : 'false'}\n data-max-lines={capped ? String(maxLines) : undefined}\n style={capped ? `--kui-toolbar-text-max-lines:${maxLines}` : undefined}\n data-placeholder={placeholder ? 'true' : undefined}\n id={id}\n role={headingLevel ? 'heading' : undefined}\n aria-level={headingLevel ? String(headingLevel) : undefined}\n aria-busy={placeholder ? 'true' : undefined}\n >\n {placeholder ? (\n <Skeleton width=\"8em\" />\n ) : (\n <span class=\"kui-toolbar-text__text\">{text}</span>\n )}\n </span>\n );\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -9,16 +9,18 @@ export { ListInsetText, ListInsetTextProps } from './list-inset-text.js';
9
9
  export { ListItem, ListItemProps } from './list-item.js';
10
10
  export { LoadingSpinner, LoadingSpinnerProps } from './loading-spinner.js';
11
11
  export { LucideIcon, LucideIconProps, LucideNode } from './lucide-icon.js';
12
+ export { Pane, PaneContentElement, PaneElement, PaneProps, PaneSeparatorSide } from './pane.js';
12
13
  export { PanelHeader, PanelHeaderProps } from './panel-header.js';
13
14
  export { ResizableRegion, ResizableRegionAxis, ResizableRegionEdge, ResizableRegionProps, clampRegionSize, resizeRegionFromPointer } from './resizable-region.js';
14
15
  export { SegmentedControl, SegmentedControlAppearance, SegmentedControlChoice, SegmentedControlLayout, SegmentedControlProps, SegmentedControlShape, SegmentedControlSize } from './segmented-control.js';
15
16
  export { Select, SelectChoice, SelectProps } from './select.js';
16
17
  export { Skeleton, SkeletonProps } from './skeleton.js';
17
- export { StateBanner, StateBannerProps, StateBannerTone } from './state-banner.js';
18
- export { TabBar, TabBarProps } from './tab-bar.js';
19
- export { TokenSearchField, TokenSearchFieldProps, TokenSearchFieldValue, TokenSearchToken, placeTokenSearchCaret, readTokenSearchField } from './token-search-field.js';
18
+ export { StateBanner, StateBannerProps, StateBannerTone, StateBannerUrgency } from './state-banner.js';
19
+ export { SunkenPanel, SunkenPanelProps } from './sunken-panel.js';
20
+ export { TabActivation, TabBar, TabBarProps } from './tab-bar.js';
21
+ export { TokenSearchEditorAttributes, TokenSearchField, TokenSearchFieldProps, TokenSearchFieldValue, TokenSearchToken, placeTokenSearchCaret, readTokenSearchField } from './token-search-field.js';
20
22
  export { Toolbar, ToolbarProps } from './toolbar.js';
21
- export { ToolbarControlGroup, ToolbarControlGroupProps } from './toolbar-control-group.js';
23
+ export { ToolbarControlGroup, ToolbarControlGroupAppearance, ToolbarControlGroupButtonAppearance, ToolbarControlGroupProps, ToolbarControlGroupShape, ToolbarControlGroupTone } from './toolbar-control-group.js';
22
24
  export { HeadingLevel, ToolbarText, ToolbarTextProps, ToolbarTextSize } from './toolbar-text.js';
23
25
  export { ValueTable, ValueTableProps, ValueTableRow, ValueTableRowProps } from './value-table.js';
24
26
  export { ResizeCommit, WireResizableRegionsOptions, wireResizableRegions } from './wire-resizable-regions.js';
package/dist/index.js CHANGED
@@ -1,22 +1,24 @@
1
- export { wireResizableRegions } from './chunk-DPDBVKNA.js';
2
- export { reorderTabs, wireTabBars } from './chunk-NVWXKU37.js';
3
- export { wireTokenSearchFields } from './chunk-ENVTNLYC.js';
4
- export { TabBar } from './chunk-ZVI5YST2.js';
5
- export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-S3HKPI7I.js';
1
+ export { wireTokenSearchFields } from './chunk-CN2XNTAM.js';
6
2
  export { ValueTable, ValueTableRow } from './chunk-QQFJMRIB.js';
7
- export { PanelHeader } from './chunk-JTHUXDN2.js';
8
- export { SegmentedControl } from './chunk-4TRDV6RL.js';
9
- export { Select } from './chunk-U5IFGQCD.js';
3
+ export { wireResizableRegions } from './chunk-DPDBVKNA.js';
4
+ export { reorderTabs, wireTabBars } from './chunk-AASLYRGE.js';
5
+ export { StateBanner } from './chunk-VLYV65LK.js';
6
+ export { SunkenPanel } from './chunk-W4CXQYSG.js';
7
+ export { TabBar } from './chunk-M7JBER5U.js';
8
+ export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-7KEUJIIC.js';
9
+ export { PanelHeader } from './chunk-RYRIFZCT.js';
10
+ export { ToolbarText } from './chunk-W7YD6E4N.js';
10
11
  export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-NENBUYX5.js';
11
- export { StateBanner } from './chunk-6ETZKKAE.js';
12
+ export { SegmentedControl } from './chunk-OZWU5ZPZ.js';
13
+ export { Select } from './chunk-K57KRAOV.js';
12
14
  export { ListActionRow } from './chunk-BBRXX6PF.js';
13
15
  export { ListInsetControl } from './chunk-QO55FN2Y.js';
14
16
  export { ListInsetText } from './chunk-FEY65TBV.js';
15
- export { ToolbarText } from './chunk-S3PCZ7NV.js';
16
17
  export { AppTab } from './chunk-PIDTEQ3U.js';
17
- export { ToolbarControlGroup } from './chunk-ZK2G3VR5.js';
18
+ export { Pane } from './chunk-JRKSK2HX.js';
18
19
  export { Toolbar } from './chunk-7L6EHUMV.js';
19
- export { ListHeader } from './chunk-QIRXYKCE.js';
20
+ export { ToolbarControlGroup } from './chunk-5VTB2BKP.js';
21
+ export { ListHeader } from './chunk-DSNIYOZ3.js';
20
22
  export { ListItem } from './chunk-ELSJX4W7.js';
21
23
 
22
24
  export { Skeleton } from './chunk-PZQVSDLH.js';
@@ -16,18 +16,39 @@ type ListHeaderTriggerAttributes = Readonly<Record<`data-${string}`, string | un
16
16
  }>;
17
17
  interface ListHeaderBaseProps {
18
18
  label: string;
19
- action?: string;
20
- actionLabel?: string;
21
- actionIcon?: SafeHtml;
22
- actionDisabled?: boolean;
23
- disabledReason?: string;
24
- expanded?: boolean;
25
- toggle?: boolean;
26
19
  /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */
27
20
  placeholder?: boolean;
28
21
  rootAttributes?: ListHeaderRootAttributes;
29
22
  triggerAttributes?: ListHeaderTriggerAttributes;
30
23
  }
24
+ type ListHeaderModeProps = {
25
+ /** Render the title as a controlled disclosure trigger. */
26
+ toggle: true;
27
+ action: string;
28
+ expanded: boolean;
29
+ actionIcon?: SafeHtml;
30
+ actionLabel?: never;
31
+ actionDisabled?: boolean;
32
+ disabledReason?: string;
33
+ } | {
34
+ /** Render a separately named trailing action. */
35
+ toggle?: false;
36
+ action: string;
37
+ actionLabel: string;
38
+ actionIcon: SafeHtml;
39
+ expanded?: never;
40
+ actionDisabled?: boolean;
41
+ disabledReason?: string;
42
+ } | {
43
+ /** Render a passive section heading. */
44
+ toggle?: false;
45
+ action?: never;
46
+ actionLabel?: never;
47
+ actionIcon?: never;
48
+ expanded?: never;
49
+ actionDisabled?: never;
50
+ disabledReason?: never;
51
+ };
31
52
  type ListHeaderIndicatorProps = {
32
53
  count: number;
33
54
  countLabel: string;
@@ -37,7 +58,7 @@ type ListHeaderIndicatorProps = {
37
58
  countLabel?: never;
38
59
  badge?: SafeHtml;
39
60
  };
40
- type ListHeaderProps = ListHeaderBaseProps & ListHeaderIndicatorProps;
61
+ type ListHeaderProps = ListHeaderBaseProps & ListHeaderIndicatorProps & ListHeaderModeProps;
41
62
  declare function ListHeader({ label, count, countLabel, badge, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, }: ListHeaderProps): SafeHtml;
42
63
 
43
64
  export { ListHeader, type ListHeaderProps };
@@ -1,4 +1,4 @@
1
- export { ListHeader } from './chunk-QIRXYKCE.js';
1
+ export { ListHeader } from './chunk-DSNIYOZ3.js';
2
2
 
3
3
 
4
4
 
package/dist/nav-stack.js CHANGED
@@ -1,4 +1,4 @@
1
- export { NavStack } from './chunk-43FUQH35.js';
1
+ export { NavStack } from './chunk-OHU6CI22.js';
2
2
 
3
3
 
4
4
 
package/dist/pane.d.ts ADDED
@@ -0,0 +1,49 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ /** Logical sides that can show a {@link Pane} separator. */
4
+ type PaneSeparatorSide = 'block-start' | 'block-end' | 'inline-start' | 'inline-end';
5
+ /** Semantic root elements supported by {@link Pane}. */
6
+ type PaneElement = 'article' | 'aside' | 'div' | 'main' | 'section';
7
+ /** Semantic elements supported by the scrolling content slot. */
8
+ type PaneContentElement = 'div' | 'main' | 'nav' | 'section';
9
+ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
10
+ 'data-component'?: never;
11
+ 'data-separator-block-start'?: never;
12
+ 'data-separator-block-end'?: never;
13
+ 'data-separator-inline-start'?: never;
14
+ 'data-separator-inline-end'?: never;
15
+ }>;
16
+ interface PaneProps {
17
+ /** Optional fixed chrome above the scrolling content, arranged vertically. */
18
+ header?: SafeHtml | readonly SafeHtml[];
19
+ /** The pane's primary vertical, scrolling content stack. */
20
+ children?: SafeHtml | readonly SafeHtml[];
21
+ /** Optional fixed chrome below the scrolling content. */
22
+ footer?: SafeHtml | readonly SafeHtml[];
23
+ /** Root semantics. Defaults to `div`. */
24
+ element?: PaneElement;
25
+ /** Scrolling content semantics. Defaults to `div`. */
26
+ contentElement?: PaneContentElement;
27
+ /** Independent logical-edge separator lines. Defaults to none. */
28
+ separators?: readonly PaneSeparatorSide[];
29
+ id?: string;
30
+ /** Accessible name for a landmark root such as `aside` or `main`. */
31
+ label?: string;
32
+ /** Accessible name for a landmark scrolling slot such as `nav`. */
33
+ contentLabel?: string;
34
+ className?: string;
35
+ headerClassName?: string;
36
+ contentClassName?: string;
37
+ footerClassName?: string;
38
+ /** Safe `data-*` metadata; Pane-owned structural attributes remain protected. */
39
+ rootAttributes?: PaneRootAttributes;
40
+ }
41
+ /**
42
+ * An unpadded application column with optional fixed header/footer slots and one
43
+ * scrolling vertical content owner. Separator lines are independently opt-in on
44
+ * each logical edge, so the same component works as a sidebar, main area,
45
+ * inspector, or dialog column.
46
+ */
47
+ declare function Pane({ header, children, footer, element, contentElement, separators, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, }: PaneProps): SafeHtml;
48
+
49
+ export { Pane, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
package/dist/pane.js ADDED
@@ -0,0 +1,4 @@
1
+ export { Pane } from './chunk-JRKSK2HX.js';
2
+
3
+
4
+ //# sourceMappingURL=pane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"pane.js"}
@@ -1,11 +1,9 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
  import { HeadingLevel } from './toolbar-text.js';
3
3
 
4
- interface PanelHeaderProps {
4
+ interface PanelHeaderBaseProps {
5
5
  title: string;
6
6
  titleId: string;
7
- summary?: string;
8
- summaryId?: string;
9
7
  icon?: SafeHtml;
10
8
  iconClassName?: string;
11
9
  actions?: SafeHtml;
@@ -19,6 +17,14 @@ interface PanelHeaderProps {
19
17
  /** Render the title and summary as unanimated loading skeletons, keeping the icon and actions. */
20
18
  placeholder?: boolean;
21
19
  }
20
+ type PanelHeaderSummaryProps = {
21
+ summary: string;
22
+ summaryId?: string;
23
+ } | {
24
+ summary?: never;
25
+ summaryId?: never;
26
+ };
27
+ type PanelHeaderProps = PanelHeaderBaseProps & PanelHeaderSummaryProps;
22
28
  /**
23
29
  * The heading of a panel, dialog, or page: a plain `Toolbar` whose leading zone
24
30
  * holds an optional icon control group and the title as extra-large `ToolbarText`,
@@ -1,4 +1,4 @@
1
- export { PanelHeader } from './chunk-JTHUXDN2.js';
1
+ export { PanelHeader } from './chunk-RYRIFZCT.js';
2
2
 
3
3
 
4
4
 
@@ -4,18 +4,18 @@ type SegmentedControlAppearance = 'filled' | 'outlined' | 'toolbar';
4
4
  type SegmentedControlShape = 'rounded' | 'pill';
5
5
  type SegmentedControlSize = 'small' | 'default';
6
6
  type SegmentedControlLayout = 'content' | 'equal';
7
- interface SegmentedControlChoice {
8
- value: string;
7
+ interface SegmentedControlChoice<Value extends string = string> {
8
+ value: Value;
9
9
  label: string;
10
10
  content?: SafeHtml;
11
11
  title?: string;
12
12
  disabled?: boolean;
13
13
  }
14
- interface SegmentedControlProps {
14
+ interface SegmentedControlProps<Value extends string = string> {
15
15
  id: string;
16
16
  label: string;
17
- value: string;
18
- choices: readonly SegmentedControlChoice[];
17
+ value: NoInfer<Value>;
18
+ choices: readonly SegmentedControlChoice<Value>[];
19
19
  action?: string;
20
20
  appearance?: SegmentedControlAppearance;
21
21
  shape?: SegmentedControlShape;
@@ -25,6 +25,6 @@ interface SegmentedControlProps {
25
25
  /** Render as an unanimated loading skeleton, disabling every segment. */
26
26
  placeholder?: boolean;
27
27
  }
28
- declare function SegmentedControl({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, }: SegmentedControlProps): SafeHtml;
28
+ declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, }: SegmentedControlProps<Value>): SafeHtml;
29
29
 
30
30
  export { SegmentedControl, type SegmentedControlAppearance, type SegmentedControlChoice, type SegmentedControlLayout, type SegmentedControlProps, type SegmentedControlShape, type SegmentedControlSize };
@@ -1,4 +1,4 @@
1
- export { SegmentedControl } from './chunk-4TRDV6RL.js';
1
+ export { SegmentedControl } from './chunk-OZWU5ZPZ.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=segmented-control.js.map
package/dist/select.d.ts CHANGED
@@ -11,11 +11,16 @@ interface SelectChoice<Value extends string = string> {
11
11
  group?: string;
12
12
  separatorBefore?: boolean;
13
13
  }
14
- interface SelectProps<Value extends string = string> {
15
- name: string;
16
- value: Value;
17
- label?: string;
14
+ type SelectAccessibleName = {
15
+ label: string;
18
16
  ariaLabel?: string;
17
+ } | {
18
+ label?: never;
19
+ ariaLabel: string;
20
+ };
21
+ interface SelectBaseProps<Value extends string = string> {
22
+ name: string;
23
+ value: NoInfer<Value>;
19
24
  choices: readonly SelectChoice<Value>[];
20
25
  className?: string;
21
26
  /** Empty-value hint text shown in the closed control (the native select placeholder). */
@@ -26,6 +31,7 @@ interface SelectProps<Value extends string = string> {
26
31
  /** Render as an unanimated loading skeleton: the label above a static, empty control box. */
27
32
  placeholder?: boolean;
28
33
  }
34
+ type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName;
29
35
  declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholderText, disabled, fitMenu, renderSelected, placeholder, }: SelectProps<Value>): SafeHtml;
30
36
 
31
37
  export { Select, type SelectChoice, type SelectProps };
package/dist/select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-U5IFGQCD.js';
1
+ export { Select } from './chunk-K57KRAOV.js';
2
2
 
3
3
 
4
4
 
@@ -1,6 +1,6 @@
1
- import { NavStack } from './chunk-43FUQH35.js';
2
- import { ResizableRegion } from './chunk-NENBUYX5.js';
1
+ import { NavStack } from './chunk-OHU6CI22.js';
3
2
 
3
+ import { ResizableRegion } from './chunk-NENBUYX5.js';
4
4
 
5
5
  import { jsx, jsxs } from 'kerfjs/jsx-runtime';
6
6
 
@@ -1,17 +1,18 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
3
  type StateBannerTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
4
+ type StateBannerUrgency = 'status' | 'alert';
4
5
  interface StateBannerProps {
5
6
  title: string;
6
7
  detail?: string;
7
8
  icon?: SafeHtml;
8
9
  action?: SafeHtml;
9
10
  tone?: StateBannerTone;
10
- urgency?: 'status' | 'alert';
11
+ urgency?: StateBannerUrgency;
11
12
  className?: string;
12
13
  /** Render the title and detail as unanimated loading skeletons, keeping the icon and tone. */
13
14
  placeholder?: boolean;
14
15
  }
15
16
  declare function StateBanner({ title, detail, icon, action, tone, urgency, className, placeholder, }: StateBannerProps): SafeHtml;
16
17
 
17
- export { StateBanner, type StateBannerProps, type StateBannerTone };
18
+ export { StateBanner, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
@@ -1,4 +1,4 @@
1
- export { StateBanner } from './chunk-6ETZKKAE.js';
1
+ export { StateBanner } from './chunk-VLYV65LK.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=state-banner.js.map
@@ -23,15 +23,14 @@
23
23
  padding: 0;
24
24
  overflow: hidden;
25
25
  justify-self: start;
26
- border-inline-end: 1px solid var(--kui-color-border);
27
26
  background: var(--kui-color-surface);
28
27
  transition:
29
28
  transform 200ms ease,
30
29
  visibility 0s linear 0s;
31
30
  }
32
31
 
33
- .kui-catalog[data-sidebar-collapsed="true"] .kui-catalog__sidebar {
34
- border-inline-end: 0;
32
+ .kui-catalog[data-sidebar-collapsed="true"] .kui-catalog__sidebar.kui-pane {
33
+ --kui-pane-separator-inline-end-width: 0;
35
34
  /* Slide out first, then hide, so the panel animates offscreen and only then
36
35
  leaves the tab order rather than snapping invisible mid-slide. */
37
36
  transform: translateX(-100%);
@@ -510,15 +509,16 @@
510
509
  .kui-catalog[data-sidebar-collapsed="true"] .kui-catalog__sidebar {
511
510
  display: none;
512
511
  }
513
- .kui-catalog__sidebar {
512
+ .kui-catalog .kui-catalog__sidebar.kui-pane {
513
+ --kui-pane-separator-block-end-width: var(--kui-pane-separator-width, 1px);
514
+ --kui-pane-separator-inline-end-width: 0;
515
+
514
516
  width: 100%;
515
517
  min-width: 0;
516
518
  height: auto;
517
519
  justify-self: stretch;
518
520
  /* Narrow layout collapses via display:none, not the desktop slide. */
519
521
  transform: none;
520
- border-inline-end: 0;
521
- border-block-end: 1px solid var(--kui-color-border);
522
522
  }
523
523
  .kui-catalog__detail {
524
524
  height: auto;
@@ -1,24 +1,6 @@
1
- /* Shared application geometry: unpadded panes containing toolbars and content. */
2
- .kui-pane {
3
- display: grid;
4
- min-width: 0;
5
- min-height: 0;
6
- padding: 0;
7
- grid-template-rows: auto minmax(0, 1fr) auto;
8
- }
9
-
10
- .kui-pane__toolbar,
11
- .kui-pane__footer {
12
- min-width: 0;
13
- }
1
+ @import "./pane.css";
14
2
 
15
- .kui-pane__content {
16
- min-width: 0;
17
- min-height: 0;
18
- padding: 0;
19
- overflow: auto;
20
- overscroll-behavior: contain;
21
- }
3
+ /* Shared application content geometry for Pane children and standalone stacks. */
22
4
 
23
5
  .kui-content {
24
6
  display: flex;
@@ -0,0 +1,62 @@
1
+ .kui-pane {
2
+ --kui-pane-separator-block-start-width: 0;
3
+ --kui-pane-separator-block-end-width: 0;
4
+ --kui-pane-separator-inline-start-width: 0;
5
+ --kui-pane-separator-inline-end-width: 0;
6
+
7
+ display: grid;
8
+ min-width: 0;
9
+ min-height: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ border: 0 solid var(--kui-pane-separator-color, var(--kui-color-border));
13
+ border-block-start-width: var(--kui-pane-separator-block-start-width);
14
+ border-block-end-width: var(--kui-pane-separator-block-end-width);
15
+ border-inline-start-width: var(--kui-pane-separator-inline-start-width);
16
+ border-inline-end-width: var(--kui-pane-separator-inline-end-width);
17
+ grid-template-areas:
18
+ "header"
19
+ "content"
20
+ "footer";
21
+ grid-template-rows: auto minmax(0, 1fr) auto;
22
+ }
23
+
24
+ .kui-pane[data-separator-block-start="true"] {
25
+ --kui-pane-separator-block-start-width: var(--kui-pane-separator-width, 1px);
26
+ }
27
+
28
+ .kui-pane[data-separator-block-end="true"] {
29
+ --kui-pane-separator-block-end-width: var(--kui-pane-separator-width, 1px);
30
+ }
31
+
32
+ .kui-pane[data-separator-inline-start="true"] {
33
+ --kui-pane-separator-inline-start-width: var(--kui-pane-separator-width, 1px);
34
+ }
35
+
36
+ .kui-pane[data-separator-inline-end="true"] {
37
+ --kui-pane-separator-inline-end-width: var(--kui-pane-separator-width, 1px);
38
+ }
39
+
40
+ .kui-pane__header,
41
+ .kui-pane__toolbar {
42
+ display: flex;
43
+ min-width: 0;
44
+ flex-direction: column;
45
+ grid-area: header;
46
+ }
47
+
48
+ .kui-pane__content {
49
+ min-width: 0;
50
+ min-height: 0;
51
+ padding: 0;
52
+ overflow: auto;
53
+ grid-area: content;
54
+ overscroll-behavior: contain;
55
+ }
56
+
57
+ .kui-pane__footer {
58
+ display: flex;
59
+ min-width: 0;
60
+ flex-direction: column;
61
+ grid-area: footer;
62
+ }