refactor: migrate Icon to component icons from @coss/ui/icons#27458
refactor: migrate Icon to component icons from @coss/ui/icons#27458eunjae-lee merged 50 commits intomainfrom
Conversation
Create a new icon system in @coss/ui/icons that wraps lucide-react icons
with controlled props (size and className only). Migrate 44 component
files from <Icon name="xxx" /> to <XxxIcon /> pattern.
This is Phase 1 of the icon migration, covering only static icon names.
Dynamic icon usages (e.g., name={variable}) are skipped for now.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Migrated 18 files from <Icon name="xxx" /> to <XxxIcon /> pattern: - Event meta, insights, shell, user table bulk actions - Webhooks, blocklist, form-builder, form components Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Migrated 7 files: - CancelBooking, AddGuestsDialog, ChargeCardDialog - ReassignDialog, RescheduleDialog - Categories, Slider Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Migrated 6 files: - Organizations: AboutOrganizationForm, PaymentStatusView, profile - Workflows: CallDetailsSheet, SkeletonLoaderList, TimeTimeUnitInput Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Migrated 4 files: - TwoFactorModalHeader - App setups: alby, make, btcpayserver Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- confirmDialog.tsx: clock icon - ics-feedcalendar/Setup.tsx: trash, plus icons - hitpay/Setup.tsx: info icon - paypal/Setup.tsx: circle-alert icons Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- webhook-edit-view.tsx: external-link icon - webhook-new-view.tsx: external-link icon - UserDropdown.tsx: chevron-down, user, settings, moon, map, circle-help, download, blocks, log-out icons - TopNav.tsx: settings icon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EmailInviteForm.tsx: x icon - InviteOptions.tsx: mail, upload, link icons - SkeletonLoader.tsx: search, clock, user icons - Embed.tsx: sun, arrow-left icons - CalendarSwitch.tsx: arrow-left, rotate-cw icons Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- apps-view.tsx: search icon - categories-view.tsx: arrow-left, arrow-right icons - DatePicker.tsx: calendar icon - EditLocationDialog.tsx: map-pin icon - AppPage.tsx: circle-alert, book-open, external-link, mail, file, shield, flag icons Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- LicenseSelection.tsx: loader, check icons - AppConnectionItem.tsx: circle-alert, arrow-right icons - oauth-client-form/index.tsx: info icons (x2) - auth/error/page.tsx: x icon - troubleshoot/layout.tsx: loader icon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- UpgradeTipWrapper.tsx: users, refresh-ccw, user-plus icons - PbacOptInModal.tsx: shield-check, lock, users, shield icons - AdvancedPermissionGroup.tsx: chevron-right, info icons Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AdminAppsList.tsx: pencil icon - AvailableTimes.tsx: calendar-x-2 icon - BookingDetailsSheet.tsx: external-link (x2), repeat icons - BookingCalendarContainer.tsx: chevron-left, chevron-right icons Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- videos-single-view.tsx: chevron-right icon - TroubleshooterSidebar.tsx: arrow-left icon - RuleBuilder.tsx: filter icon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FieldMappingBuilder.tsx: arrow-right, link icons - IntegrationAttributeSyncCard.tsx: key icon - onboarding-view.tsx: loader icon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- team-profile-view.tsx: copy icon - DateRangeFilter.tsx: check icon - ColumnVisibilityButton.tsx: check icon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EventWorkflowsTab.tsx: lock - event-types-listing-view.tsx: search - onboarding-migrate-members-browser-view.tsx: arrow-left, arrow-right, rotate-cw, lock, ellipsis-vertical, check, user-plus - onboarding-migrate-teams-browser-view.tsx: arrow-left, arrow-right, rotate-cw, lock, ellipsis-vertical, check, arrow-right, users - EventAvailabilityTab.tsx: globe, user - onboarding-teams-browser-view.tsx: arrow-left, arrow-right, rotate-cw, lock, ellipsis-vertical, check, arrow-right, users - FormBuilder.tsx: mail, phone, arrow-up, arrow-down - AIEventController.tsx: info - EventTeamAssignmentTab.tsx: x Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EventAdvancedTab.tsx: pencil, info - HostLocations.tsx: triangle-alert, loader - EventTypeLayout.tsx: loader - Locations.tsx: x, corner-down-right, check - EditWeightsForAllTeamMembers.tsx: upload, search, info, chevron-down - WorkflowPage.tsx: pencil Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TestPhoneCallDialog.tsx: phone - WorkflowListPage.tsx: link - UsersTable.tsx: building, lock - TeamList.tsx: building, paintbrush, chart-line, user-plus, users, pencil - bookings-single-view.tsx: chevron-left, check, calendar, x, external-link Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TeamsListing.tsx: users, refresh-ccw, user-plus, mail, video, eye-off, info - ConnectionInfo.tsx: clipboard - IntercomContactForm.tsx: message-circle, loader, send Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EventTypesList.tsx: check → CheckIcon - MemberInvitationModal.tsx: user, users, building → UserIcon, UsersIcon, BuildingIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ImportNumberDialog.tsx: info → InfoIcon - VoiceSelector.tsx: user → UserIcon - IncomingCallsTab.tsx: info, phone-incoming → InfoIcon, PhoneIncomingIcon - PhoneNumberTab.tsx: loader, phone → LoaderIcon, PhoneIcon - VoiceSelectionDialog.tsx: pause, play, user → PauseIcon, PlayIcon, UserIcon - WebCallDialog.tsx: loader, phone, phone-off, triangle-alert, trash, message-circle → new icons (kept Icon import for dynamic mic icon) - WorkflowDetailsPage.tsx: zap, arrow-right → ZapIcon, ArrowRightIcon - AddActionDialog.tsx: info → InfoIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- info → InfoIcon (2 instances) - phone → PhoneIcon (2 instances) - circle-help → CircleHelpIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…onents - attributes-list-view.tsx: tags → TagsIcon - AddFilterButton.tsx: plus, eye-off → PlusIcon, EyeOffIcon - BaseSelectFilterOptions.tsx: check → CheckIcon - DataTable.tsx: arrow-up, arrow-down, check, chevrons-up-down, eye-off → new icons - booking-dry-run-success-view.tsx: check → CheckIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…mponents - UsernameTextfield.tsx: check → CheckIcon - PremiumTextfield.tsx: check, external-link → CheckIcon, ExternalLinkIcon (kept Icon for star with fill prop) - Header.tsx (routing-forms): pencil, menu, waypoints → PencilIcon, MenuIcon, WaypointsIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Batch 25: Migrate static Icon usages to @coss/ui/icons components. Files changed: - Forms.tsx: file-text, shuffle, chart-bar, circle-check, mail, download → FileTextIcon, ShuffleIcon, ChartBarIcon, CircleCheckIcon, MailIcon, DownloadIcon - FormEdit.tsx: chevron-down, menu → ChevronDownIcon, MenuIcon - IncompleteBooking.tsx: globe → GlobeIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Batch 26: Migrate static Icon usages to @coss/ui/icons components. Files changed: - ProgressToast.tsx: file-down, x → FileDownIcon, XIcon - showToast.tsx: check, info, x → CheckIcon, InfoIcon, XIcon - InfoBadge.tsx: info → InfoIcon - MeetingTimeInTimezones.tsx: globe → GlobeIcon - InputError.tsx: info → InfoIcon - ConfirmationDialogContent.tsx: circle-alert, check → CircleAlertIcon, CheckIcon - CalendarSwitch.tsx: arrow-left, rotate-cw → ArrowLeftIcon, RotateCwIcon - ArrowButton.tsx: arrow-up, arrow-down → ArrowUpIcon, ArrowDownIcon - FileUploader.tsx: upload → UploadIcon (kept Icon for dynamic) - Checkbox.tsx: check → CheckIcon - EditableHeading.tsx: pencil → PencilIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Batch 27: Migrate static Icon usages to @coss/ui/icons components. Files changed: - MultiEmail.tsx: x → XIcon (converted width to size) - AppListCard.tsx: circle-alert → CircleAlertIcon - SplitButton.tsx: chevron-down → ChevronDownIcon (kept Icon for dynamic) - Calendar.tsx: chevron-left, chevron-right → ChevronLeftIcon, ChevronRightIcon - AppDependencyComponent.tsx: check, circle-x, arrow-right → CheckIcon, CircleXIcon, ArrowRightIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Batch 28: Migrate static Icon usages to @coss/ui/icons components. Files changed: - TextField.tsx: info → InfoIcon (kept Icon for x with onClick) - Input.tsx: eye, eye-off, search → EyeIcon, EyeOffIcon, SearchIcon Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Packages like packages/ui and packages/app-store use a legacy moduleResolution setting that doesn't support subpath exports. This changes the import path from @coss/ui/icons to @coss/ui/src/icons for these packages. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…nents Migrates static Icon usages: - MultiOptionInput: x (2x), arrow-up, arrow-down - components (select): check - AddVariablesDropdown: chevron-down (3x) - ToolbarPlugin: chevron-down Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
Co-Authored-By: unknown <>
There was a problem hiding this comment.
1 issue found across 1 file (changes from recent commits).
Prompt for AI agents (all issues)
Check if these issues are valid — if so, understand the root cause of each and fix them.
<file name="packages/coss-ui/package.json">
<violation number="1" location="packages/coss-ui/package.json:5">
P2: Marking the package as `sideEffects: false` can tree‑shake away CSS‑only imports like `@coss/ui/styles.css`, so consumers may lose global styles. Exempt CSS files in `sideEffects` so the stylesheet is preserved.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
Devin AI is addressing Cubic AI's review feedbackA Devin session has been created to address the issues identified by Cubic AI. |
Cubic AI Review Feedback - Triage SummaryReviewed all Cubic AI comments on this PR and checked confidence scores:
Note on the No code changes needed - all issues meeting the 9/10 confidence threshold have already been addressed. |
supalarry
left a comment
There was a problem hiding this comment.
Tested locally - went trough all side bar tabs, settings, made a booking, workflow etc and did not see any icon issues.
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
Co-Authored-By: unknown <>
794f50c
What does this PR do?
Phase 1 of the icon migration project - migrating static
<Icon name="xxx" />usages to component icons from@coss/ui/icons. This includes fixing module resolution issues for packages with legacy moduleResolution settings.Key Changes:
@coss/ui/iconsexport file with component-based icons<CheckIcon />instead of<Icon name="check" />)@coss/ui/iconsto@coss/ui/src/iconsfor packages/ui and packages/app-store due to legacy moduleResolutionFiles Changed: 190 files
Lines Changed: +1296/-1014
Updates since last revision
FormEdit.tsx: Changed hardcoded "Select field type" string to uset("select_field_type")for proper i18n support (addresses Cubic AI review feedback)select_field_typetranslation key toapps/web/public/static/locales/en/common.jsonTesting
Icons should render visually identically to before - this is a refactoring that improves type safety and performance. All component-based icons maintain the same className and size prop handling as the original Icon component.
How should this be tested?
Human Review Checklist
Mandatory Tasks (DO NOT REMOVE)
Checklist
🤖 Generated with Claude Code
Link to Devin run: https://app.devin.ai/sessions/2d43ade9d49f4458ac4748b9109b4b90
Requested by: unknown ()