+
+
+
+
`
- })
+ }),
+ parameters: {
+ docs: {
+ controls: { disable: true },
+ description: { story: 'All severity variants stacked.' }
+ }
+ }
}
-export const WithoutAction = {
+/** @type {import('@storybook/vue3').StoryObj
} */
+export const Closable = {
args: {
- severity: 'info',
- title: 'Info message',
- description: 'A brief description of the message.',
- actionLabel: ''
+ closable: true
},
- render: (args) => ({
- components: { Message },
- setup() {
- return { args }
- },
- template: `
-
- `
- })
+ render: Template,
+ parameters: {
+ docs: {
+ description: { story: 'Closable message with a dismiss control on the trailing edge.' }
+ }
+ }
}
-export const CustomAction = {
- render: () => ({
- components: { Message },
- template: `
-
-
-
-
-
- `
- })
+/** @type {import('@storybook/vue3').StoryObj} */
+export const AutoDismiss = {
+ args: {
+ life: 5000,
+ actionLabel: ''
+ },
+ render: Template,
+ parameters: {
+ docs: {
+ description: {
+ story: 'Auto-dismisses after 5 seconds when `life` is greater than zero.'
+ }
+ }
+ }
}
diff --git a/packages/webkit/src/components/feedback/message/message.vue b/packages/webkit/src/components/feedback/message/message.vue
index 603cdfa4b..673583c3d 100644
--- a/packages/webkit/src/components/feedback/message/message.vue
+++ b/packages/webkit/src/components/feedback/message/message.vue
@@ -1,154 +1,211 @@
-
-
-
-
-
-
-
- {{ title }}
-
-
- {{ description }}
-
-
-
-
-
-
+
+
diff --git a/packages/webkit/src/components/feedback/message/presets/transitions.ts b/packages/webkit/src/components/feedback/message/presets/transitions.ts
new file mode 100644
index 000000000..8175ee4ff
--- /dev/null
+++ b/packages/webkit/src/components/feedback/message/presets/transitions.ts
@@ -0,0 +1,23 @@
+import {
+ curve,
+ duration
+} from '../../../../../../theme/src/tokens/primitives/animations/animate.js'
+
+/**
+ * Message dismiss motion — values read only from `animate.js` (`duration`, `curve`).
+ * Applied via inline `transition` (Tailwind does not emit dynamic `duration-[…]` classes).
+ */
+export const messageDismissMotion = {
+ duration: duration['fast-02'],
+ curve: curve['productive-exit']
+} as const
+
+/** Defers unmount until the opacity exit finishes. */
+export const MESSAGE_DISMISS_MS = Number.parseInt(messageDismissMotion.duration, 10)
+
+/** Inline transition for dismiss (opacity fade-out). */
+export const getMessageDismissTransitionStyle = (): { transition: string } => ({
+ transition: `opacity ${messageDismissMotion.duration} ${messageDismissMotion.curve}`
+})
+
+export const messageDismissTransitionClasses = ['motion-reduce:transition-none'] as const