@aggc/ui 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/chunks/UiToastProvider.vue_vue_type_script_setup_true_lang-D7OGRCU4.js +3958 -0
  2. package/dist/components/UiAvatar.styles.d.ts +53 -0
  3. package/dist/components/UiAvatar.vue.d.ts +13 -0
  4. package/dist/components/UiModal.styles.d.ts +21 -0
  5. package/dist/components/UiModal.vue.d.ts +30 -0
  6. package/dist/components/UiToast.styles.d.ts +41 -0
  7. package/dist/components/UiToast.vue.d.ts +13 -0
  8. package/dist/components/UiToastProvider.vue.d.ts +13 -0
  9. package/dist/components/index.d.ts +4 -0
  10. package/dist/components.js +14 -10
  11. package/dist/composables/useToast.d.ts +27 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.js +66 -61
  14. package/dist/ui.css +356 -58
  15. package/package.json +3 -2
  16. package/src/components/UiAvatar.styles.ts +81 -0
  17. package/src/components/UiAvatar.test.ts +43 -0
  18. package/src/components/UiAvatar.vue +41 -0
  19. package/src/components/UiModal.styles.ts +126 -0
  20. package/src/components/UiModal.test.ts +64 -0
  21. package/src/components/UiModal.vue +79 -0
  22. package/src/components/UiToast.styles.ts +143 -0
  23. package/src/components/UiToast.test.ts +47 -0
  24. package/src/components/UiToast.vue +65 -0
  25. package/src/components/UiToastProvider.vue +22 -0
  26. package/src/components/index.ts +4 -0
  27. package/src/composables/useToast.ts +43 -0
  28. package/src/css/base.css +50 -1
  29. package/src/index.ts +1 -0
  30. package/src/stories/feedback/UiToast.stories.ts +72 -0
  31. package/src/stories/layout/UiModal.stories.ts +89 -0
  32. package/src/stories/primitives/UiAvatar.stories.ts +83 -0
  33. package/dist/chunks/UiSkeleton.vue_vue_type_script_setup_true_lang-DUse1KRc.js +0 -1201
package/src/css/base.css CHANGED
@@ -83,9 +83,58 @@ body {
83
83
  }
84
84
  }
85
85
 
86
+ @keyframes fadeIn {
87
+ from { opacity: 0; }
88
+ to { opacity: 1; }
89
+ }
90
+
91
+ @keyframes modalIn {
92
+ from {
93
+ opacity: 0;
94
+ transform: scale(0.95) translateY(12px);
95
+ }
96
+ to {
97
+ opacity: 1;
98
+ transform: scale(1) translateY(0);
99
+ }
100
+ }
101
+
102
+ @keyframes toastSlideIn {
103
+ from {
104
+ opacity: 0;
105
+ transform: translateX(calc(100% + 1rem));
106
+ }
107
+ to {
108
+ opacity: 1;
109
+ transform: translateX(0);
110
+ }
111
+ }
112
+
113
+ @keyframes toastFadeOut {
114
+ from {
115
+ opacity: 1;
116
+ transform: translateX(0);
117
+ }
118
+ to {
119
+ opacity: 0;
120
+ transform: translateX(calc(100% + 1rem));
121
+ }
122
+ }
123
+
124
+ @keyframes toastSwipeOut {
125
+ from {
126
+ transform: translateX(var(--reka-toast-swipe-end-x));
127
+ }
128
+ to {
129
+ transform: translateX(calc(100% + 1rem));
130
+ }
131
+ }
132
+
86
133
  @media (prefers-reduced-motion: reduce) {
87
134
  .aggc-spin,
88
- [data-ui-loading-pulse] {
135
+ [data-ui-loading-pulse],
136
+ [data-state="open"],
137
+ [data-state="closed"] {
89
138
  animation: none !important;
90
139
  }
91
140
 
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./components/index";
2
+ export * from "./composables/useToast";
2
3
  export * from "./styles/index";
3
4
  export * from "./tokens/index";
@@ -0,0 +1,72 @@
1
+ import type { Meta, StoryObj } from "@storybook/vue3-vite";
2
+ import { ref } from "vue";
3
+ import { UiButton, UiToast, UiToastProvider } from "../../components";
4
+ import { useToast } from "../../composables/useToast";
5
+ import StoryThemeFrame from "../support/StoryThemeFrame.vue";
6
+ import {
7
+ storySurfaceClass,
8
+ storySurfaceCompactClass,
9
+ } from "../support/storyStyles";
10
+
11
+ const meta: Meta = {
12
+ title: "Feedback/UiToast",
13
+ id: "ui-toast",
14
+ component: UiToast,
15
+ tags: ["autodocs"],
16
+ parameters: {
17
+ docs: {
18
+ description: {
19
+ component:
20
+ "Notification toast with tone-based styling, auto-dismiss, and swipe-to-dismiss. Built on Reka UI Toast.",
21
+ },
22
+ },
23
+ },
24
+ };
25
+
26
+ export default meta;
27
+ type Story = StoryObj<typeof meta>;
28
+
29
+ export const Tones: Story = {
30
+ render: () => ({
31
+ components: { StoryThemeFrame, UiToast, UiToastProvider, UiButton },
32
+ setup() {
33
+ const previewTheme = ref<"light" | "dark">("dark");
34
+ const toast = useToast();
35
+ return { previewTheme, toast };
36
+ },
37
+ template: `
38
+ <StoryThemeFrame v-model:theme="previewTheme" preview-id="toast-tones">
39
+ <UiToastProvider>
40
+ <div :class="[storySurfaceClass, storySurfaceCompactClass]" style="display: flex; gap: 0.75rem; flex-wrap: wrap;">
41
+ <UiButton variant="outline" @click="toast.success('Workspace created successfully')">Success</UiButton>
42
+ <UiButton variant="outline" @click="toast.error('Failed to upload document')">Error</UiButton>
43
+ <UiButton variant="outline" @click="toast.info('API key copied to clipboard')">Info</UiButton>
44
+ <UiButton variant="outline" @click="toast.warning('Storage quota almost full')">Warning</UiButton>
45
+ </div>
46
+ </UiToastProvider>
47
+ </StoryThemeFrame>
48
+ `,
49
+ }),
50
+ };
51
+
52
+ export const Static: Story = {
53
+ render: () => ({
54
+ components: { StoryThemeFrame, UiToast, UiToastProvider },
55
+ setup() {
56
+ const previewTheme = ref<"light" | "dark">("dark");
57
+ return { previewTheme };
58
+ },
59
+ template: `
60
+ <StoryThemeFrame v-model:theme="previewTheme" preview-id="toast-static">
61
+ <UiToastProvider>
62
+ <div :class="[storySurfaceClass, storySurfaceCompactClass]" style="display: flex; flex-direction: column; gap: 0.75rem;">
63
+ <UiToast tone="success" message="Document uploaded and processed." :duration="0" />
64
+ <UiToast tone="error" message="Upload failed. Please try again." :duration="0" />
65
+ <UiToast tone="info" message="New workspace available." :duration="0" />
66
+ <UiToast tone="warning" message="Rate limit approaching." :duration="0" />
67
+ </div>
68
+ </UiToastProvider>
69
+ </StoryThemeFrame>
70
+ `,
71
+ }),
72
+ };
@@ -0,0 +1,89 @@
1
+ import type { Meta, StoryObj } from "@storybook/vue3-vite";
2
+ import { ref } from "vue";
3
+ import { UiButton, UiField, UiModal } from "../../components";
4
+ import StoryThemeFrame from "../support/StoryThemeFrame.vue";
5
+ import {
6
+ storySurfaceClass,
7
+ storySurfaceCompactClass,
8
+ } from "../support/storyStyles";
9
+
10
+ const meta: Meta = {
11
+ title: "Layout/UiModal",
12
+ id: "ui-modal",
13
+ component: UiModal,
14
+ tags: ["autodocs"],
15
+ parameters: {
16
+ docs: {
17
+ description: {
18
+ component:
19
+ "Accessible dialog overlay with focus trap, ESC close, and portal rendering. Built on Reka UI Dialog.",
20
+ },
21
+ },
22
+ },
23
+ };
24
+
25
+ export default meta;
26
+ type Story = StoryObj<typeof meta>;
27
+
28
+ export const Default: Story = {
29
+ render: () => ({
30
+ components: { StoryThemeFrame, UiModal, UiButton, UiField },
31
+ setup() {
32
+ const previewTheme = ref<"light" | "dark">("dark");
33
+ const open = ref(false);
34
+ return { previewTheme, open };
35
+ },
36
+ template: `
37
+ <StoryThemeFrame v-model:theme="previewTheme" preview-id="modal-default">
38
+ <div :class="[storySurfaceClass, storySurfaceCompactClass]">
39
+ <UiButton @click="open = true">Open Modal</UiButton>
40
+ <UiModal v-model:open="open" title="Create Workspace" description="Add a new workspace to your tenant.">
41
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
42
+ <UiField label="Name" for-id="ws-name">
43
+ <input id="ws-name" type="text" placeholder="e.g., Legal Documents Q2" style="width: 100%; padding: 0.5rem 0.75rem; border-radius: 0.5rem; border: 1px solid var(--colors-border-default); background: var(--colors-bg-input); color: var(--colors-text-primary); font-size: 0.875rem;" />
44
+ </UiField>
45
+ </div>
46
+ <template #actions>
47
+ <UiButton variant="outline" @click="open = false">Cancel</UiButton>
48
+ <UiButton @click="open = false">Create</UiButton>
49
+ </template>
50
+ </UiModal>
51
+ </div>
52
+ </StoryThemeFrame>
53
+ `,
54
+ }),
55
+ };
56
+
57
+ export const Sizes: Story = {
58
+ render: () => ({
59
+ components: { StoryThemeFrame, UiModal, UiButton },
60
+ setup() {
61
+ const previewTheme = ref<"light" | "dark">("dark");
62
+ const openSm = ref(false);
63
+ const openMd = ref(false);
64
+ const openLg = ref(false);
65
+ return { previewTheme, openSm, openMd, openLg };
66
+ },
67
+ template: `
68
+ <StoryThemeFrame v-model:theme="previewTheme" preview-id="modal-sizes">
69
+ <div :class="[storySurfaceClass, storySurfaceCompactClass]" style="display: flex; gap: 0.75rem;">
70
+ <UiButton variant="outline" @click="openSm = true">Small</UiButton>
71
+ <UiButton variant="outline" @click="openMd = true">Medium</UiButton>
72
+ <UiButton variant="outline" @click="openLg = true">Large</UiButton>
73
+ <UiModal v-model:open="openSm" size="sm" title="Small Modal">
74
+ <p>This is a small modal (400px max width).</p>
75
+ </UiModal>
76
+ <UiModal v-model:open="openMd" size="md" title="Medium Modal">
77
+ <p>This is a medium modal (560px max width).</p>
78
+ </UiModal>
79
+ <UiModal v-model:open="openLg" size="lg" title="Large Modal">
80
+ <p>This is a large modal (720px max width).</p>
81
+ <template #actions>
82
+ <UiButton variant="outline" @click="openLg = false">Close</UiButton>
83
+ </template>
84
+ </UiModal>
85
+ </div>
86
+ </StoryThemeFrame>
87
+ `,
88
+ }),
89
+ };
@@ -0,0 +1,83 @@
1
+ import type { Meta, StoryObj } from "@storybook/vue3-vite";
2
+ import { ref } from "vue";
3
+ import { UiAvatar } from "../../components";
4
+ import StoryThemeFrame from "../support/StoryThemeFrame.vue";
5
+ import {
6
+ storySurfaceClass,
7
+ storySurfaceCompactClass,
8
+ } from "../support/storyStyles";
9
+
10
+ const meta: Meta = {
11
+ title: "Primitives/UiAvatar",
12
+ id: "ui-avatar",
13
+ component: UiAvatar,
14
+ tags: ["autodocs"],
15
+ parameters: {
16
+ docs: {
17
+ description: {
18
+ component:
19
+ "User avatar with image support and initials fallback. Built on Reka UI Avatar.",
20
+ },
21
+ },
22
+ },
23
+ };
24
+
25
+ export default meta;
26
+ type Story = StoryObj<typeof meta>;
27
+
28
+ export const Sizes: Story = {
29
+ render: () => ({
30
+ components: { StoryThemeFrame, UiAvatar },
31
+ setup() {
32
+ const previewTheme = ref<"light" | "dark">("dark");
33
+ return { previewTheme };
34
+ },
35
+ template: `
36
+ <StoryThemeFrame v-model:theme="previewTheme" preview-id="avatar-sizes">
37
+ <div :class="[storySurfaceClass, storySurfaceCompactClass]" style="display: flex; align-items: center; gap: 1rem;">
38
+ <UiAvatar name="Alice Johnson" size="sm" />
39
+ <UiAvatar name="Alice Johnson" size="md" />
40
+ <UiAvatar name="Alice Johnson" size="lg" />
41
+ <UiAvatar name="Alice Johnson" size="xl" />
42
+ </div>
43
+ </StoryThemeFrame>
44
+ `,
45
+ }),
46
+ };
47
+
48
+ export const Shapes: Story = {
49
+ render: () => ({
50
+ components: { StoryThemeFrame, UiAvatar },
51
+ setup() {
52
+ const previewTheme = ref<"light" | "dark">("dark");
53
+ return { previewTheme };
54
+ },
55
+ template: `
56
+ <StoryThemeFrame v-model:theme="previewTheme" preview-id="avatar-shapes">
57
+ <div :class="[storySurfaceClass, storySurfaceCompactClass]" style="display: flex; align-items: center; gap: 1rem;">
58
+ <UiAvatar name="Alice Johnson" size="lg" shape="circle" />
59
+ <UiAvatar name="Alice Johnson" size="lg" shape="square" />
60
+ </div>
61
+ </StoryThemeFrame>
62
+ `,
63
+ }),
64
+ };
65
+
66
+ export const WithImage: Story = {
67
+ render: () => ({
68
+ components: { StoryThemeFrame, UiAvatar },
69
+ setup() {
70
+ const previewTheme = ref<"light" | "dark">("dark");
71
+ return { previewTheme };
72
+ },
73
+ template: `
74
+ <StoryThemeFrame v-model:theme="previewTheme" preview-id="avatar-image">
75
+ <div :class="[storySurfaceClass, storySurfaceCompactClass]" style="display: flex; align-items: center; gap: 1rem;">
76
+ <UiAvatar name="Colm Tuite" src="https://images.unsplash.com/photo-1492633423870-43d1cd2775eb?&w=128&h=128&dpr=2&q=80" size="lg" />
77
+ <UiAvatar name="Fallback User" src="https://broken-url.invalid/photo.jpg" size="lg" />
78
+ <UiAvatar name="No Image" size="lg" />
79
+ </div>
80
+ </StoryThemeFrame>
81
+ `,
82
+ }),
83
+ };