@zentauri-ui/zentauri-components 2.1.8 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +7 -5
  2. package/cli/props.json +381 -0
  3. package/cli/registry.json +9 -1
  4. package/dist/{chunk-4PAHLHYF.mjs → chunk-37KMH77M.mjs} +3 -3
  5. package/dist/{chunk-4PAHLHYF.mjs.map → chunk-37KMH77M.mjs.map} +1 -1
  6. package/dist/chunk-4KOQS4DT.mjs +96 -0
  7. package/dist/chunk-4KOQS4DT.mjs.map +1 -0
  8. package/dist/{chunk-D7ZTSAA6.mjs → chunk-5XSW5JYA.mjs} +4 -4
  9. package/dist/{chunk-D7ZTSAA6.mjs.map → chunk-5XSW5JYA.mjs.map} +1 -1
  10. package/dist/{chunk-UVP3MUBU.mjs → chunk-AMNJ35TT.mjs} +29 -7
  11. package/dist/chunk-AMNJ35TT.mjs.map +1 -0
  12. package/dist/chunk-DXNIAFBG.js +103 -0
  13. package/dist/chunk-DXNIAFBG.js.map +1 -0
  14. package/dist/chunk-EMZC6ICD.mjs +55 -0
  15. package/dist/chunk-EMZC6ICD.mjs.map +1 -0
  16. package/dist/{chunk-BAAXQPZ7.js → chunk-EPJYLBXV.js} +6 -6
  17. package/dist/{chunk-BAAXQPZ7.js.map → chunk-EPJYLBXV.js.map} +1 -1
  18. package/dist/{chunk-DPNTQ4AK.js → chunk-F3G3RL2N.js} +29 -7
  19. package/dist/chunk-F3G3RL2N.js.map +1 -0
  20. package/dist/chunk-GP3FUS2H.mjs +26 -0
  21. package/dist/chunk-GP3FUS2H.mjs.map +1 -0
  22. package/dist/chunk-HNPGWFVY.js +65 -0
  23. package/dist/chunk-HNPGWFVY.js.map +1 -0
  24. package/dist/chunk-PAISX7YL.js +38 -0
  25. package/dist/chunk-PAISX7YL.js.map +1 -0
  26. package/dist/{chunk-OWVQVAOY.mjs → chunk-TACF7MJE.mjs} +3 -3
  27. package/dist/{chunk-OWVQVAOY.mjs.map → chunk-TACF7MJE.mjs.map} +1 -1
  28. package/dist/chunk-VQJXOJ7G.js +19 -0
  29. package/dist/{chunk-6OVDBAMI.js.map → chunk-VQJXOJ7G.js.map} +1 -1
  30. package/dist/{chunk-L5QORCUO.js → chunk-YTCVWOBC.js} +12 -12
  31. package/dist/{chunk-L5QORCUO.js.map → chunk-YTCVWOBC.js.map} +1 -1
  32. package/dist/design-system/code-diff.d.ts +18 -0
  33. package/dist/design-system/code-diff.d.ts.map +1 -0
  34. package/dist/design-system/facade.js +9 -7
  35. package/dist/design-system/facade.js.map +1 -1
  36. package/dist/design-system/facade.mjs +8 -6
  37. package/dist/design-system/facade.mjs.map +1 -1
  38. package/dist/design-system/index.d.ts +2 -0
  39. package/dist/design-system/index.d.ts.map +1 -1
  40. package/dist/design-system/typing-indicator.d.ts +47 -0
  41. package/dist/design-system/typing-indicator.d.ts.map +1 -0
  42. package/dist/ui/buttons/animated.js +11 -9
  43. package/dist/ui/buttons/animated.js.map +1 -1
  44. package/dist/ui/buttons/animated.mjs +9 -7
  45. package/dist/ui/buttons/animated.mjs.map +1 -1
  46. package/dist/ui/buttons.js +12 -10
  47. package/dist/ui/buttons.mjs +10 -8
  48. package/dist/ui/code-diff/code-diff-base.d.ts +6 -0
  49. package/dist/ui/code-diff/code-diff-base.d.ts.map +1 -0
  50. package/dist/ui/code-diff/code-diff.d.ts +6 -0
  51. package/dist/ui/code-diff/code-diff.d.ts.map +1 -0
  52. package/dist/ui/code-diff/index.d.ts +4 -0
  53. package/dist/ui/code-diff/index.d.ts.map +1 -0
  54. package/dist/ui/code-diff/types.d.ts +26 -0
  55. package/dist/ui/code-diff/types.d.ts.map +1 -0
  56. package/dist/ui/code-diff/variants.d.ts +11 -0
  57. package/dist/ui/code-diff/variants.d.ts.map +1 -0
  58. package/dist/ui/code-diff.js +302 -0
  59. package/dist/ui/code-diff.js.map +1 -0
  60. package/dist/ui/code-diff.mjs +297 -0
  61. package/dist/ui/code-diff.mjs.map +1 -0
  62. package/dist/ui/data-table.js +23 -21
  63. package/dist/ui/data-table.js.map +1 -1
  64. package/dist/ui/data-table.mjs +13 -11
  65. package/dist/ui/data-table.mjs.map +1 -1
  66. package/dist/ui/dynamic-stepper.js +21 -19
  67. package/dist/ui/dynamic-stepper.js.map +1 -1
  68. package/dist/ui/dynamic-stepper.mjs +10 -8
  69. package/dist/ui/dynamic-stepper.mjs.map +1 -1
  70. package/dist/ui/pagination.js +13 -11
  71. package/dist/ui/pagination.mjs +10 -8
  72. package/dist/ui/split-button.js +23 -21
  73. package/dist/ui/split-button.js.map +1 -1
  74. package/dist/ui/split-button.mjs +10 -8
  75. package/dist/ui/split-button.mjs.map +1 -1
  76. package/dist/ui/typing-indicator/animated/animations.d.ts +8 -0
  77. package/dist/ui/typing-indicator/animated/animations.d.ts.map +1 -0
  78. package/dist/ui/typing-indicator/animated/index.d.ts +4 -0
  79. package/dist/ui/typing-indicator/animated/index.d.ts.map +1 -0
  80. package/dist/ui/typing-indicator/animated/types.d.ts +9 -0
  81. package/dist/ui/typing-indicator/animated/types.d.ts.map +1 -0
  82. package/dist/ui/typing-indicator/animated/typing-indicator-animated.d.ts +6 -0
  83. package/dist/ui/typing-indicator/animated/typing-indicator-animated.d.ts.map +1 -0
  84. package/dist/ui/typing-indicator/animated.js +119 -0
  85. package/dist/ui/typing-indicator/animated.js.map +1 -0
  86. package/dist/ui/typing-indicator/animated.mjs +116 -0
  87. package/dist/ui/typing-indicator/animated.mjs.map +1 -0
  88. package/dist/ui/typing-indicator/index.d.ts +4 -0
  89. package/dist/ui/typing-indicator/index.d.ts.map +1 -0
  90. package/dist/ui/typing-indicator/types.d.ts +13 -0
  91. package/dist/ui/typing-indicator/types.d.ts.map +1 -0
  92. package/dist/ui/typing-indicator/typing-indicator-base.d.ts +13 -0
  93. package/dist/ui/typing-indicator/typing-indicator-base.d.ts.map +1 -0
  94. package/dist/ui/typing-indicator/typing-indicator.d.ts +2 -0
  95. package/dist/ui/typing-indicator/typing-indicator.d.ts.map +1 -0
  96. package/dist/ui/typing-indicator/variants.d.ts +16 -0
  97. package/dist/ui/typing-indicator/variants.d.ts.map +1 -0
  98. package/dist/ui/typing-indicator.js +32 -0
  99. package/dist/ui/typing-indicator.js.map +1 -0
  100. package/dist/ui/typing-indicator.mjs +7 -0
  101. package/dist/ui/typing-indicator.mjs.map +1 -0
  102. package/package.json +4 -1
  103. package/src/design-system/code-diff.ts +37 -0
  104. package/src/design-system/index.ts +2 -0
  105. package/src/design-system/typing-indicator.ts +74 -0
  106. package/src/ui/code-diff/code-diff-base.tsx +284 -0
  107. package/src/ui/code-diff/code-diff.test.tsx +50 -0
  108. package/src/ui/code-diff/code-diff.tsx +8 -0
  109. package/src/ui/code-diff/index.ts +15 -0
  110. package/src/ui/code-diff/types.ts +31 -0
  111. package/src/ui/code-diff/variants.ts +49 -0
  112. package/src/ui/typing-indicator/animated/animations.ts +58 -0
  113. package/src/ui/typing-indicator/animated/index.ts +8 -0
  114. package/src/ui/typing-indicator/animated/types.ts +11 -0
  115. package/src/ui/typing-indicator/animated/typing-indicator-animated.tsx +79 -0
  116. package/src/ui/typing-indicator/index.ts +15 -0
  117. package/src/ui/typing-indicator/types.ts +20 -0
  118. package/src/ui/typing-indicator/typing-indicator-base.tsx +75 -0
  119. package/src/ui/typing-indicator/typing-indicator.test.tsx +76 -0
  120. package/src/ui/typing-indicator/typing-indicator.tsx +2 -0
  121. package/src/ui/typing-indicator/variants.ts +49 -0
  122. package/dist/chunk-6OVDBAMI.js +0 -19
  123. package/dist/chunk-DPNTQ4AK.js.map +0 -1
  124. package/dist/chunk-UVP3MUBU.mjs.map +0 -1
@@ -0,0 +1,6 @@
1
+ import type { CodeDiffProps } from "./types";
2
+ export declare function CodeDiff(props: CodeDiffProps): import("react/jsx-runtime").JSX.Element;
3
+ export declare namespace CodeDiff {
4
+ var displayName: string;
5
+ }
6
+ //# sourceMappingURL=code-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-diff.d.ts","sourceRoot":"","sources":["../../../src/ui/code-diff/code-diff.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAE5C;yBAFe,QAAQ"}
@@ -0,0 +1,4 @@
1
+ export { CodeDiff } from "./code-diff";
2
+ export type { CodeDiffBaseProps, CodeDiffProps, CodeDiffVariantProps, CodeDiffViewType, DiffLine, } from "./types";
3
+ export { codeDiffLineContentVariants, codeDiffLineNumberVariants, codeDiffVariants, } from "./variants";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/code-diff/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { VariantProps } from "class-variance-authority";
2
+ import type { ComponentPropsWithRef, ElementType } from "react";
3
+ import type { codeDiffVariants } from "./variants";
4
+ export type CodeDiffVariantProps = VariantProps<typeof codeDiffVariants>;
5
+ export type CodeDiffViewType = "split" | "unified";
6
+ export interface CodeDiffBaseProps extends ComponentPropsWithRef<"div"> {
7
+ oldCode: string;
8
+ newCode: string;
9
+ language?: string;
10
+ viewType?: CodeDiffViewType;
11
+ showLineNumbers?: boolean;
12
+ showGutterMarkers?: boolean;
13
+ oldTitle?: string;
14
+ newTitle?: string;
15
+ appearance?: CodeDiffVariantProps["appearance"];
16
+ size?: CodeDiffVariantProps["size"];
17
+ as?: ElementType;
18
+ }
19
+ export type CodeDiffProps = Omit<CodeDiffBaseProps, "as">;
20
+ export interface DiffLine {
21
+ type: "added" | "removed" | "unchanged";
22
+ content: string;
23
+ oldLineNumber: number | null;
24
+ newLineNumber: number | null;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/code-diff/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEzE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAC;AAEnD,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB,CAAC,KAAK,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpC,EAAE,CAAC,EAAE,WAAW,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAE1D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B"}
@@ -0,0 +1,11 @@
1
+ export declare const codeDiffVariants: (props?: ({
2
+ appearance?: "default" | null | undefined;
3
+ size?: "md" | "sm" | "lg" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ export declare const codeDiffLineNumberVariants: (props?: ({
6
+ type?: "added" | "removed" | "unchanged" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ export declare const codeDiffLineContentVariants: (props?: ({
9
+ type?: "added" | "removed" | "unchanged" | null | undefined;
10
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
+ //# sourceMappingURL=variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/ui/code-diff/variants.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,gBAAgB;;;8EAS3B,CAAC;AAEH,eAAO,MAAM,0BAA0B;;8EAWrC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;8EAWtC,CAAC"}
@@ -0,0 +1,302 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkPAISX7YL_js = require('../chunk-PAISX7YL.js');
5
+ var chunkZS5756ZC_js = require('../chunk-ZS5756ZC.js');
6
+ require('../chunk-PZ5AY32C.js');
7
+ var diff = require('diff');
8
+ var react = require('react');
9
+ var classVarianceAuthority = require('class-variance-authority');
10
+ var jsxRuntime = require('react/jsx-runtime');
11
+
12
+ var codeDiffVariants = classVarianceAuthority.cva(chunkPAISX7YL_js.zuiCodeDiffBase, {
13
+ variants: {
14
+ appearance: chunkPAISX7YL_js.zuiCodeDiffAppearances,
15
+ size: chunkPAISX7YL_js.zuiCodeDiffSizes
16
+ },
17
+ defaultVariants: {
18
+ appearance: "default",
19
+ size: "md"
20
+ }
21
+ });
22
+ var codeDiffLineNumberVariants = classVarianceAuthority.cva(chunkPAISX7YL_js.zuiCodeDiffLineNumberBase, {
23
+ variants: {
24
+ type: {
25
+ added: chunkPAISX7YL_js.zuiCodeDiffLineAdded,
26
+ removed: chunkPAISX7YL_js.zuiCodeDiffLineRemoved,
27
+ unchanged: chunkPAISX7YL_js.zuiCodeDiffLineUnchanged
28
+ }
29
+ },
30
+ defaultVariants: {
31
+ type: "unchanged"
32
+ }
33
+ });
34
+ var codeDiffLineContentVariants = classVarianceAuthority.cva(chunkPAISX7YL_js.zuiCodeDiffLineContentBase, {
35
+ variants: {
36
+ type: {
37
+ added: chunkPAISX7YL_js.zuiCodeDiffLineAdded,
38
+ removed: chunkPAISX7YL_js.zuiCodeDiffLineRemoved,
39
+ unchanged: chunkPAISX7YL_js.zuiCodeDiffLineUnchanged
40
+ }
41
+ },
42
+ defaultVariants: {
43
+ type: "unchanged"
44
+ }
45
+ });
46
+ function computeDiff(oldCode, newCode) {
47
+ const changes = diff.diffLines(oldCode, newCode);
48
+ const lines = [];
49
+ let oldLineNum = 1;
50
+ let newLineNum = 1;
51
+ for (const change of changes) {
52
+ const changeLines = change.value.replace(/\n$/, "").split("\n");
53
+ for (const content of changeLines) {
54
+ if (change.added) {
55
+ lines.push({
56
+ type: "added",
57
+ content,
58
+ oldLineNumber: null,
59
+ newLineNumber: newLineNum++
60
+ });
61
+ } else if (change.removed) {
62
+ lines.push({
63
+ type: "removed",
64
+ content,
65
+ oldLineNumber: oldLineNum++,
66
+ newLineNumber: null
67
+ });
68
+ } else {
69
+ lines.push({
70
+ type: "unchanged",
71
+ content,
72
+ oldLineNumber: oldLineNum++,
73
+ newLineNumber: newLineNum++
74
+ });
75
+ }
76
+ }
77
+ }
78
+ return lines;
79
+ }
80
+ function toSplitRows(lines) {
81
+ const rows = [];
82
+ let i = 0;
83
+ while (i < lines.length) {
84
+ const current = lines[i];
85
+ if (current.type === "unchanged") {
86
+ rows.push({ oldLine: current, newLine: current });
87
+ i++;
88
+ } else if (current.type === "removed") {
89
+ const removedBlock = [];
90
+ while (i < lines.length && lines[i].type === "removed") {
91
+ removedBlock.push(lines[i]);
92
+ i++;
93
+ }
94
+ const addedBlock = [];
95
+ while (i < lines.length && lines[i].type === "added") {
96
+ addedBlock.push(lines[i]);
97
+ i++;
98
+ }
99
+ const maxLen = Math.max(removedBlock.length, addedBlock.length);
100
+ for (let j = 0; j < maxLen; j++) {
101
+ rows.push({
102
+ oldLine: j < removedBlock.length ? removedBlock[j] : null,
103
+ newLine: j < addedBlock.length ? addedBlock[j] : null
104
+ });
105
+ }
106
+ } else if (current.type === "added") {
107
+ const addedBlock = [];
108
+ while (i < lines.length && lines[i].type === "added") {
109
+ addedBlock.push(lines[i]);
110
+ i++;
111
+ }
112
+ for (const added of addedBlock) {
113
+ rows.push({ oldLine: null, newLine: added });
114
+ }
115
+ } else {
116
+ i++;
117
+ }
118
+ }
119
+ return rows;
120
+ }
121
+ function LineNumberCell({
122
+ lineNumber,
123
+ type,
124
+ showLineNumbers
125
+ }) {
126
+ return /* @__PURE__ */ jsxRuntime.jsx(
127
+ "td",
128
+ {
129
+ className: codeDiffLineNumberVariants({ type }),
130
+ style: { width: showLineNumbers ? "4.5rem" : "2rem" },
131
+ children: showLineNumbers && lineNumber !== null ? lineNumber : ""
132
+ }
133
+ );
134
+ }
135
+ function LineContentCell({
136
+ line,
137
+ type,
138
+ showGutterMarkers
139
+ }) {
140
+ return /* @__PURE__ */ jsxRuntime.jsxs("td", { className: codeDiffLineContentVariants({ type }), children: [
141
+ showGutterMarkers ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-block w-4 select-none text-center", children: type === "added" ? "+" : type === "removed" ? "-" : " " }) : null,
142
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: line || " " })
143
+ ] });
144
+ }
145
+ function UnifiedView({
146
+ lines,
147
+ showLineNumbers,
148
+ showGutterMarkers
149
+ }) {
150
+ return /* @__PURE__ */ jsxRuntime.jsx("table", { className: "w-full border-collapse table-fixed", children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: lines.map((line, idx) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
151
+ /* @__PURE__ */ jsxRuntime.jsx(
152
+ LineNumberCell,
153
+ {
154
+ lineNumber: line.oldLineNumber,
155
+ type: line.type,
156
+ showLineNumbers
157
+ }
158
+ ),
159
+ /* @__PURE__ */ jsxRuntime.jsx(
160
+ LineNumberCell,
161
+ {
162
+ lineNumber: line.newLineNumber,
163
+ type: line.type,
164
+ showLineNumbers
165
+ }
166
+ ),
167
+ /* @__PURE__ */ jsxRuntime.jsx(
168
+ LineContentCell,
169
+ {
170
+ line: line.content,
171
+ type: line.type,
172
+ showGutterMarkers
173
+ }
174
+ )
175
+ ] }, idx)) }) });
176
+ }
177
+ function SplitView({
178
+ lines,
179
+ showLineNumbers,
180
+ showGutterMarkers
181
+ }) {
182
+ const rows = toSplitRows(lines);
183
+ return /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full border-collapse table-fixed", children: [
184
+ /* @__PURE__ */ jsxRuntime.jsxs("colgroup", { children: [
185
+ /* @__PURE__ */ jsxRuntime.jsx("col", { style: { width: showLineNumbers ? "4.5rem" : "2rem" } }),
186
+ /* @__PURE__ */ jsxRuntime.jsx("col", {}),
187
+ /* @__PURE__ */ jsxRuntime.jsx("col", { style: { width: showLineNumbers ? "4.5rem" : "2rem" } }),
188
+ /* @__PURE__ */ jsxRuntime.jsx("col", {})
189
+ ] }),
190
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row, idx) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
191
+ /* @__PURE__ */ jsxRuntime.jsx(
192
+ LineNumberCell,
193
+ {
194
+ lineNumber: row.oldLine?.oldLineNumber ?? null,
195
+ type: row.oldLine?.type ?? "unchanged",
196
+ showLineNumbers
197
+ }
198
+ ),
199
+ /* @__PURE__ */ jsxRuntime.jsx(
200
+ LineContentCell,
201
+ {
202
+ line: row.oldLine?.content ?? "",
203
+ type: row.oldLine?.type ?? "unchanged",
204
+ showGutterMarkers
205
+ }
206
+ ),
207
+ /* @__PURE__ */ jsxRuntime.jsx(
208
+ LineNumberCell,
209
+ {
210
+ lineNumber: row.newLine?.newLineNumber ?? null,
211
+ type: row.newLine?.type ?? "unchanged",
212
+ showLineNumbers
213
+ }
214
+ ),
215
+ /* @__PURE__ */ jsxRuntime.jsx(
216
+ LineContentCell,
217
+ {
218
+ line: row.newLine?.content ?? "",
219
+ type: row.newLine?.type ?? "unchanged",
220
+ showGutterMarkers
221
+ }
222
+ )
223
+ ] }, idx)) })
224
+ ] });
225
+ }
226
+ function CodeDiffBase({
227
+ className,
228
+ appearance,
229
+ size,
230
+ oldCode,
231
+ newCode,
232
+ viewType = "unified",
233
+ showLineNumbers = true,
234
+ showGutterMarkers = true,
235
+ oldTitle = "Old",
236
+ newTitle = "New",
237
+ ref,
238
+ as: Wrapper = "div",
239
+ ...rest
240
+ }) {
241
+ const lines = react.useMemo(
242
+ () => computeDiff(oldCode ?? "", newCode ?? ""),
243
+ [oldCode, newCode]
244
+ );
245
+ const hasChanges = lines.some(
246
+ (l) => l.type === "added" || l.type === "removed"
247
+ );
248
+ return /* @__PURE__ */ jsxRuntime.jsxs(
249
+ Wrapper,
250
+ {
251
+ ref,
252
+ "data-slot": "code-diff",
253
+ className: chunkZS5756ZC_js.cn(codeDiffVariants({ appearance, size }), className),
254
+ ...rest,
255
+ children: [
256
+ hasChanges ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sticky top-0 flex items-center justify-between border-b border-[color:var(--zui-code-diff-border,var(--zui-border,#0000001a))] dark:border-[color:var(--zui-code-diff-border-dark,var(--zui-border-dark,#ffffff1a))] bg-[var(--zui-code-diff-header-bg,var(--zui-surface-muted,oklch(92.9%_0.013_255.508)))] dark:bg-[var(--zui-code-diff-header-bg-dark,var(--zui-surface-muted-dark,oklch(27.9%_0.041_260.031)))] px-4 py-2", children: [
257
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-medium", children: [
258
+ lines.filter((l) => l.type === "added").length,
259
+ " additions",
260
+ " ",
261
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mx-1", children: "\u2022" }),
262
+ " ",
263
+ lines.filter((l) => l.type === "removed").length,
264
+ " deletions"
265
+ ] }),
266
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-[color:var(--zui-code-diff-header-fg,var(--zui-fg-muted,oklch(55.2%_0.046_257.417)))] dark:text-[color:var(--zui-code-diff-header-fg-dark,var(--zui-fg-muted-dark,oklch(70.8%_0.015_256.243)))]", children: [
267
+ oldTitle,
268
+ " \u2192 ",
269
+ newTitle
270
+ ] })
271
+ ] }) : null,
272
+ viewType === "split" ? /* @__PURE__ */ jsxRuntime.jsx(
273
+ SplitView,
274
+ {
275
+ lines,
276
+ showLineNumbers,
277
+ showGutterMarkers
278
+ }
279
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
280
+ UnifiedView,
281
+ {
282
+ lines,
283
+ showLineNumbers,
284
+ showGutterMarkers
285
+ }
286
+ )
287
+ ]
288
+ }
289
+ );
290
+ }
291
+ CodeDiffBase.displayName = "CodeDiff";
292
+ function CodeDiff(props) {
293
+ return /* @__PURE__ */ jsxRuntime.jsx(CodeDiffBase, { ...props });
294
+ }
295
+ CodeDiff.displayName = "CodeDiff";
296
+
297
+ exports.CodeDiff = CodeDiff;
298
+ exports.codeDiffLineContentVariants = codeDiffLineContentVariants;
299
+ exports.codeDiffLineNumberVariants = codeDiffLineNumberVariants;
300
+ exports.codeDiffVariants = codeDiffVariants;
301
+ //# sourceMappingURL=code-diff.js.map
302
+ //# sourceMappingURL=code-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/code-diff/variants.ts","../../src/ui/code-diff/code-diff-base.tsx","../../src/ui/code-diff/code-diff.tsx"],"names":["cva","zuiCodeDiffBase","zuiCodeDiffAppearances","zuiCodeDiffSizes","zuiCodeDiffLineNumberBase","zuiCodeDiffLineAdded","zuiCodeDiffLineRemoved","zuiCodeDiffLineUnchanged","zuiCodeDiffLineContentBase","diffLines","jsx","jsxs","useMemo","cn"],"mappings":"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","file":"code-diff.js","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nimport {\n zuiCodeDiffAppearances,\n zuiCodeDiffBase,\n zuiCodeDiffLineAdded,\n zuiCodeDiffLineContentBase,\n zuiCodeDiffLineNumberBase,\n zuiCodeDiffLineRemoved,\n zuiCodeDiffLineUnchanged,\n zuiCodeDiffSizes,\n} from \"../../design-system/code-diff\";\n\nexport const codeDiffVariants = cva(zuiCodeDiffBase, {\n variants: {\n appearance: zuiCodeDiffAppearances,\n size: zuiCodeDiffSizes,\n },\n defaultVariants: {\n appearance: \"default\",\n size: \"md\",\n },\n});\n\nexport const codeDiffLineNumberVariants = cva(zuiCodeDiffLineNumberBase, {\n variants: {\n type: {\n added: zuiCodeDiffLineAdded,\n removed: zuiCodeDiffLineRemoved,\n unchanged: zuiCodeDiffLineUnchanged,\n },\n },\n defaultVariants: {\n type: \"unchanged\",\n },\n});\n\nexport const codeDiffLineContentVariants = cva(zuiCodeDiffLineContentBase, {\n variants: {\n type: {\n added: zuiCodeDiffLineAdded,\n removed: zuiCodeDiffLineRemoved,\n unchanged: zuiCodeDiffLineUnchanged,\n },\n },\n defaultVariants: {\n type: \"unchanged\",\n },\n});\n","\"use client\";\n\nimport { diffLines } from \"diff\";\nimport { useMemo } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type { CodeDiffBaseProps, DiffLine } from \"./types\";\nimport {\n codeDiffLineContentVariants,\n codeDiffLineNumberVariants,\n codeDiffVariants,\n} from \"./variants\";\n\nfunction computeDiff(oldCode: string, newCode: string): DiffLine[] {\n const changes = diffLines(oldCode, newCode);\n const lines: DiffLine[] = [];\n let oldLineNum = 1;\n let newLineNum = 1;\n\n for (const change of changes) {\n const changeLines = change.value.replace(/\\n$/, \"\").split(\"\\n\");\n for (const content of changeLines) {\n if (change.added) {\n lines.push({\n type: \"added\",\n content,\n oldLineNumber: null,\n newLineNumber: newLineNum++,\n });\n } else if (change.removed) {\n lines.push({\n type: \"removed\",\n content,\n oldLineNumber: oldLineNum++,\n newLineNumber: null,\n });\n } else {\n lines.push({\n type: \"unchanged\",\n content,\n oldLineNumber: oldLineNum++,\n newLineNumber: newLineNum++,\n });\n }\n }\n }\n return lines;\n}\n\ninterface SplitRow {\n oldLine: DiffLine | null;\n newLine: DiffLine | null;\n}\n\nfunction toSplitRows(lines: DiffLine[]): SplitRow[] {\n const rows: SplitRow[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const current = lines[i]!;\n\n if (current.type === \"unchanged\") {\n rows.push({ oldLine: current, newLine: current });\n i++;\n } else if (current.type === \"removed\") {\n const removedBlock: DiffLine[] = [];\n while (i < lines.length && lines[i]!.type === \"removed\") {\n removedBlock.push(lines[i]!);\n i++;\n }\n const addedBlock: DiffLine[] = [];\n while (i < lines.length && lines[i]!.type === \"added\") {\n addedBlock.push(lines[i]!);\n i++;\n }\n const maxLen = Math.max(removedBlock.length, addedBlock.length);\n for (let j = 0; j < maxLen; j++) {\n rows.push({\n oldLine: j < removedBlock.length ? removedBlock[j]! : null,\n newLine: j < addedBlock.length ? addedBlock[j]! : null,\n });\n }\n } else if (current.type === \"added\") {\n const addedBlock: DiffLine[] = [];\n while (i < lines.length && lines[i]!.type === \"added\") {\n addedBlock.push(lines[i]!);\n i++;\n }\n for (const added of addedBlock) {\n rows.push({ oldLine: null, newLine: added });\n }\n } else {\n i++;\n }\n }\n return rows;\n}\n\nfunction LineNumberCell({\n lineNumber,\n type,\n showLineNumbers,\n}: {\n lineNumber: number | null;\n type: DiffLine[\"type\"];\n showLineNumbers: boolean;\n}) {\n return (\n <td\n className={codeDiffLineNumberVariants({ type })}\n style={{ width: showLineNumbers ? \"4.5rem\" : \"2rem\" }}\n >\n {showLineNumbers && lineNumber !== null ? lineNumber : \"\"}\n </td>\n );\n}\n\nfunction LineContentCell({\n line,\n type,\n showGutterMarkers,\n}: {\n line: string;\n type: DiffLine[\"type\"];\n showGutterMarkers: boolean;\n}) {\n return (\n <td className={codeDiffLineContentVariants({ type })}>\n {showGutterMarkers ? (\n <span className=\"inline-block w-4 select-none text-center\">\n {type === \"added\" ? \"+\" : type === \"removed\" ? \"-\" : \" \"}\n </span>\n ) : null}\n <span>{line || \" \"}</span>\n </td>\n );\n}\n\nfunction UnifiedView({\n lines,\n showLineNumbers,\n showGutterMarkers,\n}: {\n lines: DiffLine[];\n showLineNumbers: boolean;\n showGutterMarkers: boolean;\n}) {\n return (\n <table className=\"w-full border-collapse table-fixed\">\n <tbody>\n {lines.map((line, idx) => (\n <tr key={idx}>\n <LineNumberCell\n lineNumber={line.oldLineNumber}\n type={line.type}\n showLineNumbers={showLineNumbers}\n />\n <LineNumberCell\n lineNumber={line.newLineNumber}\n type={line.type}\n showLineNumbers={showLineNumbers}\n />\n <LineContentCell\n line={line.content}\n type={line.type}\n showGutterMarkers={showGutterMarkers}\n />\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction SplitView({\n lines,\n showLineNumbers,\n showGutterMarkers,\n}: {\n lines: DiffLine[];\n showLineNumbers: boolean;\n showGutterMarkers: boolean;\n}) {\n const rows = toSplitRows(lines);\n\n return (\n <table className=\"w-full border-collapse table-fixed\">\n <colgroup>\n <col style={{ width: showLineNumbers ? \"4.5rem\" : \"2rem\" }} />\n <col />\n <col style={{ width: showLineNumbers ? \"4.5rem\" : \"2rem\" }} />\n <col />\n </colgroup>\n <tbody>\n {rows.map((row, idx) => (\n <tr key={idx}>\n <LineNumberCell\n lineNumber={row.oldLine?.oldLineNumber ?? null}\n type={row.oldLine?.type ?? \"unchanged\"}\n showLineNumbers={showLineNumbers}\n />\n <LineContentCell\n line={row.oldLine?.content ?? \"\"}\n type={row.oldLine?.type ?? \"unchanged\"}\n showGutterMarkers={showGutterMarkers}\n />\n <LineNumberCell\n lineNumber={row.newLine?.newLineNumber ?? null}\n type={row.newLine?.type ?? \"unchanged\"}\n showLineNumbers={showLineNumbers}\n />\n <LineContentCell\n line={row.newLine?.content ?? \"\"}\n type={row.newLine?.type ?? \"unchanged\"}\n showGutterMarkers={showGutterMarkers}\n />\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nexport function CodeDiffBase({\n className,\n appearance,\n size,\n oldCode,\n newCode,\n viewType = \"unified\",\n showLineNumbers = true,\n showGutterMarkers = true,\n oldTitle = \"Old\",\n newTitle = \"New\",\n ref,\n as: Wrapper = \"div\",\n ...rest\n}: CodeDiffBaseProps) {\n const lines = useMemo(\n () => computeDiff(oldCode ?? \"\", newCode ?? \"\"),\n [oldCode, newCode],\n );\n const hasChanges = lines.some(\n (l) => l.type === \"added\" || l.type === \"removed\",\n );\n\n return (\n <Wrapper\n ref={ref}\n data-slot=\"code-diff\"\n className={cn(codeDiffVariants({ appearance, size }), className)}\n {...rest}\n >\n {hasChanges ? (\n <div className=\"sticky top-0 flex items-center justify-between border-b border-[color:var(--zui-code-diff-border,var(--zui-border,#0000001a))] dark:border-[color:var(--zui-code-diff-border-dark,var(--zui-border-dark,#ffffff1a))] bg-[var(--zui-code-diff-header-bg,var(--zui-surface-muted,oklch(92.9%_0.013_255.508)))] dark:bg-[var(--zui-code-diff-header-bg-dark,var(--zui-surface-muted-dark,oklch(27.9%_0.041_260.031)))] px-4 py-2\">\n <span className=\"text-xs font-medium\">\n {lines.filter((l) => l.type === \"added\").length} additions{\" \"}\n <span className=\"mx-1\">&bull;</span>{\" \"}\n {lines.filter((l) => l.type === \"removed\").length} deletions\n </span>\n <span className=\"text-xs text-[color:var(--zui-code-diff-header-fg,var(--zui-fg-muted,oklch(55.2%_0.046_257.417)))] dark:text-[color:var(--zui-code-diff-header-fg-dark,var(--zui-fg-muted-dark,oklch(70.8%_0.015_256.243)))]\">\n {oldTitle} &rarr; {newTitle}\n </span>\n </div>\n ) : null}\n {viewType === \"split\" ? (\n <SplitView\n lines={lines}\n showLineNumbers={showLineNumbers}\n showGutterMarkers={showGutterMarkers}\n />\n ) : (\n <UnifiedView\n lines={lines}\n showLineNumbers={showLineNumbers}\n showGutterMarkers={showGutterMarkers}\n />\n )}\n </Wrapper>\n );\n}\n\nCodeDiffBase.displayName = \"CodeDiff\";\n","import { CodeDiffBase } from \"./code-diff-base\";\nimport type { CodeDiffProps } from \"./types\";\n\nexport function CodeDiff(props: CodeDiffProps) {\n return <CodeDiffBase {...props} />;\n}\n\nCodeDiff.displayName = \"CodeDiff\";\n"]}