LinPulsar is a shared UI component library for LinOpenFactory, used by front-end applications built from lin-open-factory-ui-template.
It provides reusable visual components that can be consumed by multiple modules across the application, ensuring consistency in design, accessibility, and functionality.
This library is part of the LinOpenFactory platform and integrates seamlessly with the Module Federation architecture used in the front-end.
- Shared Vue 3 components for building module UIs
- Components categorized by function (Layout, Forms, Navigationβ¦)
- Designed for reusability across multiple modules
- Fully compatible with Quasar and TypeScript
| Area | Technology |
|---|---|
| Language | TypeScript |
| Framework | Vue.js (Composition API) |
| UI Toolkit | Quasar Framework |
| Module System | Module Federation (Vite) |
| Build Tool | Vite |
| Package Manager | pnpm |
Ensure the following requirements to use or develop LinPulsar:
- Node.js β₯ 22.19 (LTS)
- Package manager: pnpm 11+ (managed via Corepack)
- Vue.js 3 project
- Quasar Framework for UI components
- A bundler supporting Module Federation
This project is licensed under: GNU Affero General Public License version 3
See: LICENSE.md for details.
This section groups the default Module Federation implementations provided by LinPulsar.
Some modules require no custom behavior for specific concerns such as lifecycle hooks, routing, or internationalization.
For these cases, LinPulsar provides default no-op implementations that satisfy the Module Federation contract while performing no additional logic.
These implementations are intended to simplify module configuration when no customization is needed.
-
π€ EmptyLifecycle β Default lifecycle implementation that performs no operations during module lifecycle phases (init, postInit, destroy, etc.) β Exposed as:
LinPulsar/EmptyLifecycle -
π§ EmptyRoutes β Default route configuration that exposes no routes β Exposed as:
LinPulsar/EmptyRoutes -
π EmptyI18n β Default i18n configuration with no translations β Exposed as:
LinPulsar/EmptyI18n -
π ImportPageI18n β Default i18n configuration for Import page β Exposed as:
LinPulsar/ImportPageI18n
LinPulsar also provides generic page module building blocks used to structure page-based federated modules.
These modules define the standard federation contracts for page routing and lifecycle management.
-
π PageRoutes β Generic page route federation module β Exposed as:
LinPulsar/PageRoutes -
βοΈ PageLifecycle β Generic page lifecycle federation module β Exposed as:
LinPulsar/PageLifecycle
Detailed documentation for these modules is available in the dedicated module page documentation.
LinPulsar also provides generic page components used to build reusable page structures in Module Federation applications.
These components are intended to be combined with page modules to accelerate development of standard UI patterns.
The library organizes components by category. For each component, documentation is provided in a dedicated Markdown file inside docs/.
- ποΈ BaseLayout β The core layout component for all module pages
β Documentation is inside:
BaseLayout.md
- NavigationMenu β Tab-based navigation menu for module pages
β Documentation is inside:
NavigationMenu.md
- π€ HeaderProfile β User profile button for the application header, displaying the authenticated user's name and email from the
lin-pulsar-coreuser store β Documentation is inside:HeaderProfile.md - πͺ LogoutMenuItem β Logout entry rendered by HeaderProfile, with a confirmation dialog before navigating to the host logout route
β Documentation is inside:
LogoutMenuItem.md
- π EntityProfilePanel β Vertical profile panel with avatar (stored image or DiceBear, with optional image import), title/subtitle, action slot and entity details
β Documentation is inside:
EntityProfilePanel.md
- GenericEntityTable β Minimal QTable wrapper for simple entity lists
β Documentation is inside:
GenericEntityTable.md
- π³ GenericTree β Minimal QTree wrapper for hierarchical entity structures with per-type icon and label support
β Documentation is inside:
GenericTree.md
-
β¨ InformationCard β Reusable card component for displaying labeled read-only information with optional loading states β Documentation is inside:
InformationCard.md -
β¨ EntityDetailsCard β Composable container card for displaying multiple entity attributes using
InformationCardcomponents
β Documentation is inside:EntityDetailsCard.md -
β¨ ButtonsCard β A card component with action buttons β Documentation is inside:
ButtonsCard.md -
π AdvancedSearchCard β Generic search card with default and expandable advanced filters sections β Documentation is inside:
AdvancedSearchCard.md -
π GenericEditableTableCard β Card managing a collection through a table, with configuration-driven create, edit and delete flows β Documentation is inside:
GenericEditableTableCard.md -
π GenericSortableListCard β Card managing an ordered collection as a drag-and-drop list with a column header, per-item actions and order persistence β Documentation is inside:
GenericSortableListCard.md -
π³ GenericTreeCard β Card displaying an endpoint-driven tree, with configuration-driven node navigation and edition flows β Documentation is inside:
GenericTreeCard.md
-
π§© EntityAttributeField β Dynamic attribute field resolver that selects and renders the correct input component β Documentation is inside:
EntityAttributeField.md -
π EntityAttributeBooleanField β Boolean attribute input based on a toggle switch (
QToggle) β Documentation is inside:EntityAttributeBooleanField.md -
βοΈ EntityAttributeTextField β Text attribute input with full i18n and UI customization support β Documentation is inside:
EntityAttributeTextField.md -
π’ EntityAttributeNumberField β Numeric attribute input with automatic number casting and scoped translations β Documentation is inside:
EntityAttributeNumberField.md -
π EntityAttributeTextAreaField β Textarea attribute input with full i18n and UI customization support β Documentation is inside:
EntityAttributeTextAreaField.md -
π’ EntityAttributeDateField β Date attribute input with automatic date casting and scoped translations β Documentation is inside:
EntityAttributeDateField.md -
π EntityAttributeListField β Single-selection dropdown for list attributes with predefined values β Documentation is inside:
EntityAttributeListField.md -
π EntityAttributeDynamicListField β Single-selection dropdown for dynamic list attributes with lazy loading from a backend endpoint β Documentation is inside:
EntityAttributeDynamicListField.md -
π§ EntityAttributeEmailField β Email attribute input with format validation and scoped translations β Documentation is inside:
EntityAttributeEmailField.md -
π EntityAttributeFileField β File attribute picker with maximum size and allowed extensions validation β Documentation is inside:
EntityAttributeFileField.md
-
π LinPulsarSmartFilter β Filter field with a toggle-able menu managing active filters, typed filter panels and saved filter favorites β Documentation is inside:
LinPulsarSmartFilter.mdIts panels (
LinPulsarFilterPanel,LinPulsarFavoritePanel,TextSearchFilterPanel,NumberSearchFilterPanel,DateSearchFilterPanel,ListSearchFilterPanel,TreeSearchFilterPanel) and theLinPulsarFilterChipare internal to the smart filter and documented in the same file.
-
π¨οΈ ConfirmationDialog β Modal dialog for confirmation actions, with customizable title, message, and buttons β Documentation is inside:
ConfirmationDialog.md -
π FormDialog β Modal dialog for dynamic forms, supporting async validation, i18n, and custom layouts β Documentation is inside:
FormDialog.md
- β¨ BlurLoader β Skeleton loader for representing loading states
β Documentation is inside:
BlurLoader.md
-
π½ DropdownButton β A button component that provides a reusable dropdown action button with support for flat items and one-level nested sub-menus. β Documentation is inside:
DropdownButton.md -
π FormDialogButton β Action button opening the shared form dialog and sending the collected input through a configurable POST or PUT request β Documentation is inside:
FormDialogButton.md -
ποΈ ConfirmDialogButton β Action button opening the shared confirmation dialog and sending a configurable DELETE, POST or PUT request once confirmed β Documentation is inside:
ConfirmDialogButton.md -
βοΈ RedirectButton β Action button navigating through the router to a route rendered from a Nunjucks template, such as/accounts/{{ entity.id }}β Documentation is inside:RedirectButton.md -
β° MenuButton β Button opening a menu of actions, hosting the other action buttons directly or through a plugin zone β Documentation is inside:
MenuButton.md
- π EntityLink β Link whose destination and label are dynamically generated from the provided entity, the destination being rendered from a Nunjucks template such as
/accounts/{{ entity.id }}β Documentation is inside:EntityLink.md
- π·οΈ StatusBadge β Reusable badge component that standardizes the display of entity statuses with i18n support and design configuration
β Documentation is inside:
StatusBadge.md
- π€ EntityAvatar β Deterministic DiceBear avatar generated from the provided entity, sharing the generation logic of EntityProfilePanel (generated avatar only, never the stored image)
β Documentation is inside:
EntityAvatar.md
More categories and components will be added as the library evolves.
Breaking changes come with a migration guide:
0.2.xβ0.3.0: renaming fromlinid-catalog-ui(catalogUI) to@linagora/lin-pulsar(LinPulsar)
We welcome contributions to improve and extend LinPulsar. Please refer to the CONTRIBUTING.md file for:
- Development workflow
- Code guidelines
- Commit conventions
- Pull request rules
Additional documentation for the library is located in the docs/ folder:
- Each component has a dedicated Markdown file describing its usage, props, events, and examples.
- See
BaseLayout.mdas the first example of component documentation. - More docs will be added as new components are created.
For information on how to customize the visual appearance of LinPulsar components using the design.json configuration system, see:
β Design Configuration Guide
For the list of translation keys expected by the LinPulsar components, see:
For the declarative formatter / formatOptions configuration shared by the table and list components, see:
For conventions on declaring plugin zones in components, naming, and best practices, see:
For general component design rules (props, styling, i18n), see: