@womp/kookie-ui 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/components.css +288 -35
  2. package/dist/cjs/components/_internal/pane-chrome.js +1 -1
  3. package/dist/cjs/components/_internal/pane-chrome.js.map +2 -2
  4. package/dist/cjs/components/_internal/shell-bottom.d.ts +7 -2
  5. package/dist/cjs/components/_internal/shell-bottom.d.ts.map +1 -1
  6. package/dist/cjs/components/_internal/shell-bottom.js +1 -1
  7. package/dist/cjs/components/_internal/shell-bottom.js.map +3 -3
  8. package/dist/cjs/components/_internal/shell-inspector.d.ts +7 -2
  9. package/dist/cjs/components/_internal/shell-inspector.d.ts.map +1 -1
  10. package/dist/cjs/components/_internal/shell-inspector.js +1 -1
  11. package/dist/cjs/components/_internal/shell-inspector.js.map +3 -3
  12. package/dist/cjs/components/_internal/shell-pane.js +1 -1
  13. package/dist/cjs/components/_internal/shell-pane.js.map +2 -2
  14. package/dist/cjs/components/_internal/shell-sidebar.d.ts +7 -2
  15. package/dist/cjs/components/_internal/shell-sidebar.d.ts.map +1 -1
  16. package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
  17. package/dist/cjs/components/_internal/shell-sidebar.js.map +3 -3
  18. package/dist/cjs/components/_internal/shell-store.d.ts +6 -6
  19. package/dist/cjs/components/_internal/shell-store.d.ts.map +1 -1
  20. package/dist/cjs/components/_internal/shell-store.js +1 -1
  21. package/dist/cjs/components/_internal/shell-store.js.map +3 -3
  22. package/dist/cjs/components/command.d.ts +133 -0
  23. package/dist/cjs/components/command.d.ts.map +1 -0
  24. package/dist/cjs/components/command.js +3 -0
  25. package/dist/cjs/components/command.js.map +7 -0
  26. package/dist/cjs/components/index.d.ts +1 -0
  27. package/dist/cjs/components/index.d.ts.map +1 -1
  28. package/dist/cjs/components/index.js +2 -2
  29. package/dist/cjs/components/index.js.map +4 -4
  30. package/dist/cjs/components/navigator.js +1 -1
  31. package/dist/cjs/components/navigator.js.map +2 -2
  32. package/dist/cjs/components/shell.context.js +1 -1
  33. package/dist/cjs/components/shell.context.js.map +2 -2
  34. package/dist/cjs/components/shell.d.ts +25 -7
  35. package/dist/cjs/components/shell.d.ts.map +1 -1
  36. package/dist/cjs/components/shell.hooks.js +1 -1
  37. package/dist/cjs/components/shell.hooks.js.map +2 -2
  38. package/dist/cjs/components/shell.js +1 -1
  39. package/dist/cjs/components/shell.js.map +3 -3
  40. package/dist/cjs/components/toolbar.js +1 -1
  41. package/dist/cjs/components/toolbar.js.map +2 -2
  42. package/dist/cjs/index.js +5 -5
  43. package/dist/cjs/index.js.map +4 -4
  44. package/dist/esm/chunk-5BXCPANF.js +3 -0
  45. package/dist/esm/{chunk-GHWEXMF6.js.map → chunk-5BXCPANF.js.map} +3 -3
  46. package/dist/esm/{chunk-K35JUIUT.js → chunk-API4DAPY.js} +2 -2
  47. package/dist/esm/{chunk-ZG2XQUOH.js → chunk-B447PNRD.js} +2 -2
  48. package/dist/esm/{chunk-QDAM2I6O.js → chunk-BR6Z2CAE.js} +2 -2
  49. package/dist/esm/{chunk-W35ZKQMQ.js → chunk-CAM66IXC.js} +2 -2
  50. package/dist/esm/chunk-GZPB6MRQ.js +3 -0
  51. package/dist/esm/chunk-GZPB6MRQ.js.map +7 -0
  52. package/dist/esm/{chunk-4G3FJUER.js → chunk-INGT6DB6.js} +2 -2
  53. package/dist/esm/{chunk-4ZHBNYXM.js → chunk-J6B7UCZN.js} +2 -2
  54. package/dist/esm/chunk-KDJM4NQQ.js +3 -0
  55. package/dist/esm/chunk-KDJM4NQQ.js.map +7 -0
  56. package/dist/esm/{chunk-LTUW36HM.js → chunk-KGCGT4MJ.js} +2 -2
  57. package/dist/esm/chunk-NO2JCJWI.js +3 -0
  58. package/dist/esm/chunk-NO2JCJWI.js.map +7 -0
  59. package/dist/esm/{chunk-6WHKGVWY.js → chunk-NZJRXZYX.js} +2 -2
  60. package/dist/esm/{chunk-NFSW36RG.js → chunk-ODHCDJ3Y.js} +2 -2
  61. package/dist/esm/chunk-SHKPQ3RI.js +2 -0
  62. package/dist/esm/chunk-UMQOTGJC.js +3 -0
  63. package/dist/esm/chunk-UMQOTGJC.js.map +7 -0
  64. package/dist/esm/chunk-XD676L6S.js +3 -0
  65. package/dist/esm/chunk-XD676L6S.js.map +7 -0
  66. package/dist/esm/{chunk-6SGJWML7.js → chunk-XKYPJTRN.js} +2 -2
  67. package/dist/esm/components/_internal/pane-chrome.js +1 -1
  68. package/dist/esm/components/_internal/shell-bottom.d.ts +7 -2
  69. package/dist/esm/components/_internal/shell-bottom.d.ts.map +1 -1
  70. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  71. package/dist/esm/components/_internal/shell-inspector.d.ts +7 -2
  72. package/dist/esm/components/_internal/shell-inspector.d.ts.map +1 -1
  73. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  74. package/dist/esm/components/_internal/shell-pane.js +1 -1
  75. package/dist/esm/components/_internal/shell-sidebar.d.ts +7 -2
  76. package/dist/esm/components/_internal/shell-sidebar.d.ts.map +1 -1
  77. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  78. package/dist/esm/components/_internal/shell-store.d.ts +6 -6
  79. package/dist/esm/components/_internal/shell-store.d.ts.map +1 -1
  80. package/dist/esm/components/_internal/shell-store.js +1 -1
  81. package/dist/esm/components/alert-dialog.js +1 -1
  82. package/dist/esm/components/command.d.ts +133 -0
  83. package/dist/esm/components/command.d.ts.map +1 -0
  84. package/dist/esm/components/command.js +3 -0
  85. package/dist/esm/components/command.js.map +7 -0
  86. package/dist/esm/components/dialog.js +1 -1
  87. package/dist/esm/components/index.d.ts +1 -0
  88. package/dist/esm/components/index.d.ts.map +1 -1
  89. package/dist/esm/components/index.js +1 -1
  90. package/dist/esm/components/navigator.js +1 -1
  91. package/dist/esm/components/sheet.js +1 -1
  92. package/dist/esm/components/shell.context.js +1 -1
  93. package/dist/esm/components/shell.d.ts +25 -7
  94. package/dist/esm/components/shell.d.ts.map +1 -1
  95. package/dist/esm/components/shell.hooks.js +1 -1
  96. package/dist/esm/components/shell.js +1 -1
  97. package/dist/esm/components/sidebar.js +1 -1
  98. package/dist/esm/components/toolbar.js +1 -1
  99. package/dist/esm/hooks/index.js +1 -1
  100. package/dist/esm/index.js +1 -1
  101. package/package.json +1 -1
  102. package/src/components/_internal/shell-bottom.tsx +11 -6
  103. package/src/components/_internal/shell-inspector.tsx +11 -6
  104. package/src/components/_internal/shell-sidebar.tsx +11 -6
  105. package/src/components/_internal/shell-store.tsx +13 -13
  106. package/src/components/command.css +197 -0
  107. package/src/components/command.tsx +432 -0
  108. package/src/components/index.css +1 -0
  109. package/src/components/index.tsx +24 -0
  110. package/src/components/shell.css +133 -47
  111. package/src/components/shell.tsx +50 -32
  112. package/src/styles/tokens/color.css +2 -0
  113. package/styles.css +289 -35
  114. package/tokens/base.css +1 -0
  115. package/tokens.css +1 -0
  116. package/dist/esm/chunk-4B3S2DM7.js +0 -3
  117. package/dist/esm/chunk-4B3S2DM7.js.map +0 -7
  118. package/dist/esm/chunk-AKMRPGNP.js +0 -3
  119. package/dist/esm/chunk-AKMRPGNP.js.map +0 -7
  120. package/dist/esm/chunk-GHWEXMF6.js +0 -3
  121. package/dist/esm/chunk-RSG4XWHU.js +0 -2
  122. package/dist/esm/chunk-ZBSGH74F.js +0 -3
  123. package/dist/esm/chunk-ZBSGH74F.js.map +0 -7
  124. package/dist/esm/chunk-ZHXEEOGI.js +0 -3
  125. package/dist/esm/chunk-ZHXEEOGI.js.map +0 -7
  126. /package/dist/esm/{chunk-K35JUIUT.js.map → chunk-API4DAPY.js.map} +0 -0
  127. /package/dist/esm/{chunk-ZG2XQUOH.js.map → chunk-B447PNRD.js.map} +0 -0
  128. /package/dist/esm/{chunk-QDAM2I6O.js.map → chunk-BR6Z2CAE.js.map} +0 -0
  129. /package/dist/esm/{chunk-W35ZKQMQ.js.map → chunk-CAM66IXC.js.map} +0 -0
  130. /package/dist/esm/{chunk-4G3FJUER.js.map → chunk-INGT6DB6.js.map} +0 -0
  131. /package/dist/esm/{chunk-4ZHBNYXM.js.map → chunk-J6B7UCZN.js.map} +0 -0
  132. /package/dist/esm/{chunk-LTUW36HM.js.map → chunk-KGCGT4MJ.js.map} +0 -0
  133. /package/dist/esm/{chunk-6WHKGVWY.js.map → chunk-NZJRXZYX.js.map} +0 -0
  134. /package/dist/esm/{chunk-NFSW36RG.js.map → chunk-ODHCDJ3Y.js.map} +0 -0
  135. /package/dist/esm/{chunk-RSG4XWHU.js.map → chunk-SHKPQ3RI.js.map} +0 -0
  136. /package/dist/esm/{chunk-6SGJWML7.js.map → chunk-XKYPJTRN.js.map} +0 -0
@@ -7,7 +7,7 @@ import { PaneResizeContext } from './shell-resize.js';
7
7
  import { PaneHandle, SidebarHandle } from './shell-handles.js';
8
8
  import { usePane, paneAttributes, usePresentationTable } from './shell-pane.js';
9
9
  import { splitHandles, useInitialPaneSize, useResizablePane, type SizeChangeMeta } from './shell-resizable.js';
10
- import { useInsetRegistration, warnOnce, type PaneValue } from './shell-store.js';
10
+ import { useFrameRegistration, warnOnce, type PaneValue } from './shell-store.js';
11
11
  import { navigationRest, startAnchoredGrowth, withoutRemovedPaneProps } from './shell-rest.js';
12
12
  import { readBreakpoint } from '../../hooks/use-breakpoint.js';
13
13
  import { PaneChromeScope } from './pane-chrome.js';
@@ -23,8 +23,13 @@ type SidebarPublicProps = PaneBaseProps & {
23
23
  onSizeChange?: (size: number, meta: SizeChangeMeta) => void;
24
24
  sizeUpdate?: 'throttle' | 'debounce';
25
25
  sizeUpdateMs?: number;
26
- /** When true, adds margin and triggers the gray backdrop on the Shell. */
27
- inset?: boolean;
26
+ /**
27
+ * Sets whether this pane joins the app frame. The default is `true`: the pane sits against its
28
+ * neighbours with one hairline between them. Set `flush={false}` to pull it off the frame as a
29
+ * card. It then floats over the content if the content is flush, and otherwise sits on the
30
+ * Shell's background beside a card content.
31
+ */
32
+ flush?: boolean;
28
33
  } & (SidebarControlledProps | SidebarUncontrolledProps);
29
34
 
30
35
  type SidebarComponent = React.ForwardRefExoticComponent<SidebarPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof SidebarHandle };
@@ -77,7 +82,7 @@ export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((pro
77
82
  onSizeChange,
78
83
  sizeUpdate,
79
84
  sizeUpdateMs = 50,
80
- inset,
85
+ flush = true,
81
86
  id,
82
87
  ...domProps
83
88
  } = props;
@@ -97,7 +102,7 @@ export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((pro
97
102
  onCollapse,
98
103
  size: expandedSize,
99
104
  });
100
- useInsetRegistration('sidebar', inset);
105
+ useFrameRegistration('sidebar', flush);
101
106
 
102
107
  React.useEffect(() => {
103
108
  if (snapPoints !== undefined || collapseThreshold !== undefined || paneId !== undefined || persistence !== undefined) {
@@ -158,7 +163,7 @@ export const Sidebar = React.forwardRef<HTMLDivElement, SidebarPublicProps>((pro
158
163
  ref={composedRef}
159
164
  className={classNames('kui-ShellPane', 'kui-ShellSidebar', className)}
160
165
  {...paneAttributes(pane, attributes)}
161
- data-inset={inset || undefined}
166
+ data-flush={flush || undefined}
162
167
  tabIndex={pane.overlaying ? -1 : domProps.tabIndex}
163
168
  style={
164
169
  {
@@ -171,25 +171,25 @@ export function usePeeking(store: ShellStore, name: PaneName): boolean {
171
171
  );
172
172
  }
173
173
 
174
- /* ── Inset ─────────────────────────────────────────────────────────────────── */
174
+ /* ── Off the frame ─────────────────────────────────────────────────────────── */
175
175
 
176
- export type InsetPaneId = 'rail' | 'panel' | 'sidebar' | 'content' | 'inspector' | 'bottom';
176
+ export type FramePaneId = 'rail' | 'panel' | 'sidebar' | 'content' | 'inspector' | 'bottom';
177
177
 
178
- export const ShellInsetContext = React.createContext<{
179
- registerInset: (id: InsetPaneId) => void;
180
- unregisterInset: (id: InsetPaneId) => void;
178
+ export const ShellFrameContext = React.createContext<{
179
+ registerOffFrame: (id: FramePaneId) => void;
180
+ unregisterOffFrame: (id: FramePaneId) => void;
181
181
  } | null>(null);
182
182
 
183
- /** Registers a pane's `inset` with the Root, which paints the backdrop while any pane is inset. */
184
- export function useInsetRegistration(id: InsetPaneId, inset: boolean | undefined) {
185
- const ctx = React.useContext(ShellInsetContext);
183
+ /** Tells the Root a pane is off the frame (`flush={false}`); the Rail's card moves a floating Panel over. */
184
+ export function useFrameRegistration(id: FramePaneId, flush: boolean) {
185
+ const ctx = React.useContext(ShellFrameContext);
186
186
  if (!ctx) throw new Error('Shell panes must be used within <Shell.Root>');
187
- const { registerInset, unregisterInset } = ctx;
187
+ const { registerOffFrame, unregisterOffFrame } = ctx;
188
188
  useLayoutEffect(() => {
189
- if (!inset) return;
190
- registerInset(id);
191
- return () => unregisterInset(id);
192
- }, [id, inset, registerInset, unregisterInset]);
189
+ if (flush) return;
190
+ registerOffFrame(id);
191
+ return () => unregisterOffFrame(id);
192
+ }, [id, flush, registerOffFrame, unregisterOffFrame]);
193
193
  }
194
194
 
195
195
  /* ── Development warnings ──────────────────────────────────────────────────── */
@@ -0,0 +1,197 @@
1
+ @import './_internal/base-menu.css';
2
+
3
+ /* Command (from v2, 2026-11-03): a command palette. The dialog's panel paints nothing; it is a
4
+ * column of two panes, the search bar and the results, anchored to the top at every width so a
5
+ * result count never moves the field. Rows are menu rows. No motion. */
6
+
7
+ .kui-CommandOverlay {
8
+ display: flex;
9
+ justify-content: center;
10
+ align-items: flex-start;
11
+ padding: max(var(--space-9), 12vh) var(--space-4) var(--space-4);
12
+ }
13
+
14
+ .kui-CommandContent {
15
+ position: relative;
16
+ z-index: 1;
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: var(--space-3);
20
+ width: 100%;
21
+ max-width: var(--overlay-w);
22
+ max-height: 100%;
23
+ outline: none;
24
+ }
25
+
26
+ .kui-CommandContent:where(.kui-r-size-1) {
27
+ --overlay-w: var(--overlay-w-1);
28
+ }
29
+
30
+ .kui-CommandContent:where(.kui-r-size-2) {
31
+ --overlay-w: var(--overlay-w-2);
32
+ }
33
+
34
+ .kui-CommandContent:where(.kui-r-size-3) {
35
+ --overlay-w: var(--overlay-w-3);
36
+ }
37
+
38
+ .kui-CommandContent:where(.kui-r-size-4) {
39
+ --overlay-w: var(--overlay-w-4);
40
+ }
41
+
42
+ .kui-CommandRoot {
43
+ display: flex;
44
+ flex-direction: column;
45
+ gap: var(--space-3);
46
+ min-height: 0;
47
+ }
48
+
49
+ /* The search bar: a pane of its own, with type one step above the rows it filters. It pads by the
50
+ panel ladder at its index, one rung wider along the line than above and below it. */
51
+ .kui-CommandSearch {
52
+ display: flex;
53
+ align-items: center;
54
+ flex-shrink: 0;
55
+ background-color: var(--color-surface);
56
+ box-shadow: var(--floating-chrome);
57
+ cursor: text;
58
+ }
59
+
60
+ .kui-CommandSearch:where(.kui-r-size-1) {
61
+ gap: var(--space-2);
62
+ padding: var(--panel-p-1) var(--panel-p-2);
63
+ border-radius: var(--radius-panel-1);
64
+ font-size: var(--font-size-3);
65
+ line-height: var(--line-height-3);
66
+ }
67
+
68
+ .kui-CommandSearch:where(.kui-r-size-2) {
69
+ gap: var(--space-3);
70
+ padding: var(--panel-p-2) var(--panel-p-3);
71
+ border-radius: var(--radius-panel-2);
72
+ font-size: var(--font-size-4);
73
+ line-height: var(--line-height-4);
74
+ }
75
+
76
+ .kui-CommandSearch:where(.kui-r-size-3) {
77
+ gap: var(--space-3);
78
+ padding: var(--panel-p-3) var(--panel-p-4);
79
+ border-radius: var(--radius-panel-3);
80
+ font-size: var(--font-size-5);
81
+ line-height: var(--line-height-5);
82
+ }
83
+
84
+ .kui-CommandSearch:where(.kui-r-size-4) {
85
+ gap: var(--space-4);
86
+ padding: var(--panel-p-4) var(--panel-p-4);
87
+ border-radius: var(--radius-panel-4);
88
+ font-size: var(--font-size-6);
89
+ line-height: var(--line-height-6);
90
+ }
91
+
92
+ .kui-CommandSearchSlot {
93
+ display: flex;
94
+ flex-shrink: 0;
95
+ color: var(--neutral-a10);
96
+ }
97
+
98
+ .kui-CommandSearchSlot > :where(*) {
99
+ width: 1em;
100
+ height: 1em;
101
+ }
102
+
103
+ .kui-CommandInput {
104
+ flex: 1;
105
+ min-width: 0;
106
+ font: inherit;
107
+ color: var(--neutral-12);
108
+ background: none;
109
+ outline: none;
110
+ }
111
+
112
+ .kui-CommandInput::placeholder {
113
+ color: var(--neutral-a10);
114
+ }
115
+
116
+ /* The results: a menu pane whose height is its rows, up to what the window leaves. */
117
+ .kui-CommandPanel {
118
+ min-height: 0;
119
+ flex-shrink: 1;
120
+ }
121
+
122
+ .kui-CommandList {
123
+ max-height: min(60vh, calc(480px * var(--scale)));
124
+ overflow: auto;
125
+ overscroll-behavior: contain;
126
+ outline: 0;
127
+ }
128
+
129
+ /* A pane with nothing in it (no rows, no empty state) shows nothing. */
130
+ .kui-CommandPanel:where(:not(:has(.kui-CommandItem, .kui-CommandEmpty))) {
131
+ display: none;
132
+ }
133
+
134
+ .kui-CommandSeat:where(:empty) {
135
+ display: none;
136
+ }
137
+
138
+ /* cmdk marks every enabled row data-disabled="false"; base-menu.css reads any [data-disabled]. */
139
+ .kui-CommandItem:where([data-disabled='false']) {
140
+ color: inherit;
141
+ cursor: var(--cursor-menu-item);
142
+ }
143
+
144
+ /* The highlighted row: cmdk's [data-selected='true'], from the pointer and the keyboard. */
145
+ .kui-CommandItem:where([data-selected='true']) {
146
+ background-color: var(--accent-4);
147
+ }
148
+
149
+ .kui-CommandItem:where([data-tone='destructive']) {
150
+ color: var(--red-11);
151
+ }
152
+
153
+ .kui-CommandItem:where([data-disabled='true']) {
154
+ color: var(--neutral-a8);
155
+ cursor: default;
156
+ pointer-events: none;
157
+ }
158
+
159
+ /* A link row takes the row's look, not a link's. */
160
+ .kui-CommandItem:where(:any-link) {
161
+ text-decoration: none;
162
+ }
163
+
164
+ .kui-CommandItemLabel {
165
+ flex: 1;
166
+ min-width: 0;
167
+ }
168
+
169
+ .kui-CommandItemSlot {
170
+ display: flex;
171
+ flex-shrink: 0;
172
+ }
173
+
174
+ .kui-CommandItemSlot:where([data-slot='leading']) {
175
+ color: var(--neutral-a11);
176
+ }
177
+
178
+ .kui-CommandItemSlot:where([data-slot='trailing']) {
179
+ color: var(--neutral-a10);
180
+ }
181
+
182
+ .kui-CommandEmpty {
183
+ padding: var(--space-5);
184
+ text-align: center;
185
+ color: var(--neutral-a11);
186
+ }
187
+
188
+ @media (forced-colors: active) {
189
+ .kui-CommandItem:where([data-selected='true']) {
190
+ outline: 2px solid Highlight;
191
+ outline-offset: -2px;
192
+ }
193
+
194
+ .kui-CommandSearch {
195
+ border: 1px solid CanvasText;
196
+ }
197
+ }