@kerfjs/ui 5.0.0-beta.54 → 5.0.0-beta.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -11
- package/ai/compile-time-contracts-v1.json +2 -2
- package/ai/component-catalog-v2.json +206 -39
- package/ai/component-catalog.json +306 -58
- package/ai/public-api-signatures-v1.md +671 -92
- package/ai/skill.md +43 -38
- package/ai/webawesome-jsx-signatures-v1.md +8 -2
- package/dist/app-tab.js +1 -1
- package/dist/badge.d.ts +35 -7
- package/dist/badge.js +1 -1
- package/dist/browser/content-item.js +3 -0
- package/dist/browser/popup-menu.js +3 -0
- package/dist/browser/select.js +1 -0
- package/dist/catalog-resources.d.ts +12 -1
- package/dist/catalog.d.ts +21 -4
- package/dist/catalog.js +260 -308
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-7IUSV4XG.js → chunk-24PHKUR3.js} +2 -2
- package/dist/chunk-24PHKUR3.js.map +1 -0
- package/dist/{chunk-WZ2GLEY4.js → chunk-2G2ZJQYK.js} +2 -14
- package/dist/chunk-2G2ZJQYK.js.map +1 -0
- package/dist/{chunk-D7GWXIAS.js → chunk-5I7QGQVT.js} +1 -1
- package/dist/chunk-5I7QGQVT.js.map +1 -0
- package/dist/{chunk-HJKRCKDR.js → chunk-63ZWBGE3.js} +6 -3
- package/dist/chunk-63ZWBGE3.js.map +1 -0
- package/dist/{chunk-44IG7PFV.js → chunk-6CINWX2E.js} +3 -3
- package/dist/{chunk-44IG7PFV.js.map → chunk-6CINWX2E.js.map} +1 -1
- package/dist/{chunk-C2FAYFDE.js → chunk-AGXQQFKZ.js} +2 -2
- package/dist/{chunk-C2FAYFDE.js.map → chunk-AGXQQFKZ.js.map} +1 -1
- package/dist/{chunk-ATHXW6RP.js → chunk-AHEG27M7.js} +2 -2
- package/dist/{chunk-ATHXW6RP.js.map → chunk-AHEG27M7.js.map} +1 -1
- package/dist/{chunk-7GUQYHKA.js → chunk-AK67F6QN.js} +4 -1
- package/dist/chunk-AK67F6QN.js.map +1 -0
- package/dist/chunk-BFPBS5Y4.js +250 -0
- package/dist/chunk-BFPBS5Y4.js.map +1 -0
- package/dist/chunk-DG6G5EPF.js +35 -0
- package/dist/chunk-DG6G5EPF.js.map +1 -0
- package/dist/{chunk-MTM43SJO.js → chunk-G33XC2NB.js} +1 -1
- package/dist/chunk-G33XC2NB.js.map +1 -0
- package/dist/{chunk-TZ5IHWB2.js → chunk-K6UNVKDK.js} +3 -3
- package/dist/{chunk-TZ5IHWB2.js.map → chunk-K6UNVKDK.js.map} +1 -1
- package/dist/chunk-KH6VUGHU.js +399 -0
- package/dist/chunk-KH6VUGHU.js.map +1 -0
- package/dist/{chunk-HMQ2ZDGG.js → chunk-KROD7KZK.js} +3 -2
- package/dist/chunk-KROD7KZK.js.map +1 -0
- package/dist/{chunk-5NDQABWK.js → chunk-M7QV3IHH.js} +3 -1
- package/dist/chunk-M7QV3IHH.js.map +1 -0
- package/dist/{chunk-RNZAKSME.js → chunk-MA6Z6EIM.js} +3 -3
- package/dist/{chunk-RNZAKSME.js.map → chunk-MA6Z6EIM.js.map} +1 -1
- package/dist/chunk-MA73TA6D.js +42 -0
- package/dist/chunk-MA73TA6D.js.map +1 -0
- package/dist/{chunk-ZMBU522F.js → chunk-MEY33VWB.js} +2 -2
- package/dist/{chunk-ZMBU522F.js.map → chunk-MEY33VWB.js.map} +1 -1
- package/dist/{chunk-T22EM4ET.js → chunk-MOBRFZH3.js} +81 -31
- package/dist/chunk-MOBRFZH3.js.map +1 -0
- package/dist/chunk-MP2GDBQZ.js +50 -0
- package/dist/chunk-MP2GDBQZ.js.map +1 -0
- package/dist/{chunk-3NBL3OUQ.js → chunk-NAPE7WUS.js} +2 -2
- package/dist/chunk-NAPE7WUS.js.map +1 -0
- package/dist/{chunk-CMUIXJZM.js → chunk-NBYTIVHS.js} +2 -2
- package/dist/{chunk-CMUIXJZM.js.map → chunk-NBYTIVHS.js.map} +1 -1
- package/dist/chunk-O3EXIBEZ.js +114 -0
- package/dist/chunk-O3EXIBEZ.js.map +1 -0
- package/dist/{chunk-KPNTVB7A.js → chunk-PK4N5QTO.js} +8 -7
- package/dist/chunk-PK4N5QTO.js.map +1 -0
- package/dist/chunk-QQOTQTDD.js +415 -0
- package/dist/chunk-QQOTQTDD.js.map +1 -0
- package/dist/{chunk-BJJKFVWW.js → chunk-T4UZTNZ4.js} +5 -5
- package/dist/chunk-T4UZTNZ4.js.map +1 -0
- package/dist/chunk-V65EOWNF.js +83 -0
- package/dist/chunk-V65EOWNF.js.map +1 -0
- package/dist/{chunk-GUIHMIT2.js → chunk-VNPQDCQZ.js} +3 -3
- package/dist/{chunk-GUIHMIT2.js.map → chunk-VNPQDCQZ.js.map} +1 -1
- package/dist/{chunk-5I22LMCV.js → chunk-VZOFZPSO.js} +2 -2
- package/dist/chunk-VZOFZPSO.js.map +1 -0
- package/dist/chunk-WLG6SSNT.js +94 -0
- package/dist/chunk-WLG6SSNT.js.map +1 -0
- package/dist/{chunk-NE5JAOQS.js → chunk-WOUF7YXM.js} +3 -3
- package/dist/{chunk-NE5JAOQS.js.map → chunk-WOUF7YXM.js.map} +1 -1
- package/dist/collapsible-panel.d.ts +51 -13
- package/dist/collapsible-panel.js +38 -10
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/content-item.d.ts +46 -0
- package/dist/content-item.js +4 -0
- package/dist/content-item.js.map +1 -0
- package/dist/css-values.d.ts +5 -11
- package/dist/css-values.js +1 -1
- package/dist/disclosure-arrow.d.ts +4 -1
- package/dist/disclosure-arrow.js +1 -1
- package/dist/floating-toolbar.d.ts +17 -6
- package/dist/floating-toolbar.js +1 -1
- package/dist/grid.js +1 -1
- package/dist/help-tags-register.d.ts +13 -0
- package/dist/help-tags-register.js +9 -0
- package/dist/help-tags-register.js.map +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.js +31 -29
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.d.ts +14 -1
- 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 +9 -10
- package/dist/list-inset-text.js +2 -1
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +10 -3
- package/dist/list.js +1 -1
- package/dist/nav-stack.d.ts +38 -5
- package/dist/nav-stack.js +4 -1
- package/dist/pane.d.ts +20 -2
- package/dist/pane.js +1 -1
- package/dist/panel-toolbar-C8sF-YZC.d.ts +63 -0
- package/dist/popup-menu-register.d.ts +9 -0
- package/dist/popup-menu-register.js +31 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +71 -0
- package/dist/popup-menu.js +3 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/row.d.ts +1 -1
- package/dist/row.js +1 -1
- package/dist/select-register.js +70 -3
- package/dist/select-register.js.map +1 -1
- package/dist/select.d.ts +46 -8
- package/dist/select.js +2 -1
- package/dist/{divider-sides-BzB6rphT.d.ts → sides-BPSWde0A.d.ts} +1 -3
- package/dist/skeleton.js +1 -1
- package/dist/spacer.js +1 -1
- package/dist/split-view.d.ts +31 -3
- package/dist/split-view.js +33 -5
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/badge.css +13 -0
- package/dist/styles/catalog/components/catalog-example.css +1 -17
- package/dist/styles/catalog/components/catalog-stage.css +9 -14
- package/dist/styles/catalog/components/catalog.css +8 -18
- package/dist/styles/catalog.css +0 -5
- package/dist/styles/collapsible-panel.css +192 -39
- package/dist/styles/content-item.css +30 -0
- package/dist/styles/floating-toolbar.css +5 -0
- package/dist/styles/foundation.css +28 -19
- package/dist/styles/layout.css +1 -21
- package/dist/styles/list-action-row.css +13 -1
- package/dist/styles/list-inset-text.css +1 -2
- package/dist/styles/list-item.css +14 -1
- package/dist/styles/list.css +1 -1
- package/dist/styles/nav-stack.css +29 -64
- package/dist/styles/pane.css +33 -1
- package/dist/styles/popup-menu.css +90 -0
- package/dist/styles/resizable-region.css +53 -10
- package/dist/styles/select.css +39 -12
- package/dist/styles/split-view.css +21 -25
- package/dist/styles/state-banner.css +13 -4
- package/dist/styles/styles.css +1 -0
- package/dist/styles/tab-bar.css +31 -3
- package/dist/styles/tab-scaffold.css +36 -14
- package/dist/styles/text.css +1 -1
- package/dist/styles/token-search-field.css +4 -4
- package/dist/styles/toolbar-control-group.css +44 -12
- package/dist/styles/toolbar.css +57 -7
- package/dist/styles/value-table.css +19 -2
- package/dist/styles/webawesome.css +3 -1
- package/dist/styles/workbench.css +165 -31
- package/dist/tab-scaffold.d.ts +35 -1
- package/dist/tab-scaffold.js +50 -16
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/text.js +1 -1
- package/dist/token-search-field.d.ts +13 -2
- package/dist/token-search-field.js +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +12 -4
- package/dist/toolbar.js +1 -1
- package/dist/{types-CEsieBZi.d.ts → types-DXAGogOS.d.ts} +48 -0
- package/dist/value-table.js +1 -1
- package/dist/webawesome.d.ts +7 -1
- package/dist/wire-catalog.d.ts +24 -1
- package/dist/wire-catalog.js +26 -3
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-sidebar.js +6 -3
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/wire-workbench.js +1 -350
- package/dist/wire-workbench.js.map +1 -1
- package/dist/workbench.d.ts +144 -6
- package/dist/workbench.js +11 -208
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +126 -6
- package/docs/app-layouts.md +9 -7
- package/docs/catalog.md +41 -9
- package/docs/collapsible-panel.md +79 -5
- package/docs/component-contract.md +38 -12
- package/docs/component-selection.md +64 -55
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state/with-action.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -1
- package/docs/design/templates/empty-state.svg +1 -1
- package/docs/design/templates/list/compact-dark.svg +1 -1
- package/docs/design/templates/list/compact.svg +1 -1
- package/docs/design/templates/list/stack-dark.svg +1 -1
- package/docs/design/templates/list/stack.svg +1 -1
- package/docs/design/templates/list-action-row/default-dark.svg +1 -1
- package/docs/design/templates/list-action-row/default.svg +1 -1
- package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
- package/docs/design/templates/list-action-row/selected.svg +1 -1
- package/docs/design/templates/list-action-row-dark.svg +1 -1
- package/docs/design/templates/list-action-row.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- package/docs/design/templates/list-item/default-dark.svg +1 -1
- package/docs/design/templates/list-item/default.svg +1 -1
- package/docs/design/templates/list-item/selected-dark.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item/trailing-dark.svg +1 -1
- package/docs/design/templates/list-item/trailing.svg +1 -1
- package/docs/design/templates/list-item-dark.svg +1 -1
- package/docs/design/templates/list-item.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/design/templates/value-table/details-dark.svg +1 -1
- package/docs/design/templates/value-table/details.svg +1 -1
- package/docs/design/templates/value-table-dark.svg +1 -1
- package/docs/design/templates/value-table.svg +1 -1
- package/docs/design-philosophy.md +1 -1
- package/docs/examples/command-palette-adapter.tsx +3 -2
- package/docs/layout.md +74 -29
- package/docs/nav-stack.md +45 -1
- package/docs/recipes.md +48 -40
- package/docs/split-view.md +46 -2
- package/docs/surface-scaffold.md +1 -1
- package/docs/tab-scaffold.md +50 -1
- package/docs/type-contracts.md +17 -17
- package/docs/ux-demo.md +8 -4
- package/docs/webawesome-theme.md +1 -2
- package/docs/workbench.md +131 -10
- package/llms.txt +38 -9
- package/package.json +24 -2
- package/ux-demo/recipes/app-shell.tsx +141 -223
- package/ux-demo/recipes/collapsible-sidebar.tsx +47 -77
- package/ux-demo/recipes/list-detail-dialog.tsx +150 -54
- package/ux-demo/recipes/mount-recipe.ts +0 -5
- package/ux-demo/recipes/navigation-sidebar.tsx +3 -2
- package/ux-demo/recipes/navigation-stack.tsx +3 -2
- package/ux-demo/recipes/types.ts +0 -1
- package/dist/chunk-3NBL3OUQ.js.map +0 -1
- package/dist/chunk-5I22LMCV.js.map +0 -1
- package/dist/chunk-5NDQABWK.js.map +0 -1
- package/dist/chunk-7GUQYHKA.js.map +0 -1
- package/dist/chunk-7IUSV4XG.js.map +0 -1
- package/dist/chunk-BJJKFVWW.js.map +0 -1
- package/dist/chunk-D7GWXIAS.js.map +0 -1
- package/dist/chunk-DQA5FMOX.js +0 -85
- package/dist/chunk-DQA5FMOX.js.map +0 -1
- package/dist/chunk-HJKRCKDR.js.map +0 -1
- package/dist/chunk-HMQ2ZDGG.js.map +0 -1
- package/dist/chunk-KPNTVB7A.js.map +0 -1
- package/dist/chunk-MTM43SJO.js.map +0 -1
- package/dist/chunk-T22EM4ET.js.map +0 -1
- package/dist/chunk-WZ2GLEY4.js.map +0 -1
- package/dist/chunk-XD7DWYXG.js +0 -34
- package/dist/chunk-XD7DWYXG.js.map +0 -1
- package/dist/chunk-ZK5EGVFP.js +0 -27
- package/dist/chunk-ZK5EGVFP.js.map +0 -1
- package/dist/styles/catalog/components/catalog-detail.css +0 -35
- package/dist/styles/catalog/components/catalog-resource-footer.css +0 -37
- package/dist/styles/catalog/components/catalog-secondary-sections.css +0 -38
- package/dist/styles/catalog/components/catalog-section-list.css +0 -22
- package/dist/styles/catalog/components/catalog-sidebar.css +0 -82
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { SafeHtml } from 'kerfjs';
|
|
2
|
+
import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
|
|
3
|
+
|
|
4
|
+
type PopupMenuPlacement = 'bottom-start' | 'bottom' | 'bottom-end' | 'top-start' | 'top' | 'top-end';
|
|
5
|
+
type PopupMenuDataAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
|
|
6
|
+
'data-action'?: never;
|
|
7
|
+
'data-component'?: never;
|
|
8
|
+
'data-key'?: never;
|
|
9
|
+
'data-morph-skip-children'?: never;
|
|
10
|
+
}>;
|
|
11
|
+
/** One command in the menu. */
|
|
12
|
+
interface PopupMenuItem {
|
|
13
|
+
kind?: 'item';
|
|
14
|
+
label: string;
|
|
15
|
+
/** Delegated `data-action` the app handles when the item is chosen. */
|
|
16
|
+
action?: string;
|
|
17
|
+
/** Native `wa-dropdown-item` value, reported by its `wa-select` event. */
|
|
18
|
+
value?: string;
|
|
19
|
+
/** Leading icon, typically a `LucideIcon`; it is placed in the item's icon slot. */
|
|
20
|
+
icon?: SafeHtml;
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
/** Application `data-*` metadata such as a record id. */
|
|
23
|
+
attributes?: PopupMenuDataAttributes;
|
|
24
|
+
}
|
|
25
|
+
/** A labeled group heading; items that follow it belong to the group. */
|
|
26
|
+
interface PopupMenuHeading {
|
|
27
|
+
kind: 'heading';
|
|
28
|
+
label: string;
|
|
29
|
+
}
|
|
30
|
+
/** A separator between groups of items. */
|
|
31
|
+
interface PopupMenuDivider {
|
|
32
|
+
kind: 'divider';
|
|
33
|
+
}
|
|
34
|
+
type PopupMenuEntry = PopupMenuItem | PopupMenuHeading | PopupMenuDivider;
|
|
35
|
+
type PopupMenuTriggerName = {
|
|
36
|
+
/** Visible trigger text, which is also its accessible name. */
|
|
37
|
+
text: string;
|
|
38
|
+
label?: never;
|
|
39
|
+
} | {
|
|
40
|
+
text?: never;
|
|
41
|
+
/**
|
|
42
|
+
* Accessible name of an icon-only trigger, rendered as visually hidden
|
|
43
|
+
* slotted text (a Web Awesome button takes its name from its content).
|
|
44
|
+
*/
|
|
45
|
+
label: string;
|
|
46
|
+
};
|
|
47
|
+
type PopupMenuProps = PopupMenuTriggerName & {
|
|
48
|
+
/** Trigger icon, typically a `LucideIcon`, before any visible text. */
|
|
49
|
+
icon?: KerfUiContent;
|
|
50
|
+
items: readonly PopupMenuEntry[];
|
|
51
|
+
/** Where the menu opens relative to its trigger. Defaults to `bottom-start`. */
|
|
52
|
+
placement?: PopupMenuPlacement;
|
|
53
|
+
/** Show the disclosure caret after the trigger content. Defaults to true. */
|
|
54
|
+
caret?: boolean;
|
|
55
|
+
disabled?: boolean;
|
|
56
|
+
/** Application `data-*` metadata on the menu root. */
|
|
57
|
+
rootAttributes?: PopupMenuDataAttributes;
|
|
58
|
+
/** Native named-slot assignment when composed inside a web component. */
|
|
59
|
+
slot?: string;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* An action menu: a trigger button that opens a list of commands. Renders the
|
|
63
|
+
* `wa-dropdown` root directly, so a `single` `ToolbarControlGroup` (with
|
|
64
|
+
* `nestedDropdown`) or a `PopupSurface` sizes and insets it as usual. Items
|
|
65
|
+
* dispatch through delegated `data-action`s; the app owns the commands and any
|
|
66
|
+
* open-state reaction. Import `@kerfjs/ui/popup-menu/register` once to register
|
|
67
|
+
* the Web Awesome elements.
|
|
68
|
+
*/
|
|
69
|
+
declare function PopupMenu({ text, label, icon, items, placement, caret, disabled, rootAttributes, slot, }: PopupMenuProps): SafeHtml;
|
|
70
|
+
|
|
71
|
+
export { PopupMenu, type PopupMenuDivider, type PopupMenuEntry, type PopupMenuHeading, type PopupMenuItem, type PopupMenuPlacement, type PopupMenuProps };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"popup-menu.js"}
|
package/dist/row.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as kerfjs from 'kerfjs';
|
|
2
2
|
import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
|
|
3
|
-
import { S as Sides } from './divider-sides-BzB6rphT.js';
|
|
4
3
|
import { H as HorizontalAlignment, V as VerticalAlignment } from './flex-alignment-4ms8ZbV8.js';
|
|
5
4
|
import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
|
|
5
|
+
import { S as Sides } from './sides-BPSWde0A.js';
|
|
6
6
|
|
|
7
7
|
type RowRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
|
|
8
8
|
'data-component'?: never;
|
package/dist/row.js
CHANGED
package/dist/select-register.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
+
import { installHelpTags } from './chunk-BFPBS5Y4.js';
|
|
1
2
|
import '@awesome.me/webawesome/dist/components/button/button.js';
|
|
2
3
|
import '@awesome.me/webawesome/dist/components/divider/divider.js';
|
|
3
4
|
import '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';
|
|
4
5
|
import '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';
|
|
5
|
-
import '@awesome.me/webawesome/dist/components/
|
|
6
|
+
import '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';
|
|
7
|
+
import WaOption from '@awesome.me/webawesome/dist/components/option/option.js';
|
|
6
8
|
import WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';
|
|
7
9
|
import { WaAfterHideEvent } from '@awesome.me/webawesome/dist/events/after-hide.js';
|
|
8
10
|
import { WaAfterShowEvent } from '@awesome.me/webawesome/dist/events/after-show.js';
|
|
9
11
|
import { WaHideEvent } from '@awesome.me/webawesome/dist/events/hide.js';
|
|
10
12
|
import { WaShowEvent } from '@awesome.me/webawesome/dist/events/show.js';
|
|
11
13
|
|
|
12
|
-
// src/select-register.ts
|
|
13
|
-
|
|
14
14
|
// src/animate-select-popup.ts
|
|
15
15
|
function animateSelectPopup(popup, phase, signal) {
|
|
16
16
|
return new Promise((resolve) => {
|
|
@@ -129,8 +129,75 @@ function installSelectLifecycle(prototype) {
|
|
|
129
129
|
};
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
// src/install-select-multiple.ts
|
|
133
|
+
function kerfMultiple(host) {
|
|
134
|
+
return host instanceof HTMLElement && host.dataset.component === "select" && host.multiple;
|
|
135
|
+
}
|
|
136
|
+
function listLocale(host) {
|
|
137
|
+
const lang = host.closest("[lang]")?.lang;
|
|
138
|
+
return lang || void 0;
|
|
139
|
+
}
|
|
140
|
+
function summarizeSelection(labels, locale) {
|
|
141
|
+
if (labels.length === 0) return "";
|
|
142
|
+
try {
|
|
143
|
+
return new Intl.ListFormat(locale, {
|
|
144
|
+
type: "unit",
|
|
145
|
+
style: "short"
|
|
146
|
+
}).format(labels);
|
|
147
|
+
} catch {
|
|
148
|
+
return labels.join(", ");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function installSelectMultiple(selectPrototype, optionPrototype) {
|
|
152
|
+
const installed = /* @__PURE__ */ Symbol.for("@kerfjs/ui/select-multiple");
|
|
153
|
+
if (Object.prototype.hasOwnProperty.call(selectPrototype, installed)) return;
|
|
154
|
+
Object.defineProperty(selectPrototype, installed, { value: true });
|
|
155
|
+
const select = selectPrototype;
|
|
156
|
+
const selectionChanged = select.selectionChanged;
|
|
157
|
+
select.selectionChanged = function() {
|
|
158
|
+
selectionChanged.call(this);
|
|
159
|
+
if (!kerfMultiple(this)) return;
|
|
160
|
+
const chosen = new Set(this.selectedOptions);
|
|
161
|
+
const summary = summarizeSelection(
|
|
162
|
+
this.getAllOptions().filter((option2) => chosen.has(option2)).map((option2) => option2.label),
|
|
163
|
+
listLocale(this)
|
|
164
|
+
);
|
|
165
|
+
const nameSummary = this.querySelector(
|
|
166
|
+
':scope > [slot="label"] > .kui-select__name-summary'
|
|
167
|
+
);
|
|
168
|
+
if (this.dataset.selectedPresentation === "icon-only" && nameSummary) {
|
|
169
|
+
nameSummary.textContent = summary ? `: ${summary}` : "";
|
|
170
|
+
this.displayLabel = "";
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
this.displayLabel = summary;
|
|
174
|
+
};
|
|
175
|
+
const tags = Object.getOwnPropertyDescriptor(selectPrototype, "tags");
|
|
176
|
+
if (tags?.get) {
|
|
177
|
+
const getTags = tags.get;
|
|
178
|
+
Object.defineProperty(selectPrototype, "tags", {
|
|
179
|
+
configurable: true,
|
|
180
|
+
get() {
|
|
181
|
+
return kerfMultiple(this) ? [] : getTags.call(this);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const option = optionPrototype;
|
|
186
|
+
const syncDefaultSelected = option.syncDefaultSelected;
|
|
187
|
+
option.syncDefaultSelected = function() {
|
|
188
|
+
const host = this.closest('[data-component="select"]');
|
|
189
|
+
if (!kerfMultiple(host) || !host.hasUpdated) {
|
|
190
|
+
syncDefaultSelected.call(this);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
host.value = host.getAllOptions().filter((candidate) => candidate.hasAttribute("selected")).map((candidate) => candidate.value);
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
132
197
|
// src/select-register.ts
|
|
133
198
|
installSelectLifecycle(WaSelect.prototype);
|
|
199
|
+
installSelectMultiple(WaSelect.prototype, WaOption.prototype);
|
|
200
|
+
installHelpTags();
|
|
134
201
|
var selectElementsRegistered = true;
|
|
135
202
|
|
|
136
203
|
export { selectElementsRegistered };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/animate-select-popup.ts","../src/install-select-lifecycle.ts","../src/select-register.ts"],"names":[],"mappings":"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","file":"select-register.js","sourcesContent":["/** Run one native Select CSS animation; a reversal owns cancellation and cleanup. */\nexport function animateSelectPopup(\n popup: HTMLElement,\n phase: 'show' | 'hide',\n signal: AbortSignal,\n): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n let frame = 0;\n const finish = () => {\n if (settled) return;\n settled = true;\n window.cancelAnimationFrame(frame);\n signal.removeEventListener('abort', finish);\n popup.classList.remove(phase);\n resolve();\n };\n signal.addEventListener('abort', finish, { once: true });\n popup.classList.add(phase);\n // Activation renders asynchronously. Check for reduced/absent motion only\n // after the native popup has had its normal render opportunity.\n frame = window.requestAnimationFrame(() => {\n // Observe these exact animations. An old CSS animationcancel event can\n // arrive after the next phase starts and must not finish that new phase.\n void Promise.all(\n popup\n .getAnimations()\n .map((animation) => animation.finished.catch(() => undefined)),\n ).then(finish);\n });\n if (signal.aborted) finish();\n });\n}\n","import type WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';\nimport { WaAfterHideEvent } from '@awesome.me/webawesome/dist/events/after-hide.js';\nimport { WaAfterShowEvent } from '@awesome.me/webawesome/dist/events/after-show.js';\nimport { WaHideEvent } from '@awesome.me/webawesome/dist/events/hide.js';\nimport { WaShowEvent } from '@awesome.me/webawesome/dist/events/show.js';\n\nimport { animateSelectPopup } from './animate-select-popup.js';\n\n// Web Awesome 3.12/3.13 expose the lifecycle method but not these helper types.\n// Keep this integration boundary local: native option selection, dismissal\n// listeners, popup positioning and rendering remain owned by Web Awesome.\ninterface SelectHost extends Pick<\n WaSelect,\n | 'open'\n | 'disabled'\n | 'isConnected'\n | 'dataset'\n | 'popup'\n | 'listbox'\n | 'currentOption'\n | 'selectedOptions'\n | 'dispatchEvent'\n | 'handleOpenChange'\n | 'updateComplete'\n> {\n getFirstOption(): WaSelect['currentOption'];\n setCurrentOption(option: WaSelect['currentOption']): void;\n addOpenListeners(): void;\n removeOpenListeners(): void;\n}\n\n/** Install once at the explicit registration boundary, only for Kerf Selects. */\nexport function installSelectLifecycle(\n prototype: Pick<WaSelect, 'handleOpenChange' | 'handleDisabledChange'>,\n): void {\n const installed = Symbol.for('@kerfjs/ui/select-lifecycle');\n if (Object.prototype.hasOwnProperty.call(prototype, installed)) return;\n Object.defineProperty(prototype, installed, { value: true });\n const original = prototype.handleOpenChange;\n const originalDisabled = prototype.handleDisabledChange;\n prototype.handleDisabledChange = function () {\n const host = this as unknown as SelectHost;\n const wasOpen = host.open;\n originalDisabled.call(this);\n // WA's disabled watcher runs after its open watcher in the same Lit update.\n // Its open=false mutation otherwise misses the open lifecycle altogether.\n if (host.dataset.component === 'select' && wasOpen && !host.open) {\n void host.handleOpenChange();\n }\n };\n const transitions = new WeakMap<SelectHost, AbortController>();\n const restorations = new WeakMap<SelectHost, { open: boolean }>();\n prototype.handleOpenChange = async function () {\n const host = this as unknown as SelectHost;\n if (host.dataset.component !== 'select') return original.call(this);\n const restoring = restorations.get(host)?.open === host.open;\n restorations.delete(host);\n if (restoring) return;\n const transition = new AbortController();\n const opening = host.open && !host.disabled;\n const current = () =>\n !transition.signal.aborted &&\n host.isConnected &&\n (host.open && !host.disabled) === opening;\n try {\n if (!host.isConnected) return;\n if (opening) {\n host.setCurrentOption(host.selectedOptions[0] || host.getFirstOption());\n }\n const event = opening ? new WaShowEvent() : new WaHideEvent();\n host.dispatchEvent(event);\n if (event.defaultPrevented) {\n // Restore the accepted state without emitting the opposite transition.\n // Clear at the update checkpoint too: Lit can coalesce a restoration.\n host.open = !opening;\n const restoration = { open: host.open };\n restorations.set(host, restoration);\n void host.updateComplete.then(() => {\n if (restorations.get(host) === restoration) restorations.delete(host);\n });\n return;\n }\n // A consumer can reverse the request synchronously in a lifecycle event.\n if (!current()) return;\n // A rejected reversal must not cancel the previously accepted animation.\n transitions.get(host)?.abort();\n transitions.set(host, transition);\n if (opening) {\n host.addOpenListeners();\n host.listbox.hidden = false;\n host.popup.active = true;\n window.requestAnimationFrame(() => {\n if (current()) host.setCurrentOption(host.currentOption);\n });\n } else {\n host.removeOpenListeners();\n }\n await animateSelectPopup(\n host.popup.popup,\n opening ? 'show' : 'hide',\n transition.signal,\n );\n if (!transition.signal.aborted && !host.isConnected) {\n host.removeOpenListeners();\n host.listbox.hidden = true;\n host.popup.active = false;\n }\n if (!current()) return;\n if (opening) {\n // Match native vertical, immediate option reveal without scrolling an\n // ancestor page or moving focus after animation completion.\n const option = host.currentOption;\n if (option) {\n const list = host.listbox;\n const offset = Math.round(\n option.getBoundingClientRect().top -\n list.getBoundingClientRect().top,\n );\n if (offset < 0)\n list.scrollTo({ top: list.scrollTop + offset, behavior: 'auto' });\n else if (offset + option.clientHeight > list.offsetHeight) {\n list.scrollTo({\n top:\n list.scrollTop +\n offset -\n list.offsetHeight +\n option.clientHeight,\n behavior: 'auto',\n });\n }\n }\n host.dispatchEvent(new WaAfterShowEvent());\n } else {\n host.listbox.hidden = true;\n host.popup.active = false;\n host.dispatchEvent(new WaAfterHideEvent());\n }\n } finally {\n if (transitions.get(host) === transition) transitions.delete(host);\n }\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/option/option.js';\n\nimport WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';\n\nimport { installSelectLifecycle } from './install-select-lifecycle.js';\n\ninstallSelectLifecycle(WaSelect.prototype);\n\n/**\n * Marker export for tests and tooling; importing this module performs registration.\n * Registers both the `Select` elements and the `Catalog` related-entries popup-menu\n * elements (`wa-dropdown` / `wa-dropdown-item` / `wa-button`).\n */\nexport const selectElementsRegistered = true;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/animate-select-popup.ts","../src/install-select-lifecycle.ts","../src/install-select-multiple.ts","../src/select-register.ts"],"names":["option"],"mappings":"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","file":"select-register.js","sourcesContent":["/** Run one native Select CSS animation; a reversal owns cancellation and cleanup. */\nexport function animateSelectPopup(\n popup: HTMLElement,\n phase: 'show' | 'hide',\n signal: AbortSignal,\n): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n let frame = 0;\n const finish = () => {\n if (settled) return;\n settled = true;\n window.cancelAnimationFrame(frame);\n signal.removeEventListener('abort', finish);\n popup.classList.remove(phase);\n resolve();\n };\n signal.addEventListener('abort', finish, { once: true });\n popup.classList.add(phase);\n // Activation renders asynchronously. Check for reduced/absent motion only\n // after the native popup has had its normal render opportunity.\n frame = window.requestAnimationFrame(() => {\n // Observe these exact animations. An old CSS animationcancel event can\n // arrive after the next phase starts and must not finish that new phase.\n void Promise.all(\n popup\n .getAnimations()\n .map((animation) => animation.finished.catch(() => undefined)),\n ).then(finish);\n });\n if (signal.aborted) finish();\n });\n}\n","import type WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';\nimport { WaAfterHideEvent } from '@awesome.me/webawesome/dist/events/after-hide.js';\nimport { WaAfterShowEvent } from '@awesome.me/webawesome/dist/events/after-show.js';\nimport { WaHideEvent } from '@awesome.me/webawesome/dist/events/hide.js';\nimport { WaShowEvent } from '@awesome.me/webawesome/dist/events/show.js';\n\nimport { animateSelectPopup } from './animate-select-popup.js';\n\n// Web Awesome 3.12/3.13 expose the lifecycle method but not these helper types.\n// Keep this integration boundary local: native option selection, dismissal\n// listeners, popup positioning and rendering remain owned by Web Awesome.\ninterface SelectHost extends Pick<\n WaSelect,\n | 'open'\n | 'disabled'\n | 'isConnected'\n | 'dataset'\n | 'popup'\n | 'listbox'\n | 'currentOption'\n | 'selectedOptions'\n | 'dispatchEvent'\n | 'handleOpenChange'\n | 'updateComplete'\n> {\n getFirstOption(): WaSelect['currentOption'];\n setCurrentOption(option: WaSelect['currentOption']): void;\n addOpenListeners(): void;\n removeOpenListeners(): void;\n}\n\n/** Install once at the explicit registration boundary, only for Kerf Selects. */\nexport function installSelectLifecycle(\n prototype: Pick<WaSelect, 'handleOpenChange' | 'handleDisabledChange'>,\n): void {\n const installed = Symbol.for('@kerfjs/ui/select-lifecycle');\n if (Object.prototype.hasOwnProperty.call(prototype, installed)) return;\n Object.defineProperty(prototype, installed, { value: true });\n const original = prototype.handleOpenChange;\n const originalDisabled = prototype.handleDisabledChange;\n prototype.handleDisabledChange = function () {\n const host = this as unknown as SelectHost;\n const wasOpen = host.open;\n originalDisabled.call(this);\n // WA's disabled watcher runs after its open watcher in the same Lit update.\n // Its open=false mutation otherwise misses the open lifecycle altogether.\n if (host.dataset.component === 'select' && wasOpen && !host.open) {\n void host.handleOpenChange();\n }\n };\n const transitions = new WeakMap<SelectHost, AbortController>();\n const restorations = new WeakMap<SelectHost, { open: boolean }>();\n prototype.handleOpenChange = async function () {\n const host = this as unknown as SelectHost;\n if (host.dataset.component !== 'select') return original.call(this);\n const restoring = restorations.get(host)?.open === host.open;\n restorations.delete(host);\n if (restoring) return;\n const transition = new AbortController();\n const opening = host.open && !host.disabled;\n const current = () =>\n !transition.signal.aborted &&\n host.isConnected &&\n (host.open && !host.disabled) === opening;\n try {\n if (!host.isConnected) return;\n if (opening) {\n host.setCurrentOption(host.selectedOptions[0] || host.getFirstOption());\n }\n const event = opening ? new WaShowEvent() : new WaHideEvent();\n host.dispatchEvent(event);\n if (event.defaultPrevented) {\n // Restore the accepted state without emitting the opposite transition.\n // Clear at the update checkpoint too: Lit can coalesce a restoration.\n host.open = !opening;\n const restoration = { open: host.open };\n restorations.set(host, restoration);\n void host.updateComplete.then(() => {\n if (restorations.get(host) === restoration) restorations.delete(host);\n });\n return;\n }\n // A consumer can reverse the request synchronously in a lifecycle event.\n if (!current()) return;\n // A rejected reversal must not cancel the previously accepted animation.\n transitions.get(host)?.abort();\n transitions.set(host, transition);\n if (opening) {\n host.addOpenListeners();\n host.listbox.hidden = false;\n host.popup.active = true;\n window.requestAnimationFrame(() => {\n if (current()) host.setCurrentOption(host.currentOption);\n });\n } else {\n host.removeOpenListeners();\n }\n await animateSelectPopup(\n host.popup.popup,\n opening ? 'show' : 'hide',\n transition.signal,\n );\n if (!transition.signal.aborted && !host.isConnected) {\n host.removeOpenListeners();\n host.listbox.hidden = true;\n host.popup.active = false;\n }\n if (!current()) return;\n if (opening) {\n // Match native vertical, immediate option reveal without scrolling an\n // ancestor page or moving focus after animation completion.\n const option = host.currentOption;\n if (option) {\n const list = host.listbox;\n const offset = Math.round(\n option.getBoundingClientRect().top -\n list.getBoundingClientRect().top,\n );\n if (offset < 0)\n list.scrollTo({ top: list.scrollTop + offset, behavior: 'auto' });\n else if (offset + option.clientHeight > list.offsetHeight) {\n list.scrollTo({\n top:\n list.scrollTop +\n offset -\n list.offsetHeight +\n option.clientHeight,\n behavior: 'auto',\n });\n }\n }\n host.dispatchEvent(new WaAfterShowEvent());\n } else {\n host.listbox.hidden = true;\n host.popup.active = false;\n host.dispatchEvent(new WaAfterHideEvent());\n }\n } finally {\n if (transitions.get(host) === transition) transitions.delete(host);\n }\n };\n}\n","// Web Awesome's multiple select keeps its popup open while choices toggle and\n// closes on an outside press, Escape, or focus leaving; Kerf keeps that\n// behavior. This boundary adapts the rest to Kerf's rendering model, only for\n// Kerf Selects (`data-component=\"select\"`):\n// - the closed control summarizes the chosen labels instead of drawing a\n// removable tag per choice or a \"N options selected\" count; an icon-only\n// trigger (whose value text is hidden) ends its accessible name with that\n// summary instead;\n// - the rendered `selected` attributes are the controlled value, so a\n// re-render that changes them updates the selection (Web Awesome otherwise\n// reads them only until the first interaction).\n\ninterface MultipleOption extends HTMLElement {\n value: string;\n label: string;\n selected: boolean;\n defaultSelected: boolean;\n}\n\ninterface MultipleSelectHost extends HTMLElement {\n multiple: boolean;\n hasUpdated: boolean;\n displayLabel: string;\n value: string | string[] | null;\n selectedOptions: MultipleOption[];\n getAllOptions(): MultipleOption[];\n selectionChanged(): void;\n}\n\ninterface SelectPrototype {\n selectionChanged(this: MultipleSelectHost): void;\n}\n\ninterface OptionPrototype {\n syncDefaultSelected(this: MultipleOption): void;\n}\n\nfunction kerfMultiple(host: Element | null): host is MultipleSelectHost {\n return (\n host instanceof HTMLElement &&\n host.dataset.component === 'select' &&\n (host as MultipleSelectHost).multiple\n );\n}\n\nfunction listLocale(host: HTMLElement): string | undefined {\n const lang = host.closest<HTMLElement>('[lang]')?.lang;\n return lang || undefined;\n}\n\n/** The closed-control text: chosen labels in choice order, as a short list. */\nfunction summarizeSelection(\n labels: readonly string[],\n locale?: string,\n): string {\n if (labels.length === 0) return '';\n try {\n return new Intl.ListFormat(locale, {\n type: 'unit',\n style: 'short',\n }).format(labels);\n } catch {\n return labels.join(', ');\n }\n}\n\n/** Install once at the explicit registration boundary, only for Kerf Selects. */\nexport function installSelectMultiple(\n selectPrototype: object,\n optionPrototype: object,\n): void {\n const installed = Symbol.for('@kerfjs/ui/select-multiple');\n if (Object.prototype.hasOwnProperty.call(selectPrototype, installed)) return;\n Object.defineProperty(selectPrototype, installed, { value: true });\n\n const select = selectPrototype as SelectPrototype;\n const selectionChanged = select.selectionChanged;\n select.selectionChanged = function () {\n selectionChanged.call(this);\n if (!kerfMultiple(this)) return;\n const chosen = new Set(this.selectedOptions);\n const summary = summarizeSelection(\n this.getAllOptions()\n .filter((option) => chosen.has(option))\n .map((option) => option.label),\n listLocale(this),\n );\n const nameSummary = this.querySelector(\n ':scope > [slot=\"label\"] > .kui-select__name-summary',\n );\n if (this.dataset.selectedPresentation === 'icon-only' && nameSummary) {\n // An icon-only trigger carries the summary in its accessible name, so\n // the (visually hidden) value stays empty rather than repeating it.\n nameSummary.textContent = summary ? `: ${summary}` : '';\n this.displayLabel = '';\n return;\n }\n this.displayLabel = summary;\n };\n\n // The summary replaces Web Awesome's per-choice tags.\n const tags = Object.getOwnPropertyDescriptor(selectPrototype, 'tags');\n if (tags?.get) {\n const getTags = tags.get;\n Object.defineProperty(selectPrototype, 'tags', {\n configurable: true,\n get(this: MultipleSelectHost) {\n return kerfMultiple(this) ? [] : getTags.call(this);\n },\n });\n }\n\n const option = optionPrototype as OptionPrototype;\n const syncDefaultSelected = option.syncDefaultSelected;\n option.syncDefaultSelected = function () {\n const host: Element | null = this.closest('[data-component=\"select\"]');\n if (!kerfMultiple(host) || !host.hasUpdated) {\n syncDefaultSelected.call(this);\n return;\n }\n // A re-render changed which options carry `selected`: that is the new\n // controlled value, whether or not the person has interacted.\n host.value = host\n .getAllOptions()\n .filter((candidate) => candidate.hasAttribute('selected'))\n .map((candidate) => candidate.value);\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\n\nimport WaOption from '@awesome.me/webawesome/dist/components/option/option.js';\nimport WaSelect from '@awesome.me/webawesome/dist/components/select/select.js';\n\nimport { installHelpTags } from './install-help-tag.js';\nimport { installSelectLifecycle } from './install-select-lifecycle.js';\nimport { installSelectMultiple } from './install-select-multiple.js';\n\ninstallSelectLifecycle(WaSelect.prototype);\ninstallSelectMultiple(WaSelect.prototype, WaOption.prototype);\ninstallHelpTags();\n\n/**\n * Marker export for tests and tooling; importing this module performs registration.\n * Registers both the `Select` elements and the `Catalog` related-entries popup-menu\n * elements (`wa-dropdown` / `wa-dropdown-item` / `wa-button`).\n */\nexport const selectElementsRegistered = true;\n"]}
|
package/dist/select.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { SafeHtml } from 'kerfjs';
|
|
2
2
|
import { CssForegroundColor } from './css-values.js';
|
|
3
3
|
import { LucideNode } from './lucide-icon.js';
|
|
4
|
+
import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
|
|
4
5
|
import 'lucide';
|
|
5
6
|
|
|
6
7
|
interface SelectChoice<Value extends string = string> {
|
|
@@ -12,7 +13,8 @@ interface SelectChoice<Value extends string = string> {
|
|
|
12
13
|
* Foreground color for the optional icon: a semantic foreground token such
|
|
13
14
|
* as `uiColor('success-on-quiet')`, or an application-owned
|
|
14
15
|
* `foregroundColorVar('--app-icon-color')`. Fill tokens such as
|
|
15
|
-
* `uiColor('success')` are pale background tints and do not
|
|
16
|
+
* `uiColor('success-fill-quiet')` are pale background tints and do not
|
|
17
|
+
* type-check.
|
|
16
18
|
*/
|
|
17
19
|
color?: CssForegroundColor;
|
|
18
20
|
group?: string;
|
|
@@ -36,7 +38,6 @@ type SelectSelectedPresentation = 'label' | 'icon-only';
|
|
|
36
38
|
type SelectFocusRingOwner = 'select' | 'group';
|
|
37
39
|
interface SelectBaseProps<Value extends string = string> {
|
|
38
40
|
name: string;
|
|
39
|
-
value: NoInfer<Value>;
|
|
40
41
|
choices: readonly SelectChoice<Value>[];
|
|
41
42
|
className?: string;
|
|
42
43
|
/** Empty-value hint text shown in the closed control (the native select placeholder). */
|
|
@@ -45,14 +46,11 @@ interface SelectBaseProps<Value extends string = string> {
|
|
|
45
46
|
hint?: string;
|
|
46
47
|
disabled?: boolean;
|
|
47
48
|
fitMenu?: boolean;
|
|
48
|
-
renderSelected?: (choice: SelectChoice<Value>) => SafeHtml;
|
|
49
49
|
/** Render as an unanimated loading skeleton: the label above a static, empty control box. */
|
|
50
50
|
placeholder?: boolean;
|
|
51
51
|
/** Form (default), borderless toolbar, or intrinsic navigation chrome. */
|
|
52
52
|
presentation?: SelectPresentation;
|
|
53
53
|
size?: SelectSize;
|
|
54
|
-
/** Show only the selected choice icon while retaining the Select's accessible name. */
|
|
55
|
-
selectedPresentation?: SelectSelectedPresentation;
|
|
56
54
|
/** Let an enclosing ToolbarControlGroup paint the composed focus ring. */
|
|
57
55
|
focusRingOwner?: SelectFocusRingOwner;
|
|
58
56
|
/** Maximum closed-control label width in CSS pixels before ellipsis. */
|
|
@@ -60,7 +58,47 @@ interface SelectBaseProps<Value extends string = string> {
|
|
|
60
58
|
/** Native named-slot assignment when composed inside a web component. */
|
|
61
59
|
slot?: string;
|
|
62
60
|
}
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
/** One chosen value (the default). */
|
|
62
|
+
interface SelectSingleValueProps<Value extends string = string> {
|
|
63
|
+
multiple?: false;
|
|
64
|
+
value: NoInfer<Value>;
|
|
65
|
+
renderSelected?: (choice: SelectChoice<Value>) => SafeHtml;
|
|
66
|
+
/** Show only the selected choice icon while retaining the Select's accessible name. */
|
|
67
|
+
selectedPresentation?: SelectSelectedPresentation;
|
|
68
|
+
triggerIcon?: never;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Any number of chosen values. The popup stays open while the person toggles
|
|
72
|
+
* choices and closes on an outside click, Escape, or focus leaving; the closed
|
|
73
|
+
* control summarizes the chosen labels in choice order.
|
|
74
|
+
*/
|
|
75
|
+
interface SelectMultipleLabelProps<Value extends string = string> {
|
|
76
|
+
multiple: true;
|
|
77
|
+
value: readonly NoInfer<Value>[];
|
|
78
|
+
renderSelected?: never;
|
|
79
|
+
selectedPresentation?: 'label';
|
|
80
|
+
triggerIcon?: never;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A multiple Select drawn as an icon-only toolbar trigger, such as a
|
|
84
|
+
* "Filter by label" funnel. No single choice is selected, so the trigger shows
|
|
85
|
+
* a fixed `triggerIcon` naming the menu's purpose; while any choice is chosen
|
|
86
|
+
* a count badge sits beside it, and the combobox's accessible name ends with
|
|
87
|
+
* the chosen labels in choice order.
|
|
88
|
+
*/
|
|
89
|
+
interface SelectMultipleIconProps<Value extends string = string> {
|
|
90
|
+
multiple: true;
|
|
91
|
+
value: readonly NoInfer<Value>[];
|
|
92
|
+
renderSelected?: never;
|
|
93
|
+
selectedPresentation: 'icon-only';
|
|
94
|
+
/**
|
|
95
|
+
* The trigger's fixed icon, typically a `LucideIcon` naming the menu's
|
|
96
|
+
* purpose (a funnel for a filter), independent of the selection.
|
|
97
|
+
*/
|
|
98
|
+
triggerIcon: KerfUiContent;
|
|
99
|
+
}
|
|
100
|
+
type SelectMultipleValueProps<Value extends string = string> = SelectMultipleLabelProps<Value> | SelectMultipleIconProps<Value>;
|
|
101
|
+
type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName & (SelectSingleValueProps<Value> | SelectMultipleValueProps<Value>);
|
|
102
|
+
declare function Select<Value extends string>(props: SelectProps<Value>): SafeHtml;
|
|
65
103
|
|
|
66
|
-
export { Select, type SelectChoice, type SelectFocusRingOwner, type SelectPresentation, type SelectProps, type SelectSelectedPresentation, type SelectSize };
|
|
104
|
+
export { Select, type SelectChoice, type SelectFocusRingOwner, type SelectMultipleIconProps, type SelectMultipleLabelProps, type SelectMultipleValueProps, type SelectPresentation, type SelectProps, type SelectSelectedPresentation, type SelectSingleValueProps, type SelectSize };
|
package/dist/select.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
/** Canonical physical edge combinations in top/right/bottom/left order. */
|
|
2
2
|
type Sides = '' | 't' | 'r' | 'b' | 'l' | 'tr' | 'tb' | 'tl' | 'rb' | 'rl' | 'bl' | 'trb' | 'trl' | 'tbl' | 'rbl' | 'trbl';
|
|
3
|
-
/** @deprecated Use the general `Sides` type. */
|
|
4
|
-
type DividerSides = Sides;
|
|
5
3
|
|
|
6
|
-
export type {
|
|
4
|
+
export type { Sides as S };
|
package/dist/skeleton.js
CHANGED
package/dist/spacer.js
CHANGED
package/dist/split-view.d.ts
CHANGED
|
@@ -1,11 +1,37 @@
|
|
|
1
1
|
import * as kerfjs from 'kerfjs';
|
|
2
|
+
import { NavStackProps, NavStackView } from './nav-stack.js';
|
|
3
|
+
import { ResizableRegionProps } from './resizable-region.js';
|
|
2
4
|
import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
|
|
5
|
+
import './toolbar.js';
|
|
6
|
+
import './pane.js';
|
|
7
|
+
import './sides-BPSWde0A.js';
|
|
8
|
+
import './toolbar-text.js';
|
|
3
9
|
|
|
4
|
-
|
|
10
|
+
/**
|
|
11
|
+
* The roomy list pane's `ResizableRegion`: its committed `size` and `min` /
|
|
12
|
+
* `max` limits, plus the region configuration that forwards unchanged
|
|
13
|
+
* (`separator`, `handleIcon`, `contentOverflow`, and collapse:
|
|
14
|
+
* `collapsed`, `transitioning`, `collapseMotion`, `restoreControl`,
|
|
15
|
+
* `restorePosition`). Omitted options keep the region's defaults.
|
|
16
|
+
*/
|
|
17
|
+
interface SplitViewResizable extends Pick<ResizableRegionProps, 'separator' | 'handleIcon' | 'contentOverflow' | 'collapsed' | 'transitioning' | 'collapseMotion' | 'restoreControl' | 'restorePosition'> {
|
|
5
18
|
size: number;
|
|
6
19
|
min: number;
|
|
7
20
|
max: number;
|
|
8
21
|
}
|
|
22
|
+
/** One compact view's top- and bottom-toolbar content (see `NavStackView`). */
|
|
23
|
+
type SplitViewCompactViewToolbars = Pick<NavStackView, 'leading' | 'center' | 'toolbar' | 'bottomToolbar'>;
|
|
24
|
+
/**
|
|
25
|
+
* The compact `NavStack`'s configuration: its toolbar configuration, back
|
|
26
|
+
* control, and persistent bottom toolbar forward to the stack, and `list` /
|
|
27
|
+
* `detail` give each view its own toolbar groups.
|
|
28
|
+
*/
|
|
29
|
+
interface SplitViewCompactStack extends Pick<NavStackProps, 'toolbarConfig' | 'backIcon' | 'backText' | 'hideToolbar' | 'bottomToolbar'> {
|
|
30
|
+
/** Toolbar content for the list (root) view. */
|
|
31
|
+
list?: SplitViewCompactViewToolbars;
|
|
32
|
+
/** Toolbar content for the pushed detail view. */
|
|
33
|
+
detail?: SplitViewCompactViewToolbars;
|
|
34
|
+
}
|
|
9
35
|
interface SplitViewProps {
|
|
10
36
|
id: string;
|
|
11
37
|
label: string;
|
|
@@ -27,6 +53,8 @@ interface SplitViewProps {
|
|
|
27
53
|
detailTitle?: string;
|
|
28
54
|
/** Back label for the compact NavStack (default "Back"). */
|
|
29
55
|
backLabel?: string;
|
|
56
|
+
/** Compact NavStack configuration and per-view toolbars. */
|
|
57
|
+
compactStack?: SplitViewCompactStack;
|
|
30
58
|
/** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */
|
|
31
59
|
resizable?: SplitViewResizable;
|
|
32
60
|
className?: string;
|
|
@@ -40,6 +68,6 @@ interface SplitViewProps {
|
|
|
40
68
|
* resizable wiring with `wireResizableRegions` and the compact back with
|
|
41
69
|
* `wireNavStack`.
|
|
42
70
|
*/
|
|
43
|
-
declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className, slot, }: SplitViewProps): kerfjs.SafeHtml;
|
|
71
|
+
declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, compactStack, resizable, className, slot, }: SplitViewProps): kerfjs.SafeHtml;
|
|
44
72
|
|
|
45
|
-
export { SplitView, type SplitViewProps, type SplitViewResizable };
|
|
73
|
+
export { SplitView, type SplitViewCompactStack, type SplitViewCompactViewToolbars, type SplitViewProps, type SplitViewResizable };
|
package/dist/split-view.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { NavStack } from './chunk-
|
|
1
|
+
import { NavStack } from './chunk-O3EXIBEZ.js';
|
|
2
2
|
import { ResizableRegion } from './chunk-VHADGP3B.js';
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
6
9
|
import { jsx, jsxs } from 'kerfjs/jsx-runtime';
|
|
7
10
|
|
|
8
11
|
function SplitView({
|
|
@@ -15,15 +18,27 @@ function SplitView({
|
|
|
15
18
|
listTitle = "",
|
|
16
19
|
detailTitle = "",
|
|
17
20
|
backLabel = "Back",
|
|
21
|
+
compactStack = {},
|
|
18
22
|
resizable,
|
|
19
23
|
className = "",
|
|
20
24
|
slot
|
|
21
25
|
}) {
|
|
22
26
|
if (compact) {
|
|
27
|
+
const listView = {
|
|
28
|
+
...compactStack.list,
|
|
29
|
+
key: "list",
|
|
30
|
+
title: listTitle,
|
|
31
|
+
content: list
|
|
32
|
+
};
|
|
23
33
|
const views = detailActive ? [
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
|
|
34
|
+
listView,
|
|
35
|
+
{
|
|
36
|
+
...compactStack.detail,
|
|
37
|
+
key: "detail",
|
|
38
|
+
title: detailTitle,
|
|
39
|
+
content: detail
|
|
40
|
+
}
|
|
41
|
+
] : [listView];
|
|
27
42
|
return /* @__PURE__ */ jsx(
|
|
28
43
|
"div",
|
|
29
44
|
{
|
|
@@ -38,7 +53,12 @@ function SplitView({
|
|
|
38
53
|
id: `${id}-stack`,
|
|
39
54
|
label,
|
|
40
55
|
views,
|
|
41
|
-
backLabel
|
|
56
|
+
backLabel,
|
|
57
|
+
backIcon: compactStack.backIcon,
|
|
58
|
+
backText: compactStack.backText,
|
|
59
|
+
toolbarConfig: compactStack.toolbarConfig,
|
|
60
|
+
hideToolbar: compactStack.hideToolbar,
|
|
61
|
+
bottomToolbar: compactStack.bottomToolbar
|
|
42
62
|
}
|
|
43
63
|
)
|
|
44
64
|
}
|
|
@@ -52,6 +72,14 @@ function SplitView({
|
|
|
52
72
|
size: resizable.size,
|
|
53
73
|
min: resizable.min,
|
|
54
74
|
max: resizable.max,
|
|
75
|
+
separator: resizable.separator,
|
|
76
|
+
handleIcon: resizable.handleIcon,
|
|
77
|
+
contentOverflow: resizable.contentOverflow,
|
|
78
|
+
collapsed: resizable.collapsed,
|
|
79
|
+
transitioning: resizable.transitioning,
|
|
80
|
+
collapseMotion: resizable.collapseMotion,
|
|
81
|
+
restoreControl: resizable.restoreControl,
|
|
82
|
+
restorePosition: resizable.restorePosition,
|
|
55
83
|
children: /* @__PURE__ */ jsx(
|
|
56
84
|
"div",
|
|
57
85
|
{
|
package/dist/split-view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":"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","file":"split-view.js","sourcesContent":["import {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from './nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from './resizable-region.js';\nimport type { KerfUiContent } from './semantic-content.js';\n\n/**\n * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /\n * `max` limits, plus the region configuration that forwards unchanged\n * (`separator`, `handleIcon`, `contentOverflow`, and collapse:\n * `collapsed`, `transitioning`, `collapseMotion`, `restoreControl`,\n * `restorePosition`). Omitted options keep the region's defaults.\n */\nexport interface SplitViewResizable extends Pick<\n ResizableRegionProps,\n | 'separator'\n | 'handleIcon'\n | 'contentOverflow'\n | 'collapsed'\n | 'transitioning'\n | 'collapseMotion'\n | 'restoreControl'\n | 'restorePosition'\n> {\n size: number;\n min: number;\n max: number;\n}\n\n/** One compact view's top- and bottom-toolbar content (see `NavStackView`). */\nexport type SplitViewCompactViewToolbars = Pick<\n NavStackView,\n 'leading' | 'center' | 'toolbar' | 'bottomToolbar'\n>;\n\n/**\n * The compact `NavStack`'s configuration: its toolbar configuration, back\n * control, and persistent bottom toolbar forward to the stack, and `list` /\n * `detail` give each view its own toolbar groups.\n */\nexport interface SplitViewCompactStack extends Pick<\n NavStackProps,\n 'toolbarConfig' | 'backIcon' | 'backText' | 'hideToolbar' | 'bottomToolbar'\n> {\n /** Toolbar content for the list (root) view. */\n list?: SplitViewCompactViewToolbars;\n /** Toolbar content for the pushed detail view. */\n detail?: SplitViewCompactViewToolbars;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: KerfUiContent;\n /** The detail (secondary) pane. */\n detail: KerfUiContent;\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 /** Compact NavStack configuration and per-view toolbars. */\n compactStack?: SplitViewCompactStack;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: 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 compactStack = {},\n resizable,\n className = '',\n slot,\n}: SplitViewProps) {\n if (compact) {\n const listView: NavStackView = {\n ...compactStack.list,\n key: 'list',\n title: listTitle,\n content: list,\n };\n const views: NavStackView[] = detailActive\n ? [\n listView,\n {\n ...compactStack.detail,\n key: 'detail',\n title: detailTitle,\n content: detail,\n },\n ]\n : [listView];\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 slot={slot}\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n backIcon={compactStack.backIcon}\n backText={compactStack.backText}\n toolbarConfig={compactStack.toolbarConfig}\n hideToolbar={compactStack.hideToolbar}\n bottomToolbar={compactStack.bottomToolbar}\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 separator={resizable.separator}\n handleIcon={resizable.handleIcon}\n contentOverflow={resizable.contentOverflow}\n collapsed={resizable.collapsed}\n transitioning={resizable.transitioning}\n collapseMotion={resizable.collapseMotion}\n restoreControl={resizable.restoreControl}\n restorePosition={resizable.restorePosition}\n >\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"true\"\n >\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"false\"\n >\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 slot={slot}\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.js
CHANGED
package/dist/styles/badge.css
CHANGED
|
@@ -95,3 +95,16 @@
|
|
|
95
95
|
padding-inline: 0.35rem;
|
|
96
96
|
font-size: var(--kui-font-2xs);
|
|
97
97
|
}
|
|
98
|
+
|
|
99
|
+
/* The text-free status dot (the iOS "new content" dot): a small solid circle
|
|
100
|
+
in the tone's solid fill, without the text box's padding or minimum size. */
|
|
101
|
+
.kui-badge[data-size="dot"] {
|
|
102
|
+
width: 0.5rem;
|
|
103
|
+
min-width: 0.5rem;
|
|
104
|
+
height: 0.5rem;
|
|
105
|
+
min-height: 0.5rem;
|
|
106
|
+
padding: 0;
|
|
107
|
+
border: 0;
|
|
108
|
+
border-radius: 50%;
|
|
109
|
+
background: var(--_kui-badge-fill-solid);
|
|
110
|
+
}
|
|
@@ -8,19 +8,6 @@
|
|
|
8
8
|
gap: 0.5rem;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
.kui-catalog-example__note {
|
|
12
|
-
margin: 0;
|
|
13
|
-
padding-block: var(--kui-layout-item-padding, 0.5rem);
|
|
14
|
-
padding-inline: calc(
|
|
15
|
-
var(--kui-layout-inline-margin, 0.5rem) +
|
|
16
|
-
var(--kui-layout-item-padding, 0.5rem)
|
|
17
|
-
);
|
|
18
|
-
box-sizing: border-box;
|
|
19
|
-
border: 1px solid transparent;
|
|
20
|
-
color: var(--kui-color-text-quiet);
|
|
21
|
-
font-size: var(--kui-font-xs);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
11
|
.kui-catalog-example__viewport {
|
|
25
12
|
position: relative;
|
|
26
13
|
max-width: 100%;
|
|
@@ -109,7 +96,7 @@
|
|
|
109
96
|
}
|
|
110
97
|
|
|
111
98
|
.kui-catalog-example__viewport[data-frame] {
|
|
112
|
-
border: 1px solid var(--kui-color-border);
|
|
99
|
+
border: 1px solid var(--kui-color-neutral-border-normal);
|
|
113
100
|
border-radius: var(--kui-radius-m);
|
|
114
101
|
}
|
|
115
102
|
|
|
@@ -139,9 +126,6 @@
|
|
|
139
126
|
|
|
140
127
|
.kui-catalog-example__compact-fallback {
|
|
141
128
|
display: none;
|
|
142
|
-
margin: 0;
|
|
143
|
-
color: var(--kui-color-text-quiet);
|
|
144
|
-
font-size: var(--kui-font-s);
|
|
145
129
|
}
|
|
146
130
|
|
|
147
131
|
@media ((max-width: 52rem)) {
|