@kerfjs/ui 5.0.0-beta.17 → 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.
- package/README.md +221 -81
- package/ai/application-ui-diagnostic-ids-v1.json +92 -0
- package/ai/application-ui-profile-sync.cjs +529 -0
- package/ai/application-ui-profile.d.mts +1 -0
- package/ai/application-ui-profile.d.ts +102 -0
- package/ai/application-ui-profile.defaults.json +41 -0
- package/ai/application-ui-profile.mjs +626 -0
- package/ai/application-ui-profile.schema.json +130 -0
- package/ai/catalog-authoring.json +25 -0
- package/ai/catalog-authoring.schema.json +61 -0
- package/ai/compile-time-contracts-v1.json +101 -0
- package/ai/compile-time-contracts-v1.schema.json +49 -0
- package/ai/component-catalog-extension-v2.d.ts +7 -0
- package/ai/component-catalog-extension-v2.schema.json +7 -0
- package/ai/component-catalog-extension.schema.json +79 -0
- package/ai/component-catalog-v2-overrides.json +326 -0
- package/ai/component-catalog-v2.d.ts +67 -0
- package/ai/component-catalog-v2.json +4441 -0
- package/ai/component-catalog-v2.schema.json +246 -0
- package/ai/component-catalog.json +649 -6
- package/ai/component-catalog.schema.json +15 -0
- package/ai/public-api-signatures-v1.md +357 -91
- package/ai/skill.md +95 -50
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/cli.mjs +46 -0
- package/analyzer/index.d.mts +45 -0
- package/analyzer/index.mjs +743 -0
- package/analyzer/report.schema.json +66 -0
- package/dist/app-tab.d.ts +1 -1
- package/dist/app-tab.js +1 -1
- package/dist/browser/pane.js +3 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/catalog-resources.d.ts +34 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +29 -4
- package/dist/catalog.js +302 -84
- package/dist/catalog.js.map +1 -1
- package/dist/chunk-5VTB2BKP.js +35 -0
- package/dist/chunk-5VTB2BKP.js.map +1 -0
- package/dist/chunk-6WTETUZ6.js +21 -0
- package/dist/chunk-6WTETUZ6.js.map +1 -0
- package/dist/chunk-7KEUJIIC.js +218 -0
- package/dist/chunk-7KEUJIIC.js.map +1 -0
- package/dist/chunk-7L6EHUMV.js +31 -0
- package/dist/chunk-7L6EHUMV.js.map +1 -0
- package/dist/{chunk-XXMOARTH.js → chunk-AASLYRGE.js} +57 -16
- package/dist/chunk-AASLYRGE.js.map +1 -0
- package/dist/chunk-BBRXX6PF.js +108 -0
- package/dist/chunk-BBRXX6PF.js.map +1 -0
- package/dist/{chunk-6NLRBSVX.js → chunk-CN2XNTAM.js} +129 -72
- package/dist/chunk-CN2XNTAM.js.map +1 -0
- package/dist/chunk-DPDBVKNA.js +113 -0
- package/dist/chunk-DPDBVKNA.js.map +1 -0
- package/dist/chunk-DSNIYOZ3.js +114 -0
- package/dist/chunk-DSNIYOZ3.js.map +1 -0
- package/dist/chunk-ELSJX4W7.js +68 -0
- package/dist/chunk-ELSJX4W7.js.map +1 -0
- package/dist/{chunk-AHQI52QO.js → chunk-FEY65TBV.js} +6 -2
- package/dist/chunk-FEY65TBV.js.map +1 -0
- package/dist/chunk-JRKSK2HX.js +79 -0
- package/dist/chunk-JRKSK2HX.js.map +1 -0
- package/dist/chunk-K57KRAOV.js +117 -0
- package/dist/chunk-K57KRAOV.js.map +1 -0
- package/dist/chunk-LPOMRC4C.js +25 -0
- package/dist/chunk-LPOMRC4C.js.map +1 -0
- package/dist/chunk-M7JBER5U.js +41 -0
- package/dist/chunk-M7JBER5U.js.map +1 -0
- package/dist/chunk-NENBUYX5.js +79 -0
- package/dist/chunk-NENBUYX5.js.map +1 -0
- package/dist/chunk-OHU6CI22.js +83 -0
- package/dist/chunk-OHU6CI22.js.map +1 -0
- package/dist/{chunk-YGN7OMLT.js → chunk-OZWU5ZPZ.js} +2 -2
- package/dist/chunk-OZWU5ZPZ.js.map +1 -0
- package/dist/chunk-PIDTEQ3U.js +105 -0
- package/dist/chunk-PIDTEQ3U.js.map +1 -0
- package/dist/chunk-PX3YSS5C.js +32 -0
- package/dist/chunk-PX3YSS5C.js.map +1 -0
- package/dist/chunk-PZQVSDLH.js +61 -0
- package/dist/chunk-PZQVSDLH.js.map +1 -0
- package/dist/chunk-QO55FN2Y.js +20 -0
- package/dist/chunk-QO55FN2Y.js.map +1 -0
- package/dist/chunk-QQFJMRIB.js +45 -0
- package/dist/chunk-QQFJMRIB.js.map +1 -0
- package/dist/chunk-RYRIFZCT.js +58 -0
- package/dist/chunk-RYRIFZCT.js.map +1 -0
- package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
- package/dist/chunk-SRSJO5QE.js.map +1 -0
- package/dist/chunk-VLYV65LK.js +38 -0
- package/dist/chunk-VLYV65LK.js.map +1 -0
- package/dist/chunk-W4CXQYSG.js +23 -0
- package/dist/chunk-W4CXQYSG.js.map +1 -0
- package/dist/{chunk-WXMGNX2Y.js → chunk-W7YD6E4N.js} +2 -2
- package/dist/chunk-W7YD6E4N.js.map +1 -0
- package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
- package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
- package/dist/collapsible-panel.d.ts +2 -2
- package/dist/collapsible-panel.js +47 -6
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/device-class.js +33 -5
- package/dist/device-class.js.map +1 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/empty-state.d.ts +1 -1
- package/dist/empty-state.js +1 -1
- package/dist/floating-toolbar.d.ts +1 -1
- package/dist/floating-toolbar.js +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +27 -25
- package/dist/list-action-row.d.ts +1 -1
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.d.ts +30 -9
- package/dist/list-header.js +1 -1
- package/dist/list-inset-control.d.ts +1 -1
- package/dist/list-inset-control.js +1 -1
- package/dist/list-inset-text.d.ts +1 -1
- package/dist/list-inset-text.js +1 -1
- package/dist/list-item.d.ts +1 -1
- package/dist/list-item.js +1 -1
- package/dist/loading-spinner.js +1 -1
- package/dist/nav-stack.d.ts +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +49 -0
- package/dist/pane.js +4 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-header.d.ts +10 -4
- package/dist/panel-header.js +1 -1
- package/dist/resizable-region.d.ts +1 -1
- package/dist/resizable-region.js +1 -1
- package/dist/segmented-control.d.ts +6 -6
- package/dist/segmented-control.js +1 -1
- package/dist/select.d.ts +11 -5
- package/dist/select.js +1 -1
- package/dist/skeleton.d.ts +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/split-view.d.ts +1 -1
- package/dist/split-view.js +70 -10
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.d.ts +4 -3
- package/dist/state-banner.js +1 -1
- package/dist/styles/catalog.css +32 -6
- package/dist/styles/layout.css +2 -20
- package/dist/styles/pane.css +62 -0
- package/dist/styles/segmented-control.css +3 -7
- package/dist/styles/sunken-panel.css +18 -0
- package/dist/sunken-panel.d.ts +16 -0
- package/dist/sunken-panel.js +3 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/tab-bar.d.ts +4 -3
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +6 -6
- package/dist/tab-scaffold.js +43 -8
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/token-search-field.d.ts +25 -9
- package/dist/token-search-field.js +1 -1
- package/dist/toolbar-control-group.d.ts +10 -6
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +10 -11
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +1 -1
- package/dist/toolbar.js +1 -1
- package/dist/value-table.d.ts +2 -2
- package/dist/value-table.js +1 -1
- package/dist/wire-catalog.d.ts +31 -2
- package/dist/wire-catalog.js +203 -8
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-nav-stack.js +22 -7
- package/dist/wire-nav-stack.js.map +1 -1
- package/dist/wire-resizable-regions.d.ts +1 -1
- package/dist/wire-resizable-regions.js +1 -1
- package/dist/wire-sidebar.js +52 -41
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-tab-bars.d.ts +5 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-tab-scaffold.js +9 -4
- package/dist/wire-tab-scaffold.js.map +1 -1
- package/dist/wire-token-search-fields.d.ts +12 -7
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/workbench.d.ts +1 -1
- package/dist/workbench.js +56 -9
- package/dist/workbench.js.map +1 -1
- package/docs/app-layouts.md +7 -7
- package/docs/catalog.md +249 -46
- package/docs/collapsible-panel.md +38 -11
- package/docs/component-contract.md +132 -7
- package/docs/component-selection.md +79 -67
- package/docs/design/templates.md +1 -1
- package/docs/design-philosophy.md +7 -9
- package/docs/device-class.md +8 -8
- package/docs/examples/application-ui-profile.json +60 -0
- package/docs/examples/command-palette-adapter.tsx +67 -17
- package/docs/examples/component-catalog-extension-v2.json +81 -0
- package/docs/examples/component-catalog-extension.json +45 -0
- package/docs/layout.md +51 -32
- package/docs/nav-stack.md +15 -6
- package/docs/recipes.md +4 -4
- package/docs/split-view.md +3 -3
- package/docs/sunken-panel.md +43 -0
- package/docs/tab-scaffold.md +16 -7
- package/docs/type-contracts.md +99 -0
- package/docs/ui-analyzer.md +81 -0
- package/docs/ui-doctor.md +77 -0
- package/docs/ui-evaluator.md +122 -0
- package/docs/webawesome-theme.md +8 -8
- package/docs/workbench.md +18 -5
- package/doctor/cli.mjs +115 -0
- package/doctor/config.schema.json +68 -0
- package/doctor/index.d.mts +116 -0
- package/doctor/index.mjs +1256 -0
- package/doctor/report.schema.json +118 -0
- package/evaluator/cli.mjs +89 -0
- package/evaluator/index.d.mts +90 -0
- package/evaluator/index.mjs +1138 -0
- package/evaluator/report.schema.json +152 -0
- package/llms.txt +58 -15
- package/package.json +70 -10
- package/ux-demo/recipes/app-shell.tsx +206 -10
- package/ux-demo/recipes/collapsible-sidebar.tsx +167 -44
- package/ux-demo/recipes/compact-toolbar.tsx +114 -12
- package/ux-demo/recipes/composer-form.tsx +106 -18
- package/ux-demo/recipes/list-detail-dialog.tsx +144 -8
- package/ux-demo/recipes/list-workspace-states.tsx +165 -8
- package/ux-demo/recipes/loaders.ts +5 -2
- package/ux-demo/recipes/loading-inspector.tsx +124 -41
- package/ux-demo/recipes/mount-recipe.ts +27 -6
- package/ux-demo/recipes/navigation-sidebar.tsx +120 -9
- package/ux-demo/recipes/navigation-stack.tsx +61 -19
- package/ux-demo/recipes/types.ts +3 -1
- package/ux-demo/recipes/workspace-header.tsx +57 -2
- package/dist/chunk-2Z5TWHKQ.js +0 -34
- package/dist/chunk-2Z5TWHKQ.js.map +0 -1
- package/dist/chunk-37T3VNIZ.js +0 -19
- package/dist/chunk-37T3VNIZ.js.map +0 -1
- package/dist/chunk-55DATV3A.js +0 -10
- package/dist/chunk-55DATV3A.js.map +0 -1
- package/dist/chunk-5ATCDSQS.js +0 -42
- package/dist/chunk-5ATCDSQS.js.map +0 -1
- package/dist/chunk-5E2HVJ33.js +0 -10
- package/dist/chunk-5E2HVJ33.js.map +0 -1
- package/dist/chunk-6NLRBSVX.js.map +0 -1
- package/dist/chunk-7BR3DO2A.js.map +0 -1
- package/dist/chunk-7JB7VPRI.js +0 -34
- package/dist/chunk-7JB7VPRI.js.map +0 -1
- package/dist/chunk-7LDCTU7D.js +0 -134
- package/dist/chunk-7LDCTU7D.js.map +0 -1
- package/dist/chunk-AHQI52QO.js.map +0 -1
- package/dist/chunk-AQNKJRFH.js +0 -79
- package/dist/chunk-AQNKJRFH.js.map +0 -1
- package/dist/chunk-AVZHJN6C.js +0 -14
- package/dist/chunk-AVZHJN6C.js.map +0 -1
- package/dist/chunk-B24C4A6T.js +0 -22
- package/dist/chunk-B24C4A6T.js.map +0 -1
- package/dist/chunk-CH4SQ6H5.js +0 -39
- package/dist/chunk-CH4SQ6H5.js.map +0 -1
- package/dist/chunk-DAFFDO33.js +0 -14
- package/dist/chunk-DAFFDO33.js.map +0 -1
- package/dist/chunk-I7INRJO4.js +0 -17
- package/dist/chunk-I7INRJO4.js.map +0 -1
- package/dist/chunk-L4OKFDJY.js +0 -24
- package/dist/chunk-L4OKFDJY.js.map +0 -1
- package/dist/chunk-M5JRI6MN.js +0 -27
- package/dist/chunk-M5JRI6MN.js.map +0 -1
- package/dist/chunk-RNPGFQ33.js +0 -10
- package/dist/chunk-RNPGFQ33.js.map +0 -1
- package/dist/chunk-VPCTCUED.js +0 -10
- package/dist/chunk-VPCTCUED.js.map +0 -1
- package/dist/chunk-WRTAQ7BZ.js +0 -23
- package/dist/chunk-WRTAQ7BZ.js.map +0 -1
- package/dist/chunk-WVPYVDXY.js +0 -15
- package/dist/chunk-WVPYVDXY.js.map +0 -1
- package/dist/chunk-WXMGNX2Y.js.map +0 -1
- package/dist/chunk-XXMOARTH.js.map +0 -1
- package/dist/chunk-YGN7OMLT.js.map +0 -1
- package/dist/chunk-ZQQ6P4SV.js +0 -20
- package/dist/chunk-ZQQ6P4SV.js.map +0 -1
package/dist/pane.js
ADDED
package/dist/pane.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"pane.js"}
|
package/dist/panel-header.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { SafeHtml } from 'kerfjs';
|
|
2
2
|
import { HeadingLevel } from './toolbar-text.js';
|
|
3
3
|
|
|
4
|
-
interface
|
|
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`,
|
|
@@ -31,6 +37,6 @@ interface PanelHeaderProps {
|
|
|
31
37
|
* is passed straight into the toolbar's trailing zone; the app supplies whatever
|
|
32
38
|
* trailing controls it needs (typically a `ToolbarControlGroup`).
|
|
33
39
|
*/
|
|
34
|
-
declare function PanelHeader({ title, titleId, summary, summaryId, icon, iconClassName, actions, headingLevel, placeholder }: PanelHeaderProps): SafeHtml;
|
|
40
|
+
declare function PanelHeader({ title, titleId, summary, summaryId, icon, iconClassName, actions, headingLevel, placeholder, }: PanelHeaderProps): SafeHtml;
|
|
35
41
|
|
|
36
42
|
export { PanelHeader, type PanelHeaderProps };
|
package/dist/panel-header.js
CHANGED
|
@@ -18,6 +18,6 @@ interface ResizableRegionProps {
|
|
|
18
18
|
}
|
|
19
19
|
declare const clampRegionSize: (size: number, min: number, max: number) => number;
|
|
20
20
|
declare const resizeRegionFromPointer: (startSize: number, delta: number, edge: ResizableRegionEdge) => number;
|
|
21
|
-
declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, handleIcon, children }: ResizableRegionProps): SafeHtml;
|
|
21
|
+
declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, handleIcon, children, }: ResizableRegionProps): SafeHtml;
|
|
22
22
|
|
|
23
23
|
export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionEdge, type ResizableRegionProps, clampRegionSize, resizeRegionFromPointer };
|
package/dist/resizable-region.js
CHANGED
|
@@ -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:
|
|
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:
|
|
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 };
|
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
|
-
|
|
15
|
-
|
|
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
|
}
|
|
29
|
-
|
|
34
|
+
type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName;
|
|
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
package/dist/skeleton.d.ts
CHANGED
|
@@ -19,6 +19,6 @@ interface SkeletonProps {
|
|
|
19
19
|
* `placeholder` prop. Decorative by default (`aria-hidden`); pass `label` to
|
|
20
20
|
* announce it. Sizes to its slot unless `width`/`height` are given.
|
|
21
21
|
*/
|
|
22
|
-
declare function Skeleton({ width, height, radius, lines, label, className }: SkeletonProps): kerfjs.SafeHtml;
|
|
22
|
+
declare function Skeleton({ width, height, radius, lines, label, className, }: SkeletonProps): kerfjs.SafeHtml;
|
|
23
23
|
|
|
24
24
|
export { Skeleton, type SkeletonProps };
|
package/dist/skeleton.js
CHANGED
package/dist/split-view.d.ts
CHANGED
|
@@ -37,6 +37,6 @@ interface SplitViewProps {
|
|
|
37
37
|
* resizable wiring with `wireResizableRegions` and the compact back with
|
|
38
38
|
* `wireNavStack`.
|
|
39
39
|
*/
|
|
40
|
-
declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className }: SplitViewProps): SafeHtml;
|
|
40
|
+
declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className, }: SplitViewProps): SafeHtml;
|
|
41
41
|
|
|
42
42
|
export { SplitView, type SplitViewProps, type SplitViewResizable };
|
package/dist/split-view.js
CHANGED
|
@@ -1,19 +1,79 @@
|
|
|
1
|
-
import { NavStack } from './chunk-
|
|
2
|
-
import { ResizableRegion } from './chunk-M5JRI6MN.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
|
|
|
7
|
-
function SplitView({
|
|
7
|
+
function SplitView({
|
|
8
|
+
id,
|
|
9
|
+
label,
|
|
10
|
+
list,
|
|
11
|
+
detail,
|
|
12
|
+
compact = false,
|
|
13
|
+
detailActive = false,
|
|
14
|
+
listTitle = "",
|
|
15
|
+
detailTitle = "",
|
|
16
|
+
backLabel = "Back",
|
|
17
|
+
resizable,
|
|
18
|
+
className = ""
|
|
19
|
+
}) {
|
|
8
20
|
if (compact) {
|
|
9
|
-
const views = detailActive ? [
|
|
10
|
-
|
|
21
|
+
const views = detailActive ? [
|
|
22
|
+
{ key: "list", title: listTitle, content: list },
|
|
23
|
+
{ key: "detail", title: detailTitle, content: detail }
|
|
24
|
+
] : [{ key: "list", title: listTitle, content: list }];
|
|
25
|
+
return /* @__PURE__ */ jsx(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
class: `kui-split-view kui-split-view--compact ${className}`.trim(),
|
|
29
|
+
id,
|
|
30
|
+
"data-component": "split-view",
|
|
31
|
+
"data-split-mode": "compact",
|
|
32
|
+
children: /* @__PURE__ */ jsx(
|
|
33
|
+
NavStack,
|
|
34
|
+
{
|
|
35
|
+
id: `${id}-stack`,
|
|
36
|
+
label,
|
|
37
|
+
views,
|
|
38
|
+
backLabel
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
);
|
|
11
43
|
}
|
|
12
|
-
const listPane = resizable ? /* @__PURE__ */ jsx(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
44
|
+
const listPane = resizable ? /* @__PURE__ */ jsx(
|
|
45
|
+
ResizableRegion,
|
|
46
|
+
{
|
|
47
|
+
id: `${id}-list`,
|
|
48
|
+
label: listTitle || "List",
|
|
49
|
+
size: resizable.size,
|
|
50
|
+
min: resizable.min,
|
|
51
|
+
max: resizable.max,
|
|
52
|
+
children: /* @__PURE__ */ jsx("div", { class: "kui-split-view__list kui-pane", "data-split-list": true, children: list })
|
|
53
|
+
}
|
|
54
|
+
) : /* @__PURE__ */ jsx("div", { class: "kui-split-view__list kui-pane", "data-split-list": true, children: list });
|
|
55
|
+
return /* @__PURE__ */ jsxs(
|
|
56
|
+
"div",
|
|
57
|
+
{
|
|
58
|
+
class: `kui-split-view ${className}`.trim(),
|
|
59
|
+
id,
|
|
60
|
+
"data-component": "split-view",
|
|
61
|
+
"data-split-mode": "split",
|
|
62
|
+
"aria-label": label,
|
|
63
|
+
children: [
|
|
64
|
+
listPane,
|
|
65
|
+
/* @__PURE__ */ jsx(
|
|
66
|
+
"div",
|
|
67
|
+
{
|
|
68
|
+
class: "kui-split-view__detail kui-pane",
|
|
69
|
+
"data-split-detail": true,
|
|
70
|
+
"aria-label": detailTitle || void 0,
|
|
71
|
+
children: detail
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
);
|
|
17
77
|
}
|
|
18
78
|
|
|
19
79
|
export { SplitView };
|
package/dist/split-view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":";;;;;;AA4CO,SAAS,
|
|
1
|
+
{"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":";;;;;;AA4CO,SAAS,SAAA,CAAU;AAAA,EACxB,EAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,KAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,EAAA;AAAA,EACd,SAAA,GAAY,MAAA;AAAA,EACZ,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAmB;AACjB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,QAAQ,YAAA,GACV;AAAA,MACE,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,MAC/C,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,SAAS,MAAA;AAAO,KACvD,GACA,CAAC,EAAE,GAAA,EAAK,QAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,CAAA;AACrD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,QAClE,EAAA;AAAA,QACA,gBAAA,EAAe,YAAA;AAAA,QACf,iBAAA,EAAgB,SAAA;AAAA,QAEhB,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,YACT,KAAA;AAAA,YACA,KAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,MAAM,WAAW,SAAA,mBACf,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,GAAG,EAAE,CAAA,KAAA,CAAA;AAAA,MACT,OAAO,SAAA,IAAa,MAAA;AAAA,MACpB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,KAAK,SAAA,CAAU,GAAA;AAAA,MACf,KAAK,SAAA,CAAU,GAAA;AAAA,MAEf,8BAAC,KAAA,EAAA,EAAI,KAAA,EAAM,+BAAA,EAAgC,iBAAA,EAAe,MACvD,QAAA,EAAA,IAAA,EACH;AAAA;AAAA,sBAGF,GAAA,CAAC,KAAA,EAAA,EAAI,OAAM,+BAAA,EAAgC,iBAAA,EAAe,MACvD,QAAA,EAAA,IAAA,EACH,CAAA;AAEF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC1C,EAAA;AAAA,MACA,gBAAA,EAAe,YAAA;AAAA,MACf,iBAAA,EAAgB,OAAA;AAAA,MAChB,YAAA,EAAY,KAAA;AAAA,MAEX,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,iCAAA;AAAA,YACN,mBAAA,EAAiB,IAAA;AAAA,YACjB,cAAY,WAAA,IAAe,MAAA;AAAA,YAE1B,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ","file":"split-view.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { NavStack } from './nav-stack.js';\nimport { ResizableRegion } from './resizable-region.js';\n\nexport interface SplitViewResizable {\n size: number;\n min: number;\n max: number;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: SafeHtml;\n /** The detail (secondary) pane. */\n detail: SafeHtml;\n /**\n * Compact (\"one pane at a time\") classes — a handset or portrait tablet.\n * Derive from `deviceClass().value.compact`. When true the split collapses to\n * a `NavStack`: the list is the root and the detail is pushed over it.\n */\n compact?: boolean;\n /** In compact mode, whether the detail is currently pushed over the list. */\n detailActive?: boolean;\n /** Title/label for the list (compact NavStack root + region label). */\n listTitle?: string;\n /** Title/label for the detail (compact NavStack pushed view + region label). */\n detailTitle?: string;\n /** Back label for the compact NavStack (default \"Back\"). */\n backLabel?: string;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n className?: string;\n}\n\n/**\n * A list-detail split. On roomy classes it shows both panes side\n * by side with an optional resizable separator; on compact classes it collapses\n * to a `NavStack` (list → detail). See `docs/23-app-layouts.md` §3.2. Compose the\n * resizable wiring with `wireResizableRegions` and the compact back with\n * `wireNavStack`.\n */\nexport function SplitView({\n id,\n label,\n list,\n detail,\n compact = false,\n detailActive = false,\n listTitle = '',\n detailTitle = '',\n backLabel = 'Back',\n resizable,\n className = '',\n}: SplitViewProps) {\n if (compact) {\n const views = detailActive\n ? [\n { key: 'list', title: listTitle, content: list },\n { key: 'detail', title: detailTitle, content: detail },\n ]\n : [{ key: 'list', title: listTitle, content: list }];\n return (\n <div\n class={`kui-split-view kui-split-view--compact ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"compact\"\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n />\n </div>\n );\n }\n const listPane = resizable ? (\n <ResizableRegion\n id={`${id}-list`}\n label={listTitle || 'List'}\n size={resizable.size}\n min={resizable.min}\n max={resizable.max}\n >\n <div class=\"kui-split-view__list kui-pane\" data-split-list>\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div class=\"kui-split-view__list kui-pane\" data-split-list>\n {list}\n </div>\n );\n return (\n <div\n class={`kui-split-view ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"split\"\n aria-label={label}\n >\n {listPane}\n <div\n class=\"kui-split-view__detail kui-pane\"\n data-split-detail\n aria-label={detailTitle || undefined}\n >\n {detail}\n </div>\n </div>\n );\n}\n"]}
|
package/dist/state-banner.d.ts
CHANGED
|
@@ -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?:
|
|
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
|
-
declare function StateBanner({ title, detail, icon, action, tone, urgency, className, placeholder }: StateBannerProps): SafeHtml;
|
|
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 };
|
package/dist/state-banner.js
CHANGED
package/dist/styles/catalog.css
CHANGED
|
@@ -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
|
-
|
|
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%);
|
|
@@ -325,6 +324,32 @@
|
|
|
325
324
|
place-items: center;
|
|
326
325
|
}
|
|
327
326
|
|
|
327
|
+
/* Optional devtools-style geometry overlay. `wireCatalogGeometryOverlay` draws
|
|
328
|
+
a quiet dashed outer bound for transparent specimens and orange bands for
|
|
329
|
+
non-zero margins. */
|
|
330
|
+
.kui-catalog__geometry-overlay {
|
|
331
|
+
position: absolute;
|
|
332
|
+
z-index: 3;
|
|
333
|
+
pointer-events: none;
|
|
334
|
+
inset: 0;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.kui-catalog__geometry-bound,
|
|
338
|
+
.kui-catalog__geometry-margin {
|
|
339
|
+
position: absolute;
|
|
340
|
+
top: 0;
|
|
341
|
+
left: 0;
|
|
342
|
+
box-sizing: border-box;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.kui-catalog__geometry-bound {
|
|
346
|
+
border: 1px dashed color-mix(in srgb, var(--kui-color-text) 40%, transparent);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.kui-catalog__geometry-margin {
|
|
350
|
+
background: color-mix(in srgb, #f6a94c 55%, transparent);
|
|
351
|
+
}
|
|
352
|
+
|
|
328
353
|
.kui-catalog__footer {
|
|
329
354
|
--kui-toolbar-gap: 0.25rem;
|
|
330
355
|
--kui-toolbar-group-size: 2rem;
|
|
@@ -484,15 +509,16 @@
|
|
|
484
509
|
.kui-catalog[data-sidebar-collapsed="true"] .kui-catalog__sidebar {
|
|
485
510
|
display: none;
|
|
486
511
|
}
|
|
487
|
-
.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
|
+
|
|
488
516
|
width: 100%;
|
|
489
517
|
min-width: 0;
|
|
490
518
|
height: auto;
|
|
491
519
|
justify-self: stretch;
|
|
492
520
|
/* Narrow layout collapses via display:none, not the desktop slide. */
|
|
493
521
|
transform: none;
|
|
494
|
-
border-inline-end: 0;
|
|
495
|
-
border-block-end: 1px solid var(--kui-color-border);
|
|
496
522
|
}
|
|
497
523
|
.kui-catalog__detail {
|
|
498
524
|
height: auto;
|
package/dist/styles/layout.css
CHANGED
|
@@ -1,24 +1,6 @@
|
|
|
1
|
-
|
|
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
|
-
.
|
|
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
|
+
}
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
--kui-layout-rounded-radius,
|
|
13
13
|
calc(1px + 0.6875rem)
|
|
14
14
|
);
|
|
15
|
-
--kui-segmented-item-radius:
|
|
16
|
-
|
|
17
|
-
calc(
|
|
15
|
+
--kui-segmented-item-radius: max(
|
|
16
|
+
0px,
|
|
17
|
+
calc(var(--kui-segmented-radius) - 2px)
|
|
18
18
|
);
|
|
19
19
|
display: inline-flex;
|
|
20
20
|
max-width: 100%;
|
|
@@ -82,10 +82,6 @@
|
|
|
82
82
|
--kui-layout-pill-radius,
|
|
83
83
|
calc(1px + 1.3125rem)
|
|
84
84
|
);
|
|
85
|
-
--kui-segmented-item-radius: var(
|
|
86
|
-
--kui-layout-pill-radius,
|
|
87
|
-
calc(1px + 1.3125rem)
|
|
88
|
-
);
|
|
89
85
|
}
|
|
90
86
|
|
|
91
87
|
.kui-segmented-control[data-layout="equal"] {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
.kui-sunken-panel {
|
|
2
|
+
display: flex;
|
|
3
|
+
min-width: 0;
|
|
4
|
+
min-height: 0;
|
|
5
|
+
padding: var(--kui-sunken-panel-padding, 0.5rem);
|
|
6
|
+
box-sizing: border-box;
|
|
7
|
+
border-radius: var(
|
|
8
|
+
--kui-sunken-panel-radius,
|
|
9
|
+
var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
|
|
10
|
+
);
|
|
11
|
+
color: var(--kui-sunken-panel-foreground, var(--kui-color-text));
|
|
12
|
+
background: var(
|
|
13
|
+
--kui-sunken-panel-background,
|
|
14
|
+
var(--kui-color-surface-lowered)
|
|
15
|
+
);
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
gap: var(--kui-sunken-panel-gap, 0.5rem);
|
|
18
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SafeHtml } from 'kerfjs';
|
|
2
|
+
|
|
3
|
+
interface SunkenPanelProps {
|
|
4
|
+
children?: SafeHtml | readonly SafeHtml[];
|
|
5
|
+
/** Optional accessible landmark name for a distinct application region. */
|
|
6
|
+
ariaLabel?: string;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A lowered application surface with one compact inset and a vertical content
|
|
11
|
+
* stack. The panel owns its background and padding; children own their own
|
|
12
|
+
* borders and internal geometry.
|
|
13
|
+
*/
|
|
14
|
+
declare function SunkenPanel({ children, ariaLabel, className, }: SunkenPanelProps): SafeHtml;
|
|
15
|
+
|
|
16
|
+
export { SunkenPanel, type SunkenPanelProps };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"sunken-panel.js"}
|
package/dist/tab-bar.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SafeHtml } from 'kerfjs';
|
|
2
2
|
|
|
3
|
+
type TabActivation = 'automatic' | 'manual';
|
|
3
4
|
interface TabBarProps {
|
|
4
5
|
id: string;
|
|
5
6
|
label: string;
|
|
@@ -13,9 +14,9 @@ interface TabBarProps {
|
|
|
13
14
|
* selects on arrow / Home / End; `'manual'` moves roving focus only and the user
|
|
14
15
|
* selects with Enter / Space / click — use it when selecting a tab is a heavy action.
|
|
15
16
|
*/
|
|
16
|
-
activation?:
|
|
17
|
+
activation?: TabActivation;
|
|
17
18
|
}
|
|
18
19
|
/** Render a controlled tab strip. The application owns selection, order, and persistence. */
|
|
19
|
-
declare function TabBar({ id, label, children, leading, trailing, className, activation }: TabBarProps): SafeHtml;
|
|
20
|
+
declare function TabBar({ id, label, children, leading, trailing, className, activation, }: TabBarProps): SafeHtml;
|
|
20
21
|
|
|
21
|
-
export { TabBar, type TabBarProps };
|
|
22
|
+
export { type TabActivation, TabBar, type TabBarProps };
|
package/dist/tab-bar.js
CHANGED
package/dist/tab-scaffold.d.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { SafeHtml } from 'kerfjs';
|
|
2
2
|
|
|
3
|
-
interface TabScaffoldTab {
|
|
4
|
-
id:
|
|
3
|
+
interface TabScaffoldTab<Id extends string = string> {
|
|
4
|
+
id: Id;
|
|
5
5
|
label: string;
|
|
6
6
|
/** Decorative icon shown above the label in the bottom bar. */
|
|
7
7
|
icon?: SafeHtml;
|
|
8
8
|
/** The tab's content — typically a `NavStack` so each tab keeps its own stack. */
|
|
9
9
|
content: SafeHtml;
|
|
10
10
|
}
|
|
11
|
-
interface TabScaffoldProps {
|
|
11
|
+
interface TabScaffoldProps<Id extends string = string> {
|
|
12
12
|
id: string;
|
|
13
13
|
/** Accessible name for the tab bar. */
|
|
14
14
|
label: string;
|
|
15
|
-
tabs: TabScaffoldTab[];
|
|
15
|
+
tabs: readonly TabScaffoldTab<Id>[];
|
|
16
16
|
/** The controlled active tab id (the app owns selection). */
|
|
17
|
-
active:
|
|
17
|
+
active: NoInfer<Id>;
|
|
18
18
|
className?: string;
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
@@ -25,6 +25,6 @@ interface TabScaffoldProps {
|
|
|
25
25
|
* On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of
|
|
26
26
|
* a bottom bar. See `docs/23-app-layouts.md` §3.4.
|
|
27
27
|
*/
|
|
28
|
-
declare function TabScaffold({ id, label, tabs, active, className }: TabScaffoldProps): SafeHtml;
|
|
28
|
+
declare function TabScaffold<Id extends string>({ id, label, tabs, active, className, }: TabScaffoldProps<Id>): SafeHtml;
|
|
29
29
|
|
|
30
30
|
export { TabScaffold, type TabScaffoldProps, type TabScaffoldTab };
|