@mastra/playground-ui 53.0.0-alpha.7 → 53.0.0-alpha.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/dist/Comment.css +37 -0
- package/dist/arrival-DRX5Mxhd.cjs +22 -0
- package/dist/arrival-DRX5Mxhd.cjs.map +1 -0
- package/dist/arrival-Dp1nnVVK.js +19 -0
- package/dist/arrival-Dp1nnVVK.js.map +1 -0
- package/dist/{code-diff-C-EHXZyK.cjs → code-diff-CHZ3P1ky.cjs} +51 -43
- package/dist/code-diff-CHZ3P1ky.cjs.map +1 -0
- package/dist/{code-diff-BB4sqHpq.js → code-diff-CIRbnIfl.js} +52 -44
- package/dist/code-diff-CIRbnIfl.js.map +1 -0
- package/dist/{combobox-BQrlN0eB.cjs → combobox-JNWmgC13.cjs} +8 -3
- package/dist/combobox-JNWmgC13.cjs.map +1 -0
- package/dist/{combobox-DeeAlYti.js → combobox-nxjXzRWu.js} +8 -3
- package/dist/combobox-nxjXzRWu.js.map +1 -0
- package/dist/components/Arrival.cjs.js +4 -16
- package/dist/components/Arrival.cjs.js.map +1 -1
- package/dist/components/Arrival.es.js +2 -19
- package/dist/components/Arrival.es.js.map +1 -1
- package/dist/components/CodeDiff.cjs.js +1 -1
- package/dist/components/CodeDiff.es.js +1 -1
- package/dist/components/Combobox.cjs.js +1 -1
- package/dist/components/Combobox.es.js +1 -1
- package/dist/components/Comment.cjs.js +210 -42
- package/dist/components/Comment.cjs.js.map +1 -1
- package/dist/components/Comment.es.js +208 -45
- package/dist/components/Comment.es.js.map +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +0 -1
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +0 -1
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/MainHeader.cjs.js +1 -1
- package/dist/components/MainHeader.cjs.js.map +1 -1
- package/dist/components/MainHeader.es.js +1 -1
- package/dist/components/MainHeader.es.js.map +1 -1
- package/dist/components/PropertyFilter.cjs.js +1 -1
- package/dist/components/PropertyFilter.es.js +1 -1
- package/dist/{data-code-section-Dn9smaz4.cjs → data-code-section-D5I0m1cS.cjs} +33 -4
- package/dist/data-code-section-D5I0m1cS.cjs.map +1 -0
- package/dist/{data-code-section-DN2yPgEz.js → data-code-section-d3NffL3V.js} +35 -6
- package/dist/data-code-section-d3NffL3V.js.map +1 -0
- package/dist/{data-panel-DEatwExN.cjs → data-panel-Bo2HCylZ.cjs} +2 -2
- package/dist/{data-panel-DEatwExN.cjs.map → data-panel-Bo2HCylZ.cjs.map} +1 -1
- package/dist/{data-panel-2Da0Utgy.js → data-panel-T3vp7wTD.js} +2 -2
- package/dist/{data-panel-2Da0Utgy.js.map → data-panel-T3vp7wTD.js.map} +1 -1
- package/dist/domains/memory/components/observation-detail-view.cjs.js +2 -2
- package/dist/domains/memory/components/observation-detail-view.cjs.js.map +1 -1
- package/dist/domains/memory/components/observation-detail-view.es.js +3 -3
- package/dist/domains/memory/components/observation-detail-view.es.js.map +1 -1
- package/dist/domains/traces/components/no-traces-info.cjs.js +1 -1
- package/dist/domains/traces/components/no-traces-info.cjs.js.map +1 -1
- package/dist/domains/traces/components/no-traces-info.es.js +1 -1
- package/dist/domains/traces/components/no-traces-info.es.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +61 -105
- package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +62 -106
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-summary-description.cjs.js +62 -0
- package/dist/domains/traces/components/span-summary-description.cjs.js.map +1 -0
- package/dist/domains/traces/components/span-summary-description.d.ts +2 -0
- package/dist/domains/traces/components/span-summary-description.es.js +58 -0
- package/dist/domains/traces/components/span-summary-description.es.js.map +1 -0
- package/dist/domains/traces/components/timeline-expand-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-expand-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-expand-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-expand-col.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-name-col.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-timing-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-timing-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -5
- package/dist/domains/traces/components/traces-toolbar.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-toolbar.es.js +1 -5
- package/dist/domains/traces/components/traces-toolbar.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js +11 -18
- package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js +13 -20
- package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js.map +1 -1
- package/dist/domains/traces/trace-filters.cjs.js +5 -5
- package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
- package/dist/domains/traces/trace-filters.es.js +5 -5
- package/dist/domains/traces/trace-filters.es.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.cjs.js +6 -0
- package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.es.js +6 -1
- package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +0 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +0 -1
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +2 -2
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
- package/dist/src/domains/traces/components/span-summary-description.d.ts +10 -0
- package/dist/src/domains/traces/components/traces-toolbar.d.ts +1 -5
- package/dist/src/domains/traces/hooks/index.d.ts +1 -1
- package/dist/src/domains/traces/hooks/use-trace-filter-persistence.d.ts +5 -18
- package/dist/src/domains/traces/trace-filters.d.ts +4 -3
- package/dist/src/domains/traces/utils/span-utils.d.ts +2 -0
- package/dist/src/ds/components/CodeDiff/code-diff.stories.d.ts +2 -0
- package/dist/src/ds/components/Combobox/combobox.d.ts +3 -1
- package/dist/src/ds/components/Comment/comment-arrival.d.ts +5 -0
- package/dist/src/ds/components/Comment/comment-context.d.ts +1 -1
- package/dist/src/ds/components/Comment/comment-editor.d.ts +14 -0
- package/dist/src/ds/components/Comment/comment-quote.d.ts +9 -0
- package/dist/src/ds/components/Comment/comment.d.ts +19 -8
- package/dist/src/ds/components/Comment/comment.stories.d.ts +7 -0
- package/dist/src/ds/components/Comment/index.d.ts +7 -2
- package/dist/src/ds/components/DataCodeSection/data-code-section.d.ts +9 -1
- package/dist/src/ds/components/DataCodeSection/index.d.ts +1 -1
- package/dist/style.css +79 -3
- package/package.json +7 -7
- package/dist/code-diff-BB4sqHpq.js.map +0 -1
- package/dist/code-diff-C-EHXZyK.cjs.map +0 -1
- package/dist/combobox-BQrlN0eB.cjs.map +0 -1
- package/dist/combobox-DeeAlYti.js.map +0 -1
- package/dist/data-code-section-DN2yPgEz.js.map +0 -1
- package/dist/data-code-section-Dn9smaz4.cjs.map +0 -1
package/dist/Comment.css
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* A comment lands rising from the composer instead of fading in place, on the
|
|
2
|
+
* same two clocks as the chat composer: the ink settles early while the travel
|
|
3
|
+
* keeps a decelerating tail.
|
|
4
|
+
*
|
|
5
|
+
* `backwards`, not `both`: a settled transform would leave the row a containing
|
|
6
|
+
* block for the actions it hangs over its own top edge. */
|
|
7
|
+
.mastra-comment-arriving {
|
|
8
|
+
animation:
|
|
9
|
+
mastra-comment-rise 420ms cubic-bezier(0.16, 1, 0.3, 1) backwards,
|
|
10
|
+
mastra-comment-fade 200ms linear backwards;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@keyframes mastra-comment-rise {
|
|
14
|
+
from {
|
|
15
|
+
transform: translateY(0.75rem);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
to {
|
|
19
|
+
transform: translateY(0);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@keyframes mastra-comment-fade {
|
|
24
|
+
from {
|
|
25
|
+
opacity: 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
to {
|
|
29
|
+
opacity: 1;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@media (prefers-reduced-motion: reduce) {
|
|
34
|
+
.mastra-comment-arriving {
|
|
35
|
+
animation: none;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
const React = require('react');
|
|
5
|
+
const useWatched = require('./use-watched-BixmYWp0.cjs');
|
|
6
|
+
const utils_cn = require('./cn-DCPcv4xv.cjs');
|
|
7
|
+
|
|
8
|
+
function ArrivalScope({ children }) {
|
|
9
|
+
const settled = React.useRef(false);
|
|
10
|
+
React.useEffect(() => {
|
|
11
|
+
settled.current = true;
|
|
12
|
+
}, []);
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsx(useWatched.SettledContext, { value: settled, children });
|
|
14
|
+
}
|
|
15
|
+
function Arriving({ children, className }) {
|
|
16
|
+
const arriving = useWatched.useArriving();
|
|
17
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils_cn.cn(arriving, className), children: /* @__PURE__ */ jsxRuntime.jsx(ArrivalScope, { children }) });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
exports.ArrivalScope = ArrivalScope;
|
|
21
|
+
exports.Arriving = Arriving;
|
|
22
|
+
//# sourceMappingURL=arrival-DRX5Mxhd.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrival-DRX5Mxhd.cjs","sources":["../src/ds/components/Arrival/arrival.tsx"],"sourcesContent":["import { useEffect, useRef, type ReactNode } from 'react';\n\nimport { SettledContext, useArriving } from './use-watched';\nimport { cn } from '@/lib/utils';\n\n/**\n * Marks what the reader was handed. Whatever mounts with a scope is already there and\n * never animates; whatever mounts after it painted is the run happening in front of\n * them, and fades in.\n *\n * Scopes nest, and that is the whole rule: a transcript opens one for its history,\n * and every element that fades in opens one for its own subtree, so a row's contents\n * ride its entrance rather than playing a second one on top of it — while a detail\n * that fills in a beat later still gets its own.\n *\n * A ref, not state: this says when a child mounted, which is only ever read by a child\n * mounting. Holding it as state would re-render every scope and its subtree once each\n * after paint — a whole restored transcript rendered twice to tell it to sit still.\n */\nexport function ArrivalScope({ children }: { children: ReactNode }) {\n const settled = useRef(false);\n useEffect(() => {\n settled.current = true;\n }, []);\n\n return <SettledContext value={settled}>{children}</SettledContext>;\n}\n\n/** An element that fades in when it lands, and hosts a scope for whatever lands inside it later. */\nexport function Arriving({ children, className }: { children: ReactNode; className?: string }) {\n const arriving = useArriving();\n\n return (\n <div className={cn(arriving, className)}>\n <ArrivalScope>{children}</ArrivalScope>\n </div>\n );\n}\n"],"names":["useRef","useEffect","jsx","SettledContext","useArriving","cn"],"mappings":";;;;;;;AAmBO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAA4B;AAClE,EAAA,MAAM,OAAA,GAAUA,aAAO,KAAK,CAAA;AAC5B,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBAAOC,cAAA,CAACC,yBAAA,EAAA,EAAe,KAAA,EAAO,OAAA,EAAU,QAAA,EAAS,CAAA;AACnD;AAGO,SAAS,QAAA,CAAS,EAAE,QAAA,EAAU,SAAA,EAAU,EAAgD;AAC7F,EAAA,MAAM,WAAWC,sBAAA,EAAY;AAE7B,EAAA,uBACEF,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWG,WAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EACpC,QAAA,kBAAAH,cAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAS,CAAA,EAC1B,CAAA;AAEJ;;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useRef, useEffect } from 'react';
|
|
3
|
+
import { S as SettledContext, u as useArriving } from './use-watched-CG9KoWl3.js';
|
|
4
|
+
import { c as cn } from './cn-B4oPhFx9.js';
|
|
5
|
+
|
|
6
|
+
function ArrivalScope({ children }) {
|
|
7
|
+
const settled = useRef(false);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
settled.current = true;
|
|
10
|
+
}, []);
|
|
11
|
+
return /* @__PURE__ */ jsx(SettledContext, { value: settled, children });
|
|
12
|
+
}
|
|
13
|
+
function Arriving({ children, className }) {
|
|
14
|
+
const arriving = useArriving();
|
|
15
|
+
return /* @__PURE__ */ jsx("div", { className: cn(arriving, className), children: /* @__PURE__ */ jsx(ArrivalScope, { children }) });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { ArrivalScope as A, Arriving as a };
|
|
19
|
+
//# sourceMappingURL=arrival-Dp1nnVVK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrival-Dp1nnVVK.js","sources":["../src/ds/components/Arrival/arrival.tsx"],"sourcesContent":["import { useEffect, useRef, type ReactNode } from 'react';\n\nimport { SettledContext, useArriving } from './use-watched';\nimport { cn } from '@/lib/utils';\n\n/**\n * Marks what the reader was handed. Whatever mounts with a scope is already there and\n * never animates; whatever mounts after it painted is the run happening in front of\n * them, and fades in.\n *\n * Scopes nest, and that is the whole rule: a transcript opens one for its history,\n * and every element that fades in opens one for its own subtree, so a row's contents\n * ride its entrance rather than playing a second one on top of it — while a detail\n * that fills in a beat later still gets its own.\n *\n * A ref, not state: this says when a child mounted, which is only ever read by a child\n * mounting. Holding it as state would re-render every scope and its subtree once each\n * after paint — a whole restored transcript rendered twice to tell it to sit still.\n */\nexport function ArrivalScope({ children }: { children: ReactNode }) {\n const settled = useRef(false);\n useEffect(() => {\n settled.current = true;\n }, []);\n\n return <SettledContext value={settled}>{children}</SettledContext>;\n}\n\n/** An element that fades in when it lands, and hosts a scope for whatever lands inside it later. */\nexport function Arriving({ children, className }: { children: ReactNode; className?: string }) {\n const arriving = useArriving();\n\n return (\n <div className={cn(arriving, className)}>\n <ArrivalScope>{children}</ArrivalScope>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AAmBO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAA4B;AAClE,EAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBAAO,GAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,OAAA,EAAU,QAAA,EAAS,CAAA;AACnD;AAGO,SAAS,QAAA,CAAS,EAAE,QAAA,EAAU,SAAA,EAAU,EAAgD;AAC7F,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EACpC,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAS,CAAA,EAC1B,CAAA;AAEJ;;;;"}
|
|
@@ -11,32 +11,43 @@ const codemirrorThemeDracula = require('@uiw/codemirror-theme-dracula');
|
|
|
11
11
|
const React = require('react');
|
|
12
12
|
const themeProvider = require('./theme-provider-aO5-jZVp.cjs');
|
|
13
13
|
|
|
14
|
+
const removed = "var(--accent2)";
|
|
15
|
+
const added = "var(--accent1)";
|
|
16
|
+
const tint = (color, pct) => `color-mix(in oklch, ${color} ${pct}%, transparent)`;
|
|
14
17
|
const diffOverrides = view.EditorView.theme({
|
|
15
|
-
"&.cm-editor .cm-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
"&.cm-editor .cm-line": { lineHeight: "1.5" },
|
|
19
|
+
"&.cm-editor .cm-gutters": { border: "none", backgroundColor: "transparent" },
|
|
20
|
+
"&.cm-editor .cm-lineNumbers .cm-gutterElement": { color: "var(--neutral2)", minWidth: "2.5rem" },
|
|
21
|
+
"&.cm-editor .cm-changeGutter": { width: "3px", paddingLeft: "0" },
|
|
22
|
+
"&.cm-merge-a .cm-changedLine": {
|
|
23
|
+
backgroundColor: tint(removed, 14),
|
|
24
|
+
backgroundImage: "none"
|
|
19
25
|
},
|
|
20
|
-
"&.cm-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
padding: "1px 5px",
|
|
24
|
-
display: "inline-block",
|
|
25
|
-
borderRadius: "4px"
|
|
26
|
+
"&.cm-merge-b .cm-changedLine": {
|
|
27
|
+
backgroundColor: tint(added, 14),
|
|
28
|
+
backgroundImage: "none"
|
|
26
29
|
},
|
|
27
|
-
"&.cm-
|
|
28
|
-
|
|
30
|
+
"&.cm-merge-a .cm-changedText": {
|
|
31
|
+
backgroundColor: tint(removed, 35),
|
|
32
|
+
backgroundImage: "none",
|
|
33
|
+
borderRadius: "2px"
|
|
29
34
|
},
|
|
30
|
-
"&.cm-
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
"&.cm-merge-b .cm-changedText": {
|
|
36
|
+
backgroundColor: tint(added, 35),
|
|
37
|
+
backgroundImage: "none",
|
|
38
|
+
borderRadius: "2px"
|
|
33
39
|
},
|
|
34
|
-
"&.cm-
|
|
35
|
-
|
|
40
|
+
"&.cm-merge-a .cm-changedLineGutter": { background: removed },
|
|
41
|
+
"&.cm-merge-b .cm-changedLineGutter": { background: added },
|
|
42
|
+
"&.cm-editor .cm-collapsedLines": {
|
|
43
|
+
backgroundColor: "var(--surface4)",
|
|
44
|
+
backgroundImage: "none",
|
|
45
|
+
color: "var(--neutral3)",
|
|
46
|
+
fontSize: "0.75rem",
|
|
47
|
+
padding: "4px 12px",
|
|
48
|
+
cursor: "pointer"
|
|
36
49
|
},
|
|
37
|
-
"&.cm-editor .cm-
|
|
38
|
-
display: "none"
|
|
39
|
-
}
|
|
50
|
+
"&.cm-editor .cm-collapsedLines:hover": { backgroundColor: "var(--surface5)" }
|
|
40
51
|
});
|
|
41
52
|
function buildDiffDarkTheme() {
|
|
42
53
|
return codemirrorThemeDracula.draculaInit({
|
|
@@ -91,34 +102,31 @@ function buildDiffLightTheme() {
|
|
|
91
102
|
]);
|
|
92
103
|
return [editorTheme, language.syntaxHighlighting(highlightStyle)];
|
|
93
104
|
}
|
|
105
|
+
const collapseUnchanged = { margin: 3, minSize: 4 };
|
|
94
106
|
function CodeDiff({ codeA, codeB }) {
|
|
95
107
|
const containerRef = React.useRef(null);
|
|
96
|
-
const viewRef = React.useRef(null);
|
|
97
108
|
const isDark = themeProvider.useTheme().resolvedTheme === "dark";
|
|
98
109
|
const theme = React.useMemo(() => isDark ? buildDiffDarkTheme() : buildDiffLightTheme(), [isDark]);
|
|
99
110
|
React.useEffect(() => {
|
|
100
|
-
|
|
101
|
-
if (
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
111
|
+
const parent = containerRef.current;
|
|
112
|
+
if (!parent) return;
|
|
113
|
+
const extensions = [
|
|
114
|
+
langJson.json(),
|
|
115
|
+
theme,
|
|
116
|
+
diffOverrides,
|
|
117
|
+
view.lineNumbers(),
|
|
118
|
+
view.EditorView.lineWrapping,
|
|
119
|
+
state.EditorState.readOnly.of(true)
|
|
120
|
+
];
|
|
105
121
|
const mergeView = new merge.MergeView({
|
|
106
|
-
parent
|
|
107
|
-
a: {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
doc: codeB,
|
|
113
|
-
extensions
|
|
114
|
-
},
|
|
115
|
-
collapseUnchanged: { margin: 3, minSize: 4 }
|
|
122
|
+
parent,
|
|
123
|
+
a: { doc: codeA, extensions },
|
|
124
|
+
b: { doc: codeB, extensions },
|
|
125
|
+
gutter: true,
|
|
126
|
+
highlightChanges: true,
|
|
127
|
+
collapseUnchanged
|
|
116
128
|
});
|
|
117
|
-
|
|
118
|
-
return () => {
|
|
119
|
-
mergeView.destroy();
|
|
120
|
-
viewRef.current = null;
|
|
121
|
-
};
|
|
129
|
+
return () => mergeView.destroy();
|
|
122
130
|
}, [codeA, codeB, theme]);
|
|
123
131
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-border1 bg-surface3 relative overflow-auto rounded-xl border dark:border-white/10 dark:bg-black/20", children: [
|
|
124
132
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-border1 absolute top-0 left-1/2 z-10 h-full w-px dark:bg-white/10" }),
|
|
@@ -126,11 +134,11 @@ function CodeDiff({ codeA, codeB }) {
|
|
|
126
134
|
"div",
|
|
127
135
|
{
|
|
128
136
|
ref: containerRef,
|
|
129
|
-
className: "[&_.cm-editor]:bg-transparent [&_.cm-editor]:
|
|
137
|
+
className: "[&_.cm-editor]:bg-transparent [&_.cm-editor]:py-3 [&_.cm-gutters]:bg-transparent [&_.cm-mergeViewEditor]:flex-1"
|
|
130
138
|
}
|
|
131
139
|
)
|
|
132
140
|
] });
|
|
133
141
|
}
|
|
134
142
|
|
|
135
143
|
exports.CodeDiff = CodeDiff;
|
|
136
|
-
//# sourceMappingURL=code-diff-
|
|
144
|
+
//# sourceMappingURL=code-diff-CHZ3P1ky.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-diff-CHZ3P1ky.cjs","sources":["../src/ds/components/CodeDiff/code-diff.tsx"],"sourcesContent":["'use client';\n\nimport { json } from '@codemirror/lang-json';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { MergeView } from '@codemirror/merge';\nimport type { Extension } from '@codemirror/state';\nimport { EditorState } from '@codemirror/state';\nimport { EditorView, lineNumbers } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useTheme } from '@/ds/components/ThemeProvider';\n\nconst removed = 'var(--accent2)';\nconst added = 'var(--accent1)';\nconst tint = (color: string, pct: number) => `color-mix(in oklch, ${color} ${pct}%, transparent)`;\n\n// GitHub-like split diff: red bands for removed lines (left), green bands for\n// added lines (right), with a stronger tint on the exact changed text.\nconst diffOverrides = EditorView.theme({\n '&.cm-editor .cm-line': { lineHeight: '1.5' },\n '&.cm-editor .cm-gutters': { border: 'none', backgroundColor: 'transparent' },\n '&.cm-editor .cm-lineNumbers .cm-gutterElement': { color: 'var(--neutral2)', minWidth: '2.5rem' },\n '&.cm-editor .cm-changeGutter': { width: '3px', paddingLeft: '0' },\n\n '&.cm-merge-a .cm-changedLine': {\n backgroundColor: tint(removed, 14),\n backgroundImage: 'none',\n },\n '&.cm-merge-b .cm-changedLine': {\n backgroundColor: tint(added, 14),\n backgroundImage: 'none',\n },\n '&.cm-merge-a .cm-changedText': {\n backgroundColor: tint(removed, 35),\n backgroundImage: 'none',\n borderRadius: '2px',\n },\n '&.cm-merge-b .cm-changedText': {\n backgroundColor: tint(added, 35),\n backgroundImage: 'none',\n borderRadius: '2px',\n },\n '&.cm-merge-a .cm-changedLineGutter': { background: removed },\n '&.cm-merge-b .cm-changedLineGutter': { background: added },\n\n '&.cm-editor .cm-collapsedLines': {\n backgroundColor: 'var(--surface4)',\n backgroundImage: 'none',\n color: 'var(--neutral3)',\n fontSize: '0.75rem',\n padding: '4px 12px',\n cursor: 'pointer',\n },\n '&.cm-editor .cm-collapsedLines:hover': { backgroundColor: 'var(--surface5)' },\n});\n\nexport interface CodeDiffProps {\n codeA: string;\n codeB: string;\n}\n\nfunction buildDiffDarkTheme(): Extension {\n return draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.8125rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: '#939393',\n background: 'transparent',\n },\n styles: [{ tag: [t.className, t.propertyName] }],\n });\n}\n\nfunction buildDiffLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.8125rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\n}\n\nconst collapseUnchanged = { margin: 3, minSize: 4 };\n\nexport function CodeDiff({ codeA, codeB }: CodeDiffProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const isDark = useTheme().resolvedTheme === 'dark';\n const theme = useMemo(() => (isDark ? buildDiffDarkTheme() : buildDiffLightTheme()), [isDark]);\n\n useEffect(() => {\n const parent = containerRef.current;\n if (!parent) return;\n\n const extensions = [\n json(),\n theme,\n diffOverrides,\n lineNumbers(),\n EditorView.lineWrapping,\n EditorState.readOnly.of(true),\n ];\n\n const mergeView = new MergeView({\n parent,\n a: { doc: codeA, extensions },\n b: { doc: codeB, extensions },\n gutter: true,\n highlightChanges: true,\n collapseUnchanged,\n });\n return () => mergeView.destroy();\n }, [codeA, codeB, theme]);\n\n return (\n <div className=\"border-border1 bg-surface3 relative overflow-auto rounded-xl border dark:border-white/10 dark:bg-black/20\">\n <div className=\"bg-border1 absolute top-0 left-1/2 z-10 h-full w-px dark:bg-white/10\" />\n <div\n ref={containerRef}\n className=\"[&_.cm-editor]:bg-transparent [&_.cm-editor]:py-3 [&_.cm-gutters]:bg-transparent [&_.cm-mergeViewEditor]:flex-1\"\n />\n </div>\n );\n}\n"],"names":["EditorView","draculaInit","t","HighlightStyle","syntaxHighlighting","useRef","useTheme","useMemo","useEffect","json","lineNumbers","EditorState","MergeView","jsxs","jsx"],"mappings":"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"}
|
|
@@ -3,38 +3,49 @@ import { json } from '@codemirror/lang-json';
|
|
|
3
3
|
import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';
|
|
4
4
|
import { MergeView } from '@codemirror/merge';
|
|
5
5
|
import { EditorState } from '@codemirror/state';
|
|
6
|
-
import { EditorView } from '@codemirror/view';
|
|
6
|
+
import { EditorView, lineNumbers } from '@codemirror/view';
|
|
7
7
|
import { tags } from '@lezer/highlight';
|
|
8
8
|
import { draculaInit } from '@uiw/codemirror-theme-dracula';
|
|
9
9
|
import { useRef, useMemo, useEffect } from 'react';
|
|
10
10
|
import { u as useTheme } from './theme-provider-C9ih9jSS.js';
|
|
11
11
|
|
|
12
|
+
const removed = "var(--accent2)";
|
|
13
|
+
const added = "var(--accent1)";
|
|
14
|
+
const tint = (color, pct) => `color-mix(in oklch, ${color} ${pct}%, transparent)`;
|
|
12
15
|
const diffOverrides = EditorView.theme({
|
|
13
|
-
"&.cm-editor .cm-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
"&.cm-editor .cm-line": { lineHeight: "1.5" },
|
|
17
|
+
"&.cm-editor .cm-gutters": { border: "none", backgroundColor: "transparent" },
|
|
18
|
+
"&.cm-editor .cm-lineNumbers .cm-gutterElement": { color: "var(--neutral2)", minWidth: "2.5rem" },
|
|
19
|
+
"&.cm-editor .cm-changeGutter": { width: "3px", paddingLeft: "0" },
|
|
20
|
+
"&.cm-merge-a .cm-changedLine": {
|
|
21
|
+
backgroundColor: tint(removed, 14),
|
|
22
|
+
backgroundImage: "none"
|
|
17
23
|
},
|
|
18
|
-
"&.cm-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
padding: "1px 5px",
|
|
22
|
-
display: "inline-block",
|
|
23
|
-
borderRadius: "4px"
|
|
24
|
+
"&.cm-merge-b .cm-changedLine": {
|
|
25
|
+
backgroundColor: tint(added, 14),
|
|
26
|
+
backgroundImage: "none"
|
|
24
27
|
},
|
|
25
|
-
"&.cm-
|
|
26
|
-
|
|
28
|
+
"&.cm-merge-a .cm-changedText": {
|
|
29
|
+
backgroundColor: tint(removed, 35),
|
|
30
|
+
backgroundImage: "none",
|
|
31
|
+
borderRadius: "2px"
|
|
27
32
|
},
|
|
28
|
-
"&.cm-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
"&.cm-merge-b .cm-changedText": {
|
|
34
|
+
backgroundColor: tint(added, 35),
|
|
35
|
+
backgroundImage: "none",
|
|
36
|
+
borderRadius: "2px"
|
|
31
37
|
},
|
|
32
|
-
"&.cm-
|
|
33
|
-
|
|
38
|
+
"&.cm-merge-a .cm-changedLineGutter": { background: removed },
|
|
39
|
+
"&.cm-merge-b .cm-changedLineGutter": { background: added },
|
|
40
|
+
"&.cm-editor .cm-collapsedLines": {
|
|
41
|
+
backgroundColor: "var(--surface4)",
|
|
42
|
+
backgroundImage: "none",
|
|
43
|
+
color: "var(--neutral3)",
|
|
44
|
+
fontSize: "0.75rem",
|
|
45
|
+
padding: "4px 12px",
|
|
46
|
+
cursor: "pointer"
|
|
34
47
|
},
|
|
35
|
-
"&.cm-editor .cm-
|
|
36
|
-
display: "none"
|
|
37
|
-
}
|
|
48
|
+
"&.cm-editor .cm-collapsedLines:hover": { backgroundColor: "var(--surface5)" }
|
|
38
49
|
});
|
|
39
50
|
function buildDiffDarkTheme() {
|
|
40
51
|
return draculaInit({
|
|
@@ -89,34 +100,31 @@ function buildDiffLightTheme() {
|
|
|
89
100
|
]);
|
|
90
101
|
return [editorTheme, syntaxHighlighting(highlightStyle)];
|
|
91
102
|
}
|
|
103
|
+
const collapseUnchanged = { margin: 3, minSize: 4 };
|
|
92
104
|
function CodeDiff({ codeA, codeB }) {
|
|
93
105
|
const containerRef = useRef(null);
|
|
94
|
-
const viewRef = useRef(null);
|
|
95
106
|
const isDark = useTheme().resolvedTheme === "dark";
|
|
96
107
|
const theme = useMemo(() => isDark ? buildDiffDarkTheme() : buildDiffLightTheme(), [isDark]);
|
|
97
108
|
useEffect(() => {
|
|
98
|
-
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
109
|
+
const parent = containerRef.current;
|
|
110
|
+
if (!parent) return;
|
|
111
|
+
const extensions = [
|
|
112
|
+
json(),
|
|
113
|
+
theme,
|
|
114
|
+
diffOverrides,
|
|
115
|
+
lineNumbers(),
|
|
116
|
+
EditorView.lineWrapping,
|
|
117
|
+
EditorState.readOnly.of(true)
|
|
118
|
+
];
|
|
103
119
|
const mergeView = new MergeView({
|
|
104
|
-
parent
|
|
105
|
-
a: {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
doc: codeB,
|
|
111
|
-
extensions
|
|
112
|
-
},
|
|
113
|
-
collapseUnchanged: { margin: 3, minSize: 4 }
|
|
120
|
+
parent,
|
|
121
|
+
a: { doc: codeA, extensions },
|
|
122
|
+
b: { doc: codeB, extensions },
|
|
123
|
+
gutter: true,
|
|
124
|
+
highlightChanges: true,
|
|
125
|
+
collapseUnchanged
|
|
114
126
|
});
|
|
115
|
-
|
|
116
|
-
return () => {
|
|
117
|
-
mergeView.destroy();
|
|
118
|
-
viewRef.current = null;
|
|
119
|
-
};
|
|
127
|
+
return () => mergeView.destroy();
|
|
120
128
|
}, [codeA, codeB, theme]);
|
|
121
129
|
return /* @__PURE__ */ jsxs("div", { className: "border-border1 bg-surface3 relative overflow-auto rounded-xl border dark:border-white/10 dark:bg-black/20", children: [
|
|
122
130
|
/* @__PURE__ */ jsx("div", { className: "bg-border1 absolute top-0 left-1/2 z-10 h-full w-px dark:bg-white/10" }),
|
|
@@ -124,11 +132,11 @@ function CodeDiff({ codeA, codeB }) {
|
|
|
124
132
|
"div",
|
|
125
133
|
{
|
|
126
134
|
ref: containerRef,
|
|
127
|
-
className: "[&_.cm-editor]:bg-transparent [&_.cm-editor]:
|
|
135
|
+
className: "[&_.cm-editor]:bg-transparent [&_.cm-editor]:py-3 [&_.cm-gutters]:bg-transparent [&_.cm-mergeViewEditor]:flex-1"
|
|
128
136
|
}
|
|
129
137
|
)
|
|
130
138
|
] });
|
|
131
139
|
}
|
|
132
140
|
|
|
133
141
|
export { CodeDiff as C };
|
|
134
|
-
//# sourceMappingURL=code-diff-
|
|
142
|
+
//# sourceMappingURL=code-diff-CIRbnIfl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-diff-CIRbnIfl.js","sources":["../src/ds/components/CodeDiff/code-diff.tsx"],"sourcesContent":["'use client';\n\nimport { json } from '@codemirror/lang-json';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { MergeView } from '@codemirror/merge';\nimport type { Extension } from '@codemirror/state';\nimport { EditorState } from '@codemirror/state';\nimport { EditorView, lineNumbers } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useTheme } from '@/ds/components/ThemeProvider';\n\nconst removed = 'var(--accent2)';\nconst added = 'var(--accent1)';\nconst tint = (color: string, pct: number) => `color-mix(in oklch, ${color} ${pct}%, transparent)`;\n\n// GitHub-like split diff: red bands for removed lines (left), green bands for\n// added lines (right), with a stronger tint on the exact changed text.\nconst diffOverrides = EditorView.theme({\n '&.cm-editor .cm-line': { lineHeight: '1.5' },\n '&.cm-editor .cm-gutters': { border: 'none', backgroundColor: 'transparent' },\n '&.cm-editor .cm-lineNumbers .cm-gutterElement': { color: 'var(--neutral2)', minWidth: '2.5rem' },\n '&.cm-editor .cm-changeGutter': { width: '3px', paddingLeft: '0' },\n\n '&.cm-merge-a .cm-changedLine': {\n backgroundColor: tint(removed, 14),\n backgroundImage: 'none',\n },\n '&.cm-merge-b .cm-changedLine': {\n backgroundColor: tint(added, 14),\n backgroundImage: 'none',\n },\n '&.cm-merge-a .cm-changedText': {\n backgroundColor: tint(removed, 35),\n backgroundImage: 'none',\n borderRadius: '2px',\n },\n '&.cm-merge-b .cm-changedText': {\n backgroundColor: tint(added, 35),\n backgroundImage: 'none',\n borderRadius: '2px',\n },\n '&.cm-merge-a .cm-changedLineGutter': { background: removed },\n '&.cm-merge-b .cm-changedLineGutter': { background: added },\n\n '&.cm-editor .cm-collapsedLines': {\n backgroundColor: 'var(--surface4)',\n backgroundImage: 'none',\n color: 'var(--neutral3)',\n fontSize: '0.75rem',\n padding: '4px 12px',\n cursor: 'pointer',\n },\n '&.cm-editor .cm-collapsedLines:hover': { backgroundColor: 'var(--surface5)' },\n});\n\nexport interface CodeDiffProps {\n codeA: string;\n codeB: string;\n}\n\nfunction buildDiffDarkTheme(): Extension {\n return draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.8125rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: '#939393',\n background: 'transparent',\n },\n styles: [{ tag: [t.className, t.propertyName] }],\n });\n}\n\nfunction buildDiffLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.8125rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\n}\n\nconst collapseUnchanged = { margin: 3, minSize: 4 };\n\nexport function CodeDiff({ codeA, codeB }: CodeDiffProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const isDark = useTheme().resolvedTheme === 'dark';\n const theme = useMemo(() => (isDark ? buildDiffDarkTheme() : buildDiffLightTheme()), [isDark]);\n\n useEffect(() => {\n const parent = containerRef.current;\n if (!parent) return;\n\n const extensions = [\n json(),\n theme,\n diffOverrides,\n lineNumbers(),\n EditorView.lineWrapping,\n EditorState.readOnly.of(true),\n ];\n\n const mergeView = new MergeView({\n parent,\n a: { doc: codeA, extensions },\n b: { doc: codeB, extensions },\n gutter: true,\n highlightChanges: true,\n collapseUnchanged,\n });\n return () => mergeView.destroy();\n }, [codeA, codeB, theme]);\n\n return (\n <div className=\"border-border1 bg-surface3 relative overflow-auto rounded-xl border dark:border-white/10 dark:bg-black/20\">\n <div className=\"bg-border1 absolute top-0 left-1/2 z-10 h-full w-px dark:bg-white/10\" />\n <div\n ref={containerRef}\n className=\"[&_.cm-editor]:bg-transparent [&_.cm-editor]:py-3 [&_.cm-gutters]:bg-transparent [&_.cm-mergeViewEditor]:flex-1\"\n />\n </div>\n );\n}\n"],"names":["t"],"mappings":"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"}
|
|
@@ -155,7 +155,8 @@ function Combobox(props) {
|
|
|
155
155
|
onOpenChange,
|
|
156
156
|
container,
|
|
157
157
|
error,
|
|
158
|
-
allowCustomValue = false
|
|
158
|
+
allowCustomValue = false,
|
|
159
|
+
onInputValueChange
|
|
159
160
|
} = props;
|
|
160
161
|
const multiple = isMultipleCombobox(props);
|
|
161
162
|
const [inputValue, setInputValue] = React__namespace.useState("");
|
|
@@ -241,11 +242,15 @@ function Combobox(props) {
|
|
|
241
242
|
items: displayedOptions,
|
|
242
243
|
value: selectedOption,
|
|
243
244
|
inputValue,
|
|
244
|
-
onInputValueChange:
|
|
245
|
+
onInputValueChange: (value) => {
|
|
246
|
+
setInputValue(value);
|
|
247
|
+
onInputValueChange?.(value);
|
|
248
|
+
},
|
|
245
249
|
onValueChange: (item) => {
|
|
246
250
|
if (item) {
|
|
247
251
|
props.onValueChange?.(item.value);
|
|
248
252
|
setInputValue("");
|
|
253
|
+
onInputValueChange?.("");
|
|
249
254
|
}
|
|
250
255
|
},
|
|
251
256
|
disabled,
|
|
@@ -260,4 +265,4 @@ function Combobox(props) {
|
|
|
260
265
|
|
|
261
266
|
exports.Combobox = Combobox;
|
|
262
267
|
exports.comboboxStyles = comboboxStyles;
|
|
263
|
-
//# sourceMappingURL=combobox-
|
|
268
|
+
//# sourceMappingURL=combobox-JNWmgC13.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox-JNWmgC13.cjs","sources":["../src/ds/components/Combobox/combobox-styles.ts","../src/ds/components/Combobox/combobox.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { buttonVariants } from '../Button/Button';\nimport type { TextButtonSize } from '../Button/Button';\nimport { controlTriggerOpenState } from '@/ds/primitives/control-size';\nimport type { ControlTriggerVisualVariant } from '@/ds/primitives/control-size';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\n/**\n * A combobox is a form field, so it reuses the same button looks as everywhere,\n * mirroring `SelectTrigger`: `default` (the Button's filled default surface —\n * the default here too), `outline` (bordered, transparent) and `ghost`\n * (borderless, for breadcrumbs/inline pickers). Only the high-emphasis `primary`\n * look is intentionally NOT offered (a field is not a call-to-action).\n */\nexport type ComboboxVisualVariant = ControlTriggerVisualVariant;\nexport type ComboboxLegacyVariant = 'link';\nexport type ComboboxVariant = ComboboxVisualVariant | ComboboxLegacyVariant;\n\nfunction normalizeComboboxVariant(variant: ComboboxVariant): ComboboxVisualVariant {\n return variant === 'link' ? 'ghost' : variant;\n}\n\n/**\n * Single source of truth for both the single- and multi-select combobox\n * triggers. A combobox = a button + a trailing chevron, so it reuses the Button\n * recipe (variant colors, size = height/text/padding/radius, unified border\n * focus, disabled) and layers only the combobox-specific extras — exactly like\n * `SelectTrigger`.\n */\nexport function comboboxTriggerClass({\n variant,\n size,\n error,\n className,\n}: {\n variant: ComboboxVariant;\n size: TextButtonSize;\n error?: boolean;\n className?: string;\n}): string {\n const visualVariant = normalizeComboboxVariant(variant);\n\n return cn(\n buttonVariants({ variant: visualVariant, size }),\n // Fill the field and push the value left / chevron right (Button's base\n // centers its content with `justify-center`).\n 'w-full min-w-32 justify-between',\n // Read as \"active\" while the popup is open, per variant (see map above).\n controlTriggerOpenState[visualVariant],\n 'data-[placeholder]:text-neutral3',\n error && 'border-error hover:border-error focus-visible:border-error',\n className,\n );\n}\n\nexport const comboboxItemClass = cva(\n cn(\n 'relative flex cursor-pointer items-center rounded-md select-none',\n 'min-h-8 py-1.5',\n 'text-ui-smd leading-ui-sm text-neutral4',\n 'outline-none focus:outline-none focus-visible:outline-none',\n transitions.colors,\n 'data-highlighted:bg-surface4 data-highlighted:text-neutral6',\n 'data-selected:text-neutral6',\n ),\n {\n variants: {\n multiple: {\n false: 'gap-2 pr-2 pl-2.5',\n true: 'gap-2 pr-2 pl-2.5',\n },\n },\n defaultVariants: {\n multiple: false,\n },\n },\n);\n\nexport const comboboxStyles = {\n /** Root wrapper */\n root: 'flex flex-col gap-1.5',\n\n /** Chevron icon in trigger — inherits the variant's text color via currentColor. */\n chevron: 'ml-2 h-4 w-4 shrink-0 opacity-60',\n\n /** Placeholder text color */\n placeholder: 'text-neutral3',\n\n /** Popup container — concentric with rounded-xl + p-1 (8px items inside 12px container). */\n popup: cn(\n 'w-max max-w-(--available-width) min-w-(--anchor-width) rounded-xl border border-border1 bg-surface3 text-neutral4',\n 'shadow-dialog',\n 'origin-(--transform-origin)',\n 'transition-[transform,scale,opacity] duration-150 ease-out',\n 'data-starting-style:scale-95 data-starting-style:opacity-0',\n 'data-ending-style:scale-95 data-ending-style:opacity-0',\n ),\n\n /** Positioner */\n positioner: 'z-50 pointer-events-auto',\n\n /** Search input container — borderless top section, hairline divider below. */\n searchContainer: cn('flex items-center border-b border-border1 px-2.5 py-1.5', transitions.colors),\n\n /** Search icon */\n searchIcon: cn('mr-2 size-3.5 shrink-0 text-neutral3', transitions.colors),\n\n /** Search input */\n searchInput: cn(\n 'flex h-7 w-full rounded-md bg-transparent py-1 text-ui-smd leading-ui-sm text-neutral6',\n 'placeholder:text-neutral3 disabled:cursor-not-allowed disabled:opacity-50',\n 'outline-none focus:outline-none focus-visible:outline-none',\n transitions.colors,\n ),\n\n /** Empty state */\n empty: 'not-empty:block hidden py-4 text-center text-ui-smd text-neutral3',\n\n /** Options list */\n list: 'max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1',\n\n /** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */\n item: comboboxItemClass({ multiple: false }),\n\n /** Multi-select item — same item rhythm with a right-aligned selected check. */\n itemMulti: comboboxItemClass({ multiple: true }),\n\n /** Right-aligned slot grouping end content + selection check. */\n itemRightSlot: 'ml-auto flex items-center gap-2 shrink-0',\n\n /** Check indicator container — inline, fixed 16x16, shown only when item is selected. */\n checkContainer: 'flex h-4 w-4 shrink-0 items-center justify-center text-neutral6',\n\n /** Check icon (single select) */\n checkIcon: 'h-3.5 w-3.5',\n\n /** Option label/description wrapper */\n optionText: 'flex flex-col gap-0.5 min-w-0',\n\n /** Option label */\n optionLabel: 'truncate',\n\n /** Option description */\n optionDescription: 'text-ui-sm text-neutral3 truncate',\n\n /** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */\n optionEnd: 'ml-auto flex items-center shrink-0',\n\n /** Error message */\n error: 'text-ui-sm text-accent2',\n} as const;\n","import { Combobox as BaseCombobox } from '@base-ui/react/combobox';\nimport { Check, ChevronsUpDown, Search } from 'lucide-react';\nimport * as React from 'react';\nimport { comboboxItemClass, comboboxStyles, comboboxTriggerClass } from './combobox-styles';\nimport type { ComboboxVariant } from './combobox-styles';\nimport type { TextButtonSize } from '@/ds/components/Button/Button';\nimport { FLOATING_POSITION_METHOD } from '@/ds/primitives/floating';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport { cn } from '@/lib/utils';\n\nexport type { ComboboxVariant } from './combobox-styles';\n\nexport type ComboboxOption = {\n label: string;\n value: string;\n description?: string;\n start?: React.ReactNode;\n end?: React.ReactNode;\n};\n\ntype ComboboxSharedProps = {\n options: ComboboxOption[];\n placeholder?: React.ReactNode;\n searchPlaceholder?: string;\n emptyText?: string;\n className?: string;\n disabled?: boolean;\n variant?: ComboboxVariant;\n size?: TextButtonSize;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n container?: HTMLElement | ShadowRoot | null | React.RefObject<HTMLElement | ShadowRoot | null>;\n error?: string;\n allowCustomValue?: boolean;\n /** Called with the search input text as it changes (and with `''` after a single-mode selection resets it). */\n onInputValueChange?: (value: string) => void;\n};\n\nexport type ComboboxSingleProps = ComboboxSharedProps & {\n multiple?: false;\n value?: string;\n onValueChange?: (value: string) => void;\n};\n\nexport type ComboboxMultipleProps = ComboboxSharedProps & {\n multiple: true;\n value?: readonly string[];\n onValueChange?: (value: string[]) => void;\n};\n\nexport type ComboboxProps = ComboboxSingleProps | ComboboxMultipleProps;\n\nconst EMPTY_VALUES: string[] = [];\nconst EMPTY_OPTIONS: ComboboxOption[] = [];\n\nfunction isMultipleCombobox(props: ComboboxProps): props is ComboboxMultipleProps {\n return props.multiple === true;\n}\n\nfunction ComboboxOptionText({ option }: { option: ComboboxOption }) {\n return (\n <span className={comboboxStyles.optionText}>\n <span className={comboboxStyles.optionLabel}>{option.label}</span>\n {option.description && <span className={comboboxStyles.optionDescription}>{option.description}</span>}\n </span>\n );\n}\n\nexport function Combobox(props: ComboboxProps) {\n const {\n options,\n placeholder = isMultipleCombobox(props) ? 'Select options...' : 'Select option...',\n searchPlaceholder = 'Search...',\n emptyText = 'No option found.',\n className,\n disabled = false,\n variant = 'default',\n size = 'md',\n open,\n onOpenChange,\n container,\n error,\n allowCustomValue = false,\n onInputValueChange,\n } = props;\n const multiple = isMultipleCombobox(props);\n const [inputValue, setInputValue] = React.useState('');\n const customValue = inputValue.trim();\n const customOption =\n !multiple && allowCustomValue && customValue && !options.some(option => option.value === customValue)\n ? { label: `Use “${customValue}”`, value: customValue }\n : undefined;\n const displayedOptions = customOption ? [customOption, ...options] : options;\n const selectedValues = multiple ? (props.value ?? EMPTY_VALUES) : EMPTY_VALUES;\n const selectedValueSet = React.useMemo(() => new Set(selectedValues), [selectedValues]);\n const selectedOption = multiple ? null : (options.find(option => option.value === props.value) ?? null);\n const selectedOptions = multiple ? options.filter(option => selectedValueSet.has(option.value)) : EMPTY_OPTIONS;\n const triggerText = selectedOptions.length === 0 ? placeholder : `${selectedOptions.length} selected`;\n // Default to the nearest SideDialog/Drawer popup so the list stays\n // interactive inside a modal drawer; an explicit `container` still wins.\n const resolvedContainer = usePortalContainer(container);\n\n const comboboxContent = (\n <>\n <BaseCombobox.Trigger className={comboboxTriggerClass({ variant, size, error: Boolean(error), className })}>\n {multiple ? (\n <span className={cn('truncate', selectedOptions.length === 0 && comboboxStyles.placeholder)}>\n {triggerText}\n </span>\n ) : (\n // Keep truncation off the outer wrapper so start adornments are not clipped.\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n {selectedOption?.start}\n <span className=\"truncate\">\n <BaseCombobox.Value placeholder={placeholder} />\n </span>\n </span>\n )}\n {/* Wrap the chevron in a `<span>` so the svg is one level deep and\n escapes Button's `[&>svg]` adornments — mirrors Select's chevron wrap. */}\n <span className=\"flex shrink-0 items-center\">\n <ChevronsUpDown className={comboboxStyles.chevron} />\n </span>\n </BaseCombobox.Trigger>\n\n <BaseCombobox.Portal container={resolvedContainer}>\n <BaseCombobox.Positioner\n align=\"start\"\n sideOffset={4}\n positionMethod={FLOATING_POSITION_METHOD}\n className={comboboxStyles.positioner}\n >\n <BaseCombobox.Popup className={comboboxStyles.popup}>\n <div className={comboboxStyles.searchContainer}>\n <Search className={comboboxStyles.searchIcon} />\n <BaseCombobox.Input className={comboboxStyles.searchInput} placeholder={searchPlaceholder} />\n </div>\n <BaseCombobox.Empty className={comboboxStyles.empty}>{emptyText}</BaseCombobox.Empty>\n <BaseCombobox.List className={comboboxStyles.list}>\n {(option: ComboboxOption) => {\n const isSelected = selectedValueSet.has(option.value);\n\n return (\n <BaseCombobox.Item key={option.value} value={option} className={comboboxItemClass({ multiple })}>\n {multiple ? (\n <>\n {option.start}\n <ComboboxOptionText option={option} />\n <span className={comboboxStyles.itemRightSlot}>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n <span className={comboboxStyles.checkContainer}>\n {isSelected ? <Check className={comboboxStyles.checkIcon} /> : null}\n </span>\n </span>\n </>\n ) : (\n <>\n {option.start}\n <ComboboxOptionText option={option} />\n <span className={comboboxStyles.itemRightSlot}>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n <span className={comboboxStyles.checkContainer}>\n <BaseCombobox.ItemIndicator>\n <Check className={comboboxStyles.checkIcon} />\n </BaseCombobox.ItemIndicator>\n </span>\n </span>\n </>\n )}\n </BaseCombobox.Item>\n );\n }}\n </BaseCombobox.List>\n </BaseCombobox.Popup>\n </BaseCombobox.Positioner>\n </BaseCombobox.Portal>\n </>\n );\n\n if (multiple) {\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n multiple\n autoHighlight\n items={displayedOptions}\n value={selectedOptions}\n onValueChange={items => props.onValueChange?.((items ?? []).map(item => item.value))}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n {comboboxContent}\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n }\n\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n autoHighlight\n items={displayedOptions}\n value={selectedOption}\n inputValue={inputValue}\n onInputValueChange={value => {\n setInputValue(value);\n onInputValueChange?.(value);\n }}\n onValueChange={item => {\n if (item) {\n props.onValueChange?.(item.value);\n setInputValue('');\n onInputValueChange?.('');\n }\n }}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n {comboboxContent}\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n}\n"],"names":["cn","buttonVariants","controlTriggerOpenState","cva","transitions","jsxs","jsx","React","usePortalContainer","Fragment","BaseCombobox","ChevronsUpDown","FLOATING_POSITION_METHOD","Search","Check"],"mappings":"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"}
|
|
@@ -134,7 +134,8 @@ function Combobox(props) {
|
|
|
134
134
|
onOpenChange,
|
|
135
135
|
container,
|
|
136
136
|
error,
|
|
137
|
-
allowCustomValue = false
|
|
137
|
+
allowCustomValue = false,
|
|
138
|
+
onInputValueChange
|
|
138
139
|
} = props;
|
|
139
140
|
const multiple = isMultipleCombobox(props);
|
|
140
141
|
const [inputValue, setInputValue] = React.useState("");
|
|
@@ -220,11 +221,15 @@ function Combobox(props) {
|
|
|
220
221
|
items: displayedOptions,
|
|
221
222
|
value: selectedOption,
|
|
222
223
|
inputValue,
|
|
223
|
-
onInputValueChange:
|
|
224
|
+
onInputValueChange: (value) => {
|
|
225
|
+
setInputValue(value);
|
|
226
|
+
onInputValueChange?.(value);
|
|
227
|
+
},
|
|
224
228
|
onValueChange: (item) => {
|
|
225
229
|
if (item) {
|
|
226
230
|
props.onValueChange?.(item.value);
|
|
227
231
|
setInputValue("");
|
|
232
|
+
onInputValueChange?.("");
|
|
228
233
|
}
|
|
229
234
|
},
|
|
230
235
|
disabled,
|
|
@@ -238,4 +243,4 @@ function Combobox(props) {
|
|
|
238
243
|
}
|
|
239
244
|
|
|
240
245
|
export { Combobox as C, comboboxStyles as c };
|
|
241
|
-
//# sourceMappingURL=combobox-
|
|
246
|
+
//# sourceMappingURL=combobox-nxjXzRWu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox-nxjXzRWu.js","sources":["../src/ds/components/Combobox/combobox-styles.ts","../src/ds/components/Combobox/combobox.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { buttonVariants } from '../Button/Button';\nimport type { TextButtonSize } from '../Button/Button';\nimport { controlTriggerOpenState } from '@/ds/primitives/control-size';\nimport type { ControlTriggerVisualVariant } from '@/ds/primitives/control-size';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\n/**\n * A combobox is a form field, so it reuses the same button looks as everywhere,\n * mirroring `SelectTrigger`: `default` (the Button's filled default surface —\n * the default here too), `outline` (bordered, transparent) and `ghost`\n * (borderless, for breadcrumbs/inline pickers). Only the high-emphasis `primary`\n * look is intentionally NOT offered (a field is not a call-to-action).\n */\nexport type ComboboxVisualVariant = ControlTriggerVisualVariant;\nexport type ComboboxLegacyVariant = 'link';\nexport type ComboboxVariant = ComboboxVisualVariant | ComboboxLegacyVariant;\n\nfunction normalizeComboboxVariant(variant: ComboboxVariant): ComboboxVisualVariant {\n return variant === 'link' ? 'ghost' : variant;\n}\n\n/**\n * Single source of truth for both the single- and multi-select combobox\n * triggers. A combobox = a button + a trailing chevron, so it reuses the Button\n * recipe (variant colors, size = height/text/padding/radius, unified border\n * focus, disabled) and layers only the combobox-specific extras — exactly like\n * `SelectTrigger`.\n */\nexport function comboboxTriggerClass({\n variant,\n size,\n error,\n className,\n}: {\n variant: ComboboxVariant;\n size: TextButtonSize;\n error?: boolean;\n className?: string;\n}): string {\n const visualVariant = normalizeComboboxVariant(variant);\n\n return cn(\n buttonVariants({ variant: visualVariant, size }),\n // Fill the field and push the value left / chevron right (Button's base\n // centers its content with `justify-center`).\n 'w-full min-w-32 justify-between',\n // Read as \"active\" while the popup is open, per variant (see map above).\n controlTriggerOpenState[visualVariant],\n 'data-[placeholder]:text-neutral3',\n error && 'border-error hover:border-error focus-visible:border-error',\n className,\n );\n}\n\nexport const comboboxItemClass = cva(\n cn(\n 'relative flex cursor-pointer items-center rounded-md select-none',\n 'min-h-8 py-1.5',\n 'text-ui-smd leading-ui-sm text-neutral4',\n 'outline-none focus:outline-none focus-visible:outline-none',\n transitions.colors,\n 'data-highlighted:bg-surface4 data-highlighted:text-neutral6',\n 'data-selected:text-neutral6',\n ),\n {\n variants: {\n multiple: {\n false: 'gap-2 pr-2 pl-2.5',\n true: 'gap-2 pr-2 pl-2.5',\n },\n },\n defaultVariants: {\n multiple: false,\n },\n },\n);\n\nexport const comboboxStyles = {\n /** Root wrapper */\n root: 'flex flex-col gap-1.5',\n\n /** Chevron icon in trigger — inherits the variant's text color via currentColor. */\n chevron: 'ml-2 h-4 w-4 shrink-0 opacity-60',\n\n /** Placeholder text color */\n placeholder: 'text-neutral3',\n\n /** Popup container — concentric with rounded-xl + p-1 (8px items inside 12px container). */\n popup: cn(\n 'w-max max-w-(--available-width) min-w-(--anchor-width) rounded-xl border border-border1 bg-surface3 text-neutral4',\n 'shadow-dialog',\n 'origin-(--transform-origin)',\n 'transition-[transform,scale,opacity] duration-150 ease-out',\n 'data-starting-style:scale-95 data-starting-style:opacity-0',\n 'data-ending-style:scale-95 data-ending-style:opacity-0',\n ),\n\n /** Positioner */\n positioner: 'z-50 pointer-events-auto',\n\n /** Search input container — borderless top section, hairline divider below. */\n searchContainer: cn('flex items-center border-b border-border1 px-2.5 py-1.5', transitions.colors),\n\n /** Search icon */\n searchIcon: cn('mr-2 size-3.5 shrink-0 text-neutral3', transitions.colors),\n\n /** Search input */\n searchInput: cn(\n 'flex h-7 w-full rounded-md bg-transparent py-1 text-ui-smd leading-ui-sm text-neutral6',\n 'placeholder:text-neutral3 disabled:cursor-not-allowed disabled:opacity-50',\n 'outline-none focus:outline-none focus-visible:outline-none',\n transitions.colors,\n ),\n\n /** Empty state */\n empty: 'not-empty:block hidden py-4 text-center text-ui-smd text-neutral3',\n\n /** Options list */\n list: 'max-h-dropdown-max-height overflow-y-auto overflow-x-hidden p-1',\n\n /** Option item base — rounded-md sits concentrically inside rounded-xl + p-1. */\n item: comboboxItemClass({ multiple: false }),\n\n /** Multi-select item — same item rhythm with a right-aligned selected check. */\n itemMulti: comboboxItemClass({ multiple: true }),\n\n /** Right-aligned slot grouping end content + selection check. */\n itemRightSlot: 'ml-auto flex items-center gap-2 shrink-0',\n\n /** Check indicator container — inline, fixed 16x16, shown only when item is selected. */\n checkContainer: 'flex h-4 w-4 shrink-0 items-center justify-center text-neutral6',\n\n /** Check icon (single select) */\n checkIcon: 'h-3.5 w-3.5',\n\n /** Option label/description wrapper */\n optionText: 'flex flex-col gap-0.5 min-w-0',\n\n /** Option label */\n optionLabel: 'truncate',\n\n /** Option description */\n optionDescription: 'text-ui-sm text-neutral3 truncate',\n\n /** Option end slot — `ml-auto` makes it push right inside flex containers (used by multi-select). */\n optionEnd: 'ml-auto flex items-center shrink-0',\n\n /** Error message */\n error: 'text-ui-sm text-accent2',\n} as const;\n","import { Combobox as BaseCombobox } from '@base-ui/react/combobox';\nimport { Check, ChevronsUpDown, Search } from 'lucide-react';\nimport * as React from 'react';\nimport { comboboxItemClass, comboboxStyles, comboboxTriggerClass } from './combobox-styles';\nimport type { ComboboxVariant } from './combobox-styles';\nimport type { TextButtonSize } from '@/ds/components/Button/Button';\nimport { FLOATING_POSITION_METHOD } from '@/ds/primitives/floating';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport { cn } from '@/lib/utils';\n\nexport type { ComboboxVariant } from './combobox-styles';\n\nexport type ComboboxOption = {\n label: string;\n value: string;\n description?: string;\n start?: React.ReactNode;\n end?: React.ReactNode;\n};\n\ntype ComboboxSharedProps = {\n options: ComboboxOption[];\n placeholder?: React.ReactNode;\n searchPlaceholder?: string;\n emptyText?: string;\n className?: string;\n disabled?: boolean;\n variant?: ComboboxVariant;\n size?: TextButtonSize;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n container?: HTMLElement | ShadowRoot | null | React.RefObject<HTMLElement | ShadowRoot | null>;\n error?: string;\n allowCustomValue?: boolean;\n /** Called with the search input text as it changes (and with `''` after a single-mode selection resets it). */\n onInputValueChange?: (value: string) => void;\n};\n\nexport type ComboboxSingleProps = ComboboxSharedProps & {\n multiple?: false;\n value?: string;\n onValueChange?: (value: string) => void;\n};\n\nexport type ComboboxMultipleProps = ComboboxSharedProps & {\n multiple: true;\n value?: readonly string[];\n onValueChange?: (value: string[]) => void;\n};\n\nexport type ComboboxProps = ComboboxSingleProps | ComboboxMultipleProps;\n\nconst EMPTY_VALUES: string[] = [];\nconst EMPTY_OPTIONS: ComboboxOption[] = [];\n\nfunction isMultipleCombobox(props: ComboboxProps): props is ComboboxMultipleProps {\n return props.multiple === true;\n}\n\nfunction ComboboxOptionText({ option }: { option: ComboboxOption }) {\n return (\n <span className={comboboxStyles.optionText}>\n <span className={comboboxStyles.optionLabel}>{option.label}</span>\n {option.description && <span className={comboboxStyles.optionDescription}>{option.description}</span>}\n </span>\n );\n}\n\nexport function Combobox(props: ComboboxProps) {\n const {\n options,\n placeholder = isMultipleCombobox(props) ? 'Select options...' : 'Select option...',\n searchPlaceholder = 'Search...',\n emptyText = 'No option found.',\n className,\n disabled = false,\n variant = 'default',\n size = 'md',\n open,\n onOpenChange,\n container,\n error,\n allowCustomValue = false,\n onInputValueChange,\n } = props;\n const multiple = isMultipleCombobox(props);\n const [inputValue, setInputValue] = React.useState('');\n const customValue = inputValue.trim();\n const customOption =\n !multiple && allowCustomValue && customValue && !options.some(option => option.value === customValue)\n ? { label: `Use “${customValue}”`, value: customValue }\n : undefined;\n const displayedOptions = customOption ? [customOption, ...options] : options;\n const selectedValues = multiple ? (props.value ?? EMPTY_VALUES) : EMPTY_VALUES;\n const selectedValueSet = React.useMemo(() => new Set(selectedValues), [selectedValues]);\n const selectedOption = multiple ? null : (options.find(option => option.value === props.value) ?? null);\n const selectedOptions = multiple ? options.filter(option => selectedValueSet.has(option.value)) : EMPTY_OPTIONS;\n const triggerText = selectedOptions.length === 0 ? placeholder : `${selectedOptions.length} selected`;\n // Default to the nearest SideDialog/Drawer popup so the list stays\n // interactive inside a modal drawer; an explicit `container` still wins.\n const resolvedContainer = usePortalContainer(container);\n\n const comboboxContent = (\n <>\n <BaseCombobox.Trigger className={comboboxTriggerClass({ variant, size, error: Boolean(error), className })}>\n {multiple ? (\n <span className={cn('truncate', selectedOptions.length === 0 && comboboxStyles.placeholder)}>\n {triggerText}\n </span>\n ) : (\n // Keep truncation off the outer wrapper so start adornments are not clipped.\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n {selectedOption?.start}\n <span className=\"truncate\">\n <BaseCombobox.Value placeholder={placeholder} />\n </span>\n </span>\n )}\n {/* Wrap the chevron in a `<span>` so the svg is one level deep and\n escapes Button's `[&>svg]` adornments — mirrors Select's chevron wrap. */}\n <span className=\"flex shrink-0 items-center\">\n <ChevronsUpDown className={comboboxStyles.chevron} />\n </span>\n </BaseCombobox.Trigger>\n\n <BaseCombobox.Portal container={resolvedContainer}>\n <BaseCombobox.Positioner\n align=\"start\"\n sideOffset={4}\n positionMethod={FLOATING_POSITION_METHOD}\n className={comboboxStyles.positioner}\n >\n <BaseCombobox.Popup className={comboboxStyles.popup}>\n <div className={comboboxStyles.searchContainer}>\n <Search className={comboboxStyles.searchIcon} />\n <BaseCombobox.Input className={comboboxStyles.searchInput} placeholder={searchPlaceholder} />\n </div>\n <BaseCombobox.Empty className={comboboxStyles.empty}>{emptyText}</BaseCombobox.Empty>\n <BaseCombobox.List className={comboboxStyles.list}>\n {(option: ComboboxOption) => {\n const isSelected = selectedValueSet.has(option.value);\n\n return (\n <BaseCombobox.Item key={option.value} value={option} className={comboboxItemClass({ multiple })}>\n {multiple ? (\n <>\n {option.start}\n <ComboboxOptionText option={option} />\n <span className={comboboxStyles.itemRightSlot}>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n <span className={comboboxStyles.checkContainer}>\n {isSelected ? <Check className={comboboxStyles.checkIcon} /> : null}\n </span>\n </span>\n </>\n ) : (\n <>\n {option.start}\n <ComboboxOptionText option={option} />\n <span className={comboboxStyles.itemRightSlot}>\n {option.end ? <div className={comboboxStyles.optionEnd}>{option.end}</div> : null}\n <span className={comboboxStyles.checkContainer}>\n <BaseCombobox.ItemIndicator>\n <Check className={comboboxStyles.checkIcon} />\n </BaseCombobox.ItemIndicator>\n </span>\n </span>\n </>\n )}\n </BaseCombobox.Item>\n );\n }}\n </BaseCombobox.List>\n </BaseCombobox.Popup>\n </BaseCombobox.Positioner>\n </BaseCombobox.Portal>\n </>\n );\n\n if (multiple) {\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n multiple\n autoHighlight\n items={displayedOptions}\n value={selectedOptions}\n onValueChange={items => props.onValueChange?.((items ?? []).map(item => item.value))}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n {comboboxContent}\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n }\n\n return (\n <div className={comboboxStyles.root}>\n <BaseCombobox.Root\n autoHighlight\n items={displayedOptions}\n value={selectedOption}\n inputValue={inputValue}\n onInputValueChange={value => {\n setInputValue(value);\n onInputValueChange?.(value);\n }}\n onValueChange={item => {\n if (item) {\n props.onValueChange?.(item.value);\n setInputValue('');\n onInputValueChange?.('');\n }\n }}\n disabled={disabled}\n open={open}\n onOpenChange={onOpenChange}\n >\n {comboboxContent}\n </BaseCombobox.Root>\n {error && <span className={comboboxStyles.error}>{error}</span>}\n </div>\n );\n}\n"],"names":["BaseCombobox"],"mappings":"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"}
|
|
@@ -2,25 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const
|
|
6
|
-
const React = require('react');
|
|
5
|
+
const arrival = require('../arrival-DRX5Mxhd.cjs');
|
|
7
6
|
const useWatched = require('../use-watched-BixmYWp0.cjs');
|
|
8
|
-
const utils_cn = require('../cn-DCPcv4xv.cjs');
|
|
9
7
|
|
|
10
|
-
function ArrivalScope({ children }) {
|
|
11
|
-
const settled = React.useRef(false);
|
|
12
|
-
React.useEffect(() => {
|
|
13
|
-
settled.current = true;
|
|
14
|
-
}, []);
|
|
15
|
-
return /* @__PURE__ */ jsxRuntime.jsx(useWatched.SettledContext, { value: settled, children });
|
|
16
|
-
}
|
|
17
|
-
function Arriving({ children, className }) {
|
|
18
|
-
const arriving = useWatched.useArriving();
|
|
19
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils_cn.cn(arriving, className), children: /* @__PURE__ */ jsxRuntime.jsx(ArrivalScope, { children }) });
|
|
20
|
-
}
|
|
21
8
|
|
|
9
|
+
|
|
10
|
+
exports.ArrivalScope = arrival.ArrivalScope;
|
|
11
|
+
exports.Arriving = arrival.Arriving;
|
|
22
12
|
exports.useArriving = useWatched.useArriving;
|
|
23
13
|
exports.useWatched = useWatched.useWatched;
|
|
24
|
-
exports.ArrivalScope = ArrivalScope;
|
|
25
|
-
exports.Arriving = Arriving;
|
|
26
14
|
//# sourceMappingURL=Arrival.cjs.js.map
|