@getmicdrop/svelte-components 5.13.0 → 5.15.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 (50) hide show
  1. package/dist/calendar/OrderSummary/OrderSummary.svelte +67 -7
  2. package/dist/calendar/OrderSummary/OrderSummary.svelte.d.ts +2 -0
  3. package/dist/calendar/OrderSummary/OrderSummary.svelte.d.ts.map +1 -1
  4. package/dist/index.spec.js +1 -1
  5. package/dist/patterns/chat/ChatActivityNotice.svelte +41 -0
  6. package/dist/patterns/chat/ChatActivityNotice.svelte.d.ts +21 -0
  7. package/dist/patterns/chat/ChatActivityNotice.svelte.d.ts.map +1 -0
  8. package/dist/patterns/chat/ChatBubble.svelte +95 -0
  9. package/dist/patterns/chat/ChatBubble.svelte.d.ts +31 -0
  10. package/dist/patterns/chat/ChatBubble.svelte.d.ts.map +1 -0
  11. package/dist/patterns/chat/ChatContainer.svelte +46 -0
  12. package/dist/patterns/chat/ChatContainer.svelte.d.ts +21 -0
  13. package/dist/patterns/chat/ChatContainer.svelte.d.ts.map +1 -0
  14. package/dist/patterns/chat/ChatDateDivider.svelte +27 -0
  15. package/dist/patterns/chat/ChatDateDivider.svelte.d.ts +10 -0
  16. package/dist/patterns/chat/ChatDateDivider.svelte.d.ts.map +1 -0
  17. package/dist/patterns/chat/ChatInvitationBubble.svelte +37 -0
  18. package/dist/patterns/chat/ChatInvitationBubble.svelte.d.ts +12 -0
  19. package/dist/patterns/chat/ChatInvitationBubble.svelte.d.ts.map +1 -0
  20. package/dist/patterns/chat/ChatInvitationNotice.svelte +27 -0
  21. package/dist/patterns/chat/ChatInvitationNotice.svelte.d.ts +10 -0
  22. package/dist/patterns/chat/ChatInvitationNotice.svelte.d.ts.map +1 -0
  23. package/dist/patterns/chat/ChatMessageGroup.svelte +57 -0
  24. package/dist/patterns/chat/ChatMessageGroup.svelte.d.ts +25 -0
  25. package/dist/patterns/chat/ChatMessageGroup.svelte.d.ts.map +1 -0
  26. package/dist/patterns/chat/ChatSlotUpdate.svelte +46 -0
  27. package/dist/patterns/chat/ChatSlotUpdate.svelte.d.ts +16 -0
  28. package/dist/patterns/chat/ChatSlotUpdate.svelte.d.ts.map +1 -0
  29. package/dist/patterns/chat/ChatStatusBadge.svelte +91 -0
  30. package/dist/patterns/chat/ChatStatusBadge.svelte.d.ts +22 -0
  31. package/dist/patterns/chat/ChatStatusBadge.svelte.d.ts.map +1 -0
  32. package/dist/patterns/chat/ChatStatusTransition.svelte +64 -0
  33. package/dist/patterns/chat/ChatStatusTransition.svelte.d.ts +19 -0
  34. package/dist/patterns/chat/ChatStatusTransition.svelte.d.ts.map +1 -0
  35. package/dist/patterns/chat/ChatTextBubble.svelte +41 -0
  36. package/dist/patterns/chat/ChatTextBubble.svelte.d.ts +19 -0
  37. package/dist/patterns/chat/ChatTextBubble.svelte.d.ts.map +1 -0
  38. package/dist/patterns/chat/index.d.ts +12 -0
  39. package/dist/patterns/chat/index.d.ts.map +1 -0
  40. package/dist/patterns/chat/index.js +22 -0
  41. package/dist/patterns/index.d.ts +1 -0
  42. package/dist/patterns/index.js +3 -0
  43. package/dist/primitives/Button/Button.spec.js +8 -6
  44. package/dist/primitives/Input/Input.svelte +1 -1
  45. package/dist/recipes/ImageUploader/ImageUploader.svelte +1 -2
  46. package/dist/tokens/__tests__/sizing.test.js +5 -7
  47. package/dist/tokens/sizing.d.ts +20 -19
  48. package/dist/tokens/sizing.d.ts.map +1 -1
  49. package/dist/tokens/sizing.js +20 -19
  50. package/package.json +1 -1
@@ -0,0 +1,46 @@
1
+ <script lang="ts">
2
+ /**
3
+ * ChatSlotUpdate - Slot/role change display
4
+ *
5
+ * Shows "{fromValue} → {toValue}" for role or slot changes.
6
+ */
7
+ import { classNames } from '../../utils/utils.js';
8
+
9
+ interface Props {
10
+ /** Original value */
11
+ fromValue: string;
12
+ /** New value */
13
+ toValue: string;
14
+ /** Style variant - bubble (in message context) or inline (in notice) */
15
+ variant?: 'bubble' | 'inline';
16
+ /** Whether this is outbound (right side) */
17
+ outbound?: boolean;
18
+ /** Additional CSS classes */
19
+ className?: string;
20
+ }
21
+
22
+ let {
23
+ fromValue,
24
+ toValue,
25
+ variant = 'bubble',
26
+ outbound = false,
27
+ className = '',
28
+ }: Props = $props();
29
+
30
+ let classes = $derived(
31
+ variant === 'bubble'
32
+ ? classNames(
33
+ 'px-4 py-2.5 rounded-2xl text-sm bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400',
34
+ outbound ? 'rounded-br-sm' : 'rounded-bl-sm',
35
+ className
36
+ )
37
+ : classNames(
38
+ 'text-xs font-medium text-gray-500 dark:text-gray-400',
39
+ className
40
+ )
41
+ );
42
+ </script>
43
+
44
+ <span class={classes}>
45
+ {fromValue} → {toValue}
46
+ </span>
@@ -0,0 +1,16 @@
1
+ interface Props {
2
+ /** Original value */
3
+ fromValue: string;
4
+ /** New value */
5
+ toValue: string;
6
+ /** Style variant - bubble (in message context) or inline (in notice) */
7
+ variant?: 'bubble' | 'inline';
8
+ /** Whether this is outbound (right side) */
9
+ outbound?: boolean;
10
+ /** Additional CSS classes */
11
+ className?: string;
12
+ }
13
+ declare const ChatSlotUpdate: import("svelte").Component<Props, {}, "">;
14
+ type ChatSlotUpdate = ReturnType<typeof ChatSlotUpdate>;
15
+ export default ChatSlotUpdate;
16
+ //# sourceMappingURL=ChatSlotUpdate.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatSlotUpdate.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/patterns/chat/ChatSlotUpdate.svelte.ts"],"names":[],"mappings":"AAWE,UAAU,KAAK;IACb,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkCH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,91 @@
1
+ <script lang="ts">
2
+ /**
3
+ * ChatStatusBadge - Status indicator for chat activity feeds
4
+ *
5
+ * Displays status changes (Confirmed, Declined, Invited, etc.) with
6
+ * appropriate colors and icons in a pill/badge format.
7
+ */
8
+ import type { Snippet, Component } from 'svelte';
9
+ import { classNames } from '../../utils/utils.js';
10
+ import CheckmarkFilled from 'carbon-icons-svelte/lib/CheckmarkFilled.svelte';
11
+ import CloseFilled from 'carbon-icons-svelte/lib/CloseFilled.svelte';
12
+ import SendAltFilled from 'carbon-icons-svelte/lib/SendAltFilled.svelte';
13
+
14
+ type StatusType = 'confirmed' | 'declined' | 'canceled' | 'invited' | 'pending' | string;
15
+
16
+ interface Props {
17
+ /** Status value */
18
+ status: StatusType;
19
+ /** Show as outbound style (right-aligned context) */
20
+ outbound?: boolean;
21
+ /** Additional CSS classes */
22
+ className?: string;
23
+ /** Optional custom icon */
24
+ icon?: Snippet;
25
+ }
26
+
27
+ let {
28
+ status,
29
+ outbound = false,
30
+ className = '',
31
+ icon,
32
+ }: Props = $props();
33
+
34
+ interface StatusStyle {
35
+ textColor: string;
36
+ bgColor: string;
37
+ icon: Component<{ class?: string }> | null;
38
+ }
39
+
40
+ function getStatusStyle(s: string): StatusStyle {
41
+ switch (s?.toLowerCase()) {
42
+ case 'confirmed':
43
+ return {
44
+ textColor: 'text-green-600',
45
+ bgColor: 'bg-green-50 dark:bg-green-900/20',
46
+ icon: CheckmarkFilled,
47
+ };
48
+ case 'declined':
49
+ case 'canceled':
50
+ return {
51
+ textColor: 'text-red-600',
52
+ bgColor: 'bg-red-50 dark:bg-red-900/20',
53
+ icon: CloseFilled,
54
+ };
55
+ case 'invited':
56
+ return {
57
+ textColor: 'text-blue-600',
58
+ bgColor: 'bg-blue-50 dark:bg-blue-900/20',
59
+ icon: SendAltFilled,
60
+ };
61
+ default:
62
+ return {
63
+ textColor: 'text-gray-600',
64
+ bgColor: 'bg-gray-100 dark:bg-gray-800',
65
+ icon: null,
66
+ };
67
+ }
68
+ }
69
+
70
+ let style = $derived(getStatusStyle(status));
71
+
72
+ let badgeClasses = $derived(
73
+ classNames(
74
+ 'px-4 py-2.5 rounded-2xl text-sm font-medium flex items-center gap-1.5',
75
+ style.bgColor,
76
+ style.textColor,
77
+ outbound ? 'rounded-br-sm' : 'rounded-bl-sm',
78
+ className
79
+ )
80
+ );
81
+ </script>
82
+
83
+ <div class={badgeClasses}>
84
+ {#if icon}
85
+ {@render icon()}
86
+ {:else if style.icon}
87
+ {@const IconComponent = style.icon}
88
+ <IconComponent class="w-4 h-4" />
89
+ {/if}
90
+ <span class="capitalize">{status}</span>
91
+ </div>
@@ -0,0 +1,22 @@
1
+ /**
2
+ * ChatStatusBadge - Status indicator for chat activity feeds
3
+ *
4
+ * Displays status changes (Confirmed, Declined, Invited, etc.) with
5
+ * appropriate colors and icons in a pill/badge format.
6
+ */
7
+ import type { Snippet, Component } from 'svelte';
8
+ type StatusType = 'confirmed' | 'declined' | 'canceled' | 'invited' | 'pending' | string;
9
+ interface Props {
10
+ /** Status value */
11
+ status: StatusType;
12
+ /** Show as outbound style (right-aligned context) */
13
+ outbound?: boolean;
14
+ /** Additional CSS classes */
15
+ className?: string;
16
+ /** Optional custom icon */
17
+ icon?: Snippet;
18
+ }
19
+ declare const ChatStatusBadge: Component<Props, {}, "">;
20
+ type ChatStatusBadge = ReturnType<typeof ChatStatusBadge>;
21
+ export default ChatStatusBadge;
22
+ //# sourceMappingURL=ChatStatusBadge.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatStatusBadge.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/patterns/chat/ChatStatusBadge.svelte.ts"],"names":[],"mappings":"AAGA;;;;;KAKK;AACL,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAO/C,KAAK,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzF,UAAU,KAAK;IACb,mBAAmB;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAgFH,QAAA,MAAM,eAAe,0BAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ /**
3
+ * ChatStatusTransition - Status change display with icons
4
+ *
5
+ * Shows "{fromStatus} → {toStatus}" with colored icons for each status.
6
+ * Used in activity notices to show silent status changes.
7
+ */
8
+ import type { Component } from 'svelte';
9
+ import { classNames } from '../../utils/utils.js';
10
+ import CheckmarkFilled from 'carbon-icons-svelte/lib/CheckmarkFilled.svelte';
11
+ import CloseFilled from 'carbon-icons-svelte/lib/CloseFilled.svelte';
12
+ import SendAltFilled from 'carbon-icons-svelte/lib/SendAltFilled.svelte';
13
+
14
+ interface Props {
15
+ /** Original status */
16
+ fromStatus: string;
17
+ /** New status */
18
+ toStatus: string;
19
+ /** Additional CSS classes */
20
+ className?: string;
21
+ }
22
+
23
+ let {
24
+ fromStatus,
25
+ toStatus,
26
+ className = '',
27
+ }: Props = $props();
28
+
29
+ interface StatusStyle {
30
+ color: string;
31
+ icon: Component<{ class?: string }> | null;
32
+ }
33
+
34
+ function getStatusStyle(status: string): StatusStyle {
35
+ switch (status?.toLowerCase()) {
36
+ case 'confirmed':
37
+ return { color: 'text-green-600', icon: CheckmarkFilled };
38
+ case 'declined':
39
+ case 'canceled':
40
+ return { color: 'text-red-600', icon: CloseFilled };
41
+ case 'invited':
42
+ return { color: 'text-blue-600', icon: SendAltFilled };
43
+ default:
44
+ return { color: 'text-gray-600', icon: null };
45
+ }
46
+ }
47
+
48
+ let fromStyle = $derived(getStatusStyle(fromStatus));
49
+ let toStyle = $derived(getStatusStyle(toStatus));
50
+ </script>
51
+
52
+ <span class={classNames('text-xs font-medium flex items-center gap-1', className)}>
53
+ {#if fromStyle.icon}
54
+ {@const FromIcon = fromStyle.icon}
55
+ <FromIcon class="w-3 h-3 {fromStyle.color}" />
56
+ {/if}
57
+ <span class={fromStyle.color}>{fromStatus}</span>
58
+ <span class="text-gray-400 mx-1">→</span>
59
+ {#if toStyle.icon}
60
+ {@const ToIcon = toStyle.icon}
61
+ <ToIcon class="w-3 h-3 {toStyle.color}" />
62
+ {/if}
63
+ <span class={toStyle.color}>{toStatus}</span>
64
+ </span>
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ChatStatusTransition - Status change display with icons
3
+ *
4
+ * Shows "{fromStatus} → {toStatus}" with colored icons for each status.
5
+ * Used in activity notices to show silent status changes.
6
+ */
7
+ import type { Component } from 'svelte';
8
+ interface Props {
9
+ /** Original status */
10
+ fromStatus: string;
11
+ /** New status */
12
+ toStatus: string;
13
+ /** Additional CSS classes */
14
+ className?: string;
15
+ }
16
+ declare const ChatStatusTransition: Component<Props, {}, "">;
17
+ type ChatStatusTransition = ReturnType<typeof ChatStatusTransition>;
18
+ export default ChatStatusTransition;
19
+ //# sourceMappingURL=ChatStatusTransition.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatStatusTransition.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/patterns/chat/ChatStatusTransition.svelte.ts"],"names":[],"mappings":"AAGA;;;;;KAKK;AACL,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAOtC,UAAU,KAAK;IACb,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwDH,QAAA,MAAM,oBAAoB,0BAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ /**
3
+ * ChatTextBubble - Simple text bubble without the full ChatBubble wrapper
4
+ *
5
+ * Just the bubble itself, for use within ChatMessageGroup or other contexts
6
+ * where you don't need avatar/timestamp handling.
7
+ */
8
+ import type { Snippet } from 'svelte';
9
+ import { classNames } from '../../utils/utils.js';
10
+
11
+ interface Props {
12
+ /** Direction - inbound (gray) or outbound (blue) */
13
+ direction?: 'inbound' | 'outbound';
14
+ /** Additional CSS classes */
15
+ className?: string;
16
+ /** Content */
17
+ children?: Snippet;
18
+ }
19
+
20
+ let {
21
+ direction = 'inbound',
22
+ className = '',
23
+ children,
24
+ }: Props = $props();
25
+
26
+ let isOutbound = $derived(direction === 'outbound');
27
+
28
+ let bubbleClasses = $derived(
29
+ classNames(
30
+ 'px-4 py-2.5 rounded-2xl text-sm',
31
+ isOutbound
32
+ ? 'bg-blue-600 text-white rounded-br-sm'
33
+ : 'bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-white rounded-bl-sm',
34
+ className
35
+ )
36
+ );
37
+ </script>
38
+
39
+ <div class={bubbleClasses}>
40
+ {@render children?.()}
41
+ </div>
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ChatTextBubble - Simple text bubble without the full ChatBubble wrapper
3
+ *
4
+ * Just the bubble itself, for use within ChatMessageGroup or other contexts
5
+ * where you don't need avatar/timestamp handling.
6
+ */
7
+ import type { Snippet } from 'svelte';
8
+ interface Props {
9
+ /** Direction - inbound (gray) or outbound (blue) */
10
+ direction?: 'inbound' | 'outbound';
11
+ /** Additional CSS classes */
12
+ className?: string;
13
+ /** Content */
14
+ children?: Snippet;
15
+ }
16
+ declare const ChatTextBubble: import("svelte").Component<Props, {}, "">;
17
+ type ChatTextBubble = ReturnType<typeof ChatTextBubble>;
18
+ export default ChatTextBubble;
19
+ //# sourceMappingURL=ChatTextBubble.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatTextBubble.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/patterns/chat/ChatTextBubble.svelte.ts"],"names":[],"mappings":"AAGA;;;;;KAKK;AACL,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIpC,UAAU,KAAK;IACb,oDAAoD;IACpD,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACnC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgCH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { default as ChatContainer } from "./ChatContainer.svelte";
2
+ export { default as ChatMessageGroup } from "./ChatMessageGroup.svelte";
3
+ export { default as ChatBubble } from "./ChatBubble.svelte";
4
+ export { default as ChatTextBubble } from "./ChatTextBubble.svelte";
5
+ export { default as ChatInvitationBubble } from "./ChatInvitationBubble.svelte";
6
+ export { default as ChatStatusBadge } from "./ChatStatusBadge.svelte";
7
+ export { default as ChatStatusTransition } from "./ChatStatusTransition.svelte";
8
+ export { default as ChatSlotUpdate } from "./ChatSlotUpdate.svelte";
9
+ export { default as ChatDateDivider } from "./ChatDateDivider.svelte";
10
+ export { default as ChatActivityNotice } from "./ChatActivityNotice.svelte";
11
+ export { default as ChatInvitationNotice } from "./ChatInvitationNotice.svelte";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/patterns/chat/index.js"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ // =============================================================================
2
+ // CHAT PATTERNS - Chat interface components
3
+ // =============================================================================
4
+
5
+ // Core layout
6
+ export { default as ChatContainer } from './ChatContainer.svelte';
7
+ export { default as ChatMessageGroup } from './ChatMessageGroup.svelte';
8
+
9
+ // Message bubbles
10
+ export { default as ChatBubble } from './ChatBubble.svelte';
11
+ export { default as ChatTextBubble } from './ChatTextBubble.svelte';
12
+ export { default as ChatInvitationBubble } from './ChatInvitationBubble.svelte';
13
+
14
+ // Status displays
15
+ export { default as ChatStatusBadge } from './ChatStatusBadge.svelte';
16
+ export { default as ChatStatusTransition } from './ChatStatusTransition.svelte';
17
+ export { default as ChatSlotUpdate } from './ChatSlotUpdate.svelte';
18
+
19
+ // Dividers and notices
20
+ export { default as ChatDateDivider } from './ChatDateDivider.svelte';
21
+ export { default as ChatActivityNotice } from './ChatActivityNotice.svelte';
22
+ export { default as ChatInvitationNotice } from './ChatInvitationNotice.svelte';
@@ -1,3 +1,4 @@
1
+ export * from "./chat/index.js";
1
2
  export * from "./forms/index.js";
2
3
  export * from "./navigation/index.js";
3
4
  export * from "./page/index.js";
@@ -2,6 +2,9 @@
2
2
  // PATTERNS - Layout & flow components (Layer 3)
3
3
  // =============================================================================
4
4
 
5
+ // Chat - re-export from chat/index.js
6
+ export * from './chat/index.js';
7
+
5
8
  // Forms - re-export from forms/index.js
6
9
  export * from './forms/index.js';
7
10
 
@@ -103,54 +103,56 @@ describe('Button Sizes', () => {
103
103
  test('Full width size', () => {
104
104
  const { button } = setupTest({ size: 'full' });
105
105
  expect(button).toHaveClass('w-full');
106
+ expect(button).toHaveClass('h-11');
106
107
  expect(button).toHaveClass('px-5');
107
- expect(button).toHaveClass('py-3');
108
108
  });
109
109
 
110
110
  test('Full width on mobile, auto on desktop', () => {
111
111
  const { button } = setupTest({ size: 'full-md-auto' });
112
112
  expect(button).toHaveClass('w-full');
113
+ expect(button).toHaveClass('h-11');
113
114
  expect(button).toHaveClass('md:w-auto');
114
115
  });
115
116
 
116
117
  test('XL size', () => {
117
118
  const { button } = setupTest({ size: 'xl' });
119
+ expect(button).toHaveClass('h-12');
118
120
  expect(button).toHaveClass('px-6');
119
- expect(button).toHaveClass('py-3.5');
120
121
  expect(button).toHaveClass('text-sm');
121
122
  });
122
123
 
123
124
  test('Large size', () => {
124
125
  const { button } = setupTest({ size: 'lg' });
126
+ expect(button).toHaveClass('h-11');
125
127
  expect(button).toHaveClass('px-5');
126
- expect(button).toHaveClass('py-3');
127
128
  expect(button).toHaveClass('text-sm');
128
129
  });
129
130
 
130
131
  test('Medium size (default)', () => {
131
132
  const { button } = setupTest({ size: 'md' });
133
+ expect(button).toHaveClass('h-10');
132
134
  expect(button).toHaveClass('px-4');
133
- expect(button).toHaveClass('py-2.5');
134
135
  expect(button).toHaveClass('text-sm');
135
136
  });
136
137
 
137
138
  test('Small size', () => {
138
139
  const { button } = setupTest({ size: 'sm' });
140
+ expect(button).toHaveClass('h-9');
139
141
  expect(button).toHaveClass('px-3');
140
- expect(button).toHaveClass('py-2');
141
142
  expect(button).toHaveClass('text-sm');
142
143
  });
143
144
 
144
145
  test('Extra small size', () => {
145
146
  const { button } = setupTest({ size: 'xs' });
147
+ expect(button).toHaveClass('h-8');
146
148
  expect(button).toHaveClass('px-3');
147
- expect(button).toHaveClass('py-1.5');
148
149
  expect(button).toHaveClass('text-xs');
149
150
  });
150
151
 
151
152
  test('Half width size', () => {
152
153
  const { button } = setupTest({ size: 'half' });
153
154
  expect(button).toHaveClass('w-1/2');
155
+ expect(button).toHaveClass('h-10');
154
156
  });
155
157
  });
156
158
 
@@ -342,7 +342,7 @@
342
342
  {:else}
343
343
  <div class="relative flex items-center w-full">
344
344
  {#if leftIcon}
345
- <div class="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 z-10 pointer-events-none">
345
+ <div class="absolute left-3 inset-y-0 flex items-center text-gray-400 z-10 pointer-events-none">
346
346
  {@render leftIcon()}
347
347
  </div>
348
348
  {/if}
@@ -627,7 +627,7 @@
627
627
  {:else}
628
628
  <!-- Empty dropzone with direct drag-drop support -->
629
629
  <div
630
- class="{shapeAspects[shape]} filepond-wrapper-single {shape === 'wide' ? 'filepond-wide' : ''}
630
+ class="{shapeAspects[shape]} filepond-wrapper-single rounded-xl {shape === 'wide' ? 'filepond-wide' : ''}
631
631
  {isDropzoneDragOver ? 'dropzone-drag-over' : ''}"
632
632
  role="button"
633
633
  tabindex="0"
@@ -883,7 +883,6 @@
883
883
  /* Single mode dropzone styling */
884
884
  .filepond-wrapper-single {
885
885
  border: 2px dashed rgb(209 213 219); /* gray-300 */
886
- border-radius: 0.75rem; /* rounded-xl */
887
886
  background-color: rgb(249 250 251); /* gray-50 */
888
887
  transition-property: color, background-color, border-color;
889
888
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
@@ -22,9 +22,8 @@ describe('sizing tokens', () => {
22
22
  expect(formInputSizes.md).toContain('h-10');
23
23
  expect(formInputSizes.lg).toContain('h-12');
24
24
  });
25
- it('includes padding and text size classes', () => {
25
+ it('includes horizontal padding and text size classes', () => {
26
26
  for (const size of Object.values(formInputSizes)) {
27
- expect(size).toMatch(/py-\d/);
28
27
  expect(size).toMatch(/px-\d/);
29
28
  expect(size).toMatch(/text-(sm|base)/);
30
29
  }
@@ -39,14 +38,13 @@ describe('sizing tokens', () => {
39
38
  expect(formControlSizes).toHaveProperty('md');
40
39
  expect(formControlSizes).toHaveProperty('lg');
41
40
  });
42
- it('does NOT include height classes (for flexible controls)', () => {
41
+ it('includes explicit height classes for toolbar alignment', () => {
43
42
  for (const size of Object.values(formControlSizes)) {
44
- expect(size).not.toMatch(/h-\d/);
43
+ expect(size).toMatch(/h-\d+/);
45
44
  }
46
45
  });
47
46
  it('includes padding and text size classes', () => {
48
47
  for (const size of Object.values(formControlSizes)) {
49
- expect(size).toMatch(/py-\d/);
50
48
  expect(size).toMatch(/px-\d/);
51
49
  expect(size).toMatch(/text-(sm|base)/);
52
50
  }
@@ -170,11 +168,11 @@ describe('sizing tokens', () => {
170
168
  expect(buttonSizes).toHaveProperty('full-md-auto');
171
169
  expect(buttonSizes).toHaveProperty('half');
172
170
  });
173
- it('standard sizes include padding and text sizing', () => {
171
+ it('standard sizes include explicit height, padding and text sizing', () => {
174
172
  const standardSizes = ['xs', 'sm', 'md', 'lg', 'xl'];
175
173
  for (const size of standardSizes) {
174
+ expect(buttonSizes[size]).toMatch(/h-\d+/);
176
175
  expect(buttonSizes[size]).toMatch(/px-\d/);
177
- expect(buttonSizes[size]).toMatch(/py-\d/);
178
176
  expect(buttonSizes[size]).toMatch(/text-(xs|sm)/);
179
177
  }
180
178
  });
@@ -6,21 +6,21 @@
6
6
  */
7
7
  /**
8
8
  * Form input sizes - for Input component with fixed heights
9
- * Provides consistent height, padding, and text sizing for text inputs.
9
+ * Uses explicit heights for consistent toolbar alignment.
10
10
  */
11
11
  export declare const formInputSizes: {
12
- readonly sm: "py-2 px-3 text-sm h-9";
13
- readonly md: "py-2.5 px-4 text-sm h-10";
14
- readonly lg: "py-3 px-4 text-base h-12";
12
+ readonly sm: "h-9 px-3 text-sm";
13
+ readonly md: "h-10 px-4 text-sm";
14
+ readonly lg: "h-12 px-4 text-base";
15
15
  };
16
16
  /**
17
- * Form control sizes - for Select and other form controls without fixed heights
18
- * Provides consistent padding and text sizing.
17
+ * Form control sizes - for Select and other form controls
18
+ * Uses explicit heights to match buttons and inputs for toolbar alignment.
19
19
  */
20
20
  export declare const formControlSizes: {
21
- readonly sm: "py-2 px-3 text-sm";
22
- readonly md: "py-2.5 px-4 text-sm";
23
- readonly lg: "py-3 px-4 text-base";
21
+ readonly sm: "h-9 px-3 text-sm";
22
+ readonly md: "h-10 px-4 text-sm";
23
+ readonly lg: "h-12 px-4 text-base";
24
24
  };
25
25
  export type FormInputSize = keyof typeof formInputSizes;
26
26
  export type FormControlSize = keyof typeof formControlSizes;
@@ -63,18 +63,19 @@ export declare const skeletonSizes: {
63
63
  };
64
64
  export type SkeletonSize = keyof typeof skeletonSizes;
65
65
  /**
66
- * Standard button sizes - padding and text sizing.
66
+ * Standard button sizes - padding, text sizing, and explicit heights for consistency.
67
+ * All toolbar elements (buttons, inputs, selects) should align at the same height.
67
68
  */
68
69
  export declare const buttonSizes: {
69
- readonly xs: "px-3 py-1.5 text-xs";
70
- readonly sm: "px-3 py-2 text-sm";
71
- readonly md: "px-4 py-2.5 text-sm";
72
- readonly lg: "px-5 py-3 text-sm";
73
- readonly xl: "px-6 py-3.5 text-sm";
74
- readonly 'xl-medium': "w-full px-6 py-3.5 text-sm";
75
- readonly full: "w-full px-5 py-3 text-sm";
76
- readonly 'full-md-auto': "w-full px-5 py-3 text-sm md:w-auto";
77
- readonly half: "w-1/2 px-4 py-2.5 text-sm";
70
+ readonly xs: "h-8 px-3 text-xs";
71
+ readonly sm: "h-9 px-3 text-sm";
72
+ readonly md: "h-10 px-4 text-sm";
73
+ readonly lg: "h-11 px-5 text-sm";
74
+ readonly xl: "h-12 px-6 text-sm";
75
+ readonly 'xl-medium': "w-full h-12 px-6 text-sm";
76
+ readonly full: "w-full h-11 px-5 text-sm";
77
+ readonly 'full-md-auto': "w-full h-11 px-5 text-sm md:w-auto";
78
+ readonly half: "w-1/2 h-10 px-4 text-sm";
78
79
  readonly landing: "h-12 sm:h-14 px-6 sm:px-8 text-base sm:text-lg";
79
80
  };
80
81
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sizing.d.ts","sourceRoot":"","sources":["../../src/lib/tokens/sizing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAM5D;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;CAMZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,SAAS,CAAC;AAM9C;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,UAAU,CAItE,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,UAAU,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAM3D;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AAMtD;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;CAYd,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,WAAW,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"sizing.d.ts","sourceRoot":"","sources":["../../src/lib/tokens/sizing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAM5D;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;CAMZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,SAAS,CAAC;AAM9C;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;CAKb,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,UAAU,CAItE,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,UAAU,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAM3D;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AAMtD;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;CAYd,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,WAAW,CAAC;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,mBAAmB,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC"}