@immich/ui 0.29.0 → 0.30.1

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 (62) hide show
  1. package/README.md +9 -17
  2. package/dist/actions/shortcut.js +1 -1
  3. package/dist/components/Alert/Alert.svelte +92 -94
  4. package/dist/components/AppShell/AppShell.svelte +26 -26
  5. package/dist/components/AppShell/AppShellHeader.svelte +8 -8
  6. package/dist/components/AppShell/AppShellSidebar.svelte +20 -20
  7. package/dist/components/AppShell/PageLayout.svelte +29 -35
  8. package/dist/components/Avatar/Avatar.svelte +45 -55
  9. package/dist/components/Button/Button.svelte +3 -3
  10. package/dist/components/Card/Card.svelte +131 -135
  11. package/dist/components/Card/CardBody.svelte +9 -9
  12. package/dist/components/Card/CardDescription.svelte +9 -9
  13. package/dist/components/Card/CardFooter.svelte +9 -9
  14. package/dist/components/Card/CardHeader.svelte +9 -9
  15. package/dist/components/Card/CardTitle.svelte +14 -14
  16. package/dist/components/Checkbox/Checkbox.svelte +109 -110
  17. package/dist/components/CloseButton/CloseButton.svelte +12 -17
  18. package/dist/components/Code/Code.svelte +58 -65
  19. package/dist/components/CommandPalette/CommandPalette.svelte +126 -131
  20. package/dist/components/CommandPalette/CommandPaletteItem.svelte +61 -61
  21. package/dist/components/ConfirmModal/ConfirmModal.svelte +48 -48
  22. package/dist/components/Container/Container.svelte +25 -25
  23. package/dist/components/Field/Field.svelte +21 -21
  24. package/dist/components/FormatBytes/FormatBytes.svelte +9 -9
  25. package/dist/components/Heading/Heading.svelte +41 -47
  26. package/dist/components/HelperText/HelperText.svelte +17 -17
  27. package/dist/components/Icon/Icon.svelte +37 -42
  28. package/dist/components/IconButton/IconButton.svelte +6 -13
  29. package/dist/components/Input/Input.svelte +153 -144
  30. package/dist/components/Kbd/Kbd.svelte +25 -25
  31. package/dist/components/Label/Label.svelte +6 -6
  32. package/dist/components/Link/Link.svelte +18 -25
  33. package/dist/components/LoadingSpinner/LoadingSpinner.svelte +46 -46
  34. package/dist/components/Logo/Logo.svelte +53 -53
  35. package/dist/components/Modal/Modal.svelte +110 -114
  36. package/dist/components/Modal/ModalBody.svelte +8 -8
  37. package/dist/components/Modal/ModalFooter.svelte +8 -8
  38. package/dist/components/Modal/ModalHeader.svelte +8 -8
  39. package/dist/components/MultiSelect/MultiSelect.svelte +7 -7
  40. package/dist/components/Navbar/NavbarGroup.svelte +5 -5
  41. package/dist/components/Navbar/NavbarItem.svelte +59 -61
  42. package/dist/components/PasswordInput/PasswordInput.svelte +29 -31
  43. package/dist/components/Scrollable/Scrollable.svelte +49 -49
  44. package/dist/components/Select/Select.svelte +9 -9
  45. package/dist/components/Stack/HStack.svelte +4 -4
  46. package/dist/components/Stack/Stack.svelte +62 -62
  47. package/dist/components/Stack/VStack.svelte +4 -4
  48. package/dist/components/SupporterBadge/SupporterBadge.svelte +80 -80
  49. package/dist/components/Switch/Switch.svelte +95 -96
  50. package/dist/components/Text/Text.svelte +27 -34
  51. package/dist/components/Textarea/Textarea.svelte +103 -104
  52. package/dist/components/ThemeSwitcher/ThemeSwitcher.svelte +30 -43
  53. package/dist/internal/Button.svelte +177 -177
  54. package/dist/internal/Child.svelte +21 -21
  55. package/dist/internal/Select.svelte +151 -158
  56. package/dist/internal/Text.svelte +42 -50
  57. package/dist/site/SiteFooter.svelte +60 -76
  58. package/dist/site/SiteFooterLink.svelte +14 -14
  59. package/dist/theme/default.css +40 -40
  60. package/dist/types.d.ts +1 -0
  61. package/dist/utilities/byte-units.js +2 -13
  62. package/package.json +77 -77
@@ -1,120 +1,119 @@
1
1
  <script lang="ts">
2
- import { getFieldContext } from '../../common/context.svelte.js';
3
- import Label from '../Label/Label.svelte';
4
- import Text from '../Text/Text.svelte';
5
- import type { TextareaProps } from '../../types.js';
6
- import { cleanClass, generateId } from '../../utils.js';
7
- import type { FormEventHandler } from 'svelte/elements';
8
- import { tv } from 'tailwind-variants';
2
+ import { getFieldContext } from '../../common/context.svelte.js';
3
+ import Label from '../Label/Label.svelte';
4
+ import Text from '../Text/Text.svelte';
5
+ import type { TextareaProps } from '../../types.js';
6
+ import { cleanClass, generateId } from '../../utils.js';
7
+ import type { FormEventHandler } from 'svelte/elements';
8
+ import { tv } from 'tailwind-variants';
9
9
 
10
- let {
11
- ref = $bindable(null),
12
- containerRef = $bindable(null),
13
- shape = 'semi-round',
14
- size = 'medium',
15
- class: className,
16
- grow,
17
- value = $bindable<string>(),
18
- ...restProps
19
- }: TextareaProps = $props();
10
+ let {
11
+ ref = $bindable(null),
12
+ containerRef = $bindable(null),
13
+ shape = 'semi-round',
14
+ size = 'medium',
15
+ class: className,
16
+ grow,
17
+ value = $bindable<string>(),
18
+ ...restProps
19
+ }: TextareaProps = $props();
20
20
 
21
- const { label, description, readOnly, required, invalid, disabled, ...labelProps } =
22
- $derived(getFieldContext());
21
+ const { label, description, readOnly, required, invalid, disabled, ...labelProps } = $derived(getFieldContext());
23
22
 
24
- const styles = tv({
25
- base: 'w-full bg-gray-200 outline-none disabled:cursor-not-allowed disabled:bg-gray-300 disabled:text-gray-400 dark:bg-gray-600 dark:disabled:bg-gray-800 dark:disabled:text-gray-200',
26
- variants: {
27
- shape: {
28
- rectangle: 'rounded-none',
29
- 'semi-round': '',
30
- round: 'rounded-full',
31
- },
32
- padding: {
33
- base: 'px-4 py-3',
34
- round: 'px-5 py-3',
35
- },
36
- grow: {
37
- true: 'resize-none',
38
- false: '',
39
- },
40
- roundedSize: {
41
- tiny: 'rounded-xl',
42
- small: 'rounded-xl',
43
- medium: 'rounded-2xl',
44
- large: 'rounded-2xl',
45
- giant: 'rounded-2xl',
46
- },
47
- textSize: {
48
- tiny: 'text-xs',
49
- small: 'text-sm',
50
- medium: 'text-base',
51
- large: 'text-lg',
52
- giant: 'text-xl',
53
- },
54
- invalid: {
55
- true: 'border-danger/80 border',
56
- false: '',
57
- },
58
- },
59
- });
23
+ const styles = tv({
24
+ base: 'w-full bg-gray-200 outline-none disabled:cursor-not-allowed disabled:bg-gray-300 disabled:text-gray-400 dark:bg-gray-600 dark:disabled:bg-gray-800 dark:disabled:text-gray-200',
25
+ variants: {
26
+ shape: {
27
+ rectangle: 'rounded-none',
28
+ 'semi-round': '',
29
+ round: 'rounded-full',
30
+ },
31
+ padding: {
32
+ base: 'px-4 py-3',
33
+ round: 'px-5 py-3',
34
+ },
35
+ grow: {
36
+ true: 'resize-none',
37
+ false: '',
38
+ },
39
+ roundedSize: {
40
+ tiny: 'rounded-xl',
41
+ small: 'rounded-xl',
42
+ medium: 'rounded-2xl',
43
+ large: 'rounded-2xl',
44
+ giant: 'rounded-2xl',
45
+ },
46
+ textSize: {
47
+ tiny: 'text-xs',
48
+ small: 'text-sm',
49
+ medium: 'text-base',
50
+ large: 'text-lg',
51
+ giant: 'text-xl',
52
+ },
53
+ invalid: {
54
+ true: 'border-danger/80 border',
55
+ false: '',
56
+ },
57
+ },
58
+ });
60
59
 
61
- const id = generateId();
62
- const inputId = `input-${id}`;
63
- const labelId = `label-${id}`;
64
- const descriptionId = $derived(description ? `description-${id}` : undefined);
60
+ const id = generateId();
61
+ const inputId = `input-${id}`;
62
+ const labelId = `label-${id}`;
63
+ const descriptionId = $derived(description ? `description-${id}` : undefined);
65
64
 
66
- const onInput: FormEventHandler<HTMLTextAreaElement> = (event) => {
67
- const element = event.target as HTMLTextAreaElement;
68
- if (element && grow) {
69
- element.style.height = 'auto';
70
- element.style.height = `${element.scrollHeight}px`;
71
- }
65
+ const onInput: FormEventHandler<HTMLTextAreaElement> = (event) => {
66
+ const element = event.target as HTMLTextAreaElement;
67
+ if (element && grow) {
68
+ element.style.height = 'auto';
69
+ element.style.height = `${element.scrollHeight}px`;
70
+ }
72
71
 
73
- restProps?.oninput?.(event);
74
- };
72
+ restProps?.oninput?.(event);
73
+ };
75
74
  </script>
76
75
 
77
76
  <div class="flex w-full flex-col gap-1" bind:this={containerRef}>
78
- {#if label}
79
- <Label id={labelId} for={inputId} {label} {...labelProps} />
80
- {/if}
77
+ {#if label}
78
+ <Label id={labelId} for={inputId} {label} {...labelProps} />
79
+ {/if}
81
80
 
82
- {#if description}
83
- <Text color="secondary" size="small" id={descriptionId}>{description}</Text>
84
- {/if}
81
+ {#if description}
82
+ <Text color="secondary" size="small" id={descriptionId}>{description}</Text>
83
+ {/if}
85
84
 
86
- <div class="relative w-full">
87
- <textarea
88
- oninput={onInput}
89
- id={inputId}
90
- aria-labelledby={label && labelId}
91
- {required}
92
- aria-required={required}
93
- {disabled}
94
- aria-disabled={disabled}
95
- aria-describedby={descriptionId}
96
- readonly={readOnly}
97
- aria-readonly={readOnly}
98
- class={cleanClass(
99
- styles({
100
- shape,
101
- textSize: size,
102
- padding: shape === 'round' ? 'round' : 'base',
103
- grow,
104
- roundedSize: shape === 'semi-round' ? size : undefined,
105
- invalid,
106
- }),
107
- className,
108
- )}
109
- bind:this={ref}
110
- bind:value
111
- {...restProps}
112
- ></textarea>
113
- </div>
85
+ <div class="relative w-full">
86
+ <textarea
87
+ oninput={onInput}
88
+ id={inputId}
89
+ aria-labelledby={label && labelId}
90
+ {required}
91
+ aria-required={required}
92
+ {disabled}
93
+ aria-disabled={disabled}
94
+ aria-describedby={descriptionId}
95
+ readonly={readOnly}
96
+ aria-readonly={readOnly}
97
+ class={cleanClass(
98
+ styles({
99
+ shape,
100
+ textSize: size,
101
+ padding: shape === 'round' ? 'round' : 'base',
102
+ grow,
103
+ roundedSize: shape === 'semi-round' ? size : undefined,
104
+ invalid,
105
+ }),
106
+ className,
107
+ )}
108
+ bind:this={ref}
109
+ bind:value
110
+ {...restProps}
111
+ ></textarea>
112
+ </div>
114
113
  </div>
115
114
 
116
115
  <style>
117
- textarea::-ms-reveal {
118
- display: none;
119
- }
116
+ textarea::-ms-reveal {
117
+ display: none;
118
+ }
120
119
  </style>
@@ -1,52 +1,39 @@
1
1
  <script lang="ts">
2
- import IconButton from '../IconButton/IconButton.svelte';
3
- import { theme, toggleTheme } from '../../services/theme.svelte.js';
4
- import { t } from '../../services/translation.svelte.js';
5
- import {
6
- Theme,
7
- type Color,
8
- type Size,
9
- type TranslationProps,
10
- type Variants,
11
- } from '../../types.js';
12
- import { cleanClass } from '../../utils.js';
13
- import { mdiWeatherNight, mdiWeatherSunny } from '@mdi/js';
2
+ import IconButton from '../IconButton/IconButton.svelte';
3
+ import { theme, toggleTheme } from '../../services/theme.svelte.js';
4
+ import { t } from '../../services/translation.svelte.js';
5
+ import { Theme, type Color, type Size, type TranslationProps, type Variants } from '../../types.js';
6
+ import { cleanClass } from '../../utils.js';
7
+ import { mdiWeatherNight, mdiWeatherSunny } from '@mdi/js';
14
8
 
15
- type Props = {
16
- size?: Size;
17
- class?: string;
18
- color?: Color;
19
- variant?: Variants;
20
- translations?: TranslationProps<'dark_theme'>;
21
- onChange?: (theme: Theme) => void;
22
- };
9
+ type Props = {
10
+ size?: Size;
11
+ class?: string;
12
+ color?: Color;
13
+ variant?: Variants;
14
+ translations?: TranslationProps<'dark_theme'>;
15
+ onChange?: (theme: Theme) => void;
16
+ };
23
17
 
24
- const {
25
- color = 'primary',
26
- variant = 'ghost',
27
- size,
28
- class: className,
29
- translations,
30
- onChange,
31
- }: Props = $props();
18
+ const { color = 'primary', variant = 'ghost', size, class: className, translations, onChange }: Props = $props();
32
19
 
33
- const handleToggleTheme = () => {
34
- toggleTheme();
35
- onChange?.(theme.value);
36
- };
20
+ const handleToggleTheme = () => {
21
+ toggleTheme();
22
+ onChange?.(theme.value);
23
+ };
37
24
 
38
- const themeIcon = $derived(theme.value === Theme.Light ? mdiWeatherSunny : mdiWeatherNight);
25
+ const themeIcon = $derived(theme.value === Theme.Light ? mdiWeatherSunny : mdiWeatherNight);
39
26
  </script>
40
27
 
41
28
  <IconButton
42
- shape="round"
43
- {color}
44
- {size}
45
- {variant}
46
- icon={themeIcon}
47
- onclick={handleToggleTheme}
48
- class={cleanClass(className)}
49
- aria-label={t('dark_theme', translations)}
50
- role="switch"
51
- aria-checked={theme.value === Theme.Dark}
29
+ shape="round"
30
+ {color}
31
+ {size}
32
+ {variant}
33
+ icon={themeIcon}
34
+ onclick={handleToggleTheme}
35
+ class={cleanClass(className)}
36
+ aria-label={t('dark_theme', translations)}
37
+ role="switch"
38
+ aria-checked={theme.value === Theme.Dark}
52
39
  />