@kanso-labs/kanso-ui 0.4.6 → 0.5.1

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 (77) hide show
  1. package/dist/assets/stylex.css +50 -0
  2. package/dist/components/card/index.d.ts +19 -7
  3. package/dist/components/card/index.js +35 -14
  4. package/dist/components/card/index.js.map +1 -1
  5. package/dist/components/index.d.ts +3 -1
  6. package/dist/components/list-detail/index.d.ts +41 -0
  7. package/dist/components/list-detail/index.js +42 -0
  8. package/dist/components/list-detail/index.js.map +1 -0
  9. package/dist/components/supporting-pane/index.d.ts +29 -0
  10. package/dist/components/supporting-pane/index.js +94 -0
  11. package/dist/components/supporting-pane/index.js.map +1 -0
  12. package/dist/index.d.ts +3 -1
  13. package/dist/index.js +3 -1
  14. package/package.json +9 -7
  15. package/dist/cjs/assets/stylex.css +0 -1655
  16. package/dist/cjs/components/avatar/index.cjs +0 -89
  17. package/dist/cjs/components/avatar/index.cjs.map +0 -1
  18. package/dist/cjs/components/avatar/index.d.cts +0 -29
  19. package/dist/cjs/components/badge/index.cjs +0 -93
  20. package/dist/cjs/components/badge/index.cjs.map +0 -1
  21. package/dist/cjs/components/badge/index.d.cts +0 -27
  22. package/dist/cjs/components/button/index.cjs +0 -101
  23. package/dist/cjs/components/button/index.cjs.map +0 -1
  24. package/dist/cjs/components/button/index.d.cts +0 -22
  25. package/dist/cjs/components/card/index.cjs +0 -84
  26. package/dist/cjs/components/card/index.cjs.map +0 -1
  27. package/dist/cjs/components/card/index.d.cts +0 -29
  28. package/dist/cjs/components/chip/index.cjs +0 -53
  29. package/dist/cjs/components/chip/index.cjs.map +0 -1
  30. package/dist/cjs/components/chip/index.d.cts +0 -13
  31. package/dist/cjs/components/code/index.cjs +0 -51
  32. package/dist/cjs/components/code/index.cjs.map +0 -1
  33. package/dist/cjs/components/code/index.d.cts +0 -11
  34. package/dist/cjs/components/copy-field/index.cjs +0 -59
  35. package/dist/cjs/components/copy-field/index.cjs.map +0 -1
  36. package/dist/cjs/components/copy-field/index.d.cts +0 -36
  37. package/dist/cjs/components/currency/index.cjs +0 -56
  38. package/dist/cjs/components/currency/index.cjs.map +0 -1
  39. package/dist/cjs/components/currency/index.d.cts +0 -36
  40. package/dist/cjs/components/icon-button/index.cjs +0 -80
  41. package/dist/cjs/components/icon-button/index.cjs.map +0 -1
  42. package/dist/cjs/components/icon-button/index.d.cts +0 -32
  43. package/dist/cjs/components/index.d.cts +0 -18
  44. package/dist/cjs/components/keycap/index.cjs +0 -52
  45. package/dist/cjs/components/keycap/index.cjs.map +0 -1
  46. package/dist/cjs/components/keycap/index.d.cts +0 -12
  47. package/dist/cjs/components/link/index.cjs +0 -61
  48. package/dist/cjs/components/link/index.cjs.map +0 -1
  49. package/dist/cjs/components/link/index.d.cts +0 -30
  50. package/dist/cjs/components/list-item/index.cjs +0 -42
  51. package/dist/cjs/components/list-item/index.cjs.map +0 -1
  52. package/dist/cjs/components/list-item/index.d.cts +0 -22
  53. package/dist/cjs/components/separator/index.cjs +0 -34
  54. package/dist/cjs/components/separator/index.cjs.map +0 -1
  55. package/dist/cjs/components/separator/index.d.cts +0 -14
  56. package/dist/cjs/components/sheet/index.cjs +0 -266
  57. package/dist/cjs/components/sheet/index.cjs.map +0 -1
  58. package/dist/cjs/components/sheet/index.d.cts +0 -73
  59. package/dist/cjs/components/tabs/index.cjs +0 -77
  60. package/dist/cjs/components/tabs/index.cjs.map +0 -1
  61. package/dist/cjs/components/tabs/index.d.cts +0 -24
  62. package/dist/cjs/components/text/index.cjs +0 -173
  63. package/dist/cjs/components/text/index.cjs.map +0 -1
  64. package/dist/cjs/components/text/index.d.cts +0 -19
  65. package/dist/cjs/components/text-field/index.cjs +0 -53
  66. package/dist/cjs/components/text-field/index.cjs.map +0 -1
  67. package/dist/cjs/components/text-field/index.d.cts +0 -30
  68. package/dist/cjs/hooks/useRipple.cjs +0 -391
  69. package/dist/cjs/hooks/useRipple.cjs.map +0 -1
  70. package/dist/cjs/index.cjs +0 -35
  71. package/dist/cjs/index.d.cts +0 -19
  72. package/dist/cjs/node_modules/@stylexjs/stylex/lib/es/stylex.cjs +0 -121
  73. package/dist/cjs/node_modules/@stylexjs/stylex/lib/es/stylex.cjs.map +0 -1
  74. package/dist/cjs/styles/ripple.cjs +0 -33
  75. package/dist/cjs/styles/ripple.cjs.map +0 -1
  76. package/dist/cjs/tokens/values.cjs +0 -36
  77. package/dist/cjs/tokens/values.cjs.map +0 -1
@@ -79,6 +79,10 @@
79
79
  border-width: 1px;
80
80
  }
81
81
 
82
+ .xj2l1yv {
83
+ gap: var(--x196ey9q);
84
+ }
85
+
82
86
  .x14qo01y {
83
87
  gap: var(--x1ug6acx);
84
88
  }
@@ -159,6 +163,10 @@
159
163
  padding-inline: var(--xod9tvo);
160
164
  }
161
165
 
166
+ .x1hl2dhg {
167
+ text-decoration: none;
168
+ }
169
+
162
170
  .xtecew7:active:not(:disabled) {
163
171
  border-radius: var(--x1m0y4ip);
164
172
  }
@@ -385,6 +393,10 @@
385
393
  display: flex;
386
394
  }
387
395
 
396
+ .xrvj5dj {
397
+ display: grid;
398
+ }
399
+
388
400
  .x1rg5ohu {
389
401
  display: inline-block;
390
402
  }
@@ -393,6 +405,10 @@
393
405
  display: inline-flex;
394
406
  }
395
407
 
408
+ .x1s85apg {
409
+ display: none;
410
+ }
411
+
396
412
  .xdt5ytf {
397
413
  flex-direction: column;
398
414
  }
@@ -617,6 +633,10 @@
617
633
  font-weight: var(--xwguucb);
618
634
  }
619
635
 
636
+ .x1mkdm3x {
637
+ grid-template-columns: minmax(0, 1fr);
638
+ }
639
+
620
640
  .xtijo5x {
621
641
  inset-inline-end: 0;
622
642
  }
@@ -1215,7 +1235,37 @@
1215
1235
  .x9t1vth.x9t1vth {
1216
1236
  border-start-start-radius: var(--x1w5u0jm);
1217
1237
  }
1238
+ }
1239
+
1240
+ @media (width >= 840px) {
1241
+ .x9a4l8x.x9a4l8x {
1242
+ display: block;
1243
+ }
1218
1244
 
1245
+ .xkgydl7.xkgydl7 {
1246
+ grid-template-columns: 360px minmax(0, 1fr);
1247
+ }
1248
+ }
1249
+
1250
+ @media (width >= 1600px) {
1251
+ .xxxc7o5.xxxc7o5 {
1252
+ grid-template-columns: 412px minmax(0, 1fr);
1253
+ }
1254
+ }
1255
+
1256
+ @media (width >= 600px) {
1257
+ .x1bg1yrb.x1bg1yrb {
1258
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1259
+ }
1260
+ }
1261
+
1262
+ @media (width >= 840px) {
1263
+ .xj1h9sb.xj1h9sb {
1264
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
1265
+ }
1266
+ }
1267
+
1268
+ @media (width < 600px) {
1219
1269
  .x1upgybz.x1upgybz {
1220
1270
  inset-inline-start: 0;
1221
1271
  }
@@ -1,11 +1,11 @@
1
- import { HTMLAttributes, ReactNode } from "react";
1
+ import { useRender } from "@base-ui/react/use-render";
2
2
  //#region src/components/card/index.d.ts
3
3
  type CardProps = {
4
- children?: ReactNode;
5
4
  /**
6
- * Renders a `<button>` that ripples and lifts on hover, for a card that is
7
- * itself the thing you press. Leave it off for a card that merely holds
8
- * content, including one containing its own buttons.
5
+ * Makes the card the thing you press: it ripples, lifts on hover, and takes
6
+ * a focus ring. Renders a `<button>` unless `render` says otherwise. Leave
7
+ * it off for a card that merely holds content, including one containing its
8
+ * own buttons.
9
9
  * @default false
10
10
  */
11
11
  interactive?: boolean;
@@ -21,9 +21,21 @@ type CardProps = {
21
21
  * @default 'elevated'
22
22
  */
23
23
  variant?: CardVariant;
24
- } & HTMLAttributes<HTMLElement>;
24
+ } & useRender.ComponentProps<'div'>;
25
25
  type CardVariant = 'elevated' | 'filled' | 'outlined';
26
- declare function Card({ children, interactive, padding, variant, ...props }: CardProps): import("react").JSX.Element;
26
+ /**
27
+ * A surface holding related content. `render` decides which element that
28
+ * surface is, so a card that navigates can be a real `<a href>` — announced
29
+ * as a link and opening in a new tab on a modifier click, which a `<button>`
30
+ * with an onClick does neither of.
31
+ *
32
+ * `interactive` and `render` are separate axes. `interactive` says the card
33
+ * is pressable and gives it the ripple, the hover lift, and a focus ring;
34
+ * `render` says what it is. A pressable card with no `render` is a
35
+ * `<button>`, which is the right default for one that acts rather than
36
+ * navigates.
37
+ */
38
+ declare function Card({ children, interactive, onClick, onContextMenu, onPointerCancel, onPointerDown, onPointerLeave, onPointerUp, padding, render, variant, ...props }: CardProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
27
39
  //#endregion
28
40
  export { type CardProps, Card as default };
29
41
  //# sourceMappingURL=index.d.ts.map
@@ -1,14 +1,17 @@
1
1
  import { props } from "../../node_modules/@stylexjs/stylex/lib/es/stylex.js";
2
2
  import { useRipple } from "../../hooks/useRipple.js";
3
- import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Fragment, jsxs } from "react/jsx-runtime";
4
+ import { useRender } from "@base-ui/react/use-render";
4
5
  //#region src/components/card/index.tsx
5
6
  const styles = {
6
7
  base: {
7
8
  kaIpWk: "xhpdng0",
8
9
  kMzoRj: "xc342km",
10
+ kMwMTN: "x1heor9g",
9
11
  k1xSpc: "x1lliihq",
10
12
  kVQacm: "xb3r6kr",
11
13
  kVAEAm: "x1n2onr6",
14
+ kybGjl: "x1hl2dhg",
12
15
  $$css: true
13
16
  },
14
17
  elevated: {
@@ -62,20 +65,38 @@ const interactionStyles = {
62
65
  $$css: true
63
66
  }
64
67
  };
65
- function Card({ children, interactive = false, padding = "default", variant = "elevated", ...props$1 }) {
66
- const ripple = useRipple(interactive);
67
- const padded = padding === "none" ? styles.paddingNone : styles.paddingDefault;
68
- if (!interactive) return /* @__PURE__ */ jsx("div", {
69
- ...props$1,
70
- ...props(styles.base, styles[variant], padded),
71
- children
68
+ /**
69
+ * A surface holding related content. `render` decides which element that
70
+ * surface is, so a card that navigates can be a real `<a href>` — announced
71
+ * as a link and opening in a new tab on a modifier click, which a `<button>`
72
+ * with an onClick does neither of.
73
+ *
74
+ * `interactive` and `render` are separate axes. `interactive` says the card
75
+ * is pressable and gives it the ripple, the hover lift, and a focus ring;
76
+ * `render` says what it is. A pressable card with no `render` is a
77
+ * `<button>`, which is the right default for one that acts rather than
78
+ * navigates.
79
+ */
80
+ function Card({ children, interactive = false, onClick, onContextMenu, onPointerCancel, onPointerDown, onPointerLeave, onPointerUp, padding = "default", render, variant = "elevated", ...props$1 }) {
81
+ const ripple = useRipple(interactive, {
82
+ onClick,
83
+ onContextMenu,
84
+ onPointerCancel,
85
+ onPointerDown,
86
+ onPointerLeave,
87
+ onPointerUp
72
88
  });
73
- return /* @__PURE__ */ jsxs("button", {
74
- type: "button",
75
- ...ripple.handlers,
76
- ...props$1,
77
- ...props(styles.base, styles[variant], padded, styles.interactive, interactionStyles[variant]),
78
- children: [children, ripple.surface]
89
+ const padded = padding === "none" ? styles.paddingNone : styles.paddingDefault;
90
+ return useRender({
91
+ defaultTagName: interactive ? "button" : "div",
92
+ props: {
93
+ ...props$1,
94
+ ...interactive && render === void 0 ? { type: "button" } : void 0,
95
+ ...ripple.handlers,
96
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [children, ripple.surface] }),
97
+ ...props(styles.base, styles[variant], padded, interactive && styles.interactive, interactive && interactionStyles[variant])
98
+ },
99
+ render
79
100
  });
80
101
  }
81
102
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/card/index.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react';\nimport * as stylex from '@stylexjs/stylex';\nimport { useRipple } from '../../hooks/useRipple';\nimport '../../tokens/design.tokens.stylex';\nimport { colors, radii, shadows, spacing, stateLayerOpacity } from '../../tokens/design.tokens.stylex';\n\n// The three variants differ only in how they separate themselves from the\n// page: a shadow, a darker fill, or a border. Each therefore sits on a\n// different background, which is why the interaction styles below are keyed\n// by variant too — a state layer composites an 'on-color' over whatever the\n// container already is, so it cannot be written once for all three.\n//\n// color-mix() is inlined at each property rather than factored into a helper:\n// @stylexjs/babel-plugin only statically recognizes expressions written\n// directly as property values. Button's header comment records the same\n// constraint, and the :not(:disabled) guard there applies here for the same\n// reason — stylex's fixed pseudo-class ordering puts :hover after :disabled.\nconst styles = {\n base: {\n kaIpWk: \"xhpdng0\",\n kMzoRj: \"xc342km\",\n k1xSpc: \"x1lliihq\",\n kVQacm: \"xb3r6kr\",\n kVAEAm: \"x1n2onr6\",\n $$css: true\n },\n elevated: {\n kWkggS: \"x1vnz5z6\",\n kGVxlE: \"x19efjv6\",\n $$css: true\n },\n filled: {\n kWkggS: \"x1rrhr5q\",\n $$css: true\n },\n interactive: {\n kkrTdU: \"x1ypdohk\",\n kVVagm: \"xln7xf2\",\n kzqmXN: \"xh8yej3\",\n kjBf7l: \"xrgy624\",\n kInvED: \"x1hl8ikr\",\n k3XXqK: \"x9v5kkp x1t137rt\",\n kMeerF: \"x1de99jn\",\n k9WMMc: \"x1yc453h\",\n $$css: true\n },\n outlined: {\n kWkggS: \"x14s9m32\",\n kVAM5u: \"x133yhug\",\n ksu8eU: \"x1y0btm7\",\n kMzoRj: \"xmkeg23\",\n $$css: true\n },\n paddingDefault: {\n kmVPX3: \"xgc26li\",\n $$css: true\n },\n paddingNone: {\n kmVPX3: \"x1717udv\",\n $$css: true\n }\n};\nconst interactionStyles = {\n elevated: {\n kWkggS: \"xu5m21g x5r8g2b x1vnz5z6\",\n kGVxlE: \"x1g60mc1 x1fzngjt x19efjv6\",\n $$css: true\n },\n filled: {\n kWkggS: \"x1w49kxs xovjh5a x1rrhr5q\",\n $$css: true\n },\n outlined: {\n kWkggS: \"x1jqfdmz x1dmgsxd x14s9m32\",\n $$css: true\n }\n};\n\n// Typed as the attributes a <div> and a <button> both accept, because\n// `interactive` decides which one renders. Anything element-specific — a\n// button's `type`, a div's ref type — would be wrong for one of the two, so\n// the shared surface is what the prop type can honestly promise.\ntype CardProps = {\n children?: ReactNode;\n /**\n * Renders a `<button>` that ripples and lifts on hover, for a card that is\n * itself the thing you press. Leave it off for a card that merely holds\n * content, including one containing its own buttons.\n * @default false\n */\n interactive?: boolean;\n /**\n * `none` removes the card's own padding, for a card whose children run to\n * its edges — a list of rows separated by rules.\n * @default 'default'\n */\n padding?: 'default' | 'none';\n /**\n * How the card separates itself from the page: `elevated` casts a shadow,\n * `filled` sits on a darker surface, `outlined` draws a border.\n * @default 'elevated'\n */\n variant?: CardVariant;\n} & HTMLAttributes<HTMLElement>;\ntype CardVariant = 'elevated' | 'filled' | 'outlined';\nfunction Card({\n children,\n interactive = false,\n padding = 'default',\n variant = 'elevated',\n ...props\n}: CardProps) {\n const ripple = useRipple<HTMLButtonElement>(interactive);\n const padded = padding === 'none' ? styles.paddingNone : styles.paddingDefault;\n if (!interactive) {\n return <div {...props} {...stylex.props(styles.base, styles[variant], padded)}>\n {children}\n </div>;\n }\n return <button type=\"button\" {...ripple.handlers} {...props} {...stylex.props(styles.base, styles[variant], padded, styles.interactive, interactionStyles[variant])}>\n {children}\n {ripple.surface}\n </button>;\n}\nexport type { CardProps };\nexport default Card;"],"mappings":";;;;AAiBA,MAAM,SAAS;CACb,MAAM;EACJ,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,UAAU;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,QAAQ;EACN,QAAQ;EACR,OAAO;CACT;CACA,aAAa;EACX,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,UAAU;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,gBAAgB;EACd,QAAQ;EACR,OAAO;CACT;CACA,aAAa;EACX,QAAQ;EACR,OAAO;CACT;AACF;AACA,MAAM,oBAAoB;CACxB,UAAU;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,QAAQ;EACN,QAAQ;EACR,OAAO;CACT;CACA,UAAU;EACR,QAAQ;EACR,OAAO;CACT;AACF;AA6BA,SAAS,KAAK,EACZ,UACA,cAAc,OACd,UAAU,WACV,UAAU,YACV,GAAG,WACS;CACZ,MAAM,SAAS,UAA6B,WAAW;CACvD,MAAM,SAAS,YAAY,SAAS,OAAO,cAAc,OAAO;CAChE,IAAI,CAAC,aACH,OAAO,oBAAC,OAAD;EAAK,GAAI;EAAO,GAAI,MAAa,OAAO,MAAM,OAAO,UAAU,MAAM;EACvE;CACE,CAAA;CAET,OAAO,qBAAC,UAAD;EAAQ,MAAK;EAAS,GAAI,OAAO;EAAU,GAAI;EAAO,GAAI,MAAa,OAAO,MAAM,OAAO,UAAU,QAAQ,OAAO,aAAa,kBAAkB,QAAQ;EAA3J,UAAA,CACF,UACA,OAAO,OACF;;AACZ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/card/index.tsx"],"sourcesContent":["import { useRender } from '@base-ui/react/use-render';\nimport * as stylex from '@stylexjs/stylex';\nimport { useRipple } from '../../hooks/useRipple';\nimport '../../tokens/design.tokens.stylex';\nimport { colors, radii, shadows, spacing, stateLayerOpacity } from '../../tokens/design.tokens.stylex';\n\n// The three variants differ only in how they separate themselves from the\n// page: a shadow, a darker fill, or a border. Each therefore sits on a\n// different background, which is why the interaction styles below are keyed\n// by variant too — a state layer composites an 'on-color' over whatever the\n// container already is, so it cannot be written once for all three.\n//\n// color-mix() is inlined at each property rather than factored into a helper:\n// @stylexjs/babel-plugin only statically recognizes expressions written\n// directly as property values. Button's header comment records the same\n// constraint, and the :not(:disabled) guard there applies here for the same\n// reason — stylex's fixed pseudo-class ordering puts :hover after :disabled.\nconst styles = {\n base: {\n kaIpWk: \"xhpdng0\",\n kMzoRj: \"xc342km\",\n kMwMTN: \"x1heor9g\",\n k1xSpc: \"x1lliihq\",\n kVQacm: \"xb3r6kr\",\n kVAEAm: \"x1n2onr6\",\n kybGjl: \"x1hl2dhg\",\n $$css: true\n },\n elevated: {\n kWkggS: \"x1vnz5z6\",\n kGVxlE: \"x19efjv6\",\n $$css: true\n },\n filled: {\n kWkggS: \"x1rrhr5q\",\n $$css: true\n },\n interactive: {\n kkrTdU: \"x1ypdohk\",\n kVVagm: \"xln7xf2\",\n kzqmXN: \"xh8yej3\",\n kjBf7l: \"xrgy624\",\n kInvED: \"x1hl8ikr\",\n k3XXqK: \"x9v5kkp x1t137rt\",\n kMeerF: \"x1de99jn\",\n k9WMMc: \"x1yc453h\",\n $$css: true\n },\n outlined: {\n kWkggS: \"x14s9m32\",\n kVAM5u: \"x133yhug\",\n ksu8eU: \"x1y0btm7\",\n kMzoRj: \"xmkeg23\",\n $$css: true\n },\n paddingDefault: {\n kmVPX3: \"xgc26li\",\n $$css: true\n },\n paddingNone: {\n kmVPX3: \"x1717udv\",\n $$css: true\n }\n};\nconst interactionStyles = {\n elevated: {\n kWkggS: \"xu5m21g x5r8g2b x1vnz5z6\",\n kGVxlE: \"x1g60mc1 x1fzngjt x19efjv6\",\n $$css: true\n },\n filled: {\n kWkggS: \"x1w49kxs xovjh5a x1rrhr5q\",\n $$css: true\n },\n outlined: {\n kWkggS: \"x1jqfdmz x1dmgsxd x14s9m32\",\n $$css: true\n }\n};\n\n// Typed as the attributes a <div> accepts, because that is the surface every\n// element this can render shares. Anything element-specific — a button's\n// `type`, an anchor's `href` — would be wrong for the others, and does not\n// need to be here anyway: those are written on the element handed to\n// `render`, where TypeScript checks them against that element's own props.\ntype CardProps = {\n /**\n * Makes the card the thing you press: it ripples, lifts on hover, and takes\n * a focus ring. Renders a `<button>` unless `render` says otherwise. Leave\n * it off for a card that merely holds content, including one containing its\n * own buttons.\n * @default false\n */\n interactive?: boolean;\n /**\n * `none` removes the card's own padding, for a card whose children run to\n * its edges — a list of rows separated by rules.\n * @default 'default'\n */\n padding?: 'default' | 'none';\n /**\n * How the card separates itself from the page: `elevated` casts a shadow,\n * `filled` sits on a darker surface, `outlined` draws a border.\n * @default 'elevated'\n */\n variant?: CardVariant;\n} & useRender.ComponentProps<'div'>;\ntype CardVariant = 'elevated' | 'filled' | 'outlined';\n\n/**\n * A surface holding related content. `render` decides which element that\n * surface is, so a card that navigates can be a real `<a href>` — announced\n * as a link and opening in a new tab on a modifier click, which a `<button>`\n * with an onClick does neither of.\n *\n * `interactive` and `render` are separate axes. `interactive` says the card\n * is pressable and gives it the ripple, the hover lift, and a focus ring;\n * `render` says what it is. A pressable card with no `render` is a\n * `<button>`, which is the right default for one that acts rather than\n * navigates.\n */\nfunction Card({\n children,\n interactive = false,\n onClick,\n onContextMenu,\n onPointerCancel,\n onPointerDown,\n onPointerLeave,\n onPointerUp,\n padding = 'default',\n render,\n variant = 'elevated',\n ...props\n}: CardProps) {\n // The consumer's own pointer handlers are handed to useRipple to merge\n // rather than spread over its handlers afterwards, which is what Button\n // does and for the same reason: a plain spread means whichever object\n // comes last silently wins, so an onPointerDown on the call site would\n // replace the one driving the ripple and the card would stop rippling.\n const ripple = useRipple(interactive, {\n onClick,\n onContextMenu,\n onPointerCancel,\n onPointerDown,\n onPointerLeave,\n onPointerUp\n });\n const padded = padding === 'none' ? styles.paddingNone : styles.paddingDefault;\n return useRender({\n defaultTagName: interactive ? 'button' : 'div',\n props: {\n ...props,\n // Only when the default <button> is what renders. On an element the\n // call site chose, `type` is either meaningless or wrong — an <a>'s\n // `type` is a hint about the MIME type of what it links to — and that\n // element's own attributes are the call site's to write.\n ...(interactive && render === undefined ? {\n type: 'button'\n } : undefined),\n ...ripple.handlers,\n children: <>\n {children}\n {ripple.surface}\n </>,\n // Spread last so it wins over a consumer-supplied className rather than\n // being merged with one, matching Text and Badge. useRender joins the\n // two class strings otherwise, and which won would come down to\n // stylesheet order rather than anything visible at the call site.\n ...stylex.props(styles.base, styles[variant], padded, interactive && styles.interactive, interactive && interactionStyles[variant])\n },\n render\n });\n}\nexport type { CardProps };\nexport default Card;"],"mappings":";;;;;AAiBA,MAAM,SAAS;CACb,MAAM;EACJ,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,UAAU;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,QAAQ;EACN,QAAQ;EACR,OAAO;CACT;CACA,aAAa;EACX,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,UAAU;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,gBAAgB;EACd,QAAQ;EACR,OAAO;CACT;CACA,aAAa;EACX,QAAQ;EACR,OAAO;CACT;AACF;AACA,MAAM,oBAAoB;CACxB,UAAU;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;CACT;CACA,QAAQ;EACN,QAAQ;EACR,OAAO;CACT;CACA,UAAU;EACR,QAAQ;EACR,OAAO;CACT;AACF;;;;;;;;;;;;;AA2CA,SAAS,KAAK,EACZ,UACA,cAAc,OACd,SACA,eACA,iBACA,eACA,gBACA,aACA,UAAU,WACV,QACA,UAAU,YACV,GAAG,WACS;CAMZ,MAAM,SAAS,UAAU,aAAa;EACpC;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,MAAM,SAAS,YAAY,SAAS,OAAO,cAAc,OAAO;CAChE,OAAO,UAAU;EACf,gBAAgB,cAAc,WAAW;EACzC,OAAO;GACL,GAAG;GAKH,GAAI,eAAe,WAAW,KAAA,IAAY,EACxC,MAAM,SACR,IAAI,KAAA;GACJ,GAAG,OAAO;GACV,UAAU,qBAAA,UAAA,EAAA,UAAA,CACL,UACA,OAAO,OACV,EAAA,CAAA;GAKF,GAAG,MAAa,OAAO,MAAM,OAAO,UAAU,QAAQ,eAAe,OAAO,aAAa,eAAe,kBAAkB,QAAQ;EACpI;EACA;CACF,CAAC;AACH"}
@@ -9,10 +9,12 @@ import Currency, { CurrencyProps } from "./currency/index.js";
9
9
  import IconButton, { IconButtonProps } from "./icon-button/index.js";
10
10
  import Keycap, { KeycapProps } from "./keycap/index.js";
11
11
  import Link, { LinkProps } from "./link/index.js";
12
+ import ListDetail, { ListDetailProps } from "./list-detail/index.js";
12
13
  import ListItem, { ListItemProps } from "./list-item/index.js";
13
14
  import Separator, { SeparatorProps } from "./separator/index.js";
14
15
  import Sheet, { SheetProps } from "./sheet/index.js";
16
+ import SupportingPane, { SupportingPaneProps } from "./supporting-pane/index.js";
15
17
  import Tabs, { TabsProps } from "./tabs/index.js";
16
18
  import Text, { TextProps } from "./text/index.js";
17
19
  import TextField, { TextFieldProps } from "./text-field/index.js";
18
- export { Avatar, type AvatarProps, Badge, type BadgeProps, Button, type ButtonProps, Card, type CardProps, Chip, type ChipProps, Code, type CodeProps, CopyField, type CopyFieldProps, Currency, type CurrencyProps, IconButton, type IconButtonProps, Keycap, type KeycapProps, Link, type LinkProps, ListItem, type ListItemProps, Separator, type SeparatorProps, Sheet, type SheetProps, Tabs, type TabsProps, Text, TextField, type TextFieldProps, type TextProps };
20
+ export { Avatar, type AvatarProps, Badge, type BadgeProps, Button, type ButtonProps, Card, type CardProps, Chip, type ChipProps, Code, type CodeProps, CopyField, type CopyFieldProps, Currency, type CurrencyProps, IconButton, type IconButtonProps, Keycap, type KeycapProps, Link, type LinkProps, ListDetail, type ListDetailProps, ListItem, type ListItemProps, Separator, type SeparatorProps, Sheet, type SheetProps, SupportingPane, type SupportingPaneProps, Tabs, type TabsProps, Text, TextField, type TextFieldProps, type TextProps };
@@ -0,0 +1,41 @@
1
+ import { useRender } from "@base-ui/react/use-render";
2
+ import { ReactNode } from "react";
3
+ //#region src/components/list-detail/index.d.ts
4
+ type ListDetailProps = {
5
+ /**
6
+ * The selected item's content. Stands on its own, and takes the flexible
7
+ * pane.
8
+ */
9
+ detail?: ReactNode;
10
+ /**
11
+ * The items to choose between. Takes the fixed pane — 360px wide, 412px at
12
+ * extra-large.
13
+ */
14
+ list?: ReactNode;
15
+ /**
16
+ * Which pane to show while only one fits, below the expanded breakpoint.
17
+ * Both are shown from expanded up, where this is ignored.
18
+ *
19
+ * Controlled, with no uncontrolled fallback: the layout cannot know that an
20
+ * item was selected or that the reader went back, so holding that state
21
+ * here would only ever be wrong.
22
+ * @default 'list'
23
+ */
24
+ showing?: 'detail' | 'list';
25
+ } & Omit<useRender.ComponentProps<'div'>, 'children'>;
26
+ /**
27
+ * Material 3's list-detail layout: a fixed list pane beside a flexible detail
28
+ * pane, collapsing to one pane at a time below the expanded breakpoint.
29
+ *
30
+ * Layout only — neither pane paints a surface of its own, so what goes inside
31
+ * them is composed at the call site. `render` swaps the container's element,
32
+ * for a layout that should be a `<main>` rather than a `<div>`.
33
+ *
34
+ * The panes are written to the DOM in the order they are shown, which is what
35
+ * M3 asks of co-planar panes: focus order has to match the arrangement on
36
+ * screen.
37
+ */
38
+ declare function ListDetail({ detail, list, render, showing, ...props }: ListDetailProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
39
+ //#endregion
40
+ export { type ListDetailProps, ListDetail as default };
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,42 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { useRender } from "@base-ui/react/use-render";
3
+ //#region src/components/list-detail/index.tsx
4
+ /**
5
+ * Material 3's list-detail layout: a fixed list pane beside a flexible detail
6
+ * pane, collapsing to one pane at a time below the expanded breakpoint.
7
+ *
8
+ * Layout only — neither pane paints a surface of its own, so what goes inside
9
+ * them is composed at the call site. `render` swaps the container's element,
10
+ * for a layout that should be a `<main>` rather than a `<div>`.
11
+ *
12
+ * The panes are written to the DOM in the order they are shown, which is what
13
+ * M3 asks of co-planar panes: focus order has to match the arrangement on
14
+ * screen.
15
+ */
16
+ function ListDetail({ detail, list, render, showing = "list", ...props }) {
17
+ return useRender({
18
+ defaultTagName: "div",
19
+ props: {
20
+ ...props,
21
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
22
+ ...{
23
+ 0: { className: "xeuugli" },
24
+ 1: { className: "xeuugli x1s85apg x9a4l8x" }
25
+ }[!!(showing === "detail") << 0],
26
+ children: list
27
+ }), /* @__PURE__ */ jsx("div", {
28
+ ...{
29
+ 0: { className: "xeuugli" },
30
+ 1: { className: "xeuugli x1s85apg x9a4l8x" }
31
+ }[!!(showing === "list") << 0],
32
+ children: detail
33
+ })] }),
34
+ className: "xrvj5dj xj2l1yv x1mkdm3x xkgydl7 xxxc7o5"
35
+ },
36
+ render
37
+ });
38
+ }
39
+ //#endregion
40
+ export { ListDetail as default };
41
+
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/list-detail/index.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { useRender } from '@base-ui/react/use-render';\nimport * as stylex from '@stylexjs/stylex';\nimport '../../tokens/design.tokens.stylex';\nimport { media, spacing } from '../../tokens/design.tokens.stylex';\n\n// Material 3's recommended snap widths for a fixed pane. The list is the\n// fixed one here — M3 points a fixed pane at \"lists with light information\n// density\" — and the detail pane is the flexible one that absorbs whatever is\n// left, which satisfies the spec's rule that every layout carry at least one\n// flexible pane.\nconst LIST_PANE = '360px';\nconst LIST_PANE_EXTRA_LARGE = '412px';\n\n// One of Material 3's canonical layouts, and the fixed-and-flexible shape of\n// its two-pane layouts. Unlike SupportingPane, the detail pane here stands on\n// its own: a message, a product, a file. That is what makes showing it\n// *instead of* the list a coherent thing to do when only one pane fits, and\n// why this layout has to be told which pane is showing while SupportingPane\n// does not.\n//\n// M3 puts the second pane on screen from expanded up. Below that the spec\n// shows one pane at a time, with selecting an item swapping to the detail and\n// back returning to the list — app navigation rather than layout, which is\n// why `showing` is controlled rather than held here.\n\ntype ListDetailProps = {\n /**\n * The selected item's content. Stands on its own, and takes the flexible\n * pane.\n */\n detail?: ReactNode;\n /**\n * The items to choose between. Takes the fixed pane — 360px wide, 412px at\n * extra-large.\n */\n list?: ReactNode;\n /**\n * Which pane to show while only one fits, below the expanded breakpoint.\n * Both are shown from expanded up, where this is ignored.\n *\n * Controlled, with no uncontrolled fallback: the layout cannot know that an\n * item was selected or that the reader went back, so holding that state\n * here would only ever be wrong.\n * @default 'list'\n */\n showing?: 'detail' | 'list';\n} & Omit<useRender.ComponentProps<'div'>, 'children'>;\n\n/**\n * Material 3's list-detail layout: a fixed list pane beside a flexible detail\n * pane, collapsing to one pane at a time below the expanded breakpoint.\n *\n * Layout only — neither pane paints a surface of its own, so what goes inside\n * them is composed at the call site. `render` swaps the container's element,\n * for a layout that should be a `<main>` rather than a `<div>`.\n *\n * The panes are written to the DOM in the order they are shown, which is what\n * M3 asks of co-planar panes: focus order has to match the arrangement on\n * screen.\n */\nfunction ListDetail({\n detail,\n list,\n render,\n showing = 'list',\n ...props\n}: ListDetailProps) {\n return useRender({\n defaultTagName: 'div',\n props: {\n ...props,\n children: <>\n <div {...{\n 0: {\n className: \"xeuugli\"\n },\n 1: {\n className: \"xeuugli x1s85apg x9a4l8x\"\n }\n }[!!(showing === 'detail') << 0]}>\n {list}\n </div>\n <div {...{\n 0: {\n className: \"xeuugli\"\n },\n 1: {\n className: \"xeuugli x1s85apg x9a4l8x\"\n }\n }[!!(showing === 'list') << 0]}>\n {detail}\n </div>\n </>,\n ...{\n className: \"xrvj5dj xj2l1yv x1mkdm3x xkgydl7 xxxc7o5\"\n }\n },\n render\n });\n}\nexport type { ListDetailProps };\nexport default ListDetail;"],"mappings":";;;;;;;;;;;;;;;AA6DA,SAAS,WAAW,EAClB,QACA,MACA,QACA,UAAU,QACV,GAAG,SACe;CAClB,OAAO,UAAU;EACf,gBAAgB;EAChB,OAAO;GACL,GAAG;GACH,UAAU,qBAAA,UAAA,EAAA,UAAA,CACN,oBAAC,OAAD;IAAK,GAAI;KACT,GAAG,EACD,WAAW,UACb;KACA,GAAG,EACD,WAAW,2BACb;IACF,EAAE,CAAC,EAAE,YAAY,aAAa;IACzB,UAAA;GACE,CAAA,GACL,oBAAC,OAAD;IAAK,GAAI;KACT,GAAG,EACD,WAAW,UACb;KACA,GAAG,EACD,WAAW,2BACb;IACF,EAAE,CAAC,EAAE,YAAY,WAAW;IACvB,UAAA;GACE,CAAA,CACP,EAAA,CAAA;GAEA,WAAW;EAEf;EACA;CACF,CAAC;AACH"}
@@ -0,0 +1,29 @@
1
+ import { useRender } from "@base-ui/react/use-render";
2
+ import { ReactNode } from "react";
3
+ //#region src/components/supporting-pane/index.d.ts
4
+ type SupportingPaneProps = Omit<useRender.ComponentProps<'div'>, 'children'> & {
5
+ /** The primary content. Takes two thirds of the width from expanded up. */
6
+ main?: ReactNode;
7
+ /**
8
+ * Content that only means something beside `main`. Sits below it at compact,
9
+ * and beside it from medium up.
10
+ */
11
+ supporting?: ReactNode;
12
+ };
13
+ /**
14
+ * Material 3's supporting pane layout: a main pane and a companion that
15
+ * reflows underneath it when there is no room beside it.
16
+ *
17
+ * Layout only — neither pane paints a surface or a border of its own, so what
18
+ * goes in them is composed at the call site out of Cards, lists, or plain
19
+ * content. `render` swaps the container's element, for a layout that should
20
+ * be a `<main>` rather than a `<div>`.
21
+ *
22
+ * The panes are written to the DOM in the order they are shown, which is what
23
+ * M3 asks of co-planar panes: focus order has to match the arrangement on
24
+ * screen.
25
+ */
26
+ declare function SupportingPane({ main, render, supporting, ...props }: SupportingPaneProps): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
27
+ //#endregion
28
+ export { type SupportingPaneProps, SupportingPane as default };
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,94 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { useRender } from "@base-ui/react/use-render";
3
+ import { c } from "react/compiler-runtime";
4
+ //#region src/components/supporting-pane/index.tsx
5
+ /**
6
+ * Material 3's supporting pane layout: a main pane and a companion that
7
+ * reflows underneath it when there is no room beside it.
8
+ *
9
+ * Layout only — neither pane paints a surface or a border of its own, so what
10
+ * goes in them is composed at the call site out of Cards, lists, or plain
11
+ * content. `render` swaps the container's element, for a layout that should
12
+ * be a `<main>` rather than a `<div>`.
13
+ *
14
+ * The panes are written to the DOM in the order they are shown, which is what
15
+ * M3 asks of co-planar panes: focus order has to match the arrangement on
16
+ * screen.
17
+ */
18
+ function SupportingPane(t0) {
19
+ const $ = c(19);
20
+ let main;
21
+ let props;
22
+ let render;
23
+ let supporting;
24
+ if ($[0] !== t0) {
25
+ ({main, render, supporting, ...props} = t0);
26
+ $[0] = t0;
27
+ $[1] = main;
28
+ $[2] = props;
29
+ $[3] = render;
30
+ $[4] = supporting;
31
+ } else {
32
+ main = $[1];
33
+ props = $[2];
34
+ render = $[3];
35
+ supporting = $[4];
36
+ }
37
+ let t1;
38
+ if ($[5] !== main) {
39
+ t1 = /* @__PURE__ */ jsx("div", {
40
+ className: "xeuugli",
41
+ children: main
42
+ });
43
+ $[5] = main;
44
+ $[6] = t1;
45
+ } else t1 = $[6];
46
+ let t2;
47
+ if ($[7] !== supporting) {
48
+ t2 = /* @__PURE__ */ jsx("div", {
49
+ className: "xeuugli",
50
+ children: supporting
51
+ });
52
+ $[7] = supporting;
53
+ $[8] = t2;
54
+ } else t2 = $[8];
55
+ let t3;
56
+ if ($[9] !== t1 || $[10] !== t2) {
57
+ t3 = /* @__PURE__ */ jsxs(Fragment, { children: [t1, t2] });
58
+ $[9] = t1;
59
+ $[10] = t2;
60
+ $[11] = t3;
61
+ } else t3 = $[11];
62
+ let t4;
63
+ if ($[12] === Symbol.for("react.memo_cache_sentinel")) {
64
+ t4 = { className: "xrvj5dj xj2l1yv x1mkdm3x xj1h9sb x1bg1yrb" };
65
+ $[12] = t4;
66
+ } else t4 = $[12];
67
+ let t5;
68
+ if ($[13] !== props || $[14] !== t3) {
69
+ t5 = {
70
+ ...props,
71
+ children: t3,
72
+ ...t4
73
+ };
74
+ $[13] = props;
75
+ $[14] = t3;
76
+ $[15] = t5;
77
+ } else t5 = $[15];
78
+ let t6;
79
+ if ($[16] !== render || $[17] !== t5) {
80
+ t6 = {
81
+ defaultTagName: "div",
82
+ props: t5,
83
+ render
84
+ };
85
+ $[16] = render;
86
+ $[17] = t5;
87
+ $[18] = t6;
88
+ } else t6 = $[18];
89
+ return useRender(t6);
90
+ }
91
+ //#endregion
92
+ export { SupportingPane as default };
93
+
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["main","supporting"],"sources":["../../../src/components/supporting-pane/index.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { useRender } from '@base-ui/react/use-render';\nimport * as stylex from '@stylexjs/stylex';\nimport '../../tokens/design.tokens.stylex';\nimport { media, spacing } from '../../tokens/design.tokens.stylex';\n\n// One of Material 3's canonical layouts. The supporting pane holds content\n// that only means anything next to the main pane — reviewer comments, related\n// items, a tool panel — which is what separates it from list-detail, where\n// the second pane stands on its own.\n//\n// M3 gives this layout three shapes across the breakpoints, and all three are\n// reachable in CSS because none of them depends on what the reader selected:\n// stacked at compact, an even split at medium, two thirds to one third from\n// expanded up. Stacking is M3's \"reflow\" strategy, where the supporting pane\n// moves under the main one rather than being dismissed. The spec's other\n// compact option is a bottom sheet, which is a different component's job —\n// reach for Sheet at the call site when the supporting content should be\n// summoned rather than scrolled to.\n//\n\ntype SupportingPaneProps = Omit<useRender.ComponentProps<'div'>, 'children'> & {\n /** The primary content. Takes two thirds of the width from expanded up. */\n main?: ReactNode;\n /**\n * Content that only means something beside `main`. Sits below it at compact,\n * and beside it from medium up.\n */\n supporting?: ReactNode;\n};\n\n/**\n * Material 3's supporting pane layout: a main pane and a companion that\n * reflows underneath it when there is no room beside it.\n *\n * Layout only — neither pane paints a surface or a border of its own, so what\n * goes in them is composed at the call site out of Cards, lists, or plain\n * content. `render` swaps the container's element, for a layout that should\n * be a `<main>` rather than a `<div>`.\n *\n * The panes are written to the DOM in the order they are shown, which is what\n * M3 asks of co-planar panes: focus order has to match the arrangement on\n * screen.\n */\nfunction SupportingPane({\n main,\n render,\n supporting,\n ...props\n}: SupportingPaneProps) {\n return useRender({\n defaultTagName: 'div',\n props: {\n ...props,\n children: <>\n <div className=\"xeuugli\">{main}</div>\n <div className=\"xeuugli\">{supporting}</div>\n </>,\n ...{\n className: \"xrvj5dj xj2l1yv x1mkdm3x xj1h9sb x1bg1yrb\"\n }\n },\n render\n });\n}\nexport type { SupportingPaneProps };\nexport default SupportingPane;"],"mappings":";;;;;;;;;;;;;;;;;AA4CA,SAAA,eAAA,IAAA;CAAA,MAAA,IAAA,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAwB,CAAA,CAAA,MAAA,QAAA,eAAA,SAAA;EAKF,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,OAAA,EAAA;EAAA,QAAA,EAAA;EAAA,SAAA,EAAA;EAAA,aAAA,EAAA;CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA;EAMZ,KAAA,oBAAA,OAAA;GAAe,WAAA;GAAW,UAAA;EAAW,CAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,YAAA;EACrC,KAAA,oBAAA,OAAA;GAAe,WAAA;GAAW,UAAA;EAAiB,CAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,EAAA,QAAA,IAAA;EAFrC,KAAA,qBAAA,UAAA,EAAA,UAAA,CACN,IACA,EAA2C,EAAA,CAAA;EAC1C,EAAA,KAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,OAAA,IAAA,2BAAA,GAAA;EACF,KAAA,EAAA,WACU,4CACb;EAAC,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,SAAA,EAAA,QAAA,IAAA;EARI,KAAA;GAAA,GACF;GAAK,UACE;GAGL,GACF;EAGL;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,UAAA,EAAA,QAAA,IAAA;EAXc,KAAA;GAAA,gBACC;GAAK,OACd;GASN;EAEH;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAbM,UAAU,EAahB;AAAC"}
package/dist/index.d.ts CHANGED
@@ -9,11 +9,13 @@ import Currency, { CurrencyProps } from "./components/currency/index.js";
9
9
  import IconButton, { IconButtonProps } from "./components/icon-button/index.js";
10
10
  import Keycap, { KeycapProps } from "./components/keycap/index.js";
11
11
  import Link, { LinkProps } from "./components/link/index.js";
12
+ import ListDetail, { ListDetailProps } from "./components/list-detail/index.js";
12
13
  import ListItem, { ListItemProps } from "./components/list-item/index.js";
13
14
  import Separator, { SeparatorProps } from "./components/separator/index.js";
14
15
  import Sheet, { SheetProps } from "./components/sheet/index.js";
16
+ import SupportingPane, { SupportingPaneProps } from "./components/supporting-pane/index.js";
15
17
  import Tabs, { TabsProps } from "./components/tabs/index.js";
16
18
  import Text, { TextProps } from "./components/text/index.js";
17
19
  import TextField, { TextFieldProps } from "./components/text-field/index.js";
18
20
  import "./components/index.js";
19
- export { Avatar, type AvatarProps, Badge, type BadgeProps, Button, type ButtonProps, Card, type CardProps, Chip, type ChipProps, Code, type CodeProps, CopyField, type CopyFieldProps, Currency, type CurrencyProps, IconButton, type IconButtonProps, Keycap, type KeycapProps, Link, type LinkProps, ListItem, type ListItemProps, Separator, type SeparatorProps, Sheet, type SheetProps, Tabs, type TabsProps, Text, TextField, type TextFieldProps, type TextProps };
21
+ export { Avatar, type AvatarProps, Badge, type BadgeProps, Button, type ButtonProps, Card, type CardProps, Chip, type ChipProps, Code, type CodeProps, CopyField, type CopyFieldProps, Currency, type CurrencyProps, IconButton, type IconButtonProps, Keycap, type KeycapProps, Link, type LinkProps, ListDetail, type ListDetailProps, ListItem, type ListItemProps, Separator, type SeparatorProps, Sheet, type SheetProps, SupportingPane, type SupportingPaneProps, Tabs, type TabsProps, Text, TextField, type TextFieldProps, type TextProps };
package/dist/index.js CHANGED
@@ -9,10 +9,12 @@ import Currency from "./components/currency/index.js";
9
9
  import IconButton from "./components/icon-button/index.js";
10
10
  import Keycap from "./components/keycap/index.js";
11
11
  import Link from "./components/link/index.js";
12
+ import ListDetail from "./components/list-detail/index.js";
12
13
  import ListItem from "./components/list-item/index.js";
13
14
  import Separator from "./components/separator/index.js";
14
15
  import Sheet from "./components/sheet/index.js";
16
+ import SupportingPane from "./components/supporting-pane/index.js";
15
17
  import Tabs from "./components/tabs/index.js";
16
18
  import Text from "./components/text/index.js";
17
19
  import TextField from "./components/text-field/index.js";
18
- export { Avatar, Badge, Button, Card, Chip, Code, CopyField, Currency, IconButton, Keycap, Link, ListItem, Separator, Sheet, Tabs, Text, TextField };
20
+ export { Avatar, Badge, Button, Card, Chip, Code, CopyField, Currency, IconButton, Keycap, Link, ListDetail, ListItem, Separator, Sheet, SupportingPane, Tabs, Text, TextField };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanso-labs/kanso-ui",
3
- "version": "0.4.6",
3
+ "version": "0.5.1",
4
4
  "description": "A React component library built on Base UI primitives and styled with StyleX, with design tokens sourced from a single W3C DTCG file and compiled via Style Dictionary",
5
5
  "keywords": [
6
6
  "react",
@@ -20,14 +20,16 @@
20
20
  "access": "public"
21
21
  },
22
22
  "type": "module",
23
+ "engines": {
24
+ "node": "^20.19.0 || >=22.12.0"
25
+ },
23
26
  "module": "./dist/index.js",
24
- "main": "./dist/cjs/index.cjs",
27
+ "main": "./dist/index.js",
25
28
  "types": "./dist/index.d.ts",
26
29
  "exports": {
27
30
  ".": {
28
31
  "types": "./dist/index.d.ts",
29
- "import": "./dist/index.js",
30
- "require": "./dist/cjs/index.cjs"
32
+ "default": "./dist/index.js"
31
33
  },
32
34
  "./tokens.css": "./dist/tokens.css",
33
35
  "./package.json": "./package.json"
@@ -63,7 +65,7 @@
63
65
  "@commitlint/cli": "21.2.2",
64
66
  "@commitlint/config-conventional": "21.2.2",
65
67
  "@eslint/js": "10.0.1",
66
- "@kanso-labs/unplugin-style-dictionary": "0.2.6",
68
+ "@kanso-labs/unplugin-style-dictionary": "0.4.0",
67
69
  "@rolldown/plugin-babel": "0.2.3",
68
70
  "@storybook/addon-a11y": "10.5.10",
69
71
  "@storybook/addon-docs": "10.5.10",
@@ -79,7 +81,7 @@
79
81
  "@vitest/coverage-v8": "4.1.11",
80
82
  "babel-plugin-react-compiler": "1.0.0",
81
83
  "eslint": "10.9.0",
82
- "eslint-plugin-oxlint": "1.78.0",
84
+ "eslint-plugin-oxlint": "1.79.0",
83
85
  "eslint-plugin-perfectionist": "5.10.1",
84
86
  "eslint-plugin-react-hooks": "7.1.1",
85
87
  "eslint-plugin-react-refresh": "0.5.4",
@@ -89,7 +91,7 @@
89
91
  "lint-staged": "17.3.0",
90
92
  "oxc-transform-react": "0.145.0",
91
93
  "oxfmt": "0.64.0",
92
- "oxlint": "1.78.0",
94
+ "oxlint": "1.79.0",
93
95
  "oxlint-tsgolint": "7.0.2001",
94
96
  "playwright": "1.62.1",
95
97
  "react": "19.2.8",