@aleph-alpha/ui-library 1.14.0 → 1.16.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.
- package/config.d.ts +58 -6
- package/config.js +167 -5
- package/dist/system/index.d.ts +41 -53
- package/dist/system/lib.js +981 -988
- package/docs/public-docs/component-directory.md +13 -0
- package/docs/public-docs/contributing.md +11 -0
- package/docs/public-docs/external-links.md +16 -0
- package/docs/public-docs/foundations.md +25 -0
- package/docs/public-docs/getting-started-designers.md +17 -0
- package/docs/public-docs/index.md +5 -0
- package/docs/public-docs/quick-start.md +274 -0
- package/docs/public-docs/standards-guidelines.md +15 -0
- package/package.json +28 -10
- package/src/assets/fonts/Saans/Saans-Bold.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-BoldItalic.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-Heavy.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-HeavyItalic.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-Light.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-LightItalic.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-Medium.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-MediumItalic.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-Regular.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-RegularItalic.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-SemiBold.woff2 +0 -0
- package/src/assets/fonts/Saans/Saans-SemiBoldItalic.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansItalicsVF.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansMono-Bold.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansMono-Heavy.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansMono-Light.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansMono-Medium.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansMono-Regular.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansMono-SemiBold.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansMonoUprightsVF.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansUprightsVF.woff2 +0 -0
- package/src/assets/fonts/Saans/SaansVF.woff2 +0 -0
- package/src/components/UiCalendar/UiCalendar.stories.ts +1 -4
- package/src/components/UiCalendar/types.ts +1 -1
- package/src/components/UiRangeCalendar/UiRangeCalendar.stories.ts +2 -4
- package/src/components/UiRangeCalendar/types.ts +1 -1
- package/src/components/UiSidebar/UiSidebar.stories.ts +179 -1
- package/src/components/UiSidebar/UiSidebarProvider.vue +1 -3
- package/src/components/UiSidebar/types.ts +6 -9
- package/src/components/UiStepper/UiStepper.stories.ts +1 -1
- package/src/components/core/calendar/Calendar.vue +1 -1
- package/src/components/core/range-calendar/RangeCalendar.vue +1 -1
- package/src/patterns/UiDatePicker/UiDatePicker.stories.ts +1 -4
- package/src/patterns/UiDatePicker/types.ts +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ref, computed } from 'vue';
|
|
1
|
+
import { ref, computed, defineComponent } from 'vue';
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/vue3-vite';
|
|
3
3
|
import {
|
|
4
4
|
UiSidebar,
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
UiSidebarRail,
|
|
26
26
|
UiSidebarSeparator,
|
|
27
27
|
UiSidebarTrigger,
|
|
28
|
+
useSidebar,
|
|
28
29
|
} from '.';
|
|
29
30
|
import { CollapsibleRoot, CollapsibleContent, CollapsibleTrigger } from 'reka-ui';
|
|
30
31
|
import {
|
|
@@ -1008,3 +1009,180 @@ export const WithSkeleton: Story = {
|
|
|
1008
1009
|
},
|
|
1009
1010
|
},
|
|
1010
1011
|
};
|
|
1012
|
+
|
|
1013
|
+
const programmaticControlTemplateSource = `<script setup lang="ts">
|
|
1014
|
+
import {
|
|
1015
|
+
UiSidebar,
|
|
1016
|
+
UiSidebarContent,
|
|
1017
|
+
UiSidebarGroup,
|
|
1018
|
+
UiSidebarGroupContent,
|
|
1019
|
+
UiSidebarGroupLabel,
|
|
1020
|
+
UiSidebarHeaderTrigger,
|
|
1021
|
+
UiSidebarInset,
|
|
1022
|
+
UiSidebarMenu,
|
|
1023
|
+
UiSidebarMenuButton,
|
|
1024
|
+
UiSidebarMenuItem,
|
|
1025
|
+
UiSidebarProvider,
|
|
1026
|
+
UiSidebarRail,
|
|
1027
|
+
useSidebar,
|
|
1028
|
+
} from '@aleph-alpha/ui-library'
|
|
1029
|
+
import { Bot, Database, BarChart3, MessageSquare, Command } from 'lucide-vue-next'
|
|
1030
|
+
|
|
1031
|
+
const items = [
|
|
1032
|
+
{ title: 'Playground', icon: Bot },
|
|
1033
|
+
{ title: 'Models', icon: Database },
|
|
1034
|
+
{ title: 'Evaluations', icon: BarChart3 },
|
|
1035
|
+
{ title: 'Conversations', icon: MessageSquare },
|
|
1036
|
+
]
|
|
1037
|
+
|
|
1038
|
+
// useSidebar() must be called inside <UiSidebarProvider>.
|
|
1039
|
+
// Use a child component or <script setup> in a component nested within the provider.
|
|
1040
|
+
</script>
|
|
1041
|
+
|
|
1042
|
+
<template>
|
|
1043
|
+
<UiSidebarProvider>
|
|
1044
|
+
<!-- Wrap content in a child component that calls useSidebar() -->
|
|
1045
|
+
<SidebarLayout :items="items" />
|
|
1046
|
+
</UiSidebarProvider>
|
|
1047
|
+
</template>
|
|
1048
|
+
|
|
1049
|
+
<!-- Child component (e.g. SidebarLayout.vue) -->
|
|
1050
|
+
<script setup lang="ts">
|
|
1051
|
+
import { useSidebar } from '@aleph-alpha/ui-library'
|
|
1052
|
+
|
|
1053
|
+
const { state, open, setOpen, toggleSidebar } = useSidebar()
|
|
1054
|
+
</script>
|
|
1055
|
+
|
|
1056
|
+
<template>
|
|
1057
|
+
<UiSidebar><!-- ... --></UiSidebar>
|
|
1058
|
+
<UiSidebarInset>
|
|
1059
|
+
<div class="p-6 space-y-4">
|
|
1060
|
+
<p>Sidebar is <strong>{{ state }}</strong></p>
|
|
1061
|
+
<button @click="toggleSidebar()">Toggle</button>
|
|
1062
|
+
<button @click="setOpen(true)">Open</button>
|
|
1063
|
+
<button @click="setOpen(false)">Close</button>
|
|
1064
|
+
</div>
|
|
1065
|
+
</UiSidebarInset>
|
|
1066
|
+
</template>`;
|
|
1067
|
+
|
|
1068
|
+
/**
|
|
1069
|
+
* Programmatic sidebar control via the `useSidebar()` composable. The composable must be called
|
|
1070
|
+
* inside a component rendered within `<UiSidebarProvider>`. It returns reactive state (`state`, `open`)
|
|
1071
|
+
* and methods (`toggleSidebar`, `setOpen`) to control the sidebar from anywhere in the provider tree.
|
|
1072
|
+
*
|
|
1073
|
+
* This is the recommended pattern for controlling the sidebar from outside — e.g. opening it
|
|
1074
|
+
* from a toolbar button, closing it after navigation, or syncing state with a store.
|
|
1075
|
+
*/
|
|
1076
|
+
export const ProgrammaticControl: Story = {
|
|
1077
|
+
render: (args) => ({
|
|
1078
|
+
components: {
|
|
1079
|
+
UiSidebar,
|
|
1080
|
+
UiSidebarContent,
|
|
1081
|
+
UiSidebarGroup,
|
|
1082
|
+
UiSidebarGroupContent,
|
|
1083
|
+
UiSidebarGroupLabel,
|
|
1084
|
+
UiSidebarHeaderTrigger,
|
|
1085
|
+
UiSidebarInset,
|
|
1086
|
+
UiSidebarMenu,
|
|
1087
|
+
UiSidebarMenuButton,
|
|
1088
|
+
UiSidebarMenuItem,
|
|
1089
|
+
UiSidebarProvider,
|
|
1090
|
+
UiSidebarRail,
|
|
1091
|
+
Bot,
|
|
1092
|
+
Database,
|
|
1093
|
+
BarChart3,
|
|
1094
|
+
MessageSquare,
|
|
1095
|
+
Command,
|
|
1096
|
+
// Inline child component that uses useSidebar() — in real apps this would be a separate .vue file
|
|
1097
|
+
SidebarContent: defineComponent({
|
|
1098
|
+
setup() {
|
|
1099
|
+
const { state, toggleSidebar, setOpen } = useSidebar();
|
|
1100
|
+
return { state, toggleSidebar, setOpen };
|
|
1101
|
+
},
|
|
1102
|
+
template: `<slot :state="state" :toggleSidebar="toggleSidebar" :setOpen="setOpen" />`,
|
|
1103
|
+
}),
|
|
1104
|
+
},
|
|
1105
|
+
setup() {
|
|
1106
|
+
const items = [
|
|
1107
|
+
{ title: 'Playground', icon: Bot },
|
|
1108
|
+
{ title: 'Models', icon: Database },
|
|
1109
|
+
{ title: 'Evaluations', icon: BarChart3 },
|
|
1110
|
+
{ title: 'Conversations', icon: MessageSquare },
|
|
1111
|
+
];
|
|
1112
|
+
return { args, items };
|
|
1113
|
+
},
|
|
1114
|
+
template: `
|
|
1115
|
+
<UiSidebarProvider>
|
|
1116
|
+
<UiSidebar :side="args.side" :variant="args.variant" :collapsible="args.collapsible">
|
|
1117
|
+
<UiSidebarHeaderTrigger>
|
|
1118
|
+
<template #logo>
|
|
1119
|
+
<div class="flex aspect-square size-8 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground">
|
|
1120
|
+
<Command class="size-4" />
|
|
1121
|
+
</div>
|
|
1122
|
+
</template>
|
|
1123
|
+
<span class="truncate font-semibold">Acme AI</span>
|
|
1124
|
+
<span class="truncate text-xs">Enterprise</span>
|
|
1125
|
+
</UiSidebarHeaderTrigger>
|
|
1126
|
+
<UiSidebarContent>
|
|
1127
|
+
<UiSidebarGroup>
|
|
1128
|
+
<UiSidebarGroupLabel>Platform</UiSidebarGroupLabel>
|
|
1129
|
+
<UiSidebarGroupContent>
|
|
1130
|
+
<UiSidebarMenu>
|
|
1131
|
+
<UiSidebarMenuItem v-for="item in items" :key="item.title">
|
|
1132
|
+
<UiSidebarMenuButton :tooltip="item.title">
|
|
1133
|
+
<component :is="item.icon" />
|
|
1134
|
+
<span>{{ item.title }}</span>
|
|
1135
|
+
</UiSidebarMenuButton>
|
|
1136
|
+
</UiSidebarMenuItem>
|
|
1137
|
+
</UiSidebarMenu>
|
|
1138
|
+
</UiSidebarGroupContent>
|
|
1139
|
+
</UiSidebarGroup>
|
|
1140
|
+
</UiSidebarContent>
|
|
1141
|
+
<UiSidebarRail />
|
|
1142
|
+
</UiSidebar>
|
|
1143
|
+
<UiSidebarInset>
|
|
1144
|
+
<SidebarContent v-slot="{ state, toggleSidebar, setOpen }">
|
|
1145
|
+
<div class="p-6">
|
|
1146
|
+
<div class="mb-6">
|
|
1147
|
+
<h2 class="text-lg font-semibold mb-1">Programmatic Control</h2>
|
|
1148
|
+
<p class="text-sm text-muted-foreground">
|
|
1149
|
+
Use <code class="rounded bg-muted px-1.5 py-0.5 text-xs">useSidebar()</code> inside the provider tree to control the sidebar from any component.
|
|
1150
|
+
</p>
|
|
1151
|
+
</div>
|
|
1152
|
+
<div class="flex items-center gap-3 mb-6">
|
|
1153
|
+
<span class="text-sm">State: <strong>{{ state }}</strong></span>
|
|
1154
|
+
</div>
|
|
1155
|
+
<div class="flex flex-wrap gap-2">
|
|
1156
|
+
<button
|
|
1157
|
+
class="inline-flex items-center justify-center rounded-md text-sm font-medium h-9 px-4 border border-input bg-background hover:bg-accent hover:text-accent-foreground"
|
|
1158
|
+
@click="toggleSidebar()"
|
|
1159
|
+
>
|
|
1160
|
+
Toggle sidebar
|
|
1161
|
+
</button>
|
|
1162
|
+
<button
|
|
1163
|
+
class="inline-flex items-center justify-center rounded-md text-sm font-medium h-9 px-4 border border-input bg-background hover:bg-accent hover:text-accent-foreground"
|
|
1164
|
+
@click="setOpen(true)"
|
|
1165
|
+
>
|
|
1166
|
+
Open
|
|
1167
|
+
</button>
|
|
1168
|
+
<button
|
|
1169
|
+
class="inline-flex items-center justify-center rounded-md text-sm font-medium h-9 px-4 border border-input bg-background hover:bg-accent hover:text-accent-foreground"
|
|
1170
|
+
@click="setOpen(false)"
|
|
1171
|
+
>
|
|
1172
|
+
Close
|
|
1173
|
+
</button>
|
|
1174
|
+
</div>
|
|
1175
|
+
</div>
|
|
1176
|
+
</SidebarContent>
|
|
1177
|
+
</UiSidebarInset>
|
|
1178
|
+
</UiSidebarProvider>
|
|
1179
|
+
`,
|
|
1180
|
+
}),
|
|
1181
|
+
parameters: {
|
|
1182
|
+
docs: {
|
|
1183
|
+
source: {
|
|
1184
|
+
code: programmaticControlTemplateSource,
|
|
1185
|
+
},
|
|
1186
|
+
},
|
|
1187
|
+
},
|
|
1188
|
+
};
|
|
@@ -7,12 +7,10 @@
|
|
|
7
7
|
});
|
|
8
8
|
|
|
9
9
|
const props = defineProps<UiSidebarProviderProps>();
|
|
10
|
-
|
|
11
|
-
const open = defineModel<boolean | undefined>('open');
|
|
12
10
|
</script>
|
|
13
11
|
|
|
14
12
|
<template>
|
|
15
|
-
<ShadcnSidebarProvider
|
|
13
|
+
<ShadcnSidebarProvider :default-open="props.defaultOpen">
|
|
16
14
|
<slot />
|
|
17
15
|
</ShadcnSidebarProvider>
|
|
18
16
|
</template>
|
|
@@ -12,20 +12,17 @@ export type UiSidebarMenuButtonSize = 'default' | 'sm' | 'lg';
|
|
|
12
12
|
|
|
13
13
|
export type UiSidebarMenuSubButtonSize = 'sm' | 'md';
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* Wraps the sidebar and manages its open/closed state.
|
|
17
|
+
* Omit `default-open` to use cookie-based persistence (falls back to expanded).
|
|
18
|
+
*/
|
|
15
19
|
export interface UiSidebarProviderProps {
|
|
16
20
|
/**
|
|
17
|
-
* The
|
|
18
|
-
* If not provided, the
|
|
21
|
+
* The initial open state of the sidebar.
|
|
22
|
+
* If not provided, the inner provider uses cookie-based persistence
|
|
19
23
|
* (falls back to expanded if no cookie exists).
|
|
20
24
|
*/
|
|
21
25
|
defaultOpen?: boolean;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* The controlled open state of the sidebar.
|
|
25
|
-
* - Omit for uncontrolled mode (component manages state internally)
|
|
26
|
-
* - Use `v-model:open` for controlled mode
|
|
27
|
-
*/
|
|
28
|
-
open?: boolean;
|
|
29
26
|
}
|
|
30
27
|
|
|
31
28
|
/**
|
|
@@ -184,7 +184,7 @@
|
|
|
184
184
|
<CalendarGrid v-for="month in grid" :key="month.value.toString()">
|
|
185
185
|
<CalendarGridHead>
|
|
186
186
|
<CalendarGridRow>
|
|
187
|
-
<CalendarHeadCell v-for="day in weekDays" :key="
|
|
187
|
+
<CalendarHeadCell v-for="(day, i) in weekDays" :key="i">
|
|
188
188
|
{{ day }}
|
|
189
189
|
</CalendarHeadCell>
|
|
190
190
|
</CalendarGridRow>
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
<RangeCalendarGrid v-for="month in grid" :key="month.value.toString()">
|
|
48
48
|
<RangeCalendarGridHead>
|
|
49
49
|
<RangeCalendarGridRow>
|
|
50
|
-
<RangeCalendarHeadCell v-for="day in weekDays" :key="
|
|
50
|
+
<RangeCalendarHeadCell v-for="(day, i) in weekDays" :key="i">
|
|
51
51
|
{{ day }}
|
|
52
52
|
</RangeCalendarHeadCell>
|
|
53
53
|
</RangeCalendarGridRow>
|
|
@@ -39,7 +39,7 @@ const meta: Meta<typeof UiDatePicker> = {
|
|
|
39
39
|
weekStartsOn: {
|
|
40
40
|
control: 'select',
|
|
41
41
|
options: [0, 1, 2, 3, 4, 5, 6],
|
|
42
|
-
description: 'The day of the week to start on. 0
|
|
42
|
+
description: 'The day of the week to start on. 0 is the locale default first day.',
|
|
43
43
|
},
|
|
44
44
|
numberOfMonths: {
|
|
45
45
|
control: { type: 'number', min: 1, max: 3 },
|
|
@@ -369,7 +369,6 @@ const date = ref<DateValue>()
|
|
|
369
369
|
<UiDatePicker
|
|
370
370
|
v-model="date"
|
|
371
371
|
locale="de"
|
|
372
|
-
:week-starts-on="1"
|
|
373
372
|
weekday-format="short"
|
|
374
373
|
placeholder="Datum auswählen"
|
|
375
374
|
/>
|
|
@@ -382,7 +381,6 @@ const date = ref<DateValue>()
|
|
|
382
381
|
export const GermanLocale: Story = {
|
|
383
382
|
args: {
|
|
384
383
|
locale: 'de',
|
|
385
|
-
weekStartsOn: 1,
|
|
386
384
|
weekdayFormat: 'short',
|
|
387
385
|
placeholder: 'Datum auswählen',
|
|
388
386
|
},
|
|
@@ -395,7 +393,6 @@ export const GermanLocale: Story = {
|
|
|
395
393
|
template: `<UiDatePicker
|
|
396
394
|
v-model="date"
|
|
397
395
|
:locale="args.locale"
|
|
398
|
-
:week-starts-on="args.weekStartsOn"
|
|
399
396
|
:weekday-format="args.weekdayFormat"
|
|
400
397
|
:placeholder="args.placeholder"
|
|
401
398
|
:disabled="args.disabled"
|