@framework/ui@framework/ui est un package interne qui regroupe des composants Vue et des utilitaires partagés entre toutes les applications dépendant du framework Frappe/Dodock (Studio, Builder, HRMS, etc.). Il s'agit d'une extension de frappe-ui dédiée aux composants spécifiques au framework que toutes les applications ont besoin de partager.
@framework/ui est un package local — il n'est jamais publié sur npm. Le code est livré sous forme de sources brutes (.vue et .ts) sans étape de compilation préalable : c'est le bundler de l'application hôte (Vite) qui le compile au moment du build. Ce fonctionnement est identique à celui de frappe-ui.
Les dépendances vue, vue-router et frappe-ui sont déclarées en peer dependencies : elles ne sont pas dupliquées dans le package, mais réutilisées depuis l'application hôte. Cela évite les instances Vue multiples et les conflits de contexte de routeur.
Le package se trouve dans le dossier ui/ du dépôt dodock (ou frappe en amont) :
dodock/
└── ui/
├── package.json # Manifeste du package (@framework/ui)
├── README.md # Documentation développeur
└── src/
├── index.ts # Point d'entrée — exporte tous les composants
└── components/
└── Link/
├── Link.vue # Composant <Link>
├── index.ts # Export du composant
└── types.ts # Types TypeScript associés
Dans le package.json de votre application, ajoutez @framework/ui comme dépendance locale en pointant vers le dossier ui/ de Dodock :
{
"dependencies": {
"@framework/ui": "file:../../../apps/dodock/ui"
}
}
Adaptez le chemin relatif selon l'emplacement de votre application dans le bench.
Comme le package est livré en sources brutes, Vite doit être configuré pour ne pas l'exclure de la compilation. Dans votre vite.config.js :
export default {
optimizeDeps: {
// Ne pas pré-bundler @framework/ui — il doit être compilé avec l'app
exclude: ['@framework/ui']
}
}
Une fois la dépendance installée, importez les composants directement depuis @framework/ui :
import { Link } from '@framework/ui'
Ou globalement dans votre main.ts pour un enregistrement sur toute l'application :
import { createApp } from 'vue'
import { Link } from '@framework/ui'
import App from './App.vue'
const app = createApp(App)
app.component('Link', Link)
app.mount('#app')
<Link>Composant de lien intelligent qui s'adapte au contexte de navigation de l'application Frappe/Dodock.
<template>
<Link :doctype="'Client'" :name="'Maison Verte SARL'">
Voir la fiche client
</Link>
</template>
<script setup lang="ts">
import { Link } from '@framework/ui'
</script>
Props principales (voir src/components/Link/types.ts pour la liste complète) :
| Prop | Type | Description |
|---|---|---|
doctype | string | Type de document Frappe cible |
name | string | Nom du document cible |
Pour contribuer un nouveau composant à @framework/ui :
ui/src/components/MonComposant/ avec au minimum :MonComposant.vue — le composant Vueindex.ts — l'export nommétypes.ts — les interfaces TypeScriptui/src/index.ts :export { default as MonComposant } from './components/MonComposant'
export type { MonComposantProps } from './components/MonComposant/types'
ui/README.md.@framework/ui que s'il est effectivement utilisé par plusieurs applications différentes. Les composants spécifiques à une seule application restent dans cette application.Le choix de ne pas publier ce package sur npm est délibéré :