@combinedk/ui 3.0.0-beta.11

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 (96) hide show
  1. package/dist/index.cjs +1 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +19 -0
  4. package/dist/index10.cjs +2 -0
  5. package/dist/index10.cjs.map +1 -0
  6. package/dist/index10.js +289 -0
  7. package/dist/index10.js.map +1 -0
  8. package/dist/index11.cjs +2 -0
  9. package/dist/index11.cjs.map +1 -0
  10. package/dist/index11.js +52 -0
  11. package/dist/index11.js.map +1 -0
  12. package/dist/index12.cjs +2 -0
  13. package/dist/index12.cjs.map +1 -0
  14. package/dist/index12.js +133 -0
  15. package/dist/index12.js.map +1 -0
  16. package/dist/index13.cjs +2 -0
  17. package/dist/index13.cjs.map +1 -0
  18. package/dist/index13.js +150 -0
  19. package/dist/index13.js.map +1 -0
  20. package/dist/index14.cjs +2 -0
  21. package/dist/index14.cjs.map +1 -0
  22. package/dist/index14.js +100 -0
  23. package/dist/index14.js.map +1 -0
  24. package/dist/index15.cjs +2 -0
  25. package/dist/index15.cjs.map +1 -0
  26. package/dist/index15.js +35 -0
  27. package/dist/index15.js.map +1 -0
  28. package/dist/index16.cjs +2 -0
  29. package/dist/index16.cjs.map +1 -0
  30. package/dist/index16.js +330 -0
  31. package/dist/index16.js.map +1 -0
  32. package/dist/index17.cjs +2 -0
  33. package/dist/index17.cjs.map +1 -0
  34. package/dist/index17.js +114 -0
  35. package/dist/index17.js.map +1 -0
  36. package/dist/index18.cjs +2 -0
  37. package/dist/index18.cjs.map +1 -0
  38. package/dist/index18.js +110 -0
  39. package/dist/index18.js.map +1 -0
  40. package/dist/index19.cjs +2 -0
  41. package/dist/index19.cjs.map +1 -0
  42. package/dist/index19.js +24 -0
  43. package/dist/index19.js.map +1 -0
  44. package/dist/index2.cjs +2 -0
  45. package/dist/index2.cjs.map +1 -0
  46. package/dist/index2.js +90 -0
  47. package/dist/index2.js.map +1 -0
  48. package/dist/index3.cjs +2 -0
  49. package/dist/index3.cjs.map +1 -0
  50. package/dist/index3.js +71 -0
  51. package/dist/index3.js.map +1 -0
  52. package/dist/index4.cjs +2 -0
  53. package/dist/index4.cjs.map +1 -0
  54. package/dist/index4.js +32 -0
  55. package/dist/index4.js.map +1 -0
  56. package/dist/index5.cjs +2 -0
  57. package/dist/index5.cjs.map +1 -0
  58. package/dist/index5.js +27 -0
  59. package/dist/index5.js.map +1 -0
  60. package/dist/index6.cjs +2 -0
  61. package/dist/index6.cjs.map +1 -0
  62. package/dist/index6.js +23 -0
  63. package/dist/index6.js.map +1 -0
  64. package/dist/index7.cjs +2 -0
  65. package/dist/index7.cjs.map +1 -0
  66. package/dist/index7.js +82 -0
  67. package/dist/index7.js.map +1 -0
  68. package/dist/index8.cjs +2 -0
  69. package/dist/index8.cjs.map +1 -0
  70. package/dist/index8.js +93 -0
  71. package/dist/index8.js.map +1 -0
  72. package/dist/index9.cjs +2 -0
  73. package/dist/index9.cjs.map +1 -0
  74. package/dist/index9.js +99 -0
  75. package/dist/index9.js.map +1 -0
  76. package/dist/src/components/Badge.d.ts +9 -0
  77. package/dist/src/components/Button.d.ts +11 -0
  78. package/dist/src/components/Card.d.ts +9 -0
  79. package/dist/src/components/Checkbox.d.ts +22 -0
  80. package/dist/src/components/ConfirmDialog.d.ts +13 -0
  81. package/dist/src/components/DropdownMenu.d.ts +24 -0
  82. package/dist/src/components/EmptyState.d.ts +9 -0
  83. package/dist/src/components/Field.d.ts +24 -0
  84. package/dist/src/components/Input.d.ts +9 -0
  85. package/dist/src/components/Modal.d.ts +12 -0
  86. package/dist/src/components/PageHeader.d.ts +11 -0
  87. package/dist/src/components/PreviewBadge.d.ts +8 -0
  88. package/dist/src/components/Select.d.ts +32 -0
  89. package/dist/src/components/Skeleton.d.ts +21 -0
  90. package/dist/src/components/StatusPill.d.ts +7 -0
  91. package/dist/src/components/Table.d.ts +26 -0
  92. package/dist/src/components/Tag.d.ts +5 -0
  93. package/dist/src/components/Toast.d.ts +13 -0
  94. package/dist/src/index.d.ts +21 -0
  95. package/package.json +43 -0
  96. package/src/tokens.css +151 -0
package/dist/index8.js ADDED
@@ -0,0 +1,93 @@
1
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
+ //#region src/components/PageHeader.tsx
3
+ function n({ title: n, group: r, subtitle: i, icon: a, actions: o }) {
4
+ return /* @__PURE__ */ t("div", {
5
+ style: { marginBottom: 28 },
6
+ children: [
7
+ /* @__PURE__ */ t("div", {
8
+ style: {
9
+ display: "flex",
10
+ alignItems: "center",
11
+ justifyContent: "space-between",
12
+ gap: 16,
13
+ flexWrap: "wrap",
14
+ marginBottom: i ? 6 : 0
15
+ },
16
+ children: [/* @__PURE__ */ t("div", {
17
+ style: {
18
+ display: "flex",
19
+ alignItems: "center",
20
+ gap: 10,
21
+ flexWrap: "wrap",
22
+ minWidth: 0
23
+ },
24
+ children: [
25
+ a && /* @__PURE__ */ e("span", {
26
+ style: {
27
+ color: "var(--c-text-subtle)",
28
+ display: "inline-flex",
29
+ flexShrink: 0
30
+ },
31
+ children: a
32
+ }),
33
+ /* @__PURE__ */ e("h1", {
34
+ style: {
35
+ fontFamily: "var(--font-sans)",
36
+ fontSize: 20,
37
+ fontWeight: 700,
38
+ color: "var(--c-text)",
39
+ lineHeight: 1.2,
40
+ margin: 0,
41
+ letterSpacing: "-0.01em"
42
+ },
43
+ children: n
44
+ }),
45
+ r && /* @__PURE__ */ e("span", {
46
+ style: {
47
+ fontFamily: "var(--font-sans)",
48
+ fontSize: 10.5,
49
+ fontWeight: 600,
50
+ color: "var(--c-text-subtle)",
51
+ background: "var(--color-neutral-100)",
52
+ padding: "2px 8px",
53
+ borderRadius: 10,
54
+ textTransform: "uppercase",
55
+ letterSpacing: "0.05em",
56
+ whiteSpace: "nowrap"
57
+ },
58
+ children: r
59
+ })
60
+ ]
61
+ }), o && /* @__PURE__ */ e("div", {
62
+ style: {
63
+ display: "flex",
64
+ alignItems: "center",
65
+ gap: 8,
66
+ flexShrink: 0
67
+ },
68
+ children: o
69
+ })]
70
+ }),
71
+ i && /* @__PURE__ */ e("p", {
72
+ style: {
73
+ fontFamily: "var(--font-sans)",
74
+ fontSize: 14,
75
+ color: "var(--c-text-secondary)",
76
+ lineHeight: 1.55,
77
+ margin: 0,
78
+ maxWidth: 560
79
+ },
80
+ children: i
81
+ }),
82
+ /* @__PURE__ */ e("div", { style: {
83
+ marginTop: 20,
84
+ height: 1,
85
+ background: "var(--c-border)"
86
+ } })
87
+ ]
88
+ });
89
+ }
90
+ //#endregion
91
+ export { n as PageHeader };
92
+
93
+ //# sourceMappingURL=index8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index8.js","names":[],"sources":["../src/components/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\ninterface PageHeaderProps {\n title: string\n /** Nav group label — \"Build\", \"Run\", or \"System\" */\n group?: string\n subtitle?: string\n icon?: ReactNode\n actions?: ReactNode\n}\n\nexport function PageHeader({ title, group, subtitle, icon, actions }: PageHeaderProps) {\n return (\n <div style={{ marginBottom: 28 }}>\n {/* Title row */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 16,\n flexWrap: 'wrap',\n marginBottom: subtitle ? 6 : 0,\n }}>\n {/* Left: icon + title + group pill */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap', minWidth: 0 }}>\n {icon && (\n <span style={{\n color: 'var(--c-text-subtle)',\n display: 'inline-flex',\n flexShrink: 0,\n }}>\n {icon}\n </span>\n )}\n\n <h1 style={{\n fontFamily: 'var(--font-sans)',\n fontSize: 20,\n fontWeight: 700,\n color: 'var(--c-text)',\n lineHeight: 1.2,\n margin: 0,\n letterSpacing: '-0.01em',\n }}>\n {title}\n </h1>\n\n {group && (\n <span style={{\n fontFamily: 'var(--font-sans)',\n fontSize: 10.5,\n fontWeight: 600,\n color: 'var(--c-text-subtle)',\n background: 'var(--color-neutral-100)',\n padding: '2px 8px',\n borderRadius: 10,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n whiteSpace: 'nowrap',\n }}>\n {group}\n </span>\n )}\n </div>\n\n {/* Right: action buttons */}\n {actions && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexShrink: 0 }}>\n {actions}\n </div>\n )}\n </div>\n\n {/* Subtitle */}\n {subtitle && (\n <p style={{\n fontFamily: 'var(--font-sans)',\n fontSize: 14,\n color: 'var(--c-text-secondary)',\n lineHeight: 1.55,\n margin: 0,\n maxWidth: 560,\n }}>\n {subtitle}\n </p>\n )}\n\n {/* Divider */}\n <div style={{\n marginTop: 20,\n height: 1,\n background: 'var(--c-border)',\n }} />\n </div>\n )\n}\n"],"mappings":";;AAWA,SAAgB,EAAW,EAAE,UAAO,UAAO,aAAU,SAAM,cAA4B;AACrF,QACE,kBAAC,OAAD;EAAK,OAAO,EAAE,cAAc,IAAI;YAAhC;GAEE,kBAAC,OAAD;IAAK,OAAO;KACV,SAAgB;KAChB,YAAgB;KAChB,gBAAgB;KAChB,KAAgB;KAChB,UAAgB;KAChB,cAAgB,IAAW,IAAI;KAChC;cAPD,CASE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAU,KAAK;MAAI,UAAU;MAAQ,UAAU;MAAG;eAA7F;MACG,KACC,kBAAC,QAAD;OAAM,OAAO;QACX,OAAa;QACb,SAAa;QACb,YAAa;QACd;iBACE;OACI,CAAA;MAGT,kBAAC,MAAD;OAAI,OAAO;QACT,YAAe;QACf,UAAe;QACf,YAAe;QACf,OAAe;QACf,YAAe;QACf,QAAe;QACf,eAAe;QAChB;iBACE;OACE,CAAA;MAEJ,KACC,kBAAC,QAAD;OAAM,OAAO;QACX,YAAe;QACf,UAAe;QACf,YAAe;QACf,OAAe;QACf,YAAe;QACf,SAAe;QACf,cAAe;QACf,eAAe;QACf,eAAe;QACf,YAAe;QAChB;iBACE;OACI,CAAA;MAEL;QAGL,KACC,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAU,KAAK;MAAG,YAAY;MAAG;eACzE;KACG,CAAA,CAEJ;;GAGL,KACC,kBAAC,KAAD;IAAG,OAAO;KACR,YAAa;KACb,UAAa;KACb,OAAa;KACb,YAAa;KACb,QAAa;KACb,UAAa;KACd;cACE;IACC,CAAA;GAIN,kBAAC,OAAD,EAAK,OAAO;IACV,WAAa;IACb,QAAa;IACb,YAAa;IACd,EAAI,CAAA;GACD"}
@@ -0,0 +1,2 @@
1
+ let e=require(`react`),t=require(`react/jsx-runtime`),n=require(`react-dom`);function r({open:r,onClose:i,title:a,subtitle:o,children:s,actions:c,width:l=440}){return(0,e.useEffect)(()=>{if(!r)return;let e=e=>{e.key===`Escape`&&i()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[r,i]),r?(0,n.createPortal)((0,t.jsx)(`div`,{onClick:i,style:{position:`fixed`,inset:0,background:`var(--c-overlay)`,backdropFilter:`blur(4px)`,display:`flex`,alignItems:`center`,justifyContent:`center`,zIndex:1e3},children:(0,t.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{background:`var(--c-surface)`,borderRadius:14,padding:`28px 32px`,boxShadow:`0 20px 60px rgba(47,56,67,0.20)`,width:l,maxWidth:`90vw`,animation:`modalIn 0.18s ease`},children:[(0,t.jsxs)(`div`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`flex-start`,marginBottom:16},children:[(0,t.jsxs)(`div`,{children:[(0,t.jsx)(`div`,{style:{fontFamily:`var(--font-sans)`,fontSize:18,fontWeight:700,color:`var(--c-text)`},children:a}),o&&(0,t.jsx)(`div`,{style:{fontFamily:`var(--font-sans)`,fontSize:13,color:`var(--c-text-secondary)`,marginTop:4},children:o})]}),(0,t.jsx)(`button`,{onClick:i,style:{background:`none`,border:`none`,cursor:`pointer`,color:`var(--c-text-muted)`,fontSize:18,lineHeight:1,padding:0,flexShrink:0},children:`✕`})]}),(0,t.jsx)(`div`,{style:{fontFamily:`var(--font-sans)`,fontSize:14,color:`var(--c-text)`,lineHeight:1.6},children:s}),c&&(0,t.jsx)(`div`,{style:{display:`flex`,gap:8,justifyContent:`flex-end`,marginTop:24},children:c})]})}),document.body):null}exports.Modal=r;
2
+ //# sourceMappingURL=index9.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index9.cjs","names":[],"sources":["../src/components/Modal.tsx"],"sourcesContent":["import { type ReactNode, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\n\ninterface ModalProps {\n open: boolean\n onClose: () => void\n title: string\n subtitle?: string\n children: ReactNode\n actions?: ReactNode\n width?: number\n}\n\nexport function Modal({ open, onClose, title, subtitle, children, actions, width = 440 }: ModalProps) {\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n if (!open) return null\n\n return createPortal(\n <div\n onClick={onClose}\n style={{\n position: 'fixed',\n inset: 0,\n background: 'var(--c-overlay)',\n backdropFilter: 'blur(4px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1000,\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--c-surface)',\n borderRadius: 14,\n padding: '28px 32px',\n boxShadow: '0 20px 60px rgba(47,56,67,0.20)',\n width,\n maxWidth: '90vw',\n animation: 'modalIn 0.18s ease',\n }}\n >\n {/* Header */}\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 16 }}>\n <div>\n <div style={{ fontFamily: 'var(--font-sans)', fontSize: 18, fontWeight: 700, color: 'var(--c-text)' }}>\n {title}\n </div>\n {subtitle && (\n <div style={{ fontFamily: 'var(--font-sans)', fontSize: 13, color: 'var(--c-text-secondary)', marginTop: 4 }}>\n {subtitle}\n </div>\n )}\n </div>\n <button\n onClick={onClose}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--c-text-muted)', fontSize: 18, lineHeight: 1, padding: 0, flexShrink: 0 }}\n >\n ✕\n </button>\n </div>\n\n {/* Body */}\n <div style={{ fontFamily: 'var(--font-sans)', fontSize: 14, color: 'var(--c-text)', lineHeight: 1.6 }}>\n {children}\n </div>\n\n {/* Footer */}\n {actions && (\n <div style={{ display: 'flex', gap: 8, justifyContent: 'flex-end', marginTop: 24 }}>\n {actions}\n </div>\n )}\n </div>\n </div>,\n document.body\n )\n}\n"],"mappings":"6EAaA,SAAgB,EAAM,CAAE,OAAM,UAAS,QAAO,WAAU,WAAU,UAAS,QAAQ,KAAmB,CAUpG,OATA,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,EAAM,OACX,IAAM,EAAS,GAAqB,CAAM,EAAE,MAAQ,UAAU,GAAS,EAEvE,OADA,SAAS,iBAAiB,UAAW,EAAM,KAC9B,SAAS,oBAAoB,UAAW,EAAM,EAC1D,CAAC,EAAM,EAAQ,CAAC,CAEd,GAEL,EAAA,EAAA,eACE,EAAA,EAAA,KAAC,MAAD,CACE,QAAS,EACT,MAAO,CACL,SAAgB,QAChB,MAAgB,EAChB,WAAgB,mBAChB,eAAgB,YAChB,QAAgB,OAChB,WAAgB,SAChB,eAAgB,SAChB,OAAgB,IACjB,WAED,EAAA,EAAA,MAAC,MAAD,CACE,QAAS,GAAK,EAAE,iBAAiB,CACjC,MAAO,CACL,WAAc,mBACd,aAAc,GACd,QAAc,YACd,UAAc,kCACd,QACA,SAAc,OACd,UAAc,qBACf,UAVH,EAaE,EAAA,EAAA,MAAC,MAAD,CAAK,MAAO,CAAE,QAAS,OAAQ,eAAgB,gBAAiB,WAAY,aAAc,aAAc,GAAI,UAA5G,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,MAAO,CAAE,WAAY,mBAAoB,SAAU,GAAI,WAAY,IAAK,MAAO,gBAAiB,UAClG,EACG,CAAA,CACL,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,MAAO,CAAE,WAAY,mBAAoB,SAAU,GAAI,MAAO,0BAA2B,UAAW,EAAG,UACzG,EACG,CAAA,CAEJ,CAAA,CAAA,EACN,EAAA,EAAA,KAAC,SAAD,CACE,QAAS,EACT,MAAO,CAAE,WAAY,OAAQ,OAAQ,OAAQ,OAAQ,UAAW,MAAO,sBAAuB,SAAU,GAAI,WAAY,EAAG,QAAS,EAAG,WAAY,EAAG,UACvJ,IAEQ,CAAA,CACL,IAGN,EAAA,EAAA,KAAC,MAAD,CAAK,MAAO,CAAE,WAAY,mBAAoB,SAAU,GAAI,MAAO,gBAAiB,WAAY,IAAK,CAClG,WACG,CAAA,CAGL,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,MAAO,CAAE,QAAS,OAAQ,IAAK,EAAG,eAAgB,WAAY,UAAW,GAAI,UAC/E,EACG,CAAA,CAEJ,GACF,CAAA,CACN,SAAS,KACV,CA9DiB"}
package/dist/index9.js ADDED
@@ -0,0 +1,99 @@
1
+ import { useEffect as e } from "react";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ import { createPortal as r } from "react-dom";
4
+ //#region src/components/Modal.tsx
5
+ function i({ open: i, onClose: a, title: o, subtitle: s, children: c, actions: l, width: u = 440 }) {
6
+ return e(() => {
7
+ if (!i) return;
8
+ let e = (e) => {
9
+ e.key === "Escape" && a();
10
+ };
11
+ return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
12
+ }, [i, a]), i ? r(/* @__PURE__ */ t("div", {
13
+ onClick: a,
14
+ style: {
15
+ position: "fixed",
16
+ inset: 0,
17
+ background: "var(--c-overlay)",
18
+ backdropFilter: "blur(4px)",
19
+ display: "flex",
20
+ alignItems: "center",
21
+ justifyContent: "center",
22
+ zIndex: 1e3
23
+ },
24
+ children: /* @__PURE__ */ n("div", {
25
+ onClick: (e) => e.stopPropagation(),
26
+ style: {
27
+ background: "var(--c-surface)",
28
+ borderRadius: 14,
29
+ padding: "28px 32px",
30
+ boxShadow: "0 20px 60px rgba(47,56,67,0.20)",
31
+ width: u,
32
+ maxWidth: "90vw",
33
+ animation: "modalIn 0.18s ease"
34
+ },
35
+ children: [
36
+ /* @__PURE__ */ n("div", {
37
+ style: {
38
+ display: "flex",
39
+ justifyContent: "space-between",
40
+ alignItems: "flex-start",
41
+ marginBottom: 16
42
+ },
43
+ children: [/* @__PURE__ */ n("div", { children: [/* @__PURE__ */ t("div", {
44
+ style: {
45
+ fontFamily: "var(--font-sans)",
46
+ fontSize: 18,
47
+ fontWeight: 700,
48
+ color: "var(--c-text)"
49
+ },
50
+ children: o
51
+ }), s && /* @__PURE__ */ t("div", {
52
+ style: {
53
+ fontFamily: "var(--font-sans)",
54
+ fontSize: 13,
55
+ color: "var(--c-text-secondary)",
56
+ marginTop: 4
57
+ },
58
+ children: s
59
+ })] }), /* @__PURE__ */ t("button", {
60
+ onClick: a,
61
+ style: {
62
+ background: "none",
63
+ border: "none",
64
+ cursor: "pointer",
65
+ color: "var(--c-text-muted)",
66
+ fontSize: 18,
67
+ lineHeight: 1,
68
+ padding: 0,
69
+ flexShrink: 0
70
+ },
71
+ children: "✕"
72
+ })]
73
+ }),
74
+ /* @__PURE__ */ t("div", {
75
+ style: {
76
+ fontFamily: "var(--font-sans)",
77
+ fontSize: 14,
78
+ color: "var(--c-text)",
79
+ lineHeight: 1.6
80
+ },
81
+ children: c
82
+ }),
83
+ l && /* @__PURE__ */ t("div", {
84
+ style: {
85
+ display: "flex",
86
+ gap: 8,
87
+ justifyContent: "flex-end",
88
+ marginTop: 24
89
+ },
90
+ children: l
91
+ })
92
+ ]
93
+ })
94
+ }), document.body) : null;
95
+ }
96
+ //#endregion
97
+ export { i as Modal };
98
+
99
+ //# sourceMappingURL=index9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index9.js","names":[],"sources":["../src/components/Modal.tsx"],"sourcesContent":["import { type ReactNode, useEffect } from 'react'\nimport { createPortal } from 'react-dom'\n\ninterface ModalProps {\n open: boolean\n onClose: () => void\n title: string\n subtitle?: string\n children: ReactNode\n actions?: ReactNode\n width?: number\n}\n\nexport function Modal({ open, onClose, title, subtitle, children, actions, width = 440 }: ModalProps) {\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n if (!open) return null\n\n return createPortal(\n <div\n onClick={onClose}\n style={{\n position: 'fixed',\n inset: 0,\n background: 'var(--c-overlay)',\n backdropFilter: 'blur(4px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1000,\n }}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: 'var(--c-surface)',\n borderRadius: 14,\n padding: '28px 32px',\n boxShadow: '0 20px 60px rgba(47,56,67,0.20)',\n width,\n maxWidth: '90vw',\n animation: 'modalIn 0.18s ease',\n }}\n >\n {/* Header */}\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 16 }}>\n <div>\n <div style={{ fontFamily: 'var(--font-sans)', fontSize: 18, fontWeight: 700, color: 'var(--c-text)' }}>\n {title}\n </div>\n {subtitle && (\n <div style={{ fontFamily: 'var(--font-sans)', fontSize: 13, color: 'var(--c-text-secondary)', marginTop: 4 }}>\n {subtitle}\n </div>\n )}\n </div>\n <button\n onClick={onClose}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--c-text-muted)', fontSize: 18, lineHeight: 1, padding: 0, flexShrink: 0 }}\n >\n ✕\n </button>\n </div>\n\n {/* Body */}\n <div style={{ fontFamily: 'var(--font-sans)', fontSize: 14, color: 'var(--c-text)', lineHeight: 1.6 }}>\n {children}\n </div>\n\n {/* Footer */}\n {actions && (\n <div style={{ display: 'flex', gap: 8, justifyContent: 'flex-end', marginTop: 24 }}>\n {actions}\n </div>\n )}\n </div>\n </div>,\n document.body\n )\n}\n"],"mappings":";;;;AAaA,SAAgB,EAAM,EAAE,SAAM,YAAS,UAAO,aAAU,aAAU,YAAS,WAAQ,OAAmB;AAUpG,QATA,QAAgB;AACd,MAAI,CAAC,EAAM;EACX,IAAM,KAAS,MAAqB;AAAE,GAAI,EAAE,QAAQ,YAAU,GAAS;;AAEvE,SADA,SAAS,iBAAiB,WAAW,EAAM,QAC9B,SAAS,oBAAoB,WAAW,EAAM;IAC1D,CAAC,GAAM,EAAQ,CAAC,EAEd,IAEE,EACL,kBAAC,OAAD;EACE,SAAS;EACT,OAAO;GACL,UAAgB;GAChB,OAAgB;GAChB,YAAgB;GAChB,gBAAgB;GAChB,SAAgB;GAChB,YAAgB;GAChB,gBAAgB;GAChB,QAAgB;GACjB;YAED,kBAAC,OAAD;GACE,UAAS,MAAK,EAAE,iBAAiB;GACjC,OAAO;IACL,YAAc;IACd,cAAc;IACd,SAAc;IACd,WAAc;IACd;IACA,UAAc;IACd,WAAc;IACf;aAVH;IAaE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,gBAAgB;MAAiB,YAAY;MAAc,cAAc;MAAI;eAA5G,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,OAAO;OAAE,YAAY;OAAoB,UAAU;OAAI,YAAY;OAAK,OAAO;OAAiB;gBAClG;MACG,CAAA,EACL,KACC,kBAAC,OAAD;MAAK,OAAO;OAAE,YAAY;OAAoB,UAAU;OAAI,OAAO;OAA2B,WAAW;OAAG;gBACzG;MACG,CAAA,CAEJ,EAAA,CAAA,EACN,kBAAC,UAAD;MACE,SAAS;MACT,OAAO;OAAE,YAAY;OAAQ,QAAQ;OAAQ,QAAQ;OAAW,OAAO;OAAuB,UAAU;OAAI,YAAY;OAAG,SAAS;OAAG,YAAY;OAAG;gBACvJ;MAEQ,CAAA,CACL;;IAGN,kBAAC,OAAD;KAAK,OAAO;MAAE,YAAY;MAAoB,UAAU;MAAI,OAAO;MAAiB,YAAY;MAAK;KAClG;KACG,CAAA;IAGL,KACC,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,KAAK;MAAG,gBAAgB;MAAY,WAAW;MAAI;eAC/E;KACG,CAAA;IAEJ;;EACF,CAAA,EACN,SAAS,KACV,GA9DiB"}
@@ -0,0 +1,9 @@
1
+ import { ReactNode } from 'react';
2
+ type BadgeVariant = 'default' | 'success' | 'warning' | 'error' | 'info' | 'brand' | 'dark';
3
+ interface BadgeProps {
4
+ variant?: BadgeVariant;
5
+ dot?: boolean;
6
+ children: ReactNode;
7
+ }
8
+ export declare function Badge({ variant, dot, children }: BadgeProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,11 @@
1
+ import { ReactNode, ButtonHTMLAttributes } from 'react';
2
+ type Variant = 'primary' | 'secondary' | 'ghost' | 'destructive' | 'outline' | 'accent';
3
+ type Size = 'sm' | 'md' | 'lg';
4
+ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
5
+ variant?: Variant;
6
+ size?: Size;
7
+ icon?: ReactNode;
8
+ children?: ReactNode;
9
+ }
10
+ export declare function Button({ variant, size, icon, children, disabled, style, ...rest }: ButtonProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,9 @@
1
+ import { ReactNode, HTMLAttributes } from 'react';
2
+ interface CardProps extends HTMLAttributes<HTMLDivElement> {
3
+ children: ReactNode;
4
+ /** Show amber left-border accent and subtle bg shift on hover */
5
+ interactive?: boolean;
6
+ padding?: string;
7
+ }
8
+ export declare function Card({ children, interactive, padding, style, ...rest }: CardProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,22 @@
1
+ interface CheckboxProps {
2
+ checked: boolean;
3
+ onChange: (v: boolean) => void;
4
+ label?: string;
5
+ disabled?: boolean;
6
+ }
7
+ export declare function Checkbox({ checked, onChange, label, disabled }: CheckboxProps): import("react/jsx-runtime").JSX.Element;
8
+ interface RadioProps {
9
+ checked: boolean;
10
+ onChange: () => void;
11
+ label?: string;
12
+ disabled?: boolean;
13
+ }
14
+ export declare function Radio({ checked, onChange, label, disabled }: RadioProps): import("react/jsx-runtime").JSX.Element;
15
+ interface SwitchProps {
16
+ checked: boolean;
17
+ onChange: (v: boolean) => void;
18
+ label?: string;
19
+ disabled?: boolean;
20
+ }
21
+ export declare function Switch({ checked, onChange, label, disabled }: SwitchProps): import("react/jsx-runtime").JSX.Element;
22
+ export {};
@@ -0,0 +1,13 @@
1
+ interface ConfirmDialogProps {
2
+ open: boolean;
3
+ onClose: () => void;
4
+ onConfirm: () => void;
5
+ title: string;
6
+ body?: string;
7
+ confirmLabel?: string;
8
+ cancelLabel?: string;
9
+ confirmVariant?: 'destructive' | 'primary';
10
+ loading?: boolean;
11
+ }
12
+ export declare function ConfirmDialog({ open, onClose, onConfirm, title, body, confirmLabel, cancelLabel, confirmVariant, loading, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
@@ -0,0 +1,24 @@
1
+ import { ReactNode } from 'react';
2
+ export interface DropdownMenuItem {
3
+ label: string;
4
+ icon?: ReactNode;
5
+ onClick?: () => void;
6
+ variant?: 'default' | 'destructive';
7
+ disabled?: boolean;
8
+ separator?: never;
9
+ }
10
+ export interface DropdownMenuSeparator {
11
+ separator: true;
12
+ label?: never;
13
+ onClick?: never;
14
+ variant?: never;
15
+ disabled?: never;
16
+ }
17
+ export type DropdownMenuEntry = DropdownMenuItem | DropdownMenuSeparator;
18
+ interface DropdownMenuProps {
19
+ trigger: ReactNode;
20
+ items: DropdownMenuEntry[];
21
+ align?: 'left' | 'right';
22
+ }
23
+ export declare function DropdownMenu({ trigger, items, align }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};
@@ -0,0 +1,9 @@
1
+ import { ReactNode } from 'react';
2
+ interface EmptyStateProps {
3
+ icon?: ReactNode;
4
+ title: string;
5
+ body?: string;
6
+ action?: ReactNode;
7
+ }
8
+ export declare function EmptyState({ icon, title, body, action }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,24 @@
1
+ import { ReactNode, TextareaHTMLAttributes } from 'react';
2
+ interface FieldProps {
3
+ label: string;
4
+ required?: boolean;
5
+ error?: string;
6
+ help?: string;
7
+ children: ReactNode;
8
+ }
9
+ export declare function Field({ label, required, error, help, children }: FieldProps): import("react/jsx-runtime").JSX.Element;
10
+ interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
11
+ error?: boolean;
12
+ mono?: boolean;
13
+ }
14
+ export declare function Textarea({ error, mono, style, ...rest }: TextareaProps): import("react/jsx-runtime").JSX.Element;
15
+ interface SegmentedControlProps {
16
+ options: string[] | Array<{
17
+ value: string;
18
+ label: string;
19
+ }>;
20
+ value: string;
21
+ onChange: (v: string) => void;
22
+ }
23
+ export declare function SegmentedControl({ options, value, onChange }: SegmentedControlProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};
@@ -0,0 +1,9 @@
1
+ import { InputHTMLAttributes, ReactNode } from 'react';
2
+ interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'prefix'> {
3
+ label?: string;
4
+ hint?: string;
5
+ error?: string;
6
+ prefix?: ReactNode;
7
+ }
8
+ export declare function Input({ label, hint, error, prefix, style, ...rest }: InputProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,12 @@
1
+ import { ReactNode } from 'react';
2
+ interface ModalProps {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ title: string;
6
+ subtitle?: string;
7
+ children: ReactNode;
8
+ actions?: ReactNode;
9
+ width?: number;
10
+ }
11
+ export declare function Modal({ open, onClose, title, subtitle, children, actions, width }: ModalProps): import('react').ReactPortal | null;
12
+ export {};
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from 'react';
2
+ interface PageHeaderProps {
3
+ title: string;
4
+ /** Nav group label — "Build", "Run", or "System" */
5
+ group?: string;
6
+ subtitle?: string;
7
+ icon?: ReactNode;
8
+ actions?: ReactNode;
9
+ }
10
+ export declare function PageHeader({ title, group, subtitle, icon, actions }: PageHeaderProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,8 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function PreviewBadge(): import("react/jsx-runtime").JSX.Element;
3
+ export declare function PreviewHeader({ title, lead, icon, actions, }: {
4
+ title: string;
5
+ lead: string;
6
+ icon?: ReactNode;
7
+ actions?: ReactNode;
8
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,32 @@
1
+ interface SelectProps {
2
+ value: string;
3
+ onChange: (v: string) => void;
4
+ options: string[] | Array<{
5
+ value: string;
6
+ label: string;
7
+ }>;
8
+ placeholder?: string;
9
+ disabled?: boolean;
10
+ }
11
+ export declare function Select({ value, onChange, options, placeholder, disabled }: SelectProps): import("react/jsx-runtime").JSX.Element;
12
+ interface MultiSelectProps {
13
+ values: string[];
14
+ onChange: (v: string[]) => void;
15
+ options: string[] | Array<{
16
+ value: string;
17
+ label: string;
18
+ }>;
19
+ placeholder?: string;
20
+ }
21
+ export declare function MultiSelect({ values, onChange, options, placeholder }: MultiSelectProps): import("react/jsx-runtime").JSX.Element;
22
+ interface ComboboxProps {
23
+ value: string;
24
+ onChange: (v: string) => void;
25
+ options: string[] | Array<{
26
+ value: string;
27
+ label: string;
28
+ }>;
29
+ placeholder?: string;
30
+ }
31
+ export declare function Combobox({ value, onChange, options, placeholder }: ComboboxProps): import("react/jsx-runtime").JSX.Element;
32
+ export {};
@@ -0,0 +1,21 @@
1
+ import { CSSProperties } from 'react';
2
+ interface SkeletonProps {
3
+ width?: number | string;
4
+ height?: number | string;
5
+ radius?: number | string;
6
+ style?: CSSProperties;
7
+ }
8
+ export declare function Skeleton({ width, height, radius, style }: SkeletonProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function SkeletonTableRow({ cols }: {
10
+ cols?: number;
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ export declare function SkeletonTable({ rows, cols }: {
13
+ rows?: number;
14
+ cols?: number;
15
+ }): import("react/jsx-runtime").JSX.Element;
16
+ export declare function SkeletonText({ lines, lastWidth }: {
17
+ lines?: number;
18
+ lastWidth?: string;
19
+ }): import("react/jsx-runtime").JSX.Element;
20
+ export declare function SkeletonCard(): import("react/jsx-runtime").JSX.Element;
21
+ export {};
@@ -0,0 +1,7 @@
1
+ type Status = 'Published' | 'Draft' | 'Archived' | 'Running' | 'Completed' | 'Failed' | 'Paused';
2
+ interface StatusPillProps {
3
+ status: Status;
4
+ pulse?: boolean;
5
+ }
6
+ export declare function StatusPill({ status, pulse }: StatusPillProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,26 @@
1
+ import { ReactNode } from 'react';
2
+ export interface TableColumn<T> {
3
+ key: string;
4
+ label: string;
5
+ sortable?: boolean;
6
+ width?: number | string;
7
+ render?: (row: T) => ReactNode;
8
+ }
9
+ interface TableProps<T extends Record<string, unknown>> {
10
+ columns: TableColumn<T>[];
11
+ data: T[];
12
+ keyField: keyof T;
13
+ selectable?: boolean;
14
+ selected?: Set<string>;
15
+ onSelectionChange?: (next: Set<string>) => void;
16
+ onRowClick?: (row: T) => void;
17
+ emptyMessage?: string;
18
+ totalCount?: number;
19
+ page?: number;
20
+ pageSize?: number;
21
+ onPageChange?: (page: number) => void;
22
+ bulkActions?: (selected: Set<string>, clearSelection: () => void) => ReactNode;
23
+ expandable?: (row: T) => ReactNode;
24
+ }
25
+ export declare function Table<T extends Record<string, unknown>>({ columns, data, keyField, selectable, selected: externalSelected, onSelectionChange, onRowClick, emptyMessage, totalCount, page, pageSize, onPageChange, bulkActions, expandable, }: TableProps<T>): import("react/jsx-runtime").JSX.Element;
26
+ export {};
@@ -0,0 +1,5 @@
1
+ interface TagProps {
2
+ children: string;
3
+ }
4
+ export declare function Tag({ children }: TagProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
@@ -0,0 +1,13 @@
1
+ import { ReactNode } from 'react';
2
+ export type ToastKind = 'success' | 'info' | 'warning' | 'error';
3
+ interface ToastContextValue {
4
+ success: (title: string, body?: string) => void;
5
+ info: (title: string, body?: string) => void;
6
+ warning: (title: string, body?: string) => void;
7
+ error: (title: string, body?: string) => void;
8
+ }
9
+ export declare function ToastProvider({ children }: {
10
+ children: ReactNode;
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ export declare function useToast(): ToastContextValue;
13
+ export {};
@@ -0,0 +1,21 @@
1
+ export { Button } from './components/Button';
2
+ export { Badge } from './components/Badge';
3
+ export { StatusPill } from './components/StatusPill';
4
+ export { Card } from './components/Card';
5
+ export { Tag } from './components/Tag';
6
+ export { Input } from './components/Input';
7
+ export { PageHeader } from './components/PageHeader';
8
+ export { Modal } from './components/Modal';
9
+ export { Table } from './components/Table';
10
+ export type { TableColumn } from './components/Table';
11
+ export { EmptyState } from './components/EmptyState';
12
+ export { Skeleton, SkeletonTable, SkeletonTableRow, SkeletonText, SkeletonCard } from './components/Skeleton';
13
+ export { ToastProvider, useToast } from './components/Toast';
14
+ export type { ToastKind } from './components/Toast';
15
+ export { DropdownMenu } from './components/DropdownMenu';
16
+ export type { DropdownMenuEntry, DropdownMenuItem } from './components/DropdownMenu';
17
+ export { ConfirmDialog } from './components/ConfirmDialog';
18
+ export { Select, MultiSelect, Combobox } from './components/Select';
19
+ export { Checkbox, Radio, Switch } from './components/Checkbox';
20
+ export { Field, Textarea, SegmentedControl } from './components/Field';
21
+ export { PreviewBadge, PreviewHeader } from './components/PreviewBadge';
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@combinedk/ui",
3
+ "version": "3.0.0-beta.11",
4
+ "description": "Combine DataController shared UI component library",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./tokens.css": "./src/tokens.css"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "src/tokens.css"
20
+ ],
21
+ "scripts": {
22
+ "build": "vite build",
23
+ "dev": "vite build --watch",
24
+ "typecheck": "tsc --noEmit"
25
+ },
26
+ "peerDependencies": {
27
+ "lucide-react": ">=1.0.0",
28
+ "react": ">=19.0.0",
29
+ "react-dom": ">=19.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/react": "^19.2.14",
33
+ "@types/react-dom": "^19.2.3",
34
+ "@vitejs/plugin-react": "^6.0.1",
35
+ "typescript": "~6.0.2",
36
+ "vite": "^8.0.9",
37
+ "vite-plugin-dts": "^4.3.0"
38
+ },
39
+ "publishConfig": {
40
+ "registry": "https://npm.pkg.github.com",
41
+ "access": "restricted"
42
+ }
43
+ }