@juspay/svelte-ui-components 3.5.0 → 4.0.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 (152) hide show
  1. package/README.md +25 -16
  2. package/dist/Accordion/Accordion.svelte +1 -5
  3. package/dist/Accordion/properties.d.ts +0 -1
  4. package/dist/AreaChart/AreaChart.svelte +2 -8
  5. package/dist/AreaChart/properties.d.ts +0 -10
  6. package/dist/AttachmentChipRow/AttachmentChipRow.svelte +30 -30
  7. package/dist/AttachmentChipRow/properties.d.ts +6 -6
  8. package/dist/Banner/Banner.svelte +1 -5
  9. package/dist/Banner/properties.d.ts +0 -1
  10. package/dist/BarChart/BarChart.svelte +7 -13
  11. package/dist/BarChart/properties.d.ts +1 -9
  12. package/dist/Book/Book.svelte +1 -5
  13. package/dist/Book/properties.d.ts +0 -1
  14. package/dist/Calendar/Calendar.svelte +3 -11
  15. package/dist/Calendar/properties.d.ts +0 -11
  16. package/dist/Chat/Chat.svelte +9 -29
  17. package/dist/Chat/properties.d.ts +0 -9
  18. package/dist/Chat/types.d.ts +7 -0
  19. package/dist/ChatBubble/ChatBubble.svelte +3 -11
  20. package/dist/ChatBubble/properties.d.ts +0 -3
  21. package/dist/ChatComposer/ChatComposer.svelte +18 -44
  22. package/dist/ChatComposer/properties.d.ts +0 -12
  23. package/dist/ChatHeader/ChatHeader.svelte +1 -5
  24. package/dist/ChatHeader/properties.d.ts +0 -1
  25. package/dist/ChatMessage/ChatMessage.svelte +87 -11
  26. package/dist/ChatMessage/properties.d.ts +18 -3
  27. package/dist/ChatMessageList/ChatMessageList.svelte +5 -11
  28. package/dist/ChatMessageList/properties.d.ts +0 -6
  29. package/dist/ChatSuggestions/ChatSuggestions.svelte +1 -5
  30. package/dist/ChatSuggestions/properties.d.ts +0 -1
  31. package/dist/CheckListItem/CheckListItem.svelte +1 -5
  32. package/dist/CheckListItem/properties.d.ts +0 -1
  33. package/dist/Checkbox/Checkbox.svelte +1 -5
  34. package/dist/Checkbox/properties.d.ts +0 -1
  35. package/dist/ChipInput/ChipInput.svelte +10 -20
  36. package/dist/ChipInput/properties.d.ts +0 -4
  37. package/dist/Choicebox/Choicebox.svelte +1 -5
  38. package/dist/Choicebox/properties.d.ts +0 -1
  39. package/dist/ColorPicker/ColorPicker.svelte +4 -10
  40. package/dist/ColorPicker/properties.d.ts +0 -2
  41. package/dist/Combobox/Combobox.svelte +15 -33
  42. package/dist/Combobox/properties.d.ts +0 -8
  43. package/dist/CommandMenu/CommandMenu.svelte +2 -8
  44. package/dist/CommandMenu/properties.d.ts +0 -2
  45. package/dist/ContextMenu/ContextMenu.svelte +3 -11
  46. package/dist/ContextMenu/properties.d.ts +0 -3
  47. package/dist/DateRangePicker/DateRangePicker.svelte +6 -20
  48. package/dist/DateRangePicker/properties.d.ts +0 -19
  49. package/dist/Draggable/Draggable.svelte +7 -7
  50. package/dist/Draggable/properties.d.ts +3 -3
  51. package/dist/DualAxisBarChart/DualAxisBarChart.svelte +1 -5
  52. package/dist/DualAxisBarChart/properties.d.ts +0 -4
  53. package/dist/FileDropzoneTrigger/FileDropzoneTrigger.svelte +1 -5
  54. package/dist/FileDropzoneTrigger/properties.d.ts +0 -1
  55. package/dist/FileInput/FileInput.svelte +2 -8
  56. package/dist/FileInput/properties.d.ts +0 -2
  57. package/dist/FunnelChart/FunnelChart.svelte +2 -8
  58. package/dist/FunnelChart/properties.d.ts +0 -8
  59. package/dist/Gallery/Gallery.svelte +15 -15
  60. package/dist/Gallery/properties.d.ts +6 -6
  61. package/dist/HITL/HITL.svelte +10 -8
  62. package/dist/HITL/properties.d.ts +2 -2
  63. package/dist/IframeViewer/IframeViewer.svelte +3 -2
  64. package/dist/IframeViewer/properties.d.ts +1 -1
  65. package/dist/Img/Img.svelte +119 -39
  66. package/dist/Img/properties.d.ts +0 -1
  67. package/dist/Input/Input.svelte +22 -37
  68. package/dist/Input/properties.d.ts +3 -10
  69. package/dist/InputButton/InputButton.svelte +2 -2
  70. package/dist/LineChart/LineChart.svelte +4 -10
  71. package/dist/LineChart/properties.d.ts +1 -11
  72. package/dist/ListItem/ListItem.svelte +10 -22
  73. package/dist/ListItem/properties.d.ts +5 -10
  74. package/dist/LottiePlayer/LottiePlayer.svelte +2 -8
  75. package/dist/LottiePlayer/properties.d.ts +0 -2
  76. package/dist/MediaPlayer/MediaPlayer.svelte +1 -5
  77. package/dist/MediaPlayer/properties.d.ts +0 -1
  78. package/dist/MediaUpload/MediaUpload.svelte +6 -6
  79. package/dist/MediaUpload/properties.d.ts +3 -3
  80. package/dist/Menu/Menu.svelte +3 -11
  81. package/dist/Menu/properties.d.ts +0 -3
  82. package/dist/Modal/Modal.svelte +15 -31
  83. package/dist/Modal/properties.d.ts +5 -11
  84. package/dist/Pagination/Pagination.svelte +3 -7
  85. package/dist/Pagination/properties.d.ts +1 -2
  86. package/dist/PieChart/PieChart.svelte +4 -10
  87. package/dist/PieChart/properties.d.ts +1 -9
  88. package/dist/Pill/Pill.svelte +1 -5
  89. package/dist/Pill/properties.d.ts +0 -1
  90. package/dist/Radio/Radio.svelte +1 -5
  91. package/dist/Radio/properties.d.ts +0 -1
  92. package/dist/Resizable/Resizable.svelte +3 -11
  93. package/dist/Resizable/properties.d.ts +0 -3
  94. package/dist/SankeyChart/SankeyChart.svelte +4 -14
  95. package/dist/SankeyChart/properties.d.ts +0 -12
  96. package/dist/Scroller/Scroller.svelte +1 -5
  97. package/dist/Scroller/properties.d.ts +0 -1
  98. package/dist/Select/Select.svelte +3 -11
  99. package/dist/Select/properties.d.ts +0 -3
  100. package/dist/Sheet/Sheet.svelte +3 -11
  101. package/dist/Sheet/properties.d.ts +0 -3
  102. package/dist/Slider/Slider.svelte +2 -8
  103. package/dist/Slider/properties.d.ts +0 -2
  104. package/dist/Snippet/Snippet.svelte +1 -5
  105. package/dist/Snippet/properties.d.ts +0 -1
  106. package/dist/SplitButton/SplitButton.svelte +1 -5
  107. package/dist/SplitButton/properties.d.ts +0 -1
  108. package/dist/SplitInput/SplitInput.svelte +6 -14
  109. package/dist/SplitInput/properties.d.ts +0 -3
  110. package/dist/StatCard/StatCard.svelte +2 -2
  111. package/dist/StatCard/properties.d.ts +1 -1
  112. package/dist/Status/Status.svelte +2 -6
  113. package/dist/Status/properties.d.ts +1 -2
  114. package/dist/Stepper/Stepper.svelte +2 -12
  115. package/dist/Stepper/properties.d.ts +1 -14
  116. package/dist/Table/BuiltinCell.svelte +1 -1
  117. package/dist/Table/Table.svelte +16 -17
  118. package/dist/Table/properties.d.ts +3 -35
  119. package/dist/Tabs/Tabs.svelte +2 -8
  120. package/dist/Tabs/properties.d.ts +0 -2
  121. package/dist/TaskList/TaskList.svelte +1 -4
  122. package/dist/TaskList/properties.d.ts +0 -1
  123. package/dist/ThemeSwitcher/ThemeSwitcher.svelte +1 -5
  124. package/dist/ThemeSwitcher/properties.d.ts +0 -1
  125. package/dist/ThinkingIndicator/ThinkingIndicator.svelte +4 -10
  126. package/dist/ThinkingIndicator/properties.d.ts +1 -3
  127. package/dist/Toast/Toast.svelte +2 -2
  128. package/dist/Toast/properties.d.ts +1 -1
  129. package/dist/Toggle/Toggle.svelte +1 -5
  130. package/dist/Toggle/properties.d.ts +0 -1
  131. package/dist/ToolCallLog/ToolCallLog.svelte +1 -10
  132. package/dist/ToolCallLog/properties.d.ts +0 -1
  133. package/dist/Toolbar/Toolbar.svelte +2 -6
  134. package/dist/Toolbar/properties.d.ts +1 -2
  135. package/dist/TypewriterText/TypewriterText.svelte +3 -3
  136. package/dist/TypewriterText/properties.d.ts +1 -1
  137. package/dist-codemod/bin.js +32 -0
  138. package/dist-codemod/cli.js +175 -0
  139. package/dist-codemod/legacy-pairs.js +228 -0
  140. package/dist-codemod/transform.js +278 -0
  141. package/dist-codemod/wc-children.js +66 -0
  142. package/dist-wc/index.js +4458 -5127
  143. package/package.json +9 -7
  144. package/scripts/postinstall.mjs +14 -12
  145. package/dist/deprecation.d.ts +0 -42
  146. package/dist/deprecation.js +0 -57
  147. package/scripts/codemod/README.md +0 -76
  148. package/scripts/codemod/cli.ts +0 -206
  149. package/scripts/codemod/map.ts +0 -118
  150. package/scripts/codemod/transform.ts +0 -549
  151. package/scripts/codemod/tsconfig.json +0 -15
  152. package/scripts/codemod/wc-children.ts +0 -75
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ // The installed entry point. Kept apart from cli.ts on purpose: cli.ts imports
3
+ // the transform, which imports `svelte/compiler` at module load, so a consumer
4
+ // missing it would get a bare module-resolution stack before any code of ours
5
+ // ran. Resolving it first turns that into one line. Also the reason this does
6
+ // not reuse cli.ts's own "am I the entry point" check — the bin is reached
7
+ // through an npm symlink, whose path never matches the real module URL, so
8
+ // that check would silently run nothing.
9
+ const REQUIRED = ['svelte/compiler'];
10
+ const missing = REQUIRED.filter((specifier) => {
11
+ try {
12
+ import.meta.resolve(specifier);
13
+ return false;
14
+ }
15
+ catch {
16
+ return true;
17
+ }
18
+ });
19
+ if (missing.length > 0) {
20
+ console.error(`sui-codemod needs ${missing.join(' and ')} installed in this project ` +
21
+ '(svelte is a peer dependency of @juspay/svelte-ui-components). ' +
22
+ 'Install it and run the command again.');
23
+ process.exitCode = 1;
24
+ }
25
+ else {
26
+ const { runCodemod } = await import("./cli.js");
27
+ const summary = runCodemod(process.argv.slice(2), (line) => {
28
+ console.log(line);
29
+ });
30
+ process.exitCode = summary.exitCode;
31
+ }
32
+ export {};
@@ -0,0 +1,175 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { parseArgs } from 'node:util';
5
+ import { transformSvelte } from "./transform.js";
6
+ import { findChildrenAssignments } from "./wc-children.js";
7
+ const USAGE = [
8
+ 'Usage: npx sui-codemod [--dry-run] <path...>',
9
+ ' (inside this repository: node scripts/codemod/cli.ts ...)',
10
+ '',
11
+ 'Prepares a @juspay/svelte-ui-components consumer for 4.0.0: renames every',
12
+ 'deprecated event-prop spelling on library components to its corrected',
13
+ 'spelling (see legacy-pairs.ts) and reports `children` assignments on the',
14
+ 'custom elements that stop declaring it.',
15
+ '',
16
+ ' --dry-run print every change as a diff without writing any file',
17
+ ' --help show this help',
18
+ '',
19
+ 'Paths may be files or directories; directories are walked recursively,',
20
+ 'skipping node_modules, .git, .svelte-kit, dist, dist-wc, build, coverage,',
21
+ 'playwright-report and test-results.'
22
+ ].join('\n');
23
+ const SKIPPED_DIRECTORIES = new Set([
24
+ 'node_modules',
25
+ '.git',
26
+ '.svelte-kit',
27
+ 'dist',
28
+ 'dist-wc',
29
+ 'build',
30
+ 'coverage',
31
+ 'playwright-report',
32
+ 'test-results'
33
+ ]);
34
+ // Scripts are scanned for `children` assignments only; the prop renames live
35
+ // in markup, so .svelte files are the only ones ever rewritten.
36
+ const SCRIPT_FILE = /\.(ts|js|mts|mjs|cts|cjs)$/;
37
+ function collectFiles(path, out) {
38
+ const stats = statSync(path);
39
+ if (stats.isFile()) {
40
+ if (path.endsWith('.svelte') || SCRIPT_FILE.test(path)) {
41
+ out.add(path);
42
+ }
43
+ return;
44
+ }
45
+ if (!stats.isDirectory()) {
46
+ return;
47
+ }
48
+ const entries = [...readdirSync(path, { withFileTypes: true })].sort((a, b) => a.name.localeCompare(b.name));
49
+ for (const entry of entries) {
50
+ if (entry.isDirectory()) {
51
+ if (!SKIPPED_DIRECTORIES.has(entry.name)) {
52
+ collectFiles(join(path, entry.name), out);
53
+ }
54
+ }
55
+ else if (entry.isFile()) {
56
+ collectFiles(join(path, entry.name), out);
57
+ }
58
+ }
59
+ }
60
+ /**
61
+ * Every edit the transform makes stays on a single line, so old and new text
62
+ * always have the same line count and a pairwise comparison is an exact diff.
63
+ */
64
+ function printLineDiff(file, before, after, log) {
65
+ const oldLines = before.split('\n');
66
+ const newLines = after.split('\n');
67
+ log(`--- ${file}`);
68
+ if (oldLines.length !== newLines.length) {
69
+ log(' (line counts differ; showing full replacement)');
70
+ for (const line of oldLines) {
71
+ log(`- ${line}`);
72
+ }
73
+ for (const line of newLines) {
74
+ log(`+ ${line}`);
75
+ }
76
+ return;
77
+ }
78
+ oldLines.forEach((oldLine, index) => {
79
+ const newLine = newLines.at(index) ?? '';
80
+ if (oldLine !== newLine) {
81
+ log(`@@ ${file}:${index + 1}`);
82
+ log(`- ${oldLine}`);
83
+ log(`+ ${newLine}`);
84
+ }
85
+ });
86
+ }
87
+ export function runCodemod(argv, log) {
88
+ const failure = {
89
+ exitCode: 2,
90
+ filesScanned: 0,
91
+ filesChanged: 0,
92
+ propsRenamed: 0,
93
+ warnings: 0
94
+ };
95
+ let parsed;
96
+ try {
97
+ parsed = parseArgs({
98
+ args: [...argv],
99
+ options: {
100
+ 'dry-run': { type: 'boolean' },
101
+ help: { type: 'boolean' }
102
+ },
103
+ allowPositionals: true,
104
+ strict: true
105
+ });
106
+ }
107
+ catch (error) {
108
+ log(error instanceof Error ? error.message : String(error));
109
+ log(USAGE);
110
+ return failure;
111
+ }
112
+ if (parsed.values.help === true) {
113
+ log(USAGE);
114
+ return { ...failure, exitCode: 0 };
115
+ }
116
+ if (parsed.positionals.length === 0) {
117
+ log(USAGE);
118
+ return failure;
119
+ }
120
+ for (const path of parsed.positionals) {
121
+ if (!existsSync(path)) {
122
+ log(`path does not exist: ${path}`);
123
+ return failure;
124
+ }
125
+ }
126
+ const dryRun = parsed.values['dry-run'] === true;
127
+ const files = new Set();
128
+ for (const path of parsed.positionals) {
129
+ collectFiles(resolve(path), files);
130
+ }
131
+ let filesChanged = 0;
132
+ let propsRenamed = 0;
133
+ let warnings = 0;
134
+ for (const file of files) {
135
+ const source = readFileSync(file, 'utf8');
136
+ // The `children` removal is a 4.0.0 breaking change to report, not a
137
+ // rename to apply, so it never contributes to filesChanged.
138
+ const childrenWarnings = findChildrenAssignments(source, file);
139
+ const result = file.endsWith('.svelte')
140
+ ? transformSvelte(source, file)
141
+ : { code: source, changed: false, propsRenamed: 0, warnings: [] };
142
+ for (const warning of [...result.warnings, ...childrenWarnings]) {
143
+ log(`${warning.file}:${warning.line}:${warning.column} WARN ${warning.message}`);
144
+ }
145
+ warnings += result.warnings.length + childrenWarnings.length;
146
+ if (!result.changed) {
147
+ continue;
148
+ }
149
+ filesChanged += 1;
150
+ propsRenamed += result.propsRenamed;
151
+ if (dryRun) {
152
+ printLineDiff(file, source, result.code, log);
153
+ }
154
+ else {
155
+ writeFileSync(file, result.code);
156
+ log(`${file}: ${result.propsRenamed} prop(s) renamed`);
157
+ }
158
+ }
159
+ log(`${dryRun ? '[dry run] ' : ''}scanned ${files.size} file(s), changed ${filesChanged}, ` +
160
+ `renamed ${propsRenamed} prop(s), ${warnings} warning(s)`);
161
+ return {
162
+ exitCode: 0,
163
+ filesScanned: files.size,
164
+ filesChanged,
165
+ propsRenamed,
166
+ warnings
167
+ };
168
+ }
169
+ const entryPoint = process.argv.at(1) ?? '';
170
+ if (entryPoint !== '' && import.meta.url === pathToFileURL(entryPoint).href) {
171
+ const summary = runCodemod(process.argv.slice(2), (line) => {
172
+ console.log(line);
173
+ });
174
+ process.exitCode = summary.exitCode;
175
+ }
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Every event-prop spelling this library still accepts but has deprecated,
3
+ * mapped to the lowercase spelling a consumer should use instead
4
+ * (DESIGN_PRINCIPLES.md §3: event props are lowercase throughout). Generated
5
+ * from the `@deprecated` tags in `src/lib/**\/properties.ts` — the tag names
6
+ * the replacement, so the library's own declarations are the source of truth
7
+ * and this table is a snapshot of them.
8
+ *
9
+ * `component` is the exported component name a consumer imports, which is
10
+ * usually but not always the `properties.ts` directory name: Stepper's
11
+ * `properties.ts` declares props for both `Stepper` and `Step`, and the
12
+ * `onClick`/`onclick` entry attributed to `Step` comes from that one shared
13
+ * file (see `scripts/codemod/generate-maps.ts`'s `OWNER_COMPONENTS`).
14
+ *
15
+ * Every entry is a same-package rewrite (a consumer moving off a spelling
16
+ * this library itself deprecated), so there is no import specifier to touch,
17
+ * only the attribute name.
18
+ *
19
+ * `scripts/codemod/generate-maps.ts` recomputes this table from source;
20
+ * `legacy-pairs.test.ts` asserts the committed array below matches its
21
+ * output, so drift fails CI instead of shipping quietly.
22
+ */
23
+ export const LEGACY_PAIRS = [
24
+ { component: 'Accordion', legacy: 'onToggle', corrected: 'ontoggle' },
25
+ { component: 'AreaChart', legacy: 'onPointHover', corrected: 'onpointhover' },
26
+ { component: 'AreaChart', legacy: 'onPointClick', corrected: 'onpointclick' },
27
+ { component: 'AttachmentChipRow', legacy: 'onRemoveImage', corrected: 'onremoveimage' },
28
+ { component: 'AttachmentChipRow', legacy: 'onRemoveFile', corrected: 'onremovefile' },
29
+ { component: 'AttachmentChipRow', legacy: 'onRemoveVideo', corrected: 'onremovevideo' },
30
+ { component: 'AttachmentChipRow', legacy: 'onOpenImage', corrected: 'onopenimage' },
31
+ { component: 'AttachmentChipRow', legacy: 'onOpenVideo', corrected: 'onopenvideo' },
32
+ { component: 'AttachmentChipRow', legacy: 'onOpenFile', corrected: 'onopenfile' },
33
+ { component: 'Banner', legacy: 'onDismiss', corrected: 'ondismiss' },
34
+ { component: 'BarChart', legacy: 'onChartReady', corrected: 'onchartready' },
35
+ { component: 'BarChart', legacy: 'onBarClick', corrected: 'onbarclick' },
36
+ { component: 'BarChart', legacy: 'onBarHover', corrected: 'onbarhover' },
37
+ { component: 'Book', legacy: 'onPageChange', corrected: 'onpagechange' },
38
+ { component: 'Calendar', legacy: 'onSelect', corrected: 'onselect' },
39
+ { component: 'Calendar', legacy: 'onRangeSelect', corrected: 'onrangeselect' },
40
+ { component: 'Calendar', legacy: 'onMonthChange', corrected: 'onmonthchange' },
41
+ { component: 'Chat', legacy: 'onSend', corrected: 'onsend' },
42
+ { component: 'Chat', legacy: 'onSuggestion', corrected: 'onsuggestion' },
43
+ { component: 'Chat', legacy: 'onClose', corrected: 'onclose' },
44
+ { component: 'Chat', legacy: 'onStop', corrected: 'onstop' },
45
+ { component: 'Chat', legacy: 'onVoice', corrected: 'onvoice' },
46
+ { component: 'Chat', legacy: 'onAttach', corrected: 'onattach' },
47
+ { component: 'Chat', legacy: 'onRetry', corrected: 'onretry' },
48
+ { component: 'Chat', legacy: 'onFeedback', corrected: 'onfeedback' },
49
+ { component: 'ChatBubble', legacy: 'onOpen', corrected: 'onopen' },
50
+ { component: 'ChatBubble', legacy: 'onClose', corrected: 'onclose' },
51
+ { component: 'ChatBubble', legacy: 'onToggle', corrected: 'ontoggle' },
52
+ { component: 'ChatComposer', legacy: 'onSubmit', corrected: 'onsubmit' },
53
+ { component: 'ChatComposer', legacy: 'onStop', corrected: 'onstop' },
54
+ { component: 'ChatComposer', legacy: 'onVoice', corrected: 'onvoice' },
55
+ { component: 'ChatComposer', legacy: 'onAttach', corrected: 'onattach' },
56
+ { component: 'ChatComposer', legacy: 'onAttachClick', corrected: 'onattachclick' },
57
+ { component: 'ChatComposer', legacy: 'onRemoveRichImage', corrected: 'onremoverichimage' },
58
+ { component: 'ChatComposer', legacy: 'onRemoveRichFile', corrected: 'onremoverichfile' },
59
+ { component: 'ChatComposer', legacy: 'onRemoveRichVideo', corrected: 'onremoverichvideo' },
60
+ { component: 'ChatComposer', legacy: 'onOpenRichImage', corrected: 'onopenrichimage' },
61
+ { component: 'ChatComposer', legacy: 'onOpenRichVideo', corrected: 'onopenrichvideo' },
62
+ { component: 'ChatComposer', legacy: 'onOpenRichFile', corrected: 'onopenrichfile' },
63
+ { component: 'ChatComposer', legacy: 'onAction', corrected: 'onaction' },
64
+ { component: 'ChatHeader', legacy: 'onClose', corrected: 'onclose' },
65
+ { component: 'ChatMessage', legacy: 'onRetry', corrected: 'onretry' },
66
+ { component: 'ChatMessage', legacy: 'onFeedback', corrected: 'onfeedback' },
67
+ { component: 'ChatMessage', legacy: 'onCopy', corrected: 'oncopy' },
68
+ { component: 'ChatMessageList', legacy: 'onScrollState', corrected: 'onscrollstate' },
69
+ { component: 'ChatMessageList', legacy: 'onRetry', corrected: 'onretry' },
70
+ { component: 'ChatMessageList', legacy: 'onFeedback', corrected: 'onfeedback' },
71
+ { component: 'ChatSuggestions', legacy: 'onSelect', corrected: 'onselect' },
72
+ { component: 'CheckListItem', legacy: 'onClick', corrected: 'onclick' },
73
+ { component: 'Checkbox', legacy: 'onClick', corrected: 'onclick' },
74
+ { component: 'ChipInput', legacy: 'onAdd', corrected: 'onadd' },
75
+ { component: 'ChipInput', legacy: 'onDismiss', corrected: 'ondismiss' },
76
+ { component: 'ChipInput', legacy: 'onEdit', corrected: 'onedit' },
77
+ { component: 'ChipInput', legacy: 'onChange', corrected: 'onchange' },
78
+ { component: 'Choicebox', legacy: 'onClick', corrected: 'onclick' },
79
+ { component: 'ColorPicker', legacy: 'onChange', corrected: 'onchange' },
80
+ { component: 'ColorPicker', legacy: 'onInput', corrected: 'oninput' },
81
+ { component: 'Combobox', legacy: 'onSelect', corrected: 'onselect' },
82
+ { component: 'Combobox', legacy: 'onInput', corrected: 'oninput' },
83
+ { component: 'Combobox', legacy: 'onOpen', corrected: 'onopen' },
84
+ { component: 'Combobox', legacy: 'onClose', corrected: 'onclose' },
85
+ { component: 'Combobox', legacy: 'onChange', corrected: 'onchange' },
86
+ { component: 'Combobox', legacy: 'onAdd', corrected: 'onadd' },
87
+ { component: 'Combobox', legacy: 'onRemove', corrected: 'onremove' },
88
+ { component: 'Combobox', legacy: 'onCreate', corrected: 'oncreate' },
89
+ { component: 'CommandMenu', legacy: 'onSelect', corrected: 'onselect' },
90
+ { component: 'CommandMenu', legacy: 'onClose', corrected: 'onclose' },
91
+ { component: 'ContextMenu', legacy: 'onSelect', corrected: 'onselect' },
92
+ { component: 'ContextMenu', legacy: 'onOpen', corrected: 'onopen' },
93
+ { component: 'ContextMenu', legacy: 'onClose', corrected: 'onclose' },
94
+ { component: 'DateRangePicker', legacy: 'onApply', corrected: 'onapply' },
95
+ { component: 'DateRangePicker', legacy: 'onApplySingle', corrected: 'onapplysingle' },
96
+ { component: 'DateRangePicker', legacy: 'onApplyCompare', corrected: 'onapplycompare' },
97
+ { component: 'DateRangePicker', legacy: 'onCancel', corrected: 'oncancel' },
98
+ { component: 'DateRangePicker', legacy: 'onOpenToggle', corrected: 'onopentoggle' },
99
+ { component: 'DateRangePicker', legacy: 'onClear', corrected: 'onclear' },
100
+ { component: 'Draggable', legacy: 'onMoveStart', corrected: 'onmovestart' },
101
+ { component: 'Draggable', legacy: 'onMove', corrected: 'onmove' },
102
+ { component: 'Draggable', legacy: 'onMoveEnd', corrected: 'onmoveend' },
103
+ { component: 'DualAxisBarChart', legacy: 'onBarClick', corrected: 'onbarclick' },
104
+ { component: 'FileDropzoneTrigger', legacy: 'onClick', corrected: 'onclick' },
105
+ { component: 'FileInput', legacy: 'onFiles', corrected: 'onfiles' },
106
+ { component: 'FileInput', legacy: 'onError', corrected: 'onerror' },
107
+ { component: 'FunnelChart', legacy: 'onStageClick', corrected: 'onstageclick' },
108
+ { component: 'FunnelChart', legacy: 'onStageHover', corrected: 'onstagehover' },
109
+ { component: 'Gallery', legacy: 'onImageClick', corrected: 'onimageclick' },
110
+ { component: 'Gallery', legacy: 'onEditClick', corrected: 'oneditclick' },
111
+ { component: 'Gallery', legacy: 'onDeleteClick', corrected: 'ondeleteclick' },
112
+ { component: 'Gallery', legacy: 'onOpen', corrected: 'onopen' },
113
+ { component: 'Gallery', legacy: 'onDismiss', corrected: 'onclose' },
114
+ { component: 'Gallery', legacy: 'onIndexChange', corrected: 'onchange' },
115
+ { component: 'HITL', legacy: 'onConfirm', corrected: 'onconfirm' },
116
+ { component: 'HITL', legacy: 'onMicToggle', corrected: 'onmictoggle' },
117
+ { component: 'IframeViewer', legacy: 'onMessage', corrected: 'onmessage' },
118
+ { component: 'Img', legacy: 'onError', corrected: 'onerror' },
119
+ { component: 'Input', legacy: 'onLeftIconClick', corrected: 'onlefticonclick' },
120
+ { component: 'Input', legacy: 'onRightIconClick', corrected: 'onrighticonclick' },
121
+ { component: 'Input', legacy: 'onInput', corrected: 'oninput' },
122
+ { component: 'Input', legacy: 'onFocus', corrected: 'onfocus' },
123
+ { component: 'Input', legacy: 'onFocusout', corrected: 'onfocusout' },
124
+ { component: 'Input', legacy: 'onBlur', corrected: 'onblur' },
125
+ { component: 'Input', legacy: 'onPaste', corrected: 'onpaste' },
126
+ { component: 'Input', legacy: 'onClick', corrected: 'onclick' },
127
+ { component: 'Input', legacy: 'onStateChange', corrected: 'onstatechange' },
128
+ { component: 'Input', legacy: 'onKeyDown', corrected: 'onkeydown' },
129
+ { component: 'LineChart', legacy: 'onPointClick', corrected: 'onpointclick' },
130
+ { component: 'LineChart', legacy: 'onPointHover', corrected: 'onpointhover' },
131
+ { component: 'LineChart', legacy: 'onChartReady', corrected: 'onchartready' },
132
+ { component: 'ListItem', legacy: 'onleftImageClick', corrected: 'onleftimageclick' },
133
+ { component: 'ListItem', legacy: 'onLeftImageClick', corrected: 'onleftimageclick' },
134
+ { component: 'ListItem', legacy: 'onrightImageClick', corrected: 'onrightimageclick' },
135
+ { component: 'ListItem', legacy: 'onRightImageClick', corrected: 'onrightimageclick' },
136
+ { component: 'ListItem', legacy: 'oncenterTextClick', corrected: 'oncentertextclick' },
137
+ { component: 'ListItem', legacy: 'onCenterTextClick', corrected: 'oncentertextclick' },
138
+ { component: 'ListItem', legacy: 'onitemClick', corrected: 'onitemclick' },
139
+ { component: 'ListItem', legacy: 'onItemClick', corrected: 'onitemclick' },
140
+ { component: 'ListItem', legacy: 'ontopSectionClick', corrected: 'ontopsectionclick' },
141
+ { component: 'ListItem', legacy: 'onTopSectionClick', corrected: 'ontopsectionclick' },
142
+ { component: 'LottiePlayer', legacy: 'onComplete', corrected: 'oncomplete' },
143
+ { component: 'LottiePlayer', legacy: 'onError', corrected: 'onerror' },
144
+ { component: 'MediaPlayer', legacy: 'onVolumeChange', corrected: 'onvolumechange' },
145
+ { component: 'MediaUpload', legacy: 'onFilesChange', corrected: 'onchange' },
146
+ { component: 'MediaUpload', legacy: 'onRemove', corrected: 'onremove' },
147
+ { component: 'MediaUpload', legacy: 'onRejected', corrected: 'onerror' },
148
+ { component: 'Menu', legacy: 'onSelect', corrected: 'onselect' },
149
+ { component: 'Menu', legacy: 'onOpen', corrected: 'onopen' },
150
+ { component: 'Menu', legacy: 'onClose', corrected: 'onclose' },
151
+ { component: 'Modal', legacy: 'onClose', corrected: 'onclose' },
152
+ { component: 'Modal', legacy: 'onheaderRightImageClick', corrected: 'onheaderrightimageclick' },
153
+ { component: 'Modal', legacy: 'onHeaderRightImageClick', corrected: 'onheaderrightimageclick' },
154
+ { component: 'Modal', legacy: 'onheaderLeftImageClick', corrected: 'onheaderleftimageclick' },
155
+ { component: 'Modal', legacy: 'onHeaderLeftImageClick', corrected: 'onheaderleftimageclick' },
156
+ { component: 'Modal', legacy: 'onprimaryButtonClick', corrected: 'onprimarybuttonclick' },
157
+ { component: 'Modal', legacy: 'onPrimaryButtonClick', corrected: 'onprimarybuttonclick' },
158
+ { component: 'Modal', legacy: 'onsecondaryButtonClick', corrected: 'onsecondarybuttonclick' },
159
+ { component: 'Modal', legacy: 'onSecondaryButtonClick', corrected: 'onsecondarybuttonclick' },
160
+ { component: 'Modal', legacy: 'onoverlayClick', corrected: 'onoverlayclick' },
161
+ { component: 'Modal', legacy: 'onOverlayClick', corrected: 'onoverlayclick' },
162
+ { component: 'Pagination', legacy: 'onChange', corrected: 'onchange' },
163
+ { component: 'Pagination', legacy: 'onLoadMore', corrected: 'onloadmore' },
164
+ { component: 'PieChart', legacy: 'onChartReady', corrected: 'onchartready' },
165
+ { component: 'PieChart', legacy: 'onSliceClick', corrected: 'onsliceclick' },
166
+ { component: 'PieChart', legacy: 'onSliceHover', corrected: 'onslicehover' },
167
+ { component: 'Pill', legacy: 'onDismiss', corrected: 'ondismiss' },
168
+ { component: 'Radio', legacy: 'onChange', corrected: 'onchange' },
169
+ { component: 'Resizable', legacy: 'onResize', corrected: 'onresize' },
170
+ { component: 'Resizable', legacy: 'onResizeStart', corrected: 'onresizestart' },
171
+ { component: 'Resizable', legacy: 'onResizeEnd', corrected: 'onresizeend' },
172
+ { component: 'SankeyChart', legacy: 'onNodeClick', corrected: 'onnodeclick' },
173
+ { component: 'SankeyChart', legacy: 'onLinkClick', corrected: 'onlinkclick' },
174
+ { component: 'SankeyChart', legacy: 'onNodeHover', corrected: 'onnodehover' },
175
+ { component: 'SankeyChart', legacy: 'onLinkHover', corrected: 'onlinkhover' },
176
+ { component: 'Scroller', legacy: 'onScrollPosition', corrected: 'onscrollposition' },
177
+ { component: 'Select', legacy: 'onChange', corrected: 'onchange' },
178
+ { component: 'Select', legacy: 'onOpen', corrected: 'onopen' },
179
+ { component: 'Select', legacy: 'onClose', corrected: 'onclose' },
180
+ { component: 'Sheet', legacy: 'onClose', corrected: 'onclose' },
181
+ { component: 'Sheet', legacy: 'onAfterOpen', corrected: 'onafteropen' },
182
+ { component: 'Sheet', legacy: 'onAfterClose', corrected: 'onafterclose' },
183
+ { component: 'Slider', legacy: 'onChange', corrected: 'onchange' },
184
+ { component: 'Slider', legacy: 'onInput', corrected: 'oninput' },
185
+ { component: 'Snippet', legacy: 'onCopy', corrected: 'oncopy' },
186
+ { component: 'SplitButton', legacy: 'onSelect', corrected: 'onselect' },
187
+ { component: 'SplitInput', legacy: 'onChange', corrected: 'onchange' },
188
+ { component: 'SplitInput', legacy: 'onInput', corrected: 'oninput' },
189
+ { component: 'SplitInput', legacy: 'onComplete', corrected: 'oncomplete' },
190
+ { component: 'StatCard', legacy: 'onCheckboxChange', corrected: 'oncheckboxchange' },
191
+ { component: 'Status', legacy: 'onbuttonClick', corrected: 'onbuttonclick' },
192
+ { component: 'Status', legacy: 'onButtonClick', corrected: 'onbuttonclick' },
193
+ { component: 'Stepper', legacy: 'onstepclick', corrected: 'onhandlestepclick' },
194
+ { component: 'Stepper', legacy: 'onStepClick', corrected: 'onhandlestepclick' },
195
+ { component: 'Stepper', legacy: 'onhandleStepClick', corrected: 'onhandlestepclick' },
196
+ { component: 'Stepper', legacy: 'onHandleStepClick', corrected: 'onhandlestepclick' },
197
+ { component: 'Step', legacy: 'onClick', corrected: 'onclick' },
198
+ { component: 'Table', legacy: 'onRowClick', corrected: 'onrowclick' },
199
+ { component: 'Table', legacy: 'onSort', corrected: 'onsort' },
200
+ { component: 'Table', legacy: 'onSearchChange', corrected: 'onsearchchange' },
201
+ { component: 'Tabs', legacy: 'onChange', corrected: 'onchange' },
202
+ { component: 'Tabs', legacy: 'onKeyChange', corrected: 'onkeychange' },
203
+ { component: 'TaskList', legacy: 'onRetry', corrected: 'onretry' },
204
+ { component: 'ThemeSwitcher', legacy: 'onChange', corrected: 'onchange' },
205
+ { component: 'ThinkingIndicator', legacy: 'onToggle', corrected: 'ontoggle' },
206
+ { component: 'ThinkingIndicator', legacy: 'onRowSelect', corrected: 'onrowselect' },
207
+ { component: 'ThinkingIndicator', legacy: 'onSettled', corrected: 'onsettled' },
208
+ { component: 'Toast', legacy: 'onToastHide', corrected: 'ontoasthide' },
209
+ { component: 'Toggle', legacy: 'onClick', corrected: 'onclick' },
210
+ { component: 'ToolCallLog', legacy: 'onChipClick', corrected: 'onchipclick' },
211
+ { component: 'Toolbar', legacy: 'onbackClick', corrected: 'onbackclick' },
212
+ { component: 'Toolbar', legacy: 'onBackClick', corrected: 'onbackclick' },
213
+ { component: 'TypewriterText', legacy: 'onProgress', corrected: 'onprogress' }
214
+ ];
215
+ /** component name -> (legacy prop name -> corrected prop name). */
216
+ export function legacyRenameTable() {
217
+ const table = new Map();
218
+ for (const pair of LEGACY_PAIRS) {
219
+ const component = table.get(pair.component) ?? new Map();
220
+ component.set(pair.legacy, pair.corrected);
221
+ table.set(pair.component, component);
222
+ }
223
+ return table;
224
+ }
225
+ /** Every legacy prop name across all components, for unresolved-tag warnings. */
226
+ export function legacyProps() {
227
+ return new Set(LEGACY_PAIRS.map((pair) => pair.legacy));
228
+ }