@kerfjs/ui 5.0.0-beta.8 → 5.0.0-beta.9
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 +20 -20
- package/ai/component-catalog.json +123 -80
- package/ai/public-api-signatures-v1.md +181 -26
- package/ai/skill.md +12 -12
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/browser/list-action-row.js +4 -0
- package/dist/browser/{menu-header.js → list-header.js} +2 -2
- package/dist/browser/{menu-item.js → list-item.js} +2 -2
- package/dist/catalog.d.ts +119 -0
- package/dist/catalog.js +128 -0
- package/dist/catalog.js.map +1 -0
- package/dist/{chunk-BNQ2YDV4.js → chunk-2TS7ZSYX.js} +2 -2
- package/dist/{chunk-BNQ2YDV4.js.map → chunk-2TS7ZSYX.js.map} +1 -1
- package/dist/{chunk-PONXLV5U.js → chunk-37T3VNIZ.js} +1 -1
- package/dist/{chunk-PONXLV5U.js.map → chunk-37T3VNIZ.js.map} +1 -1
- package/dist/{chunk-3YD6ZNRA.js → chunk-7JB7VPRI.js} +8 -8
- package/dist/{chunk-3YD6ZNRA.js.map → chunk-7JB7VPRI.js.map} +1 -1
- package/dist/{chunk-YKUUZPED.js → chunk-L4OKFDJY.js} +7 -7
- package/dist/{chunk-YKUUZPED.js.map → chunk-L4OKFDJY.js.map} +1 -1
- package/dist/{chunk-H6URQGJI.js → chunk-W5EQ3HYQ.js} +11 -11
- package/dist/{chunk-H6URQGJI.js.map → chunk-W5EQ3HYQ.js.map} +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +10 -10
- package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +7 -7
- package/dist/list-action-row.js +5 -0
- package/dist/list-action-row.js.map +1 -0
- package/dist/{menu-header.d.ts → list-header.d.ts} +9 -9
- package/dist/list-header.js +7 -0
- package/dist/list-header.js.map +1 -0
- package/dist/{menu-item.d.ts → list-item.d.ts} +5 -5
- package/dist/list-item.js +5 -0
- package/dist/list-item.js.map +1 -0
- package/dist/panel-header.js +1 -1
- package/dist/split-view.d.ts +1 -1
- package/dist/split-view.js.map +1 -1
- package/dist/styles/catalog.css +482 -0
- package/dist/styles/list-action-row.css +160 -0
- package/dist/styles/{menu-header.css → list-header.css} +33 -33
- package/dist/styles/list-item.css +123 -0
- package/dist/styles/styles.css +4 -3
- package/dist/value-table.js +1 -1
- package/dist/wire-catalog.d.ts +26 -0
- package/dist/wire-catalog.js +50 -0
- package/dist/wire-catalog.js.map +1 -0
- package/docs/accessibility.md +5 -5
- package/docs/catalog.md +154 -0
- package/docs/component-contract.md +12 -12
- package/docs/component-selection.md +12 -11
- package/docs/design-philosophy.md +4 -4
- package/docs/layout.md +8 -8
- package/docs/recipes.md +17 -5
- package/docs/split-view.md +1 -1
- package/docs/ux-demo.md +5 -5
- package/llms.txt +12 -8
- package/package.json +25 -16
- package/ux-demo/recipes/app-shell.tsx +3 -3
- package/ux-demo/recipes/list-detail-dialog.tsx +45 -0
- package/ux-demo/recipes/loaders.ts +4 -2
- package/ux-demo/recipes/loading-inspector.tsx +79 -0
- package/ux-demo/recipes/navigation-sidebar.tsx +5 -5
- package/ux-demo/recipes/navigation-stack.tsx +4 -4
- package/ux-demo/recipes/recipes.css +13 -7
- package/dist/browser/menu-action-row.js +0 -4
- package/dist/menu-action-row.js +0 -5
- package/dist/menu-action-row.js.map +0 -1
- package/dist/menu-header.js +0 -7
- package/dist/menu-header.js.map +0 -1
- package/dist/menu-item.js +0 -5
- package/dist/menu-item.js.map +0 -1
- package/dist/styles/menu-action-row.css +0 -160
- package/dist/styles/menu-item.css +0 -123
- package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
.kui-menu-item {
|
|
2
|
-
--kui-menu-item-color: var(--kui-color-neutral-on-normal);
|
|
3
|
-
--kui-menu-item-border: transparent;
|
|
4
|
-
--kui-menu-item-background: transparent;
|
|
5
|
-
--kui-menu-item-hover-border: var(--kui-color-neutral-border-normal);
|
|
6
|
-
--kui-menu-item-hover-background: var(--kui-color-neutral-fill-quiet);
|
|
7
|
-
--kui-menu-item-selected-color: var(--kui-color-brand-on-quiet);
|
|
8
|
-
--kui-menu-item-selected-border: var(--kui-color-brand-border-quiet);
|
|
9
|
-
--kui-menu-item-selected-background: var(--kui-color-brand-fill-normal);
|
|
10
|
-
display: grid;
|
|
11
|
-
width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
|
|
12
|
-
min-height: 2.75rem;
|
|
13
|
-
margin-inline: var(--kui-layout-inline-margin, 0.5rem);
|
|
14
|
-
padding: var(--kui-layout-item-padding, 0.5rem);
|
|
15
|
-
box-sizing: border-box;
|
|
16
|
-
border: 1px solid var(--kui-menu-item-border);
|
|
17
|
-
border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
|
|
18
|
-
color: var(--kui-menu-item-color);
|
|
19
|
-
background: var(--kui-menu-item-background);
|
|
20
|
-
cursor: pointer;
|
|
21
|
-
grid-template-columns: minmax(0, 1fr) auto;
|
|
22
|
-
align-items: center;
|
|
23
|
-
column-gap: var(--kui-layout-item-gap, 0.5rem);
|
|
24
|
-
font: inherit;
|
|
25
|
-
text-align: start;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.kui-menu-item[data-has-icon="true"] {
|
|
29
|
-
grid-template-columns: 1.5rem minmax(0, 1fr) auto;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
.kui-menu-item[data-has-icon="true"] .kui-menu-item__icon {
|
|
33
|
-
grid-column: 1;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.kui-menu-item[data-has-icon="true"] .kui-menu-item__label {
|
|
37
|
-
grid-column: 2;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.kui-menu-item[data-has-icon="true"] .kui-menu-item__trailing {
|
|
41
|
-
grid-column: 3;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
.kui-menu-item[data-has-icon="false"] .kui-menu-item__label {
|
|
45
|
-
grid-column: 1;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
.kui-menu-item[data-has-icon="false"] .kui-menu-item__trailing {
|
|
49
|
-
grid-column: 2;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.kui-menu-item:hover {
|
|
53
|
-
border-color: var(--kui-menu-item-hover-border);
|
|
54
|
-
background: var(--kui-menu-item-hover-background);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.kui-menu-item:disabled {
|
|
58
|
-
color: var(--kui-color-neutral-on-quiet);
|
|
59
|
-
cursor: not-allowed;
|
|
60
|
-
opacity: 0.58;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
.kui-menu-item[aria-current="page"],
|
|
64
|
-
.kui-menu-item[aria-pressed="true"] {
|
|
65
|
-
border-color: var(--kui-menu-item-selected-border);
|
|
66
|
-
color: var(--kui-menu-item-selected-color);
|
|
67
|
-
background: var(--kui-menu-item-selected-background);
|
|
68
|
-
font-weight: 650;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
.kui-menu-item:focus-visible {
|
|
72
|
-
outline: var(--kui-focus-ring);
|
|
73
|
-
outline-offset: 1px;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
.kui-menu-item__icon {
|
|
77
|
-
display: grid;
|
|
78
|
-
width: 1.5rem;
|
|
79
|
-
height: 1.5rem;
|
|
80
|
-
color: currentColor;
|
|
81
|
-
place-items: center;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.kui-menu-item__icon svg {
|
|
85
|
-
display: block;
|
|
86
|
-
width: 1.5rem;
|
|
87
|
-
height: 1.5rem;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
.kui-menu-item__label {
|
|
91
|
-
min-width: 0;
|
|
92
|
-
overflow: hidden;
|
|
93
|
-
text-overflow: ellipsis;
|
|
94
|
-
white-space: nowrap;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
.kui-menu-item[data-multiline="true"] {
|
|
98
|
-
height: fit-content;
|
|
99
|
-
white-space: normal;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
.kui-menu-item[data-multiline="true"] .kui-menu-item__label {
|
|
103
|
-
overflow: visible;
|
|
104
|
-
white-space: normal;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
.kui-menu-item[data-multiline="true"] .kui-menu-item__icon {
|
|
108
|
-
align-self: start;
|
|
109
|
-
margin-block-start: calc((1lh - 1.5rem) / 2);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
.kui-menu-item__trailing {
|
|
113
|
-
display: inline-flex;
|
|
114
|
-
min-width: 0;
|
|
115
|
-
align-items: center;
|
|
116
|
-
justify-content: flex-end;
|
|
117
|
-
gap: var(--kui-layout-item-gap, 0.5rem);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
.kui-menu-item__trailing > svg {
|
|
121
|
-
width: 1rem;
|
|
122
|
-
height: 1rem;
|
|
123
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import '@kerfjs/ui/layout.css';
|
|
2
|
-
import '@kerfjs/ui/webawesome.css';
|
|
3
|
-
import '@awesome.me/webawesome/dist/components/button/button.js';
|
|
4
|
-
import '@awesome.me/webawesome/dist/components/dialog/dialog.js';
|
|
5
|
-
import './recipes.css';
|
|
6
|
-
|
|
7
|
-
import { LucideIcon } from '@kerfjs/ui/lucide-icon';
|
|
8
|
-
import { MenuHeader } from '@kerfjs/ui/menu-header';
|
|
9
|
-
import { MenuItem } from '@kerfjs/ui/menu-item';
|
|
10
|
-
import { PanelHeader } from '@kerfjs/ui/panel-header';
|
|
11
|
-
import { ValueTable, ValueTableRow } from '@kerfjs/ui/value-table';
|
|
12
|
-
import { signal } from 'kerfjs';
|
|
13
|
-
import { FileText } from 'lucide';
|
|
14
|
-
|
|
15
|
-
import type { RecipeFactory } from './types.js';
|
|
16
|
-
|
|
17
|
-
const records = {
|
|
18
|
-
alpha: { name: 'Northstar migration', owner: 'Mara Chen', state: 'In review', updated: 'Today, 09:42' },
|
|
19
|
-
beta: { name: 'Tablet navigation', owner: 'Sam Rivera', state: 'Ready', updated: 'Yesterday, 16:20' },
|
|
20
|
-
gamma: { name: 'Contrast audit', owner: 'Inez Okafor', state: 'Blocked', updated: 'Monday, 11:05' },
|
|
21
|
-
} as const;
|
|
22
|
-
|
|
23
|
-
interface RecipeDialogElement extends HTMLElement {
|
|
24
|
-
open: boolean;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const createRecipe: RecipeFactory = (announce) => {
|
|
28
|
-
const selected = signal<keyof typeof records>('alpha');
|
|
29
|
-
const open = { value: false };
|
|
30
|
-
const render = () => <section class="kui-recipe kui-content" data-recipe="recipe-master-detail-dialog"><button class="kui-recipe__button kui-content-item" data-primary="true" type="button" data-action="recipe-action" data-recipe-command="open">Open project details</button><p class="kui-recipe__ownership kui-content-item">Web Awesome owns modal focus and dismissal. The recipe owns header/body/master-detail anatomy; the app owns open state, selection, and policy.</p><wa-dialog class="recipe-dialog" label="Project details" without-header open={open.value}><div class="recipe-dialog__pane kui-pane"><PanelHeader title="Project details" titleId="recipe-dialog-title" summary="Compare delivery state without leaving the workspace." summaryId="recipe-dialog-summary" icon={<LucideIcon icon={FileText} name="file-text" />} actions={<wa-button appearance="plain" data-action="recipe-action" data-recipe-command="close">Close</wa-button>} /><div class="recipe-master-detail kui-pane__content"><nav class="recipe-master-detail__master kui-pane" aria-label="Projects"><MenuHeader label="Recent projects" /><div class="kui-pane__content kui-content"><section>{Object.entries(records).map(([id, record]) => <MenuItem action="recipe-action" itemId={id} label={record.name} selected={selected.value === id} multiline />)}</section></div></nav><section class="recipe-master-detail__detail kui-content" aria-live="polite"><h3 class="recipe-master-detail__title kui-recipe__pane-title kui-content-item">{records[selected.value].name}</h3><ValueTable label="Project details"><ValueTableRow label="Owner" value={records[selected.value].owner} /><ValueTableRow label="Status" value={records[selected.value].state} /><ValueTableRow label="Updated" value={records[selected.value].updated} /></ValueTable><div class="recipe-master-detail__actions kui-control-cluster"><wa-button appearance="outlined" data-action="recipe-action" data-recipe-command="archive">Archive</wa-button><wa-button variant="brand" appearance="accent" data-action="recipe-action" data-recipe-command="open-record">Open project</wa-button></div></section></div></div></wa-dialog></section>;
|
|
31
|
-
return {
|
|
32
|
-
render,
|
|
33
|
-
action(command, element) {
|
|
34
|
-
const id = element.dataset.itemId;
|
|
35
|
-
if (id && id in records) { selected.value = id as keyof typeof records; announce(`Selected ${records[selected.value].name}`); return; }
|
|
36
|
-
const dialog = element.closest('[data-recipe]')?.querySelector<RecipeDialogElement>('wa-dialog');
|
|
37
|
-
if (command === 'open' && dialog) { element.focus(); open.value = true; dialog.open = true; return; }
|
|
38
|
-
if (command === 'close' && dialog) { dialog.open = false; return; }
|
|
39
|
-
announce(`${command} requested`);
|
|
40
|
-
},
|
|
41
|
-
afterHide() {
|
|
42
|
-
open.value = false;
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
};
|