doSomething(value)" />
+
+
+```
+
+See also: [inline handlers](https://vuejs.org/guide/essentials/event-handling.html#inline-handlers) in Vue.js documentation.
+
+## Components SHOULD have a Story
+
+> [!TIP]
+> For now, stories are stored in
+> `@xen-orchestra/lite/src/stories` and can only be written for XO Lite and XO Core components.
diff --git a/@xen-orchestra/web-core/docs/guidelines/components.md b/@xen-orchestra/web-core/docs/guidelines/components.md
new file mode 100644
index 00000000000..2cb6eeee73b
--- /dev/null
+++ b/@xen-orchestra/web-core/docs/guidelines/components.md
@@ -0,0 +1,99 @@
+## Components and Subcomponents MUST be defined as Vue SFC (Single-File Component)
+
+## DS Components MUST be stored in the `/ui` directory of `/web-core`.
+
+## DS Components MUST be stored in their own directory.
+
+## Directory name MUST be in kebab-case (e.g. `my-component`)
+
+## Component name MUST be in PascalCase
+
+## DS Component name MUST start with `Ui` (e.g. `UiMyComponent.vue`)
+
+❌ Bad
+
+`components/ui/Square.vue`
+
+✅ Good
+
+`components/ui/square/UiSquare.vue`
+
+## Components SHOULD be kept short and be split into multiple subcomponents if necessary, stored in the same directory as the main component.
+
+❌ Bad
+
+```
+/components/
+ /ui/
+ /square/
+ /UiSquare.vue
+ /square-icon/
+ /UiSquareIcon.vue <- This component is not part of the DS and will be used only in Square.vue
+```
+
+✅ Good
+
+```
+/components/
+ /ui/
+ /square/
+ /UiSquare.vue
+ /SquareIcon.vue
+```
+
+> [!WARNING]
+> If you think that a subcomponent is likely to be reused in other components,
+> ask the DS team to define it in the DS.
+>
+> It will be then moved in its own directory, following the DS guidelines.
+
+## Components that are not part of the DS MUST have their name start with `Vts`, and be stored outside the `/ui` directory
+
+This is the case for components that are not designed in the DS, but are shared between XO 6 and XO lite, such as "helpers" and "wrappers" components, for example.
+
+❌ Bad
+
+`components/ui/divider/Divider.vue`
+
+✅ Good
+
+`components/divider/VtsDivider.vue`
+
+## DS Components MUST start with an HTML comment containing the implemented version
+
+In the form `v1`, `v2`, etc.
+
+> [!TIP]
+> The DS team can use a minor version to indicate a change in the DS that does not affect the component style.
+>
+> It must not be added to the Vue component version.
+
+❌ Bad
+
+```vue
+
+
+
+
+```
+
+✅ Good
+
+```vue
+
+
+
+
+```
+
+## Subcomponents MUST NOT have a version number
+
+If a component from the DS is split into multiple subcomponents, only the main component will have a version number
+
+## Component tags MUST follow `template`, `script` then `style` order, separated with an empty line
+
+## Component props that are used to alter the variants MUST be required
+
+> [!TIP]
+> See also [Component variants guidelines](../component-variants.md)
+> to learn how to handle different component styles based on its props or states.
diff --git a/@xen-orchestra/web-core/docs/guidelines/css.md b/@xen-orchestra/web-core/docs/guidelines/css.md
new file mode 100644
index 00000000000..9ccd260a8a5
--- /dev/null
+++ b/@xen-orchestra/web-core/docs/guidelines/css.md
@@ -0,0 +1,139 @@
+# CSS guidelines
+
+## Class names MUST use kebab-case
+
+## Component root element's class name MUST be named after the component name
+
+If no style is applied to the root element, the class name will be omitted
+
+❌ Bad
+
+```vue
+
+
+
+
+```
+
+```vue
+
+
+
+
+```
+
+✅ Good
+
+```vue
+
+
+
+
+```
+
+```vue
+
+
+
+
+```
+
+```vue
+
+
+
+
+```
+
+## Class names SHOULD be short and MUST be meaningful
+
+❌ Bad
+
+```vue
+
+
+
+
+```
+
+✅ Good
+
+```vue
+
+
+
+
+```
+
+## Component MUST use `
+```
+
+✅ Good
+
+```vue
+
+```
+
+## `rem` unit SHOULD be used instead of `px`
+
+## Component MUST use helper classes for typography
+
+The DS relies on a fixed set of font sizes, weights, styles, etc.
+
+To avoid redefining these values in every component, every time a specific font style is needed, there are utility classes available globally.
+
+The full list of classes is available in the typography directory. See [font sizes](../../lib/assets/css/typography/_size.pcss) file, for example.
+
+These classes MUST be used to ensure the typography is consistent across all components.
+
+The `typo` class MUST be used to "activate" the typography behavior on the element that needs it.
+
+> [!TIP]
+> Example:
+>
+> In the DS, a component needs to style its label with the "Paragraph/P1 - 16 regular underline".
+>
+> In the component, you can use typography classes like this:
+>
+> `
+
+
+
+
+```
+
+```vue
+
+
+
+
+
+```
+
+✅ Good
+
+```vue
+
+
+
+
+
+
+
+
+```
+
+## Optional slots container SHOULD use `v-if="slots.
"`
+
+The `slots` variable should be defined in the `script` tag of the component, like this: `const slots = defineSlots<{...}>()`
+
+❌ Bad
+
+```vue
+
+
+
+
+
+
+
+```
+
+✅ Good
+
+```vue
+
+
+
+
+
+
+
+
+
+```
+
+## Optional slots SHOULD be marked as is in the script tag
+
+Let's take an example of two slots, the `default` one is required, and the `header` slot is optional:
+
+❌ Bad
+
+```vue
+
+```
+
+✅ Good
+
+```vue
+
+```
diff --git a/@xen-orchestra/web-core/docs/index.md b/@xen-orchestra/web-core/docs/index.md
index 61efcadb4cf..3314deda617 100644
--- a/@xen-orchestra/web-core/docs/index.md
+++ b/@xen-orchestra/web-core/docs/index.md
@@ -1,6 +1,6 @@
# Guidelines
-- [Component Definition](./component-definition.md)
+- [Component Definition](./guidelines/index.md)
- [Component Variants](./component-variants.md)
- [Internationalization (i18n)](./i18n.md)
- [Icons](./icons.md)