@plumile/ui-devtools 0.1.134 → 0.1.142

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 (46) hide show
  1. package/README.md +25 -0
  2. package/lib/esm/content/DevtoolsCodeBlock.js +3 -3
  3. package/lib/esm/content/DevtoolsCodeBlock.js.map +1 -1
  4. package/lib/esm/content/DevtoolsJsonBlock.js +24 -0
  5. package/lib/esm/content/DevtoolsJsonBlock.js.map +1 -0
  6. package/lib/esm/controls/DevtoolsButton.js +19 -0
  7. package/lib/esm/controls/DevtoolsButton.js.map +1 -0
  8. package/lib/esm/controls/DevtoolsSelect.js +25 -0
  9. package/lib/esm/controls/DevtoolsSelect.js.map +1 -0
  10. package/lib/esm/controls/devtoolsControls.css.js +7 -0
  11. package/lib/esm/controls/devtoolsControls.css.js.map +1 -0
  12. package/lib/esm/feedback/DevtoolsDiffPills.js +57 -0
  13. package/lib/esm/feedback/DevtoolsDiffPills.js.map +1 -0
  14. package/lib/esm/feedback/devtoolsFeedback.css.js +2 -2
  15. package/lib/esm/feedback/devtoolsFeedback.css.js.map +1 -1
  16. package/lib/esm/index.js +18 -13
  17. package/lib/esm/layout/DevtoolsSplitView.js +54 -50
  18. package/lib/esm/layout/DevtoolsSplitView.js.map +1 -1
  19. package/lib/esm/style.css +1 -1
  20. package/lib/esm/surfaces/DevtoolsList.js +37 -0
  21. package/lib/esm/surfaces/DevtoolsList.js.map +1 -0
  22. package/lib/esm/surfaces/devtoolsSurfaces.css.js +2 -2
  23. package/lib/esm/surfaces/devtoolsSurfaces.css.js.map +1 -1
  24. package/lib/types/DevtoolsComponents.stories.d.ts.map +1 -1
  25. package/lib/types/content/DevtoolsCodeBlock.d.ts +1 -0
  26. package/lib/types/content/DevtoolsCodeBlock.d.ts.map +1 -1
  27. package/lib/types/content/DevtoolsJsonBlock.d.ts +12 -0
  28. package/lib/types/content/DevtoolsJsonBlock.d.ts.map +1 -0
  29. package/lib/types/controls/DevtoolsButton.d.ts +12 -0
  30. package/lib/types/controls/DevtoolsButton.d.ts.map +1 -0
  31. package/lib/types/controls/DevtoolsSelect.d.ts +13 -0
  32. package/lib/types/controls/DevtoolsSelect.d.ts.map +1 -0
  33. package/lib/types/controls/devtoolsControls.css.d.ts +6 -0
  34. package/lib/types/controls/devtoolsControls.css.d.ts.map +1 -0
  35. package/lib/types/feedback/DevtoolsDiffPills.d.ts +14 -0
  36. package/lib/types/feedback/DevtoolsDiffPills.d.ts.map +1 -0
  37. package/lib/types/feedback/devtoolsFeedback.css.d.ts +7 -0
  38. package/lib/types/feedback/devtoolsFeedback.css.d.ts.map +1 -1
  39. package/lib/types/index.d.ts +5 -0
  40. package/lib/types/index.d.ts.map +1 -1
  41. package/lib/types/layout/DevtoolsSplitView.d.ts.map +1 -1
  42. package/lib/types/surfaces/DevtoolsList.d.ts +15 -0
  43. package/lib/types/surfaces/DevtoolsList.d.ts.map +1 -0
  44. package/lib/types/surfaces/devtoolsSurfaces.css.d.ts +5 -0
  45. package/lib/types/surfaces/devtoolsSurfaces.css.d.ts.map +1 -1
  46. package/package.json +11 -1
package/README.md CHANGED
@@ -13,6 +13,8 @@ specialized DevTools interfaces, not as a general-purpose component library.
13
13
  Kronex developer tooling, including:
14
14
 
15
15
  - badges and pills
16
+ - diff pills for compact before/after summaries
17
+ - compact buttons, selects, and list items
16
18
  - status lights
17
19
  - cards and sections
18
20
  - tabs and toolbar components
@@ -37,10 +39,16 @@ npm install react react-dom
37
39
  - `DevtoolsTheme`
38
40
  - `DevtoolsBadge`
39
41
  - `DevtoolsPill`
42
+ - `DevtoolsDiffPills`
40
43
  - `DevtoolsStatusLight`
44
+ - `DevtoolsButton`
45
+ - `DevtoolsSelect`
41
46
  - `DevtoolsCard`
42
47
  - `DevtoolsSection`
48
+ - `DevtoolsList`
49
+ - `DevtoolsListItem`
43
50
  - `DevtoolsCodeBlock`
51
+ - `DevtoolsJsonBlock`
44
52
  - `DevtoolsEmptyState`
45
53
  - `DevtoolsTabs`
46
54
  - `DevtoolsToolbar`
@@ -48,6 +56,23 @@ npm install react react-dom
48
56
  - `DevtoolsToolbarSeparator`
49
57
  - `DevtoolsSplitView`
50
58
 
59
+ `DevtoolsTabs` intentionally stays separate from `@plumile/ui` `Tabs` so this
60
+ package can remain independent from the app UI package.
61
+ `DevtoolsToolbar*` follows the same package boundary: DevTools panels keep their
62
+ compact theme and do not depend on the app `@plumile/ui` toolbar primitives.
63
+ Use `DevtoolsButton` and `DevtoolsSelect` for compact non-toolbar controls that
64
+ still need the DevTools chrome, and `DevtoolsList` / `DevtoolsListItem` for
65
+ dense card-like lists in diagnostics, live activity, or prepared resources.
66
+ `DevtoolsDiffPills` renders added, changed, and removed key summaries with
67
+ optional per-category overflow limits and block or inline layout variants.
68
+ `DevtoolsSplitView` is likewise DevTools-specific; its pointer, keyboard, and
69
+ separator accessibility behavior is aligned with `@plumile/ui`
70
+ `ResizableSplitView`, but it keeps the compact `--pdt-*` styling and no runtime
71
+ dependency on `@plumile/ui`.
72
+ Use `DevtoolsJsonBlock` for visual JSON payloads; it renders nullish values as
73
+ an empty fallback, pretty-prints serializable values through `DevtoolsCodeBlock`,
74
+ and exposes a fallback for circular or otherwise unserializable input.
75
+
51
76
  For the complete entry point, see [`src/index.ts`](./src/index.ts).
52
77
 
53
78
  ## Quick Start
@@ -2,9 +2,9 @@ import { codeBlock as e } from "./devtoolsCodeBlock.css.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/content/DevtoolsCodeBlock.tsx
4
4
  function n(n) {
5
- let { children: r } = n;
6
- return /* @__PURE__ */ t("pre", {
7
- className: e,
5
+ let { children: r, className: i } = n, a = e;
6
+ return i != null && (a = [e, i].join(" ")), /* @__PURE__ */ t("pre", {
7
+ className: a,
8
8
  children: r
9
9
  });
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DevtoolsCodeBlock.js","names":[],"sources":["../../../src/content/DevtoolsCodeBlock.tsx"],"sourcesContent":["import type { JSX } from 'react';\nimport { codeBlock } from './devtoolsCodeBlock.css.js';\n\nexport type DevtoolsCodeBlockProps = {\n children: string;\n};\n\n/** Render preformatted code content in the devtools theme. */\nexport function DevtoolsCodeBlock(props: DevtoolsCodeBlockProps): JSX.Element {\n const { children } = props;\n\n return <pre className={codeBlock}>{children}</pre>;\n}\n"],"mappings":";;;AAQA,SAAgB,EAAkB,GAA4C;CAC5E,IAAM,EAAE,gBAAa;CAErB,OAAO,kBAAC,OAAD;EAAK,WAAW;EAAY;EAAe,CAAA"}
1
+ {"version":3,"file":"DevtoolsCodeBlock.js","names":[],"sources":["../../../src/content/DevtoolsCodeBlock.tsx"],"sourcesContent":["import type { JSX } from 'react';\nimport { codeBlock } from './devtoolsCodeBlock.css.js';\n\nexport type DevtoolsCodeBlockProps = {\n children: string;\n className?: string;\n};\n\n/** Render preformatted code content in the devtools theme. */\nexport function DevtoolsCodeBlock(props: DevtoolsCodeBlockProps): JSX.Element {\n const { children, className } = props;\n let resolvedClassName = codeBlock;\n if (className != null) {\n resolvedClassName = [codeBlock, className].join(' ');\n }\n\n return <pre className={resolvedClassName}>{children}</pre>;\n}\n"],"mappings":";;;AASA,SAAgB,EAAkB,GAA4C;CAC5E,IAAM,EAAE,aAAU,iBAAc,GAC5B,IAAoB;CAKxB,OAJI,KAAa,SACf,IAAoB,CAAC,GAAW,EAAU,CAAC,KAAK,IAAI,GAG/C,kBAAC,OAAD;EAAK,WAAW;EAAoB;EAAe,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { DevtoolsCodeBlock as e } from "./DevtoolsCodeBlock.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ //#region src/content/DevtoolsJsonBlock.tsx
4
+ var n = "N/A", r = "[unserializable]", i = (e, t = r) => {
5
+ try {
6
+ return JSON.stringify(e, null, 2);
7
+ } catch {
8
+ return t;
9
+ }
10
+ }, a = { stringifyJsonValue: i };
11
+ function o(a) {
12
+ let { value: o, emptyFallback: s = n, serializationFallback: c = r, className: l } = a;
13
+ return o == null ? /* @__PURE__ */ t("span", {
14
+ className: l,
15
+ children: s
16
+ }) : /* @__PURE__ */ t(e, {
17
+ className: l,
18
+ children: i(o, c)
19
+ });
20
+ }
21
+ //#endregion
22
+ export { o as DevtoolsJsonBlock, a as __testDevtoolsJsonBlock };
23
+
24
+ //# sourceMappingURL=DevtoolsJsonBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsJsonBlock.js","names":[],"sources":["../../../src/content/DevtoolsJsonBlock.tsx"],"sourcesContent":["import type { JSX } from 'react';\n\nimport { DevtoolsCodeBlock } from './DevtoolsCodeBlock.js';\n\nexport type DevtoolsJsonBlockProps = {\n value: unknown;\n emptyFallback?: string;\n serializationFallback?: string;\n className?: string;\n};\n\nconst DEFAULT_EMPTY_FALLBACK = 'N/A';\nconst DEFAULT_SERIALIZATION_FALLBACK = '[unserializable]';\n\nconst stringifyJsonValue = (\n value: unknown,\n serializationFallback = DEFAULT_SERIALIZATION_FALLBACK,\n): string => {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return serializationFallback;\n }\n};\n\nexport const __testDevtoolsJsonBlock = {\n stringifyJsonValue,\n} as const;\n\n/** Render formatted JSON content in the devtools theme. */\nexport function DevtoolsJsonBlock(props: DevtoolsJsonBlockProps): JSX.Element {\n const {\n value,\n emptyFallback = DEFAULT_EMPTY_FALLBACK,\n serializationFallback = DEFAULT_SERIALIZATION_FALLBACK,\n className,\n } = props;\n\n if (value === undefined || value === null) {\n return <span className={className}>{emptyFallback}</span>;\n }\n\n return (\n <DevtoolsCodeBlock className={className}>\n {stringifyJsonValue(value, serializationFallback)}\n </DevtoolsCodeBlock>\n );\n}\n"],"mappings":";;;AAWA,IAAM,IAAyB,OACzB,IAAiC,oBAEjC,KACJ,GACA,IAAwB,MACb;CACX,IAAI;EACF,OAAO,KAAK,UAAU,GAAO,MAAM,EAAE;SAC/B;EACN,OAAO;;GAIE,IAA0B,EACrC,uBACD;AAGD,SAAgB,EAAkB,GAA4C;CAC5E,IAAM,EACJ,UACA,mBAAgB,GAChB,2BAAwB,GACxB,iBACE;CAMJ,OAJI,KAAiC,OAC5B,kBAAC,QAAD;EAAiB;YAAY;EAAqB,CAAA,GAIzD,kBAAC,GAAD;EAA8B;YAC3B,EAAmB,GAAO,EAAsB;EAC/B,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { button as e, buttonDanger as t } from "./devtoolsControls.css.js";
2
+ import { jsx as n } from "react/jsx-runtime";
3
+ //#region src/controls/DevtoolsButton.tsx
4
+ function r(r) {
5
+ let { children: i, disabled: a, onClick: o, title: s, type: c = "button", tone: l = "neutral" } = r, u = e;
6
+ return l === "danger" && (u = `${e} ${t}`), /* @__PURE__ */ n("button", {
7
+ type: c,
8
+ className: u,
9
+ disabled: a,
10
+ title: s,
11
+ "aria-label": r["aria-label"],
12
+ onClick: o,
13
+ children: i
14
+ });
15
+ }
16
+ //#endregion
17
+ export { r as DevtoolsButton };
18
+
19
+ //# sourceMappingURL=DevtoolsButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsButton.js","names":[],"sources":["../../../src/controls/DevtoolsButton.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, JSX, ReactNode } from 'react';\nimport { button, buttonDanger } from './devtoolsControls.css.js';\n\nexport type DevtoolsButtonProps = {\n children: ReactNode;\n onClick: ButtonHTMLAttributes<HTMLButtonElement>['onClick'];\n disabled?: boolean;\n title?: string;\n 'aria-label'?: string;\n type?: 'button' | 'submit' | 'reset';\n tone?: 'neutral' | 'danger';\n};\n\n/** Render a compact DevTools button for non-toolbar actions. */\nexport function DevtoolsButton(props: DevtoolsButtonProps): JSX.Element {\n const {\n children,\n disabled,\n onClick,\n title,\n type = 'button',\n tone = 'neutral',\n } = props;\n let className = button;\n if (tone === 'danger') {\n className = `${button} ${buttonDanger}`;\n }\n\n return (\n <button\n type={type}\n className={className}\n disabled={disabled}\n title={title}\n aria-label={props['aria-label']}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n"],"mappings":";;;AAcA,SAAgB,EAAe,GAAyC;CACtE,IAAM,EACJ,aACA,aACA,YACA,UACA,UAAO,UACP,UAAO,cACL,GACA,IAAY;CAKhB,OAJI,MAAS,aACX,IAAY,GAAG,EAAO,GAAG,MAIzB,kBAAC,UAAD;EACQ;EACK;EACD;EACH;EACP,cAAY,EAAM;EACT;EAER;EACM,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { select as e, selectField as t, selectLabel as n } from "./devtoolsControls.css.js";
2
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
+ //#region src/controls/DevtoolsSelect.tsx
4
+ function a(a) {
5
+ let { label: o, onChange: s, options: c, value: l } = a;
6
+ return /* @__PURE__ */ i("label", {
7
+ className: t,
8
+ children: [/* @__PURE__ */ r("span", {
9
+ className: n,
10
+ children: o
11
+ }), /* @__PURE__ */ r("select", {
12
+ className: e,
13
+ value: l,
14
+ onChange: s,
15
+ children: c.map((e) => /* @__PURE__ */ r("option", {
16
+ value: e.value,
17
+ children: e.label
18
+ }, e.value))
19
+ })]
20
+ });
21
+ }
22
+ //#endregion
23
+ export { a as DevtoolsSelect };
24
+
25
+ //# sourceMappingURL=DevtoolsSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsSelect.js","names":[],"sources":["../../../src/controls/DevtoolsSelect.tsx"],"sourcesContent":["import type { ChangeEventHandler, JSX, ReactNode } from 'react';\nimport { select, selectField, selectLabel } from './devtoolsControls.css.js';\n\nexport type DevtoolsSelectOption = {\n value: string;\n label: ReactNode;\n};\n\nexport type DevtoolsSelectProps = {\n label: ReactNode;\n value: string;\n onChange: ChangeEventHandler<HTMLSelectElement>;\n options: readonly DevtoolsSelectOption[];\n};\n\n/** Render a compact labeled DevTools select control. */\nexport function DevtoolsSelect(props: DevtoolsSelectProps): JSX.Element {\n const { label, onChange, options, value } = props;\n\n return (\n <label className={selectField}>\n <span className={selectLabel}>{label}</span>\n <select className={select} value={value} onChange={onChange}>\n {options.map((option) => {\n return (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n );\n })}\n </select>\n </label>\n );\n}\n"],"mappings":";;;AAgBA,SAAgB,EAAe,GAAyC;CACtE,IAAM,EAAE,UAAO,aAAU,YAAS,aAAU;CAE5C,OACE,kBAAC,SAAD;EAAO,WAAW;YAAlB,CACE,kBAAC,QAAD;GAAM,WAAW;aAAc;GAAa,CAAA,EAC5C,kBAAC,UAAD;GAAQ,WAAW;GAAe;GAAiB;aAChD,EAAQ,KAAK,MAEV,kBAAC,UAAD;IAA2B,OAAO,EAAO;cACtC,EAAO;IACD,EAFI,EAAO,MAEX,CAEX;GACK,CAAA,CACH"}
@@ -0,0 +1,7 @@
1
+ /* empty css */
2
+ //#region src/controls/devtoolsControls.css.ts
3
+ var e = "_83ws9k0", t = "_83ws9k1", n = "_83ws9k2", r = "_83ws9k3", i = "_83ws9k4";
4
+ //#endregion
5
+ export { e as button, t as buttonDanger, i as select, n as selectField, r as selectLabel };
6
+
7
+ //# sourceMappingURL=devtoolsControls.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtoolsControls.css.js","names":[],"sources":["../../../src/controls/devtoolsControls.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nexport const button = style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n minHeight: '28px',\n padding: '4px 10px',\n border: '1px solid var(--pdt-border)',\n borderRadius: '4px',\n backgroundColor: 'transparent',\n color: 'var(--pdt-text)',\n fontSize: '12px',\n lineHeight: 1.2,\n cursor: 'pointer',\n transition: 'background-color 150ms ease, border-color 150ms ease',\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: 'color-mix(in srgb, var(--pdt-accent) 8%, transparent)',\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: 'var(--pdt-shadow-focus)',\n },\n '&:disabled': {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n },\n});\n\nexport const buttonDanger = style({\n color: 'var(--pdt-danger)',\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: 'color-mix(in srgb, var(--pdt-danger) 10%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-danger) 34%, transparent)',\n },\n },\n});\n\nexport const selectField = style({\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n fontSize: '12px',\n color: 'var(--pdt-text-muted)',\n});\n\nexport const selectLabel = style({\n fontSize: '12px',\n});\n\nexport const select = style({\n minHeight: '28px',\n padding: '4px 8px',\n border: '1px solid var(--pdt-border)',\n borderRadius: '4px',\n backgroundColor: 'var(--pdt-bg)',\n color: 'var(--pdt-text)',\n fontSize: '12px',\n selectors: {\n '&:focus-visible': {\n outline: 'none',\n boxShadow: 'var(--pdt-shadow-focus)',\n },\n },\n});\n"],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { diffInline as e, diffList as t, diffPill as n, diffPillAdded as r, diffPillChanged as i, diffPillFlash as a, diffPillRemoved as o } from "./devtoolsFeedback.css.js";
2
+ import { Fragment as s, jsx as c } from "react/jsx-runtime";
3
+ //#region src/feedback/DevtoolsDiffPills.tsx
4
+ var l = 4, u = {
5
+ added: "+",
6
+ changed: "~",
7
+ removed: "−"
8
+ }, d = {
9
+ added: r,
10
+ changed: i,
11
+ removed: o
12
+ };
13
+ function f(e, t) {
14
+ return `${e}${t}`;
15
+ }
16
+ function p(e, t) {
17
+ return `${e}…${t}`;
18
+ }
19
+ function m(e) {
20
+ return e == null ? null : /* @__PURE__ */ c(s, { children: e });
21
+ }
22
+ function h(e, t, r, i) {
23
+ if (e.length === 0 || r < 1) return [];
24
+ let o = u[t], s = [n, d[t]];
25
+ i && s.push(a);
26
+ let l = s.join(" "), m = e.slice(0, r), h = m.map((e, n) => /* @__PURE__ */ c("span", {
27
+ className: l,
28
+ children: f(o, e)
29
+ }, `${t}-${e}-${n}`));
30
+ if (e.length > m.length) {
31
+ let n = e.length - m.length;
32
+ h.push(/* @__PURE__ */ c("span", {
33
+ className: l,
34
+ children: p(o, n)
35
+ }, `${t}-more`));
36
+ }
37
+ return h;
38
+ }
39
+ function g(n) {
40
+ let { diff: r, emptyFallback: i = null, limit: a = l, variant: o = "block" } = n;
41
+ if (r == null) return m(i);
42
+ let s = o === "block", u = [
43
+ ...h(r.added, "added", a, s),
44
+ ...h(r.changed, "changed", a, s),
45
+ ...h(r.removed, "removed", a, s)
46
+ ];
47
+ if (u.length === 0) return m(i);
48
+ let d = "div", f = t;
49
+ return o === "inline" && (d = "span", f = e), /* @__PURE__ */ c(d, {
50
+ className: f,
51
+ children: u
52
+ });
53
+ }
54
+ //#endregion
55
+ export { g as DevtoolsDiffPills };
56
+
57
+ //# sourceMappingURL=DevtoolsDiffPills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsDiffPills.js","names":[],"sources":["../../../src/feedback/DevtoolsDiffPills.tsx"],"sourcesContent":["import type { JSX, ReactNode } from 'react';\nimport {\n diffInline,\n diffList,\n diffPill,\n diffPillAdded,\n diffPillChanged,\n diffPillFlash,\n diffPillRemoved,\n} from './devtoolsFeedback.css.js';\n\nconst DEFAULT_LIMIT = 4;\n\nexport type DevtoolsDiffPillsDiff = {\n added: readonly string[];\n changed: readonly string[];\n removed: readonly string[];\n};\n\nexport type DevtoolsDiffPillsProps = {\n diff?: DevtoolsDiffPillsDiff | null;\n limit?: number;\n variant?: 'block' | 'inline';\n emptyFallback?: ReactNode;\n};\n\ntype DiffKind = 'added' | 'changed' | 'removed';\n\nconst KIND_TO_PREFIX: Record<DiffKind, string> = {\n added: '+',\n changed: '~',\n removed: '−',\n};\n\nconst KIND_TO_CLASS: Record<DiffKind, string> = {\n added: diffPillAdded,\n changed: diffPillChanged,\n removed: diffPillRemoved,\n};\n\n/** Prefix a diff key with its display marker. */\nfunction makeLabel(prefix: string, value: string): string {\n return `${prefix}${value}`;\n}\n\n/** Create the overflow label for hidden diff keys. */\nfunction createMoreLabel(prefix: string, remaining: number): string {\n return `${prefix}…${remaining}`;\n}\n\n/** Render an optional fallback without adding DOM when it is absent. */\nfunction renderFallback(emptyFallback: ReactNode): JSX.Element | null {\n if (emptyFallback == null) {\n return null;\n }\n return <>{emptyFallback}</>;\n}\n\n/** Build the rendered pill elements for one diff category. */\nfunction makePills(\n items: readonly string[],\n kind: DiffKind,\n limit: number,\n flash: boolean,\n): JSX.Element[] {\n if (items.length === 0 || limit < 1) {\n return [];\n }\n\n const prefix = KIND_TO_PREFIX[kind];\n const pillClasses = [diffPill, KIND_TO_CLASS[kind]];\n if (flash) {\n pillClasses.push(diffPillFlash);\n }\n const className = pillClasses.join(' ');\n const slice = items.slice(0, limit);\n const pills = slice.map((item, index) => {\n return (\n <span key={`${kind}-${item}-${index}`} className={className}>\n {makeLabel(prefix, item)}\n </span>\n );\n });\n\n if (items.length > slice.length) {\n const remaining = items.length - slice.length;\n pills.push(\n <span key={`${kind}-more`} className={className}>\n {createMoreLabel(prefix, remaining)}\n </span>,\n );\n }\n\n return pills;\n}\n\n/** Render compact DevTools pills for added, changed, and removed keys. */\nexport function DevtoolsDiffPills(\n props: DevtoolsDiffPillsProps,\n): JSX.Element | null {\n const {\n diff,\n emptyFallback = null,\n limit = DEFAULT_LIMIT,\n variant = 'block',\n } = props;\n\n if (diff == null) {\n return renderFallback(emptyFallback);\n }\n\n const flash = variant === 'block';\n const pills = [\n ...makePills(diff.added, 'added', limit, flash),\n ...makePills(diff.changed, 'changed', limit, flash),\n ...makePills(diff.removed, 'removed', limit, flash),\n ];\n\n if (pills.length === 0) {\n return renderFallback(emptyFallback);\n }\n\n let Element: 'div' | 'span' = 'div';\n let className = diffList;\n if (variant === 'inline') {\n Element = 'span';\n className = diffInline;\n }\n return <Element className={className}>{pills}</Element>;\n}\n"],"mappings":";;;AAWA,IAAM,IAAgB,GAiBhB,IAA2C;CAC/C,OAAO;CACP,SAAS;CACT,SAAS;CACV,EAEK,IAA0C;CAC9C,OAAO;CACP,SAAS;CACT,SAAS;CACV;AAGD,SAAS,EAAU,GAAgB,GAAuB;CACxD,OAAO,GAAG,IAAS;;AAIrB,SAAS,EAAgB,GAAgB,GAA2B;CAClE,OAAO,GAAG,EAAO,GAAG;;AAItB,SAAS,EAAe,GAA8C;CAIpE,OAHI,KAAiB,OACZ,OAEF,kBAAA,GAAA,EAAA,UAAG,GAAiB,CAAA;;AAI7B,SAAS,EACP,GACA,GACA,GACA,GACe;CACf,IAAI,EAAM,WAAW,KAAK,IAAQ,GAChC,OAAO,EAAE;CAGX,IAAM,IAAS,EAAe,IACxB,IAAc,CAAC,GAAU,EAAc,GAAM;CACnD,AAAI,KACF,EAAY,KAAK,EAAc;CAEjC,IAAM,IAAY,EAAY,KAAK,IAAI,EACjC,IAAQ,EAAM,MAAM,GAAG,EAAM,EAC7B,IAAQ,EAAM,KAAK,GAAM,MAE3B,kBAAC,QAAD;EAAkD;YAC/C,EAAU,GAAQ,EAAK;EACnB,EAFI,GAAG,EAAK,GAAG,EAAK,GAAG,IAEvB,CAET;CAEF,IAAI,EAAM,SAAS,EAAM,QAAQ;EAC/B,IAAM,IAAY,EAAM,SAAS,EAAM;EACvC,EAAM,KACJ,kBAAC,QAAD;GAAsC;aACnC,EAAgB,GAAQ,EAAU;GAC9B,EAFI,GAAG,EAAK,OAEZ,CACR;;CAGH,OAAO;;AAIT,SAAgB,EACd,GACoB;CACpB,IAAM,EACJ,SACA,mBAAgB,MAChB,WAAQ,GACR,aAAU,YACR;CAEJ,IAAI,KAAQ,MACV,OAAO,EAAe,EAAc;CAGtC,IAAM,IAAQ,MAAY,SACpB,IAAQ;EACZ,GAAG,EAAU,EAAK,OAAO,SAAS,GAAO,EAAM;EAC/C,GAAG,EAAU,EAAK,SAAS,WAAW,GAAO,EAAM;EACnD,GAAG,EAAU,EAAK,SAAS,WAAW,GAAO,EAAM;EACpD;CAED,IAAI,EAAM,WAAW,GACnB,OAAO,EAAe,EAAc;CAGtC,IAAI,IAA0B,OAC1B,IAAY;CAKhB,OAJI,MAAY,aACd,IAAU,QACV,IAAY,IAEP,kBAAC,GAAD;EAAoB;YAAY;EAAgB,CAAA"}
@@ -1,7 +1,7 @@
1
1
  /* empty css */
2
2
  //#region src/feedback/devtoolsFeedback.css.ts
3
- var e = "kewyeu0", t = "kewyeu1", n = "kewyeu2", r = "kewyeu3", i = "kewyeu4", a = "kewyeu5", o = "kewyeu6", s = "kewyeu7", c = "kewyeu8", l = "kewyeu9", u = "kewyeua", d = "kewyeub", f = "kewyeuc", p = "kewyeud", m = "kewyeue", h = "kewyeuf", g = "kewyeug", _ = "kewyeuh", v = "kewyeui";
3
+ var e = "kewyeu0", t = "kewyeu1", n = "kewyeu2", r = "kewyeu3", i = "kewyeu4", a = "kewyeu5", o = "kewyeu6", s = "kewyeu7", c = "kewyeu8", l = "kewyeu9", u = "kewyeua", d = "kewyeub", f = "kewyeuc", p = "kewyeud", m = "kewyeue", h = "kewyeuf", g = "kewyeug", _ = "kewyeuh", v = "kewyeui", y = "kewyeuk", b = "kewyeul", x = "kewyeum", S = "kewyeun", C = "kewyeuo", w = "kewyeup", T = "kewyeuq";
4
4
  //#endregion
5
- export { e as badge, a as badgeDanger, n as badgeInfo, t as badgeNeutral, r as badgeSuccess, i as badgeWarning, o as pill, f as pillHistory, c as pillNavigation, s as pillNeutral, p as pillPopstate, d as pillPreload, m as pillPrepare, u as pillSnapshot, l as pillUpdate, g as statusDot, v as statusIdle, h as statusLight, _ as statusReady };
5
+ export { e as badge, a as badgeDanger, n as badgeInfo, t as badgeNeutral, r as badgeSuccess, i as badgeWarning, b as diffInline, y as diffList, x as diffPill, S as diffPillAdded, C as diffPillChanged, T as diffPillFlash, w as diffPillRemoved, o as pill, f as pillHistory, c as pillNavigation, s as pillNeutral, p as pillPopstate, d as pillPreload, m as pillPrepare, u as pillSnapshot, l as pillUpdate, g as statusDot, v as statusIdle, h as statusLight, _ as statusReady };
6
6
 
7
7
  //# sourceMappingURL=devtoolsFeedback.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtoolsFeedback.css.js","names":[],"sources":["../../../src/feedback/devtoolsFeedback.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nexport const badge = style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n minHeight: '20px',\n padding: '2px 8px',\n borderRadius: '999px',\n border: '1px solid transparent',\n fontSize: '11px',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n backgroundColor: 'var(--pdt-surface-muted)',\n color: 'var(--pdt-text-muted)',\n});\n\nexport const badgeNeutral = style({\n backgroundColor: 'var(--pdt-surface-muted)',\n borderColor: 'var(--pdt-border)',\n color: 'var(--pdt-text-muted)',\n});\n\nexport const badgeInfo = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-info) 12%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-info) 24%, transparent)',\n color: 'var(--pdt-info)',\n});\n\nexport const badgeSuccess = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-success) 12%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-success) 24%, transparent)',\n color: 'var(--pdt-success)',\n});\n\nexport const badgeWarning = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-warning) 12%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-warning) 24%, transparent)',\n color: 'var(--pdt-warning)',\n});\n\nexport const badgeDanger = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-danger) 12%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-danger) 24%, transparent)',\n color: 'var(--pdt-danger)',\n});\n\nexport const pill = style({\n display: 'inline-flex',\n alignItems: 'center',\n minHeight: '20px',\n padding: '2px 8px',\n borderRadius: '999px',\n border: '1px solid var(--pdt-border)',\n fontSize: '11px',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n backgroundColor: 'transparent',\n color: 'var(--pdt-text)',\n});\n\nexport const pillNeutral = style({\n backgroundColor: 'var(--pdt-surface-muted)',\n borderColor: 'var(--pdt-border)',\n});\n\nexport const pillNavigation = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-accent) 10%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-accent) 24%, transparent)',\n});\n\nexport const pillUpdate = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-info) 10%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-info) 24%, transparent)',\n});\n\nexport const pillSnapshot = style({\n backgroundColor: 'rgba(99, 102, 241, 0.12)',\n borderColor: 'rgba(99, 102, 241, 0.28)',\n});\n\nexport const pillPreload = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-success) 10%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-success) 24%, transparent)',\n});\n\nexport const pillHistory = style({\n backgroundColor: 'rgba(147, 51, 234, 0.12)',\n borderColor: 'rgba(147, 51, 234, 0.28)',\n});\n\nexport const pillPopstate = style({\n backgroundColor: 'rgba(59, 130, 246, 0.12)',\n borderColor: 'rgba(59, 130, 246, 0.28)',\n});\n\nexport const pillPrepare = style({\n backgroundColor: 'rgba(217, 119, 6, 0.12)',\n borderColor: 'rgba(217, 119, 6, 0.28)',\n});\n\nexport const statusLight = style({\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n minHeight: '20px',\n fontSize: '12px',\n color: 'var(--pdt-text-muted)',\n});\n\nexport const statusDot = style({\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: 'var(--pdt-border)',\n});\n\nexport const statusReady = style({\n backgroundColor: 'var(--pdt-success)',\n boxShadow:\n '0 0 0 2px color-mix(in srgb, var(--pdt-success) 30%, transparent)',\n});\n\nexport const statusIdle = style({\n backgroundColor: 'var(--pdt-border)',\n boxShadow: 'inset 0 0 0 1px var(--pdt-text-muted)',\n});\n"],"mappings":""}
1
+ {"version":3,"file":"devtoolsFeedback.css.js","names":[],"sources":["../../../src/feedback/devtoolsFeedback.css.ts"],"sourcesContent":["import { keyframes, style } from '@vanilla-extract/css';\n\nexport const badge = style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n minHeight: '20px',\n padding: '2px 8px',\n borderRadius: '999px',\n border: '1px solid transparent',\n fontSize: '11px',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n backgroundColor: 'var(--pdt-surface-muted)',\n color: 'var(--pdt-text-muted)',\n});\n\nexport const badgeNeutral = style({\n backgroundColor: 'var(--pdt-surface-muted)',\n borderColor: 'var(--pdt-border)',\n color: 'var(--pdt-text-muted)',\n});\n\nexport const badgeInfo = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-info) 12%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-info) 24%, transparent)',\n color: 'var(--pdt-info)',\n});\n\nexport const badgeSuccess = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-success) 12%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-success) 24%, transparent)',\n color: 'var(--pdt-success)',\n});\n\nexport const badgeWarning = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-warning) 12%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-warning) 24%, transparent)',\n color: 'var(--pdt-warning)',\n});\n\nexport const badgeDanger = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-danger) 12%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-danger) 24%, transparent)',\n color: 'var(--pdt-danger)',\n});\n\nexport const pill = style({\n display: 'inline-flex',\n alignItems: 'center',\n minHeight: '20px',\n padding: '2px 8px',\n borderRadius: '999px',\n border: '1px solid var(--pdt-border)',\n fontSize: '11px',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n backgroundColor: 'transparent',\n color: 'var(--pdt-text)',\n});\n\nexport const pillNeutral = style({\n backgroundColor: 'var(--pdt-surface-muted)',\n borderColor: 'var(--pdt-border)',\n});\n\nexport const pillNavigation = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-accent) 10%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-accent) 24%, transparent)',\n});\n\nexport const pillUpdate = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-info) 10%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-info) 24%, transparent)',\n});\n\nexport const pillSnapshot = style({\n backgroundColor: 'rgba(99, 102, 241, 0.12)',\n borderColor: 'rgba(99, 102, 241, 0.28)',\n});\n\nexport const pillPreload = style({\n backgroundColor: 'color-mix(in srgb, var(--pdt-success) 10%, transparent)',\n borderColor: 'color-mix(in srgb, var(--pdt-success) 24%, transparent)',\n});\n\nexport const pillHistory = style({\n backgroundColor: 'rgba(147, 51, 234, 0.12)',\n borderColor: 'rgba(147, 51, 234, 0.28)',\n});\n\nexport const pillPopstate = style({\n backgroundColor: 'rgba(59, 130, 246, 0.12)',\n borderColor: 'rgba(59, 130, 246, 0.28)',\n});\n\nexport const pillPrepare = style({\n backgroundColor: 'rgba(217, 119, 6, 0.12)',\n borderColor: 'rgba(217, 119, 6, 0.28)',\n});\n\nexport const statusLight = style({\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n minHeight: '20px',\n fontSize: '12px',\n color: 'var(--pdt-text-muted)',\n});\n\nexport const statusDot = style({\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: 'var(--pdt-border)',\n});\n\nexport const statusReady = style({\n backgroundColor: 'var(--pdt-success)',\n boxShadow:\n '0 0 0 2px color-mix(in srgb, var(--pdt-success) 30%, transparent)',\n});\n\nexport const statusIdle = style({\n backgroundColor: 'var(--pdt-border)',\n boxShadow: 'inset 0 0 0 1px var(--pdt-text-muted)',\n});\n\nconst diffFlash = keyframes({\n from: {\n boxShadow: '0 0 0 0 rgba(37, 99, 235, 0.4)',\n },\n to: {\n boxShadow: '0 0 0 12px rgba(37, 99, 235, 0)',\n },\n});\n\nexport const diffList = style({\n display: 'flex',\n flexWrap: 'wrap',\n gap: '6px',\n marginTop: '6px',\n fontSize: '11px',\n});\n\nexport const diffInline = style({\n display: 'flex',\n flexWrap: 'wrap',\n gap: '6px',\n marginTop: 0,\n fontSize: '11px',\n});\n\nexport const diffPill = style({\n padding: '2px 8px',\n border: '1px solid transparent',\n borderRadius: '999px',\n fontWeight: 600,\n});\n\nexport const diffPillAdded = style({\n backgroundColor: 'rgba(34, 134, 58, 0.12)',\n borderColor: 'rgba(34, 134, 58, 0.35)',\n color: '#166534',\n});\n\nexport const diffPillChanged = style({\n backgroundColor: 'rgba(115, 92, 15, 0.12)',\n borderColor: 'rgba(115, 92, 15, 0.35)',\n color: '#735c0f',\n});\n\nexport const diffPillRemoved = style({\n backgroundColor: 'rgba(203, 36, 49, 0.12)',\n borderColor: 'rgba(203, 36, 49, 0.35)',\n color: '#b3212c',\n});\n\nexport const diffPillFlash = style({\n animation: `${diffFlash} 0.8s ease-in-out`,\n});\n"],"mappings":""}
package/lib/esm/index.js CHANGED
@@ -1,14 +1,19 @@
1
1
  import { DevtoolsCodeBlock as e } from "./content/DevtoolsCodeBlock.js";
2
- import { DevtoolsEmptyState as t } from "./empty_state/DevtoolsEmptyState.js";
3
- import { DevtoolsBadge as n } from "./feedback/DevtoolsBadge.js";
4
- import { DevtoolsPill as r } from "./feedback/DevtoolsPill.js";
5
- import { DevtoolsStatusLight as i } from "./feedback/DevtoolsStatusLight.js";
6
- import { DevtoolsTheme as a } from "./theme/DevtoolsTheme.js";
7
- import { DevtoolsCard as o } from "./surfaces/DevtoolsCard.js";
8
- import { DevtoolsSection as s } from "./surfaces/DevtoolsSection.js";
9
- import { DevtoolsTabs as c } from "./navigation/DevtoolsTabs.js";
10
- import { DevtoolsToolbar as l, DevtoolsToolbarGrow as u } from "./toolbar/DevtoolsToolbar.js";
11
- import { DevtoolsToolbarButton as d } from "./toolbar/DevtoolsToolbarButton.js";
12
- import { DevtoolsToolbarSeparator as f } from "./toolbar/DevtoolsToolbarSeparator.js";
13
- import { DevtoolsSplitView as p } from "./layout/DevtoolsSplitView.js";
14
- export { n as DevtoolsBadge, o as DevtoolsCard, e as DevtoolsCodeBlock, t as DevtoolsEmptyState, r as DevtoolsPill, s as DevtoolsSection, p as DevtoolsSplitView, i as DevtoolsStatusLight, c as DevtoolsTabs, a as DevtoolsTheme, l as DevtoolsToolbar, d as DevtoolsToolbarButton, u as DevtoolsToolbarGrow, f as DevtoolsToolbarSeparator };
2
+ import { DevtoolsJsonBlock as t } from "./content/DevtoolsJsonBlock.js";
3
+ import { DevtoolsButton as n } from "./controls/DevtoolsButton.js";
4
+ import { DevtoolsSelect as r } from "./controls/DevtoolsSelect.js";
5
+ import { DevtoolsEmptyState as i } from "./empty_state/DevtoolsEmptyState.js";
6
+ import { DevtoolsBadge as a } from "./feedback/DevtoolsBadge.js";
7
+ import { DevtoolsDiffPills as o } from "./feedback/DevtoolsDiffPills.js";
8
+ import { DevtoolsPill as s } from "./feedback/DevtoolsPill.js";
9
+ import { DevtoolsStatusLight as c } from "./feedback/DevtoolsStatusLight.js";
10
+ import { DevtoolsTheme as l } from "./theme/DevtoolsTheme.js";
11
+ import { DevtoolsCard as u } from "./surfaces/DevtoolsCard.js";
12
+ import { DevtoolsSection as d } from "./surfaces/DevtoolsSection.js";
13
+ import { DevtoolsList as f, DevtoolsListItem as p } from "./surfaces/DevtoolsList.js";
14
+ import { DevtoolsTabs as m } from "./navigation/DevtoolsTabs.js";
15
+ import { DevtoolsToolbar as h, DevtoolsToolbarGrow as g } from "./toolbar/DevtoolsToolbar.js";
16
+ import { DevtoolsToolbarButton as _ } from "./toolbar/DevtoolsToolbarButton.js";
17
+ import { DevtoolsToolbarSeparator as v } from "./toolbar/DevtoolsToolbarSeparator.js";
18
+ import { DevtoolsSplitView as y } from "./layout/DevtoolsSplitView.js";
19
+ export { a as DevtoolsBadge, n as DevtoolsButton, u as DevtoolsCard, e as DevtoolsCodeBlock, o as DevtoolsDiffPills, i as DevtoolsEmptyState, t as DevtoolsJsonBlock, f as DevtoolsList, p as DevtoolsListItem, s as DevtoolsPill, d as DevtoolsSection, r as DevtoolsSelect, y as DevtoolsSplitView, c as DevtoolsStatusLight, m as DevtoolsTabs, l as DevtoolsTheme, h as DevtoolsToolbar, _ as DevtoolsToolbarButton, g as DevtoolsToolbarGrow, v as DevtoolsToolbarSeparator };
@@ -2,81 +2,85 @@ import { main as e, mainBordered as t, root as n } from "./devtoolsSplitView.css
2
2
  import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
3
3
  import { useCallback as o, useEffect as s, useRef as c } from "react";
4
4
  //#region src/layout/DevtoolsSplitView.tsx
5
- function l(e, t, n) {
5
+ var l = 16, u = 64, d = "Resize sidebar";
6
+ function f(e, t, n) {
6
7
  return e < t ? t : e > n ? n : e;
7
8
  }
8
- function u(u) {
9
- let { main: d, maxSidebarWidth: f, minSidebarWidth: p, onSidebarWidthChange: m, sidebar: h, sidebarLabel: g, sidebarWidth: _ } = u, v = c({
9
+ function p(p) {
10
+ let { main: m, maxSidebarWidth: h, minSidebarWidth: g, onSidebarWidthChange: _, sidebar: v, sidebarLabel: y, sidebarWidth: b } = p, x = c({
10
11
  active: !1,
12
+ pointerId: null,
11
13
  startX: 0,
12
- width: _
13
- }), y = o((e) => {
14
- let t = v.current;
15
- if (!t.active) return;
16
- let n = e.clientX - t.startX;
17
- m(l(t.width - n, p, f));
14
+ width: b
15
+ }), S = o((e) => {
16
+ let t = x.current;
17
+ if (!t.active || t.pointerId != null && e.pointerId !== t.pointerId) return;
18
+ e.preventDefault();
19
+ let n = t.startX - e.clientX;
20
+ _(f(t.width + n, g, h));
18
21
  }, [
19
- f,
20
- p,
21
- m
22
- ]), b = o(() => {
23
- v.current.active && (v.current.active = !1, window.removeEventListener("pointermove", y), window.removeEventListener("pointerup", b));
24
- }, [y]);
22
+ h,
23
+ g,
24
+ _
25
+ ]), C = o(() => {
26
+ x.current.active && (x.current.active = !1, x.current.pointerId = null, window.removeEventListener("pointermove", S), window.removeEventListener("pointerup", C), window.removeEventListener("pointercancel", C));
27
+ }, [S]);
25
28
  s(() => () => {
26
- window.removeEventListener("pointermove", y), window.removeEventListener("pointerup", b);
27
- }, [y, b]);
28
- let x = o((e) => {
29
- h != null && (e.preventDefault(), v.current = {
29
+ window.removeEventListener("pointermove", S), window.removeEventListener("pointerup", C), window.removeEventListener("pointercancel", C);
30
+ }, [S, C]);
31
+ let w = o((e) => {
32
+ v != null && (e.preventDefault(), "setPointerCapture" in e.currentTarget && e.currentTarget.setPointerCapture(e.pointerId), x.current = {
30
33
  active: !0,
34
+ pointerId: e.pointerId,
31
35
  startX: e.clientX,
32
- width: _
33
- }, window.addEventListener("pointermove", y), window.addEventListener("pointerup", b));
36
+ width: b
37
+ }, window.addEventListener("pointermove", S), window.addEventListener("pointerup", C), window.addEventListener("pointercancel", C));
34
38
  }, [
35
- y,
36
- b,
37
- h,
38
- _
39
- ]), S = o((e) => {
40
- if (h == null) return;
41
- let t = 20;
42
- if (e.shiftKey && (t = 40), e.key === "ArrowLeft") {
43
- e.preventDefault(), m(l(_ - t, p, f));
39
+ S,
40
+ C,
41
+ v,
42
+ b
43
+ ]), T = o((e) => {
44
+ if (v == null) return;
45
+ let t = l;
46
+ if (e.shiftKey && (t = u), e.key === "ArrowLeft") {
47
+ e.preventDefault(), _(f(b + t, g, h));
44
48
  return;
45
49
  }
46
- e.key === "ArrowRight" && (e.preventDefault(), m(l(_ + t, p, f)));
50
+ e.key === "ArrowRight" && (e.preventDefault(), _(f(b - t, g, h)));
47
51
  }, [
48
- f,
49
- p,
50
- m,
51
52
  h,
52
- _
53
- ]), C = e;
54
- return h != null && (C = `${e} ${t}`), /* @__PURE__ */ a("div", {
53
+ g,
54
+ _,
55
+ v,
56
+ b
57
+ ]), E = e;
58
+ return v != null && (E = `${e} ${t}`), /* @__PURE__ */ a("div", {
55
59
  className: n,
56
60
  children: [/* @__PURE__ */ i("div", {
57
- className: C,
58
- children: d
59
- }), h != null && /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i("div", {
61
+ className: E,
62
+ children: m
63
+ }), v != null && /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i("div", {
60
64
  className: "_1m64tse3",
61
65
  role: "separator",
62
66
  "aria-orientation": "vertical",
63
- "aria-label": g,
64
- "aria-valuemin": p,
65
- "aria-valuemax": f,
66
- "aria-valuenow": Math.round(_),
67
+ "aria-label": y ?? d,
68
+ "aria-valuemin": Math.round(g),
69
+ "aria-valuemax": Math.round(h),
70
+ "aria-valuenow": Math.round(b),
67
71
  tabIndex: 0,
68
- onPointerDown: x,
69
- onKeyDown: S,
72
+ onPointerDown: w,
73
+ onKeyDown: T,
70
74
  children: /* @__PURE__ */ i("span", { className: "_1m64tse4" })
71
75
  }), /* @__PURE__ */ i("section", {
72
76
  className: "_1m64tse5",
73
- "aria-label": g,
74
- style: { width: `${_}px` },
75
- children: h
77
+ "aria-label": y ?? void 0,
78
+ style: { width: `${b}px` },
79
+ children: v
76
80
  })] })]
77
81
  });
78
82
  }
79
83
  //#endregion
80
- export { u as DevtoolsSplitView };
84
+ export { p as DevtoolsSplitView };
81
85
 
82
86
  //# sourceMappingURL=DevtoolsSplitView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DevtoolsSplitView.js","names":[],"sources":["../../../src/layout/DevtoolsSplitView.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n type JSX,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport {\n main,\n mainBordered,\n resizer,\n resizerLine,\n root,\n sidebar,\n} from './devtoolsSplitView.css.js';\n\ntype DragState = {\n active: boolean;\n startX: number;\n width: number;\n};\n\nexport type DevtoolsSplitViewProps = {\n main: ReactNode;\n sidebar: ReactNode | null;\n sidebarWidth: number;\n minSidebarWidth: number;\n maxSidebarWidth: number;\n onSidebarWidthChange: (width: number) => void;\n sidebarLabel?: string;\n};\n\n/** Clamp a sidebar width within the configured resize bounds. */\nfunction clampWidth(value: number, minWidth: number, maxWidth: number): number {\n if (value < minWidth) {\n return minWidth;\n }\n if (value > maxWidth) {\n return maxWidth;\n }\n return value;\n}\n\n/** Render a split view with a resizable optional sidebar. */\nexport function DevtoolsSplitView(props: DevtoolsSplitViewProps): JSX.Element {\n const {\n main: mainContent,\n maxSidebarWidth,\n minSidebarWidth,\n onSidebarWidthChange,\n sidebar: sidebarContent,\n sidebarLabel,\n sidebarWidth,\n } = props;\n const dragRef = useRef<DragState>({\n active: false,\n startX: 0,\n width: sidebarWidth,\n });\n\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n const state = dragRef.current;\n if (!state.active) {\n return;\n }\n const delta = event.clientX - state.startX;\n onSidebarWidthChange(\n clampWidth(state.width - delta, minSidebarWidth, maxSidebarWidth),\n );\n },\n [maxSidebarWidth, minSidebarWidth, onSidebarWidthChange],\n );\n\n const handlePointerUp = useCallback(() => {\n if (!dragRef.current.active) {\n return;\n }\n dragRef.current.active = false;\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n }, [handlePointerMove]);\n\n useEffect(() => {\n return () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, [handlePointerMove, handlePointerUp]);\n\n const handlePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (sidebarContent == null) {\n return;\n }\n event.preventDefault();\n dragRef.current = {\n active: true,\n startX: event.clientX,\n width: sidebarWidth,\n };\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n },\n [handlePointerMove, handlePointerUp, sidebarContent, sidebarWidth],\n );\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (sidebarContent == null) {\n return;\n }\n let step = 20;\n if (event.shiftKey) {\n step = 40;\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n onSidebarWidthChange(\n clampWidth(sidebarWidth - step, minSidebarWidth, maxSidebarWidth),\n );\n return;\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n onSidebarWidthChange(\n clampWidth(sidebarWidth + step, minSidebarWidth, maxSidebarWidth),\n );\n }\n },\n [\n maxSidebarWidth,\n minSidebarWidth,\n onSidebarWidthChange,\n sidebarContent,\n sidebarWidth,\n ],\n );\n\n let mainClassName = main;\n if (sidebarContent != null) {\n mainClassName = `${main} ${mainBordered}`;\n }\n\n return (\n <div className={root}>\n <div className={mainClassName}>{mainContent}</div>\n {sidebarContent != null && (\n <>\n <div\n className={resizer}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={sidebarLabel}\n aria-valuemin={minSidebarWidth}\n aria-valuemax={maxSidebarWidth}\n aria-valuenow={Math.round(sidebarWidth)}\n tabIndex={0}\n onPointerDown={handlePointerDown}\n onKeyDown={handleKeyDown}\n >\n <span className={resizerLine} />\n </div>\n <section\n className={sidebar}\n aria-label={sidebarLabel}\n style={{ width: `${sidebarWidth}px` }}\n >\n {sidebarContent}\n </section>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;AAmCA,SAAS,EAAW,GAAe,GAAkB,GAA0B;CAO7E,OANI,IAAQ,IACH,IAEL,IAAQ,IACH,IAEF;;AAIT,SAAgB,EAAkB,GAA4C;CAC5E,IAAM,EACJ,MAAM,GACN,oBACA,oBACA,yBACA,SAAS,GACT,iBACA,oBACE,GACE,IAAU,EAAkB;EAChC,QAAQ;EACR,QAAQ;EACR,OAAO;EACR,CAAC,EAEI,IAAoB,GACvB,MAAwB;EACvB,IAAM,IAAQ,EAAQ;EACtB,IAAI,CAAC,EAAM,QACT;EAEF,IAAM,IAAQ,EAAM,UAAU,EAAM;EACpC,EACE,EAAW,EAAM,QAAQ,GAAO,GAAiB,EAAgB,CAClE;IAEH;EAAC;EAAiB;EAAiB;EAAqB,CACzD,EAEK,IAAkB,QAAkB;EACnC,EAAQ,QAAQ,WAGrB,EAAQ,QAAQ,SAAS,IACzB,OAAO,oBAAoB,eAAe,EAAkB,EAC5D,OAAO,oBAAoB,aAAa,EAAgB;IACvD,CAAC,EAAkB,CAAC;CAEvB,cACe;EAEX,AADA,OAAO,oBAAoB,eAAe,EAAkB,EAC5D,OAAO,oBAAoB,aAAa,EAAgB;IAEzD,CAAC,GAAmB,EAAgB,CAAC;CAExC,IAAM,IAAoB,GACvB,MAA6C;EACxC,KAAkB,SAGtB,EAAM,gBAAgB,EACtB,EAAQ,UAAU;GAChB,QAAQ;GACR,QAAQ,EAAM;GACd,OAAO;GACR,EACD,OAAO,iBAAiB,eAAe,EAAkB,EACzD,OAAO,iBAAiB,aAAa,EAAgB;IAEvD;EAAC;EAAmB;EAAiB;EAAgB;EAAa,CACnE,EAEK,IAAgB,GACnB,MAA8C;EAC7C,IAAI,KAAkB,MACpB;EAEF,IAAI,IAAO;EAIX,IAHI,EAAM,aACR,IAAO,KAEL,EAAM,QAAQ,aAAa;GAE7B,AADA,EAAM,gBAAgB,EACtB,EACE,EAAW,IAAe,GAAM,GAAiB,EAAgB,CAClE;GACD;;EAEF,AAAI,EAAM,QAAQ,iBAChB,EAAM,gBAAgB,EACtB,EACE,EAAW,IAAe,GAAM,GAAiB,EAAgB,CAClE;IAGL;EACE;EACA;EACA;EACA;EACA;EACD,CACF,EAEG,IAAgB;CAKpB,OAJI,KAAkB,SACpB,IAAgB,GAAG,EAAK,GAAG,MAI3B,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAgB;GAAkB,CAAA,EACjD,KAAkB,QACjB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GACE,WAAA;GACA,MAAK;GACL,oBAAiB;GACjB,cAAY;GACZ,iBAAe;GACf,iBAAe;GACf,iBAAe,KAAK,MAAM,EAAa;GACvC,UAAU;GACV,eAAe;GACf,WAAW;aAEX,kBAAC,QAAD,EAAM,WAAA,aAA0B,CAAA;GAC5B,CAAA,EACN,kBAAC,WAAD;GACE,WAAA;GACA,cAAY;GACZ,OAAO,EAAE,OAAO,GAAG,EAAa,KAAK;aAEpC;GACO,CAAA,CACT,EAAA,CAAA,CAED"}
1
+ {"version":3,"file":"DevtoolsSplitView.js","names":[],"sources":["../../../src/layout/DevtoolsSplitView.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n type JSX,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport {\n main,\n mainBordered,\n resizer,\n resizerLine,\n root,\n sidebar,\n} from './devtoolsSplitView.css.js';\n\ntype DragState = {\n active: boolean;\n pointerId: number | null;\n startX: number;\n width: number;\n};\n\nconst RESIZE_STEP = 16;\nconst RESIZE_SHIFT_STEP = 64;\nconst DEFAULT_SIDEBAR_LABEL = 'Resize sidebar';\n\nexport type DevtoolsSplitViewProps = {\n main: ReactNode;\n sidebar: ReactNode | null;\n sidebarWidth: number;\n minSidebarWidth: number;\n maxSidebarWidth: number;\n onSidebarWidthChange: (width: number) => void;\n sidebarLabel?: string;\n};\n\n/** Clamp a sidebar width within the configured resize bounds. */\nfunction clampWidth(value: number, minWidth: number, maxWidth: number): number {\n if (value < minWidth) {\n return minWidth;\n }\n if (value > maxWidth) {\n return maxWidth;\n }\n return value;\n}\n\n/** Render a split view with a resizable optional sidebar. */\nexport function DevtoolsSplitView(props: DevtoolsSplitViewProps): JSX.Element {\n const {\n main: mainContent,\n maxSidebarWidth,\n minSidebarWidth,\n onSidebarWidthChange,\n sidebar: sidebarContent,\n sidebarLabel,\n sidebarWidth,\n } = props;\n const dragRef = useRef<DragState>({\n active: false,\n pointerId: null,\n startX: 0,\n width: sidebarWidth,\n });\n\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n const state = dragRef.current;\n if (!state.active) {\n return;\n }\n if (state.pointerId != null && event.pointerId !== state.pointerId) {\n return;\n }\n event.preventDefault();\n const delta = state.startX - event.clientX;\n onSidebarWidthChange(\n clampWidth(state.width + delta, minSidebarWidth, maxSidebarWidth),\n );\n },\n [maxSidebarWidth, minSidebarWidth, onSidebarWidthChange],\n );\n\n const handlePointerUp = useCallback(() => {\n if (!dragRef.current.active) {\n return;\n }\n dragRef.current.active = false;\n dragRef.current.pointerId = null;\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerUp);\n }, [handlePointerMove]);\n\n useEffect(() => {\n return () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerUp);\n };\n }, [handlePointerMove, handlePointerUp]);\n\n const handlePointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (sidebarContent == null) {\n return;\n }\n event.preventDefault();\n if ('setPointerCapture' in event.currentTarget) {\n event.currentTarget.setPointerCapture(event.pointerId);\n }\n dragRef.current = {\n active: true,\n pointerId: event.pointerId,\n startX: event.clientX,\n width: sidebarWidth,\n };\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerUp);\n },\n [handlePointerMove, handlePointerUp, sidebarContent, sidebarWidth],\n );\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (sidebarContent == null) {\n return;\n }\n let step = RESIZE_STEP;\n if (event.shiftKey) {\n step = RESIZE_SHIFT_STEP;\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n onSidebarWidthChange(\n clampWidth(sidebarWidth + step, minSidebarWidth, maxSidebarWidth),\n );\n return;\n }\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n onSidebarWidthChange(\n clampWidth(sidebarWidth - step, minSidebarWidth, maxSidebarWidth),\n );\n }\n },\n [\n maxSidebarWidth,\n minSidebarWidth,\n onSidebarWidthChange,\n sidebarContent,\n sidebarWidth,\n ],\n );\n\n let mainClassName = main;\n if (sidebarContent != null) {\n mainClassName = `${main} ${mainBordered}`;\n }\n\n return (\n <div className={root}>\n <div className={mainClassName}>{mainContent}</div>\n {sidebarContent != null && (\n <>\n <div\n className={resizer}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={sidebarLabel ?? DEFAULT_SIDEBAR_LABEL}\n aria-valuemin={Math.round(minSidebarWidth)}\n aria-valuemax={Math.round(maxSidebarWidth)}\n aria-valuenow={Math.round(sidebarWidth)}\n tabIndex={0}\n onPointerDown={handlePointerDown}\n onKeyDown={handleKeyDown}\n >\n <span className={resizerLine} />\n </div>\n <section\n className={sidebar}\n aria-label={sidebarLabel ?? undefined}\n style={{ width: `${sidebarWidth}px` }}\n >\n {sidebarContent}\n </section>\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;AAyBA,IAAM,IAAc,IACd,IAAoB,IACpB,IAAwB;AAa9B,SAAS,EAAW,GAAe,GAAkB,GAA0B;CAO7E,OANI,IAAQ,IACH,IAEL,IAAQ,IACH,IAEF;;AAIT,SAAgB,EAAkB,GAA4C;CAC5E,IAAM,EACJ,MAAM,GACN,oBACA,oBACA,yBACA,SAAS,GACT,iBACA,oBACE,GACE,IAAU,EAAkB;EAChC,QAAQ;EACR,WAAW;EACX,QAAQ;EACR,OAAO;EACR,CAAC,EAEI,IAAoB,GACvB,MAAwB;EACvB,IAAM,IAAQ,EAAQ;EAItB,IAHI,CAAC,EAAM,UAGP,EAAM,aAAa,QAAQ,EAAM,cAAc,EAAM,WACvD;EAEF,EAAM,gBAAgB;EACtB,IAAM,IAAQ,EAAM,SAAS,EAAM;EACnC,EACE,EAAW,EAAM,QAAQ,GAAO,GAAiB,EAAgB,CAClE;IAEH;EAAC;EAAiB;EAAiB;EAAqB,CACzD,EAEK,IAAkB,QAAkB;EACnC,EAAQ,QAAQ,WAGrB,EAAQ,QAAQ,SAAS,IACzB,EAAQ,QAAQ,YAAY,MAC5B,OAAO,oBAAoB,eAAe,EAAkB,EAC5D,OAAO,oBAAoB,aAAa,EAAgB,EACxD,OAAO,oBAAoB,iBAAiB,EAAgB;IAC3D,CAAC,EAAkB,CAAC;CAEvB,cACe;EAGX,AAFA,OAAO,oBAAoB,eAAe,EAAkB,EAC5D,OAAO,oBAAoB,aAAa,EAAgB,EACxD,OAAO,oBAAoB,iBAAiB,EAAgB;IAE7D,CAAC,GAAmB,EAAgB,CAAC;CAExC,IAAM,IAAoB,GACvB,MAA6C;EACxC,KAAkB,SAGtB,EAAM,gBAAgB,EAClB,uBAAuB,EAAM,iBAC/B,EAAM,cAAc,kBAAkB,EAAM,UAAU,EAExD,EAAQ,UAAU;GAChB,QAAQ;GACR,WAAW,EAAM;GACjB,QAAQ,EAAM;GACd,OAAO;GACR,EACD,OAAO,iBAAiB,eAAe,EAAkB,EACzD,OAAO,iBAAiB,aAAa,EAAgB,EACrD,OAAO,iBAAiB,iBAAiB,EAAgB;IAE3D;EAAC;EAAmB;EAAiB;EAAgB;EAAa,CACnE,EAEK,IAAgB,GACnB,MAA8C;EAC7C,IAAI,KAAkB,MACpB;EAEF,IAAI,IAAO;EAIX,IAHI,EAAM,aACR,IAAO,IAEL,EAAM,QAAQ,aAAa;GAE7B,AADA,EAAM,gBAAgB,EACtB,EACE,EAAW,IAAe,GAAM,GAAiB,EAAgB,CAClE;GACD;;EAEF,AAAI,EAAM,QAAQ,iBAChB,EAAM,gBAAgB,EACtB,EACE,EAAW,IAAe,GAAM,GAAiB,EAAgB,CAClE;IAGL;EACE;EACA;EACA;EACA;EACA;EACD,CACF,EAEG,IAAgB;CAKpB,OAJI,KAAkB,SACpB,IAAgB,GAAG,EAAK,GAAG,MAI3B,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAgB;GAAkB,CAAA,EACjD,KAAkB,QACjB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GACE,WAAA;GACA,MAAK;GACL,oBAAiB;GACjB,cAAY,KAAgB;GAC5B,iBAAe,KAAK,MAAM,EAAgB;GAC1C,iBAAe,KAAK,MAAM,EAAgB;GAC1C,iBAAe,KAAK,MAAM,EAAa;GACvC,UAAU;GACV,eAAe;GACf,WAAW;aAEX,kBAAC,QAAD,EAAM,WAAA,aAA0B,CAAA;GAC5B,CAAA,EACN,kBAAC,WAAD;GACE,WAAA;GACA,cAAY,KAAgB,KAAA;GAC5B,OAAO,EAAE,OAAO,GAAG,EAAa,KAAK;aAEpC;GACO,CAAA,CACT,EAAA,CAAA,CAED"}
package/lib/esm/style.css CHANGED
@@ -1,2 +1,2 @@
1
- ._1sbiiq0{background-color:var(--pdt-code-bg);white-space:pre-wrap;word-break:break-word;border-radius:6px;margin:0;padding:12px;font-size:12px;line-height:1.4;overflow-x:auto}.fmw3vj0{flex-direction:column;align-items:flex-start;gap:12px;max-width:420px;padding:24px;display:flex}.fmw3vj1{margin:0;font-size:18px;font-weight:600}.fmw3vj2{color:var(--pdt-text-muted);margin:0;font-size:13px;line-height:1.5}.fmw3vj3{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.kewyeu0{white-space:nowrap;background-color:var(--pdt-surface-muted);min-height:20px;color:var(--pdt-text-muted);border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;gap:4px;padding:2px 8px;font-size:11px;line-height:1.2;display:inline-flex}.kewyeu1{background-color:var(--pdt-surface-muted);border-color:var(--pdt-border);color:var(--pdt-text-muted)}.kewyeu2{background-color:color-mix(in srgb, var(--pdt-info) 12%, transparent);border-color:color-mix(in srgb, var(--pdt-info) 24%, transparent);color:var(--pdt-info)}.kewyeu3{background-color:color-mix(in srgb, var(--pdt-success) 12%, transparent);border-color:color-mix(in srgb, var(--pdt-success) 24%, transparent);color:var(--pdt-success)}.kewyeu4{background-color:color-mix(in srgb, var(--pdt-warning) 12%, transparent);border-color:color-mix(in srgb, var(--pdt-warning) 24%, transparent);color:var(--pdt-warning)}.kewyeu5{background-color:color-mix(in srgb, var(--pdt-danger) 12%, transparent);border-color:color-mix(in srgb, var(--pdt-danger) 24%, transparent);color:var(--pdt-danger)}.kewyeu6{border:1px solid var(--pdt-border);white-space:nowrap;min-height:20px;color:var(--pdt-text);background-color:#0000;border-radius:999px;align-items:center;padding:2px 8px;font-size:11px;line-height:1.2;display:inline-flex}.kewyeu7{background-color:var(--pdt-surface-muted);border-color:var(--pdt-border)}.kewyeu8{background-color:color-mix(in srgb, var(--pdt-accent) 10%, transparent);border-color:color-mix(in srgb, var(--pdt-accent) 24%, transparent)}.kewyeu9{background-color:color-mix(in srgb, var(--pdt-info) 10%, transparent);border-color:color-mix(in srgb, var(--pdt-info) 24%, transparent)}.kewyeua{background-color:#6366f11f;border-color:#6366f147}.kewyeub{background-color:color-mix(in srgb, var(--pdt-success) 10%, transparent);border-color:color-mix(in srgb, var(--pdt-success) 24%, transparent)}.kewyeuc{background-color:#9333ea1f;border-color:#9333ea47}.kewyeud{background-color:#3b82f61f;border-color:#3b82f647}.kewyeue{background-color:#d977061f;border-color:#d9770647}.kewyeuf{min-height:20px;color:var(--pdt-text-muted);align-items:center;gap:6px;font-size:12px;display:inline-flex}.kewyeug{background-color:var(--pdt-border);border-radius:50%;width:10px;height:10px}.kewyeuh{background-color:var(--pdt-success);box-shadow:0 0 0 2px color-mix(in srgb, var(--pdt-success) 30%, transparent)}.kewyeui{background-color:var(--pdt-border);box-shadow:inset 0 0 0 1px var(--pdt-text-muted)}._1m64tse0{flex:1;align-items:stretch;min-height:0;display:flex}._1m64tse1{background-color:var(--pdt-surface);flex-direction:column;flex:auto;min-width:0;display:flex;overflow:hidden}._1m64tse2{border-right:1px solid var(--pdt-border)}._1m64tse3{cursor:col-resize;background-color:#0000;flex:0 0 8px;position:relative}._1m64tse3:focus-visible{outline:none}._1m64tse4{background-color:var(--pdt-border);border-radius:2px;width:2px;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)}._1m64tse3:hover ._1m64tse4,._1m64tse3:focus-visible ._1m64tse4{background-color:var(--pdt-accent)}._1m64tse5{background-color:var(--pdt-surface);flex-direction:column;flex:none;min-width:280px;max-width:90%;display:flex;overflow:hidden}.vzai5r0{border-bottom:1px solid var(--pdt-border);background-color:var(--pdt-surface);align-items:center;gap:8px;padding:12px 16px;display:flex}.vzai5r1{appearance:none;border:1px solid var(--pdt-border);background-color:var(--pdt-bg);color:var(--pdt-text);cursor:pointer;border-radius:999px;padding:6px 16px;font-size:12px;transition:background-color .15s,border-color .15s}.vzai5r1:hover:not(:disabled){background-color:var(--pdt-border)}.vzai5r1:focus-visible{box-shadow:var(--pdt-shadow-focus);outline:none}.vzai5r1:disabled{opacity:.6;cursor:default}.vzai5r2{background-color:var(--pdt-accent);border-color:var(--pdt-accent);color:#fff}.ca0gms0{border:1px solid var(--pdt-border);background-color:var(--pdt-surface);border-radius:8px;flex-direction:column;gap:12px;padding:16px;display:flex}.ca0gms1{justify-content:space-between;align-items:center;gap:12px;display:flex}.ca0gms2{margin:0;font-size:14px;font-weight:600}.ca0gms3{flex-direction:column;gap:8px;display:flex}.ca0gms4{justify-content:space-between;align-items:center;gap:12px;display:flex}.ca0gms5{text-transform:uppercase;letter-spacing:.04em;margin:0;font-size:13px;font-weight:600}._11l3mw40{--pdt-bg:#f3f4f6;--pdt-surface:#fff;--pdt-surface-muted:#f8fafc;--pdt-border:#d1d5db;--pdt-border-strong:#9ca3af;--pdt-text:#111827;--pdt-text-muted:#4b5563;--pdt-accent:#2563eb;--pdt-info:#0369a1;--pdt-success:#166534;--pdt-warning:#9a3412;--pdt-danger:#b91c1c;--pdt-code-bg:#0f172a0f;--pdt-shadow-focus:0 0 0 2px #2563eb59;background-color:var(--pdt-bg);color:var(--pdt-text);--lightningcss-light:initial;--lightningcss-dark: ;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;min-height:100vh;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif}@media (prefers-color-scheme:dark){._11l3mw40{--lightningcss-light: ;--lightningcss-dark:initial}}._11l3mw40,._11l3mw40 *{box-sizing:border-box}._11l3mw40 a{color:var(--pdt-accent)}._11l3mw40 button,._11l3mw40 input,._11l3mw40 select,._11l3mw40 textarea{font:inherit}._11l3mw40 pre,._11l3mw40 code{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}@media (prefers-color-scheme:dark){._11l3mw40{--pdt-bg:#1f1f1f;--pdt-surface:#242424;--pdt-surface-muted:#2d2d2d;--pdt-border:#3f3f46;--pdt-border-strong:#52525b;--pdt-text:#f5f5f5;--pdt-text-muted:#a1a1aa;--pdt-accent:#60a5fa;--pdt-info:#38bdf8;--pdt-success:#4ade80;--pdt-warning:#fb923c;--pdt-danger:#f87171;--pdt-code-bg:#94a3b81f;--pdt-shadow-focus:0 0 0 2px #60a5fa59}}._1q96x230{border-bottom:1px solid var(--pdt-border);background-color:var(--pdt-surface);align-items:center;gap:8px;padding:6px 16px;display:flex}._1q96x231{flex:1}._1q96x232{background-color:var(--pdt-border);width:1px;height:18px}._1q96x233{border:1px solid var(--pdt-border);background-color:var(--pdt-bg);min-height:28px;color:var(--pdt-text);cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:4px 12px;font-size:12px;transition:background-color .15s,border-color .15s;display:inline-flex}._1q96x233:hover:not(:disabled){background-color:var(--pdt-border)}._1q96x233:focus-visible{box-shadow:var(--pdt-shadow-focus);outline:none}._1q96x233:disabled{opacity:.5;cursor:not-allowed}._1q96x234{background-color:var(--pdt-warning);border-color:var(--pdt-warning);color:#fff}
1
+ ._1sbiiq0{background-color:var(--pdt-code-bg);white-space:pre-wrap;word-break:break-word;border-radius:6px;margin:0;padding:12px;font-size:12px;line-height:1.4;overflow-x:auto}._83ws9k0{border:1px solid var(--pdt-border);min-height:28px;color:var(--pdt-text);cursor:pointer;background-color:#0000;border-radius:4px;justify-content:center;align-items:center;gap:6px;padding:4px 10px;font-size:12px;line-height:1.2;transition:background-color .15s,border-color .15s;display:inline-flex}._83ws9k0:hover:not(:disabled){background-color:color-mix(in srgb, var(--pdt-accent) 8%, transparent)}._83ws9k0:focus-visible{box-shadow:var(--pdt-shadow-focus);outline:none}._83ws9k0:disabled{opacity:.5;cursor:not-allowed}._83ws9k1{color:var(--pdt-danger)}._83ws9k1:hover:not(:disabled){background-color:color-mix(in srgb, var(--pdt-danger) 10%, transparent);border-color:color-mix(in srgb, var(--pdt-danger) 34%, transparent)}._83ws9k2{color:var(--pdt-text-muted);align-items:center;gap:6px;font-size:12px;display:inline-flex}._83ws9k3{font-size:12px}._83ws9k4{border:1px solid var(--pdt-border);background-color:var(--pdt-bg);min-height:28px;color:var(--pdt-text);border-radius:4px;padding:4px 8px;font-size:12px}._83ws9k4:focus-visible{box-shadow:var(--pdt-shadow-focus);outline:none}.fmw3vj0{flex-direction:column;align-items:flex-start;gap:12px;max-width:420px;padding:24px;display:flex}.fmw3vj1{margin:0;font-size:18px;font-weight:600}.fmw3vj2{color:var(--pdt-text-muted);margin:0;font-size:13px;line-height:1.5}.fmw3vj3{flex-wrap:wrap;align-items:center;gap:12px;display:flex}@keyframes kewyeuj{0%{box-shadow:0 0 #2563eb66}to{box-shadow:0 0 0 12px #2563eb00}}.kewyeu0{white-space:nowrap;background-color:var(--pdt-surface-muted);min-height:20px;color:var(--pdt-text-muted);border:1px solid #0000;border-radius:999px;justify-content:center;align-items:center;gap:4px;padding:2px 8px;font-size:11px;line-height:1.2;display:inline-flex}.kewyeu1{background-color:var(--pdt-surface-muted);border-color:var(--pdt-border);color:var(--pdt-text-muted)}.kewyeu2{background-color:color-mix(in srgb, var(--pdt-info) 12%, transparent);border-color:color-mix(in srgb, var(--pdt-info) 24%, transparent);color:var(--pdt-info)}.kewyeu3{background-color:color-mix(in srgb, var(--pdt-success) 12%, transparent);border-color:color-mix(in srgb, var(--pdt-success) 24%, transparent);color:var(--pdt-success)}.kewyeu4{background-color:color-mix(in srgb, var(--pdt-warning) 12%, transparent);border-color:color-mix(in srgb, var(--pdt-warning) 24%, transparent);color:var(--pdt-warning)}.kewyeu5{background-color:color-mix(in srgb, var(--pdt-danger) 12%, transparent);border-color:color-mix(in srgb, var(--pdt-danger) 24%, transparent);color:var(--pdt-danger)}.kewyeu6{border:1px solid var(--pdt-border);white-space:nowrap;min-height:20px;color:var(--pdt-text);background-color:#0000;border-radius:999px;align-items:center;padding:2px 8px;font-size:11px;line-height:1.2;display:inline-flex}.kewyeu7{background-color:var(--pdt-surface-muted);border-color:var(--pdt-border)}.kewyeu8{background-color:color-mix(in srgb, var(--pdt-accent) 10%, transparent);border-color:color-mix(in srgb, var(--pdt-accent) 24%, transparent)}.kewyeu9{background-color:color-mix(in srgb, var(--pdt-info) 10%, transparent);border-color:color-mix(in srgb, var(--pdt-info) 24%, transparent)}.kewyeua{background-color:#6366f11f;border-color:#6366f147}.kewyeub{background-color:color-mix(in srgb, var(--pdt-success) 10%, transparent);border-color:color-mix(in srgb, var(--pdt-success) 24%, transparent)}.kewyeuc{background-color:#9333ea1f;border-color:#9333ea47}.kewyeud{background-color:#3b82f61f;border-color:#3b82f647}.kewyeue{background-color:#d977061f;border-color:#d9770647}.kewyeuf{min-height:20px;color:var(--pdt-text-muted);align-items:center;gap:6px;font-size:12px;display:inline-flex}.kewyeug{background-color:var(--pdt-border);border-radius:50%;width:10px;height:10px}.kewyeuh{background-color:var(--pdt-success);box-shadow:0 0 0 2px color-mix(in srgb, var(--pdt-success) 30%, transparent)}.kewyeui{background-color:var(--pdt-border);box-shadow:inset 0 0 0 1px var(--pdt-text-muted)}.kewyeuk{flex-wrap:wrap;gap:6px;margin-top:6px;font-size:11px;display:flex}.kewyeul{flex-wrap:wrap;gap:6px;margin-top:0;font-size:11px;display:flex}.kewyeum{border:1px solid #0000;border-radius:999px;padding:2px 8px;font-weight:600}.kewyeun{color:#166534;background-color:#22863a1f;border-color:#22863a59}.kewyeuo{color:#735c0f;background-color:#735c0f1f;border-color:#735c0f59}.kewyeup{color:#b3212c;background-color:#cb24311f;border-color:#cb243159}.kewyeuq{animation:.8s ease-in-out kewyeuj}._1m64tse0{flex:1;align-items:stretch;min-height:0;display:flex}._1m64tse1{background-color:var(--pdt-surface);flex-direction:column;flex:auto;min-width:0;display:flex;overflow:hidden}._1m64tse2{border-right:1px solid var(--pdt-border)}._1m64tse3{cursor:col-resize;background-color:#0000;flex:0 0 8px;position:relative}._1m64tse3:focus-visible{outline:none}._1m64tse4{background-color:var(--pdt-border);border-radius:2px;width:2px;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)}._1m64tse3:hover ._1m64tse4,._1m64tse3:focus-visible ._1m64tse4{background-color:var(--pdt-accent)}._1m64tse5{background-color:var(--pdt-surface);flex-direction:column;flex:none;min-width:280px;max-width:90%;display:flex;overflow:hidden}.vzai5r0{border-bottom:1px solid var(--pdt-border);background-color:var(--pdt-surface);align-items:center;gap:8px;padding:12px 16px;display:flex}.vzai5r1{appearance:none;border:1px solid var(--pdt-border);background-color:var(--pdt-bg);color:var(--pdt-text);cursor:pointer;border-radius:999px;padding:6px 16px;font-size:12px;transition:background-color .15s,border-color .15s}.vzai5r1:hover:not(:disabled){background-color:var(--pdt-border)}.vzai5r1:focus-visible{box-shadow:var(--pdt-shadow-focus);outline:none}.vzai5r1:disabled{opacity:.6;cursor:default}.vzai5r2{background-color:var(--pdt-accent);border-color:var(--pdt-accent);color:#fff}.ca0gms0{border:1px solid var(--pdt-border);background-color:var(--pdt-surface);border-radius:8px;flex-direction:column;gap:12px;padding:16px;display:flex}.ca0gms1{justify-content:space-between;align-items:center;gap:12px;display:flex}.ca0gms2{margin:0;font-size:14px;font-weight:600}.ca0gms3{flex-direction:column;gap:8px;display:flex}.ca0gms4{justify-content:space-between;align-items:center;gap:12px;display:flex}.ca0gms5{text-transform:uppercase;letter-spacing:.04em;margin:0;font-size:13px;font-weight:600}.ca0gms6{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.ca0gms7{border:1px solid var(--pdt-border);border-radius:8px;flex-direction:column;gap:8px;padding:12px;display:flex}.ca0gms8:focus{box-shadow:var(--pdt-shadow-focus);outline:none}.ca0gms9{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.ca0gmsa{color:var(--pdt-text-muted);flex-wrap:wrap;gap:12px;font-size:12px;display:flex}._11l3mw40{--pdt-bg:#f3f4f6;--pdt-surface:#fff;--pdt-surface-muted:#f8fafc;--pdt-border:#d1d5db;--pdt-border-strong:#9ca3af;--pdt-text:#111827;--pdt-text-muted:#4b5563;--pdt-accent:#2563eb;--pdt-info:#0369a1;--pdt-success:#166534;--pdt-warning:#9a3412;--pdt-danger:#b91c1c;--pdt-code-bg:#0f172a0f;--pdt-shadow-focus:0 0 0 2px #2563eb59;background-color:var(--pdt-bg);color:var(--pdt-text);--lightningcss-light:initial;--lightningcss-dark: ;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;min-height:100vh;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif}@media (prefers-color-scheme:dark){._11l3mw40{--lightningcss-light: ;--lightningcss-dark:initial}}._11l3mw40,._11l3mw40 *{box-sizing:border-box}._11l3mw40 a{color:var(--pdt-accent)}._11l3mw40 button,._11l3mw40 input,._11l3mw40 select,._11l3mw40 textarea{font:inherit}._11l3mw40 pre,._11l3mw40 code{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace}@media (prefers-color-scheme:dark){._11l3mw40{--pdt-bg:#1f1f1f;--pdt-surface:#242424;--pdt-surface-muted:#2d2d2d;--pdt-border:#3f3f46;--pdt-border-strong:#52525b;--pdt-text:#f5f5f5;--pdt-text-muted:#a1a1aa;--pdt-accent:#60a5fa;--pdt-info:#38bdf8;--pdt-success:#4ade80;--pdt-warning:#fb923c;--pdt-danger:#f87171;--pdt-code-bg:#94a3b81f;--pdt-shadow-focus:0 0 0 2px #60a5fa59}}._1q96x230{border-bottom:1px solid var(--pdt-border);background-color:var(--pdt-surface);align-items:center;gap:8px;padding:6px 16px;display:flex}._1q96x231{flex:1}._1q96x232{background-color:var(--pdt-border);width:1px;height:18px}._1q96x233{border:1px solid var(--pdt-border);background-color:var(--pdt-bg);min-height:28px;color:var(--pdt-text);cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:4px 12px;font-size:12px;transition:background-color .15s,border-color .15s;display:inline-flex}._1q96x233:hover:not(:disabled){background-color:var(--pdt-border)}._1q96x233:focus-visible{box-shadow:var(--pdt-shadow-focus);outline:none}._1q96x233:disabled{opacity:.5;cursor:not-allowed}._1q96x234{background-color:var(--pdt-warning);border-color:var(--pdt-warning);color:#fff}
2
2
  /*$vite$:1*/
@@ -0,0 +1,37 @@
1
+ import { list as e, listItem as t, listItemHeader as n, listItemInteractive as r, listItemMeta as i } from "./devtoolsSurfaces.css.js";
2
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
3
+ //#region src/surfaces/DevtoolsList.tsx
4
+ function s(t) {
5
+ return /* @__PURE__ */ a("ul", {
6
+ className: e,
7
+ children: t.children
8
+ });
9
+ }
10
+ function c(e) {
11
+ let { children: s, header: c, interactive: l = !1, meta: u, onBlur: d, onFocus: f, onMouseEnter: p, onMouseLeave: m, tabIndex: h } = e, g = t;
12
+ l && (g = `${t} ${r}`);
13
+ let _ = null;
14
+ return u != null && (_ = /* @__PURE__ */ a("div", {
15
+ className: i,
16
+ children: u
17
+ })), /* @__PURE__ */ o("li", {
18
+ className: g,
19
+ onMouseEnter: p,
20
+ onMouseLeave: m,
21
+ onFocus: f,
22
+ onBlur: d,
23
+ tabIndex: h,
24
+ children: [
25
+ /* @__PURE__ */ a("header", {
26
+ className: n,
27
+ children: c
28
+ }),
29
+ _,
30
+ s
31
+ ]
32
+ });
33
+ }
34
+ //#endregion
35
+ export { s as DevtoolsList, c as DevtoolsListItem };
36
+
37
+ //# sourceMappingURL=DevtoolsList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsList.js","names":[],"sources":["../../../src/surfaces/DevtoolsList.tsx"],"sourcesContent":["import type {\n FocusEventHandler,\n JSX,\n MouseEventHandler,\n PropsWithChildren,\n ReactNode,\n} from 'react';\nimport {\n list,\n listItem,\n listItemHeader,\n listItemInteractive,\n listItemMeta,\n} from './devtoolsSurfaces.css.js';\n\nexport type DevtoolsListProps = PropsWithChildren;\n\n/** Render a compact unstyled DevTools list. */\nexport function DevtoolsList(props: DevtoolsListProps): JSX.Element {\n return <ul className={list}>{props.children}</ul>;\n}\n\nexport type DevtoolsListItemProps = PropsWithChildren<{\n header: ReactNode;\n meta?: ReactNode;\n interactive?: boolean;\n onMouseEnter?: MouseEventHandler<HTMLLIElement>;\n onMouseLeave?: MouseEventHandler<HTMLLIElement>;\n onFocus?: FocusEventHandler<HTMLLIElement>;\n onBlur?: FocusEventHandler<HTMLLIElement>;\n tabIndex?: number;\n}>;\n\n/** Render a card-like DevTools list item with optional interaction handlers. */\nexport function DevtoolsListItem(props: DevtoolsListItemProps): JSX.Element {\n const {\n children,\n header,\n interactive = false,\n meta,\n onBlur,\n onFocus,\n onMouseEnter,\n onMouseLeave,\n tabIndex,\n } = props;\n let className = listItem;\n if (interactive) {\n className = `${listItem} ${listItemInteractive}`;\n }\n\n let metaContent: JSX.Element | null = null;\n if (meta != null) {\n metaContent = <div className={listItemMeta}>{meta}</div>;\n }\n\n return (\n <li\n className={className}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onFocus={onFocus}\n onBlur={onBlur}\n tabIndex={tabIndex}\n >\n <header className={listItemHeader}>{header}</header>\n {metaContent}\n {children}\n </li>\n );\n}\n"],"mappings":";;;AAkBA,SAAgB,EAAa,GAAuC;CAClE,OAAO,kBAAC,MAAD;EAAI,WAAW;YAAO,EAAM;EAAc,CAAA;;AAenD,SAAgB,EAAiB,GAA2C;CAC1E,IAAM,EACJ,aACA,WACA,iBAAc,IACd,SACA,WACA,YACA,iBACA,iBACA,gBACE,GACA,IAAY;CAChB,AAAI,MACF,IAAY,GAAG,EAAS,GAAG;CAG7B,IAAI,IAAkC;CAKtC,OAJI,KAAQ,SACV,IAAc,kBAAC,OAAD;EAAK,WAAW;YAAe;EAAW,CAAA,GAIxD,kBAAC,MAAD;EACa;EACG;EACA;EACL;EACD;EACE;YANZ;GAQE,kBAAC,UAAD;IAAQ,WAAW;cAAiB;IAAgB,CAAA;GACnD;GACA;GACE"}
@@ -1,7 +1,7 @@
1
1
  /* empty css */
2
2
  //#region src/surfaces/devtoolsSurfaces.css.ts
3
- var e = "ca0gms0", t = "ca0gms1", n = "ca0gms2", r = "ca0gms3", i = "ca0gms4", a = "ca0gms5";
3
+ var e = "ca0gms0", t = "ca0gms1", n = "ca0gms2", r = "ca0gms3", i = "ca0gms4", a = "ca0gms5", o = "ca0gms6", s = "ca0gms7", c = "ca0gms8", l = "ca0gms9", u = "ca0gmsa";
4
4
  //#endregion
5
- export { e as card, t as cardHeader, n as cardTitle, r as section, i as sectionHeader, a as sectionTitle };
5
+ export { e as card, t as cardHeader, n as cardTitle, o as list, s as listItem, l as listItemHeader, c as listItemInteractive, u as listItemMeta, r as section, i as sectionHeader, a as sectionTitle };
6
6
 
7
7
  //# sourceMappingURL=devtoolsSurfaces.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtoolsSurfaces.css.js","names":[],"sources":["../../../src/surfaces/devtoolsSurfaces.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nexport const card = style({\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n border: '1px solid var(--pdt-border)',\n borderRadius: '8px',\n backgroundColor: 'var(--pdt-surface)',\n});\n\nexport const cardHeader = style({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n});\n\nexport const cardTitle = style({\n margin: 0,\n fontSize: '14px',\n fontWeight: 600,\n});\n\nexport const section = style({\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n});\n\nexport const sectionHeader = style({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n});\n\nexport const sectionTitle = style({\n margin: 0,\n fontSize: '13px',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n});\n"],"mappings":""}
1
+ {"version":3,"file":"devtoolsSurfaces.css.js","names":[],"sources":["../../../src/surfaces/devtoolsSurfaces.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nexport const card = style({\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n border: '1px solid var(--pdt-border)',\n borderRadius: '8px',\n backgroundColor: 'var(--pdt-surface)',\n});\n\nexport const cardHeader = style({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n});\n\nexport const cardTitle = style({\n margin: 0,\n fontSize: '14px',\n fontWeight: 600,\n});\n\nexport const section = style({\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n});\n\nexport const sectionHeader = style({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '12px',\n});\n\nexport const sectionTitle = style({\n margin: 0,\n fontSize: '13px',\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n});\n\nexport const list = style({\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n});\n\nexport const listItem = style({\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n padding: '12px',\n border: '1px solid var(--pdt-border)',\n borderRadius: '8px',\n});\n\nexport const listItemInteractive = style({\n selectors: {\n '&:focus': {\n outline: 'none',\n boxShadow: 'var(--pdt-shadow-focus)',\n },\n },\n});\n\nexport const listItemHeader = style({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: '8px',\n});\n\nexport const listItemMeta = style({\n display: 'flex',\n flexWrap: 'wrap',\n gap: '12px',\n fontSize: '12px',\n color: 'var(--pdt-text-muted)',\n});\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"DevtoolsComponents.stories.d.ts","sourceRoot":"","sources":["../../src/DevtoolsComponents.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmBvD,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;CAuBM,CAAC;AAEjB,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAqDnC,eAAO,MAAM,aAAa,EAAE,KAuB3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAuBhC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAkBrC,CAAC"}
1
+ {"version":3,"file":"DevtoolsComponents.stories.d.ts","sourceRoot":"","sources":["../../src/DevtoolsComponents.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAuBvD,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;CAuBM,CAAC;AAEjB,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAqDnC,eAAO,MAAM,aAAa,EAAE,KA8B3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAsDhC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAkBrC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { JSX } from 'react';
2
2
  export type DevtoolsCodeBlockProps = {
3
3
  children: string;
4
+ className?: string;
4
5
  };
5
6
  export declare function DevtoolsCodeBlock(props: DevtoolsCodeBlockProps): JSX.Element;
6
7
  //# sourceMappingURL=DevtoolsCodeBlock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DevtoolsCodeBlock.d.ts","sourceRoot":"","sources":["../../../src/content/DevtoolsCodeBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjC,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAGF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAI5E"}
1
+ {"version":3,"file":"DevtoolsCodeBlock.d.ts","sourceRoot":"","sources":["../../../src/content/DevtoolsCodeBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjC,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAQ5E"}
@@ -0,0 +1,12 @@
1
+ import type { JSX } from 'react';
2
+ export type DevtoolsJsonBlockProps = {
3
+ value: unknown;
4
+ emptyFallback?: string;
5
+ serializationFallback?: string;
6
+ className?: string;
7
+ };
8
+ export declare const __testDevtoolsJsonBlock: {
9
+ readonly stringifyJsonValue: (value: unknown, serializationFallback?: string) => string;
10
+ };
11
+ export declare function DevtoolsJsonBlock(props: DevtoolsJsonBlockProps): JSX.Element;
12
+ //# sourceMappingURL=DevtoolsJsonBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsJsonBlock.d.ts","sourceRoot":"","sources":["../../../src/content/DevtoolsJsonBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAgBF,eAAO,MAAM,uBAAuB;yCAV3B,OAAO,qCAEb,MAAM;CAUC,CAAC;AAGX,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAiB5E"}
@@ -0,0 +1,12 @@
1
+ import type { ButtonHTMLAttributes, JSX, ReactNode } from 'react';
2
+ export type DevtoolsButtonProps = {
3
+ children: ReactNode;
4
+ onClick: ButtonHTMLAttributes<HTMLButtonElement>['onClick'];
5
+ disabled?: boolean;
6
+ title?: string;
7
+ 'aria-label'?: string;
8
+ type?: 'button' | 'submit' | 'reset';
9
+ tone?: 'neutral' | 'danger';
10
+ };
11
+ export declare function DevtoolsButton(props: DevtoolsButtonProps): JSX.Element;
12
+ //# sourceMappingURL=DevtoolsButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsButton.d.ts","sourceRoot":"","sources":["../../../src/controls/DevtoolsButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlE,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC7B,CAAC;AAGF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,GAAG,CAAC,OAAO,CA0BtE"}
@@ -0,0 +1,13 @@
1
+ import type { ChangeEventHandler, JSX, ReactNode } from 'react';
2
+ export type DevtoolsSelectOption = {
3
+ value: string;
4
+ label: ReactNode;
5
+ };
6
+ export type DevtoolsSelectProps = {
7
+ label: ReactNode;
8
+ value: string;
9
+ onChange: ChangeEventHandler<HTMLSelectElement>;
10
+ options: readonly DevtoolsSelectOption[];
11
+ };
12
+ export declare function DevtoolsSelect(props: DevtoolsSelectProps): JSX.Element;
13
+ //# sourceMappingURL=DevtoolsSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsSelect.d.ts","sourceRoot":"","sources":["../../../src/controls/DevtoolsSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGhE,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAChD,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAC1C,CAAC;AAGF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAiBtE"}
@@ -0,0 +1,6 @@
1
+ export declare const button: string;
2
+ export declare const buttonDanger: string;
3
+ export declare const selectField: string;
4
+ export declare const selectLabel: string;
5
+ export declare const select: string;
6
+ //# sourceMappingURL=devtoolsControls.css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devtoolsControls.css.d.ts","sourceRoot":"","sources":["../../../src/controls/devtoolsControls.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,QA4BjB,CAAC;AAEH,eAAO,MAAM,YAAY,QAQvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAMtB,CAAC;AAEH,eAAO,MAAM,WAAW,QAEtB,CAAC;AAEH,eAAO,MAAM,MAAM,QAcjB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { JSX, ReactNode } from 'react';
2
+ export type DevtoolsDiffPillsDiff = {
3
+ added: readonly string[];
4
+ changed: readonly string[];
5
+ removed: readonly string[];
6
+ };
7
+ export type DevtoolsDiffPillsProps = {
8
+ diff?: DevtoolsDiffPillsDiff | null;
9
+ limit?: number;
10
+ variant?: 'block' | 'inline';
11
+ emptyFallback?: ReactNode;
12
+ };
13
+ export declare function DevtoolsDiffPills(props: DevtoolsDiffPillsProps): JSX.Element | null;
14
+ //# sourceMappingURL=DevtoolsDiffPills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsDiffPills.d.ts","sourceRoot":"","sources":["../../../src/feedback/DevtoolsDiffPills.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAa5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAyEF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,sBAAsB,GAC5B,GAAG,CAAC,OAAO,GAAG,IAAI,CA8BpB"}
@@ -17,4 +17,11 @@ export declare const statusLight: string;
17
17
  export declare const statusDot: string;
18
18
  export declare const statusReady: string;
19
19
  export declare const statusIdle: string;
20
+ export declare const diffList: string;
21
+ export declare const diffInline: string;
22
+ export declare const diffPill: string;
23
+ export declare const diffPillAdded: string;
24
+ export declare const diffPillChanged: string;
25
+ export declare const diffPillRemoved: string;
26
+ export declare const diffPillFlash: string;
20
27
  //# sourceMappingURL=devtoolsFeedback.css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtoolsFeedback.css.d.ts","sourceRoot":"","sources":["../../../src/feedback/devtoolsFeedback.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,QAchB,CAAC;AAEH,eAAO,MAAM,YAAY,QAIvB,CAAC;AAEH,eAAO,MAAM,SAAS,QAIpB,CAAC;AAEH,eAAO,MAAM,YAAY,QAIvB,CAAC;AAEH,eAAO,MAAM,YAAY,QAIvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAItB,CAAC;AAEH,eAAO,MAAM,IAAI,QAYf,CAAC;AAEH,eAAO,MAAM,WAAW,QAGtB,CAAC;AAEH,eAAO,MAAM,cAAc,QAGzB,CAAC;AAEH,eAAO,MAAM,UAAU,QAGrB,CAAC;AAEH,eAAO,MAAM,YAAY,QAGvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAGtB,CAAC;AAEH,eAAO,MAAM,WAAW,QAGtB,CAAC;AAEH,eAAO,MAAM,YAAY,QAGvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAGtB,CAAC;AAEH,eAAO,MAAM,WAAW,QAOtB,CAAC;AAEH,eAAO,MAAM,SAAS,QAKpB,CAAC;AAEH,eAAO,MAAM,WAAW,QAItB,CAAC;AAEH,eAAO,MAAM,UAAU,QAGrB,CAAC"}
1
+ {"version":3,"file":"devtoolsFeedback.css.d.ts","sourceRoot":"","sources":["../../../src/feedback/devtoolsFeedback.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,QAchB,CAAC;AAEH,eAAO,MAAM,YAAY,QAIvB,CAAC;AAEH,eAAO,MAAM,SAAS,QAIpB,CAAC;AAEH,eAAO,MAAM,YAAY,QAIvB,CAAC;AAEH,eAAO,MAAM,YAAY,QAIvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAItB,CAAC;AAEH,eAAO,MAAM,IAAI,QAYf,CAAC;AAEH,eAAO,MAAM,WAAW,QAGtB,CAAC;AAEH,eAAO,MAAM,cAAc,QAGzB,CAAC;AAEH,eAAO,MAAM,UAAU,QAGrB,CAAC;AAEH,eAAO,MAAM,YAAY,QAGvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAGtB,CAAC;AAEH,eAAO,MAAM,WAAW,QAGtB,CAAC;AAEH,eAAO,MAAM,YAAY,QAGvB,CAAC;AAEH,eAAO,MAAM,WAAW,QAGtB,CAAC;AAEH,eAAO,MAAM,WAAW,QAOtB,CAAC;AAEH,eAAO,MAAM,SAAS,QAKpB,CAAC;AAEH,eAAO,MAAM,WAAW,QAItB,CAAC;AAEH,eAAO,MAAM,UAAU,QAGrB,CAAC;AAWH,eAAO,MAAM,QAAQ,QAMnB,CAAC;AAEH,eAAO,MAAM,UAAU,QAMrB,CAAC;AAEH,eAAO,MAAM,QAAQ,QAKnB,CAAC;AAEH,eAAO,MAAM,aAAa,QAIxB,CAAC;AAEH,eAAO,MAAM,eAAe,QAI1B,CAAC;AAEH,eAAO,MAAM,eAAe,QAI1B,CAAC;AAEH,eAAO,MAAM,aAAa,QAExB,CAAC"}
@@ -2,9 +2,14 @@ export { DevtoolsTheme, type DevtoolsThemeProps, } from './theme/DevtoolsTheme.j
2
2
  export { DevtoolsBadge, type DevtoolsBadgeProps, } from './feedback/DevtoolsBadge.js';
3
3
  export { DevtoolsPill, type DevtoolsPillProps, } from './feedback/DevtoolsPill.js';
4
4
  export { DevtoolsStatusLight, type DevtoolsStatusLightProps, } from './feedback/DevtoolsStatusLight.js';
5
+ export { DevtoolsDiffPills, type DevtoolsDiffPillsDiff, type DevtoolsDiffPillsProps, } from './feedback/DevtoolsDiffPills.js';
6
+ export { DevtoolsButton, type DevtoolsButtonProps, } from './controls/DevtoolsButton.js';
7
+ export { DevtoolsSelect, type DevtoolsSelectOption, type DevtoolsSelectProps, } from './controls/DevtoolsSelect.js';
5
8
  export { DevtoolsCard, type DevtoolsCardProps, } from './surfaces/DevtoolsCard.js';
6
9
  export { DevtoolsSection, type DevtoolsSectionProps, } from './surfaces/DevtoolsSection.js';
10
+ export { DevtoolsList, DevtoolsListItem, type DevtoolsListItemProps, type DevtoolsListProps, } from './surfaces/DevtoolsList.js';
7
11
  export { DevtoolsCodeBlock, type DevtoolsCodeBlockProps, } from './content/DevtoolsCodeBlock.js';
12
+ export { DevtoolsJsonBlock, type DevtoolsJsonBlockProps, } from './content/DevtoolsJsonBlock.js';
8
13
  export { DevtoolsEmptyState, type DevtoolsEmptyStateProps, } from './empty_state/DevtoolsEmptyState.js';
9
14
  export { DevtoolsTabs, type DevtoolsTabItem, type DevtoolsTabsProps, } from './navigation/DevtoolsTabs.js';
10
15
  export { DevtoolsToolbar, DevtoolsToolbarGrow, type DevtoolsToolbarProps, } from './toolbar/DevtoolsToolbar.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,KAAK,oBAAoB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,KAAK,oBAAoB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,+BAA+B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"DevtoolsSplitView.d.ts","sourceRoot":"","sources":["../../../src/layout/DevtoolsSplitView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,GAAG,EAGR,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAgBf,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAcF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CAkI5E"}
1
+ {"version":3,"file":"DevtoolsSplitView.d.ts","sourceRoot":"","sources":["../../../src/layout/DevtoolsSplitView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,GAAG,EAGR,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAqBf,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAcF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CA+I5E"}
@@ -0,0 +1,15 @@
1
+ import type { FocusEventHandler, JSX, MouseEventHandler, PropsWithChildren, ReactNode } from 'react';
2
+ export type DevtoolsListProps = PropsWithChildren;
3
+ export declare function DevtoolsList(props: DevtoolsListProps): JSX.Element;
4
+ export type DevtoolsListItemProps = PropsWithChildren<{
5
+ header: ReactNode;
6
+ meta?: ReactNode;
7
+ interactive?: boolean;
8
+ onMouseEnter?: MouseEventHandler<HTMLLIElement>;
9
+ onMouseLeave?: MouseEventHandler<HTMLLIElement>;
10
+ onFocus?: FocusEventHandler<HTMLLIElement>;
11
+ onBlur?: FocusEventHandler<HTMLLIElement>;
12
+ tabIndex?: number;
13
+ }>;
14
+ export declare function DevtoolsListItem(props: DevtoolsListItemProps): JSX.Element;
15
+ //# sourceMappingURL=DevtoolsList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevtoolsList.d.ts","sourceRoot":"","sources":["../../../src/surfaces/DevtoolsList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,GAAG,EACH,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACV,MAAM,OAAO,CAAC;AASf,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAGlD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAElE;AAED,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;IACpD,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAGH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,GAAG,CAAC,OAAO,CAoC1E"}
@@ -4,4 +4,9 @@ export declare const cardTitle: string;
4
4
  export declare const section: string;
5
5
  export declare const sectionHeader: string;
6
6
  export declare const sectionTitle: string;
7
+ export declare const list: string;
8
+ export declare const listItem: string;
9
+ export declare const listItemInteractive: string;
10
+ export declare const listItemHeader: string;
11
+ export declare const listItemMeta: string;
7
12
  //# sourceMappingURL=devtoolsSurfaces.css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtoolsSurfaces.css.d.ts","sourceRoot":"","sources":["../../../src/surfaces/devtoolsSurfaces.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QAQf,CAAC;AAEH,eAAO,MAAM,UAAU,QAKrB,CAAC;AAEH,eAAO,MAAM,SAAS,QAIpB,CAAC;AAEH,eAAO,MAAM,OAAO,QAIlB,CAAC;AAEH,eAAO,MAAM,aAAa,QAKxB,CAAC;AAEH,eAAO,MAAM,YAAY,QAMvB,CAAC"}
1
+ {"version":3,"file":"devtoolsSurfaces.css.d.ts","sourceRoot":"","sources":["../../../src/surfaces/devtoolsSurfaces.css.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI,QAQf,CAAC;AAEH,eAAO,MAAM,UAAU,QAKrB,CAAC;AAEH,eAAO,MAAM,SAAS,QAIpB,CAAC;AAEH,eAAO,MAAM,OAAO,QAIlB,CAAC;AAEH,eAAO,MAAM,aAAa,QAKxB,CAAC;AAEH,eAAO,MAAM,YAAY,QAMvB,CAAC;AAEH,eAAO,MAAM,IAAI,QAOf,CAAC;AAEH,eAAO,MAAM,QAAQ,QAOnB,CAAC;AAEH,eAAO,MAAM,mBAAmB,QAO9B,CAAC;AAEH,eAAO,MAAM,cAAc,QAKzB,CAAC;AAEH,eAAO,MAAM,YAAY,QAMvB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plumile/ui-devtools",
3
- "version": "0.1.134",
3
+ "version": "0.1.142",
4
4
  "description": "Shared DevTools UI primitives for Kronex extensions",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -24,6 +24,16 @@
24
24
  "import": "./lib/esm/content/*.js",
25
25
  "default": "./lib/esm/content/*.js"
26
26
  },
27
+ "./controls/*.js": {
28
+ "types": "./lib/types/controls/*.d.ts",
29
+ "import": "./lib/esm/controls/*.js",
30
+ "default": "./lib/esm/controls/*.js"
31
+ },
32
+ "./controls/*": {
33
+ "types": "./lib/types/controls/*.d.ts",
34
+ "import": "./lib/esm/controls/*.js",
35
+ "default": "./lib/esm/controls/*.js"
36
+ },
27
37
  "./empty_state/*.js": {
28
38
  "types": "./lib/types/empty_state/*.d.ts",
29
39
  "import": "./lib/esm/empty_state/*.js",