@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.
Files changed (47) hide show
  1. package/config.d.ts +58 -6
  2. package/config.js +167 -5
  3. package/dist/system/index.d.ts +41 -53
  4. package/dist/system/lib.js +981 -988
  5. package/docs/public-docs/component-directory.md +13 -0
  6. package/docs/public-docs/contributing.md +11 -0
  7. package/docs/public-docs/external-links.md +16 -0
  8. package/docs/public-docs/foundations.md +25 -0
  9. package/docs/public-docs/getting-started-designers.md +17 -0
  10. package/docs/public-docs/index.md +5 -0
  11. package/docs/public-docs/quick-start.md +274 -0
  12. package/docs/public-docs/standards-guidelines.md +15 -0
  13. package/package.json +28 -10
  14. package/src/assets/fonts/Saans/Saans-Bold.woff2 +0 -0
  15. package/src/assets/fonts/Saans/Saans-BoldItalic.woff2 +0 -0
  16. package/src/assets/fonts/Saans/Saans-Heavy.woff2 +0 -0
  17. package/src/assets/fonts/Saans/Saans-HeavyItalic.woff2 +0 -0
  18. package/src/assets/fonts/Saans/Saans-Light.woff2 +0 -0
  19. package/src/assets/fonts/Saans/Saans-LightItalic.woff2 +0 -0
  20. package/src/assets/fonts/Saans/Saans-Medium.woff2 +0 -0
  21. package/src/assets/fonts/Saans/Saans-MediumItalic.woff2 +0 -0
  22. package/src/assets/fonts/Saans/Saans-Regular.woff2 +0 -0
  23. package/src/assets/fonts/Saans/Saans-RegularItalic.woff2 +0 -0
  24. package/src/assets/fonts/Saans/Saans-SemiBold.woff2 +0 -0
  25. package/src/assets/fonts/Saans/Saans-SemiBoldItalic.woff2 +0 -0
  26. package/src/assets/fonts/Saans/SaansItalicsVF.woff2 +0 -0
  27. package/src/assets/fonts/Saans/SaansMono-Bold.woff2 +0 -0
  28. package/src/assets/fonts/Saans/SaansMono-Heavy.woff2 +0 -0
  29. package/src/assets/fonts/Saans/SaansMono-Light.woff2 +0 -0
  30. package/src/assets/fonts/Saans/SaansMono-Medium.woff2 +0 -0
  31. package/src/assets/fonts/Saans/SaansMono-Regular.woff2 +0 -0
  32. package/src/assets/fonts/Saans/SaansMono-SemiBold.woff2 +0 -0
  33. package/src/assets/fonts/Saans/SaansMonoUprightsVF.woff2 +0 -0
  34. package/src/assets/fonts/Saans/SaansUprightsVF.woff2 +0 -0
  35. package/src/assets/fonts/Saans/SaansVF.woff2 +0 -0
  36. package/src/components/UiCalendar/UiCalendar.stories.ts +1 -4
  37. package/src/components/UiCalendar/types.ts +1 -1
  38. package/src/components/UiRangeCalendar/UiRangeCalendar.stories.ts +2 -4
  39. package/src/components/UiRangeCalendar/types.ts +1 -1
  40. package/src/components/UiSidebar/UiSidebar.stories.ts +179 -1
  41. package/src/components/UiSidebar/UiSidebarProvider.vue +1 -3
  42. package/src/components/UiSidebar/types.ts +6 -9
  43. package/src/components/UiStepper/UiStepper.stories.ts +1 -1
  44. package/src/components/core/calendar/Calendar.vue +1 -1
  45. package/src/components/core/range-calendar/RangeCalendar.vue +1 -1
  46. package/src/patterns/UiDatePicker/UiDatePicker.stories.ts +1 -4
  47. 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 v-model:open="open" :default-open="props.defaultOpen">
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 default open state when uncontrolled.
18
- * If not provided, the core provider uses cookie-based persistence
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
  /**
@@ -12,7 +12,7 @@ import {
12
12
  import { UiIcon } from '../UiIcon';
13
13
 
14
14
  const meta: Meta<typeof UiStepper> = {
15
- title: 'Primitives/UiStepper',
15
+ title: 'Components/UiStepper',
16
16
  component: UiStepper,
17
17
  tags: ['autodocs'],
18
18
  argTypes: {
@@ -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="day">
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="day">
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 = Sunday, 1 = Monday, etc.',
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"
@@ -125,7 +125,7 @@ export interface UiDatePickerProps {
125
125
 
126
126
  /**
127
127
  * The day of the week to start on.
128
- * @default 0 (Sunday)
128
+ * @default 0
129
129
  */
130
130
  weekStartsOn?: UiDatePickerWeekStartsOn;
131
131