Skip to content

Remove recipes superseded by built-in APIs or documentation - #445

Draft
totally-not-ai[bot] wants to merge 6 commits into
mainfrom
remove-recipes-superseded-by-builtin-api
Draft

totally-not-ai[bot] wants to merge 6 commits into
mainfrom
remove-recipes-superseded-by-builtin-api

Conversation

@totally-not-ai

@totally-not-ai totally-not-ai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Summary

This PR removes about 110 old recipes from the cookbook. Some are now covered by the Vaadin use-cases app or the Vaadin documentation. Others show something Vaadin now does out of the box, or are outdated or too simple to keep. This makes the cookbook smaller and easier to maintain.

What changed

Behavior change: The routes of the removed recipes no longer exist, so links or bookmarks to them will return "not found". Only people who use the recipes site or link to these pages are affected. No library code changes.

  • Moved to the use-cases app: disable other buttons on click, notify active users, native OS notification, log browser errors, and real-time updating content (live data / stock ticker).
  • Now a built-in API or component: Dialog position, drag and header/footer. SplitLayout splitter position. TreeGrid#scrollToItem. Compact Grid, empty Grid message and frozen selection column. Color scheme, DatePicker date formats, Clipboard, WebStorage, TabSheet, Popover, Svg, setDisableOnClick, setAriaLabel, scrollIntoView, and Image with a DownloadHandler.
  • Covered by the component docs (partly through examples added in docs: show how to top-align wrapped Grid cell content docs#6183–#6187): many Grid, TreeGrid, form, styling and layout recipes.
  • Replaced by newer components or APIs: LitRenderer template renderers, large upload area, collapsible layout, vertical menu, auto-complete ComboBox, and formatted or streamed text.
  • Obsolete or not worth keeping: the Vaadin 8 emulations (AbsoluteLayout, CustomLayout), small plain-Java recipes, and the TypeScript client-side views together with their endpoints.
  • CSV download recipe: it now links to the "Handle downloads" docs page instead of the removed Grid CSV export recipe. Its input.csv file moved into its own package.
  • Build: The unused opencsv, viritin and reactor-core dependencies are removed. The resource filtering and app.version-style properties from the version display recipe are removed too.

API Changes

Removed recipe classes

The following classes are removed, together with all their public members. They are demo views and helpers in this app, not a library API.

// Removed
com.vaadin.recipes.recipe.absolutelayout.AbsoluteLayout
com.vaadin.recipes.recipe.absolutelayout.AbsoluteLayoutView
com.vaadin.recipes.recipe.alwayseditablelabel.AlwaysEditableLabel
com.vaadin.recipes.recipe.arialabeltofields.AddAriaLabelToVaadinComponents
com.vaadin.recipes.recipe.autocompletecombobox.AutoCompleteComboBox
com.vaadin.recipes.recipe.autocompletecombobox.AutoCompleteComboBoxExample
com.vaadin.recipes.recipe.avoiddoubleclick.AvoidDoubleClick
com.vaadin.recipes.recipe.binderautoapplycustomconverter.CustomBinder
com.vaadin.recipes.recipe.binderautoapplycustomconverter.CustomBinderConverterFactory
com.vaadin.recipes.recipe.bytearraytoimage.ByteArrayToImage
com.vaadin.recipes.recipe.clientsidelivedata.StockDataEndpoint
com.vaadin.recipes.recipe.clientsideupload.FileUploadEndpoint
com.vaadin.recipes.recipe.collapsablelayout.CollapsableLayoutRecipe
com.vaadin.recipes.recipe.collapsablelayout.MyCollapsableLayout
com.vaadin.recipes.recipe.contextmenuassingleselect.ContextMenuAsSingleSelect
com.vaadin.recipes.recipe.contextmenuassingleselect.SingleSelectContextMenu
com.vaadin.recipes.recipe.copyfromclipboard.CopyFromClipboard
com.vaadin.recipes.recipe.copytoclipboard.CopyToClipboard
com.vaadin.recipes.recipe.customlayout.CustomLayout
com.vaadin.recipes.recipe.customlayout.CustomLayoutExample
com.vaadin.recipes.recipe.datepickerpattern.DatePickerPattern
com.vaadin.recipes.recipe.densegrid.GridDenseTheme
com.vaadin.recipes.recipe.dialogposition.DialogPosition
com.vaadin.recipes.recipe.dialogpositionchangedevent.DialogPositionChangedEvent
com.vaadin.recipes.recipe.dialogslideinout.DialogSlideInOut
com.vaadin.recipes.recipe.dialogwithkeyboardshortcuts.DialogWithKeyboardShortcuts
com.vaadin.recipes.recipe.disableotherbuttons.DisableOtherButtons
com.vaadin.recipes.recipe.displayversion.AppVersions
com.vaadin.recipes.recipe.displayversion.DisplayVersion
com.vaadin.recipes.recipe.distinguisheditablefromnoneditablecells.DistinguishEditableFromNonEditableCells
com.vaadin.recipes.recipe.dynamicallychangeprogressbarcolor.DynamicallyChangeProgressBarColor
com.vaadin.recipes.recipe.dynamicallyrenderimageusinglitrenderer.DynamicallyRenderImageUsingLitRenderer
com.vaadin.recipes.recipe.dynamiccomboboxitembackgroundcolor.DynamicComboboxItemBackgroundColor
com.vaadin.recipes.recipe.dynamicgridcellbackgroundcolor.DynamicGridCellBackgroundColor
com.vaadin.recipes.recipe.dynamicgridcellstyling.DynamicGridCellStyling
com.vaadin.recipes.recipe.dynamicgridrowbackgroundcolor.DynamicGridRowBackgroundColor
com.vaadin.recipes.recipe.editablelabelondblclick.EditableLabelOnDblClick
com.vaadin.recipes.recipe.filetree.FileTree
com.vaadin.recipes.recipe.focusablelayout.FocusableLayout
com.vaadin.recipes.recipe.formattext.FormatText
com.vaadin.recipes.recipe.formtabs.FormTabs
com.vaadin.recipes.recipe.gridarrowselection.GridArrowSelection
com.vaadin.recipes.recipe.gridcolumntoggle.GridColumnToggle
com.vaadin.recipes.recipe.gridcsvexport.GridCsvExport
com.vaadin.recipes.recipe.gridcsvimport.GridCsvImport
com.vaadin.recipes.recipe.griddatabaseerror.HandleDataBaseErrorInGrid
com.vaadin.recipes.recipe.griddatabaseerror.Person
com.vaadin.recipes.recipe.griddatabaseerror.PersonService
com.vaadin.recipes.recipe.griddetailstable.GridDetailsTable
com.vaadin.recipes.recipe.griddetailstable.MonthlyExpense
com.vaadin.recipes.recipe.griddndreorderrows.GridDndReorderRows
com.vaadin.recipes.recipe.griddrilldown.GridDrillDown
com.vaadin.recipes.recipe.gridexternaltemplaterenderer.GridExternalTemplateRenderer
com.vaadin.recipes.recipe.gridfrozenselectioncolumn.GridFrozenSelectionColumn
com.vaadin.recipes.recipe.gridhyperlinks.GridHyperlink
com.vaadin.recipes.recipe.gridimagerenderer.ImageRendererGrid
com.vaadin.recipes.recipe.gridmessagewhenempty.GridMessageWhenEmpty
com.vaadin.recipes.recipe.gridrecord.GridRecord
com.vaadin.recipes.recipe.gridrowheight.GridRowHeight
com.vaadin.recipes.recipe.gridtemplaterendererinteraction.GridTemplateRendererInteraction
com.vaadin.recipes.recipe.highlightweekends.DatePickerHighlightWeekends
com.vaadin.recipes.recipe.hostname.Hostname
com.vaadin.recipes.recipe.largeuploadarea.LargeUploadArea
com.vaadin.recipes.recipe.lazycomponent.LazyComponentView
com.vaadin.recipes.recipe.lazycomponent.LazyContainer
com.vaadin.recipes.recipe.lazydetails.LazyDetails
com.vaadin.recipes.recipe.livedata.LiveData
com.vaadin.recipes.recipe.livedata.StockDataService
com.vaadin.recipes.recipe.localefromcookie.LocaleFromCookie
com.vaadin.recipes.recipe.localefromcookie.LocaleInitListener
com.vaadin.recipes.recipe.localstorage.LocalStorage
com.vaadin.recipes.recipe.logbrowsererrors.LogBrowserErrors
com.vaadin.recipes.recipe.longrunningtask.BackendService
com.vaadin.recipes.recipe.longrunningtask.LongRunningTask
com.vaadin.recipes.recipe.mapingridandbinder.MapInGridAndBinder
com.vaadin.recipes.recipe.notifychanges.NotifyUsers
com.vaadin.recipes.recipe.oslightdarktheme.OSLightDarkTheme
com.vaadin.recipes.recipe.overflowingmenubar.OverflowingMenuBarRecipe
com.vaadin.recipes.recipe.popupbutton.ButtonPopupPositionView
com.vaadin.recipes.recipe.preservestate.PreserveState
com.vaadin.recipes.recipe.printselectively.PrintSelectively
com.vaadin.recipes.recipe.recursiveselecttree.RecursiveSelectTreeGrid
com.vaadin.recipes.recipe.recursiveselecttree.TreeGridRecursiveSelectionView
com.vaadin.recipes.recipe.reducecomboboxitemsseparation.ReduceComboBoxItemsSeparation
com.vaadin.recipes.recipe.resizablecomponents.ResizableComponents
com.vaadin.recipes.recipe.responsivegrid.Person
com.vaadin.recipes.recipe.responsivegrid.ResponsiveGrid
com.vaadin.recipes.recipe.scrollabledialog.ScrollableDialog
com.vaadin.recipes.recipe.scrollintoview.ScrollIntoViewView
com.vaadin.recipes.recipe.scrolltoitemintreegrid.ScrollToItemInTreeGrid
com.vaadin.recipes.recipe.showsvg.ShowSvg
com.vaadin.recipes.recipe.sortwithrenderer.SortWithRenderer
com.vaadin.recipes.recipe.splitbuttonbar.SplitButtonBar
com.vaadin.recipes.recipe.splitlayoutsplitterposition.SplitLayoutSplitterPosition
com.vaadin.recipes.recipe.streamtext.StreamText
com.vaadin.recipes.recipe.tabsheet.TabSheetView
com.vaadin.recipes.recipe.tabswithroutes.TabsWithRoutes
com.vaadin.recipes.recipe.treegridfiltering.TreeGridFiltering
com.vaadin.recipes.recipe.treegridwithicons.FileItem
com.vaadin.recipes.recipe.treegridwithicons.FileItemData
com.vaadin.recipes.recipe.treegridwithicons.TreeGridWithIcons
com.vaadin.recipes.recipe.uieventbus.UIEventBusRecipe
com.vaadin.recipes.recipe.undoablesend.UndoableSend
com.vaadin.recipes.recipe.uploadvalidator.UploadValidation
com.vaadin.recipes.recipe.userlocalegridnumbers.ApplicationI18NProvider
com.vaadin.recipes.recipe.userlocalegridnumbers.UserLocaleGridNumbers
com.vaadin.recipes.recipe.verticalmenu.VerticalMenu
com.vaadin.recipes.recipe.vibrate.Vibrate
com.vaadin.recipes.recipe.visiblyclicked.VisiblyClicked
com.vaadin.recipes.recipe.warningwhenleavingdirtyform.WarningWhenLeavingDirtyForm

totally-not-ai Bot and others added 3 commits September 26, 2026 09:11
These recipes work around limitations that no longer exist or just
demonstrate a single built-in API that is already covered by the
component and Flow documentation:

- Dialog position / drag event: Dialog#setTop/setLeft, addDraggedListener
- Scrollable dialog with fixed header/footer: Dialog#getHeader/getFooter
- SplitLayout splitter position: getSplitterPosition, addSplitterDragEndListener
- Scroll TreeGrid to item and expand: TreeGrid#scrollToItem
- Dense Grid: GridVariant.LUMO_COMPACT
- Empty Grid message: Grid#setEmptyStateText/setEmptyStateComponent
- Frozen selection column: GridMultiSelectionModel#setSelectionColumnFrozen
- OS light/dark theme: Page#setColorScheme / @colorscheme
- DatePicker custom pattern: DatePickerI18n#setDateFormats
- Copy to/from clipboard: Clipboard API
- Local storage: WebStorage
- TabSheet, Popover, Svg: dedicated components
- Avoid double click: Button#setDisableOnClick
- aria-label: HasAriaLabel#setAriaLabel
- Scroll into view: Component#scrollIntoView
- Byte array to image: Image with DownloadHandler

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
These recipes are covered by the component and building-apps
documentation, either already or through the examples added in
vaadin/docs#6183, #6184, #6185, #6186 and #6187:

- Grid styling: dynamic cell/row background, cell styling, row height,
  editable cells, ComboBox item background and item spacing
- Grid columns and renderers: hyperlinks, images, sorting with renderers,
  locale-aware numbers, details table, column toggle, responsive columns,
  records, Map items with Binder
- Grid interaction: arrow-key selection, drag-and-drop reordering, drill
  down, lazy loading errors, CSV import and export
- TreeGrid: filtering, recursive selection, icons, file tree
- Forms: auto-applied converters, upload validation, leaving a dirty
  form, form tabs, editable labels, locale from cookie, lazy Details
- Styling and layout: progress bar color, resizable components, dialog
  slide animation, printing selectively, dialog shortcuts, weekend
  highlighting, split button bar, overflowing MenuBar

The CSV file shared with the "Download text area contents as a file"
recipe moves to that recipe's package.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The related Grid CSV export recipe has been removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@totally-not-ai totally-not-ai Bot changed the title Remove recipes superseded by built-in APIs Remove recipes superseded by built-in APIs or documentation Sep 26, 2026
totally-not-ai Bot and others added 3 commits September 26, 2026 13:49
- Superseded by components or APIs: external and interactive template
  renderers (LitRenderer), large upload area (Upload), collapsable
  layout (Details), vertical menu (SideNav), auto-complete ComboBox,
  formatted and streamed text (Markdown, MessageList)
- Vaadin 8 emulations: AbsoluteLayout, CustomLayout
- Trivial or plain Java: display version, hostname, visibly clicked
  button, context menu as single select, tabs with routes, undoable
  send, lazy component, preserve state, UI event bus, long running task,
  vibrate, closable side panel
- TypeScript views: circular progress indicator, client-side upload,
  client-side live data, shortcut listener, geolocation, and the
  endpoints backing them

Drop the viritin and opencsv dependencies, which are no longer used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Disable other buttons on click: triggers use case (vaadin/use-cases#344)
- Show a notification to active users: signals use case (vaadin/use-cases#343)
- Native OS-level notification: web-notifications module (vaadin/use-cases#345)
- Log browser errors: observability module
- Show real-time updating content: signals stock ticker and dashboard

Drop the reactor-core dependency, which is no longer used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants