@invopop/popui 0.1.2 → 0.1.3-6.beta.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 (178) hide show
  1. package/dist/AlertDialog.svelte +10 -11
  2. package/dist/BaseButton.svelte +25 -104
  3. package/dist/BaseCard.svelte +35 -30
  4. package/dist/BaseCounter.svelte +11 -8
  5. package/dist/BaseDropdown.svelte +5 -5
  6. package/dist/BaseFlag.svelte +5 -3
  7. package/dist/BaseFlag.svelte.d.ts +1 -0
  8. package/dist/BaseTable.svelte +16 -16
  9. package/dist/BaseTable.svelte.d.ts +1 -1
  10. package/dist/BaseTableActions.svelte +4 -6
  11. package/dist/BaseTableCellContent.svelte +9 -21
  12. package/dist/BaseTableCheckbox.svelte +9 -11
  13. package/dist/BaseTableHeaderContent.svelte +4 -4
  14. package/dist/BaseTableHeaderOrderBy.svelte +23 -12
  15. package/dist/BaseTableRow.svelte +12 -10
  16. package/dist/Breadcrumb.svelte +40 -0
  17. package/dist/Breadcrumb.svelte.d.ts +4 -0
  18. package/dist/Breadcrumbs.svelte +5 -30
  19. package/dist/ButtonFile.svelte +40 -30
  20. package/dist/ButtonUuidCopy.svelte +6 -3
  21. package/dist/CardCheckbox.svelte +45 -32
  22. package/dist/CardCheckbox.svelte.d.ts +1 -1
  23. package/dist/CardRelation.svelte +12 -13
  24. package/dist/CompanySelector.svelte +35 -7
  25. package/dist/CounterWidget.svelte +52 -0
  26. package/dist/CounterWidget.svelte.d.ts +4 -0
  27. package/dist/DataListItem.svelte +14 -10
  28. package/dist/DatePicker.svelte +20 -17
  29. package/dist/DrawerContext.svelte +207 -15
  30. package/dist/DrawerContextItem.svelte +50 -50
  31. package/dist/DrawerContextSeparator.svelte +1 -1
  32. package/dist/DropdownSelect.svelte +46 -18
  33. package/dist/EmptyState.svelte +42 -0
  34. package/dist/EmptyState.svelte.d.ts +4 -0
  35. package/dist/FeedEvents.svelte +9 -5
  36. package/dist/FeedIconEvent.svelte +2 -2
  37. package/dist/FeedIconStatus.svelte +4 -4
  38. package/dist/FeedItem.svelte +10 -11
  39. package/dist/FeedItemDetail.svelte +32 -6
  40. package/dist/FeedViewer.svelte +1 -1
  41. package/dist/GlobalSearch.svelte +13 -12
  42. package/dist/InputCheckbox.svelte +2 -5
  43. package/dist/InputError.svelte +4 -9
  44. package/dist/InputLabel.svelte +3 -1
  45. package/dist/InputRadio.svelte +29 -13
  46. package/dist/InputRadio.svelte.d.ts +1 -1
  47. package/dist/InputSearch.svelte +8 -8
  48. package/dist/InputSelect.svelte +32 -31
  49. package/dist/InputText.svelte +32 -24
  50. package/dist/InputTextarea.svelte +25 -19
  51. package/dist/InputToggle.svelte +24 -18
  52. package/dist/MenuItem.svelte +16 -11
  53. package/dist/MenuItemCollapsible.svelte +7 -7
  54. package/dist/Notification.svelte +60 -25
  55. package/dist/ProfileAvatar.svelte +43 -14
  56. package/dist/ProgressBar.svelte +42 -0
  57. package/dist/ProgressBar.svelte.d.ts +4 -0
  58. package/dist/ProgressBarCircle.svelte +46 -0
  59. package/dist/ProgressBarCircle.svelte.d.ts +4 -0
  60. package/dist/SeparatorHorizontal.svelte +2 -2
  61. package/dist/ShortcutWrapper.svelte +14 -5
  62. package/dist/StatusLabel.svelte +4 -5
  63. package/dist/StepIconList.svelte +11 -9
  64. package/dist/TagBeta.svelte +26 -14
  65. package/dist/TagProgress.svelte +28 -0
  66. package/dist/TagProgress.svelte.d.ts +4 -0
  67. package/dist/TagSearch.svelte +4 -4
  68. package/dist/TagStatus.svelte +32 -34
  69. package/dist/TitleMain.svelte +1 -1
  70. package/dist/TitleSection.svelte +1 -1
  71. package/dist/UuidCopy.svelte +4 -4
  72. package/dist/alert-dialog/alert-dialog-action.svelte +8 -4
  73. package/dist/alert-dialog/alert-dialog-cancel.svelte +7 -3
  74. package/dist/alert-dialog/alert-dialog-content.svelte +1 -1
  75. package/dist/alert-dialog/alert-dialog-description.svelte +1 -1
  76. package/dist/alert-dialog/alert-dialog-footer.svelte +1 -1
  77. package/dist/alert-dialog/alert-dialog-header.svelte +1 -1
  78. package/dist/alert-dialog/alert-dialog-overlay.svelte +1 -1
  79. package/dist/alert-dialog/alert-dialog-title.svelte +1 -1
  80. package/dist/alert-dialog/alert-dialog-trigger.svelte +4 -2
  81. package/dist/button/button.svelte +200 -24
  82. package/dist/button/button.svelte.d.ts +51 -26
  83. package/dist/clickOutside.d.ts +5 -2
  84. package/dist/clickOutside.js +9 -3
  85. package/dist/data-table/cells/boolean-cell.svelte +16 -0
  86. package/dist/data-table/cells/boolean-cell.svelte.d.ts +8 -0
  87. package/dist/data-table/cells/currency-cell.svelte +10 -0
  88. package/dist/data-table/cells/currency-cell.svelte.d.ts +8 -0
  89. package/dist/data-table/cells/date-cell.svelte +10 -0
  90. package/dist/data-table/cells/date-cell.svelte.d.ts +8 -0
  91. package/dist/data-table/cells/tag-cell.svelte +12 -0
  92. package/dist/data-table/cells/tag-cell.svelte.d.ts +8 -0
  93. package/dist/data-table/cells/text-cell.svelte +10 -0
  94. package/dist/data-table/cells/text-cell.svelte.d.ts +8 -0
  95. package/dist/data-table/column-definitions.d.ts +12 -0
  96. package/dist/data-table/column-definitions.js +40 -0
  97. package/dist/data-table/column-sizing-helpers.d.ts +6 -0
  98. package/dist/data-table/column-sizing-helpers.js +24 -0
  99. package/dist/data-table/create-columns.d.ts +3 -0
  100. package/dist/data-table/create-columns.js +50 -0
  101. package/dist/data-table/data-table-pagination.svelte +144 -0
  102. package/dist/data-table/data-table-pagination.svelte.d.ts +4 -0
  103. package/dist/data-table/data-table-svelte.svelte.d.ts +40 -0
  104. package/dist/data-table/data-table-svelte.svelte.js +111 -0
  105. package/dist/data-table/data-table-toolbar.svelte +16 -0
  106. package/dist/data-table/data-table-toolbar.svelte.d.ts +29 -0
  107. package/dist/data-table/data-table-types.d.ts +66 -0
  108. package/dist/data-table/data-table-types.js +1 -0
  109. package/dist/data-table/data-table-view-options.svelte +88 -0
  110. package/dist/data-table/data-table-view-options.svelte.d.ts +27 -0
  111. package/dist/data-table/data-table.svelte +303 -0
  112. package/dist/data-table/data-table.svelte.d.ts +25 -0
  113. package/dist/data-table/flex-render.svelte +40 -0
  114. package/dist/data-table/flex-render.svelte.d.ts +33 -0
  115. package/dist/data-table/index.d.ts +13 -0
  116. package/dist/data-table/index.js +13 -0
  117. package/dist/data-table/render-helpers.d.ts +90 -0
  118. package/dist/data-table/render-helpers.js +99 -0
  119. package/dist/data-table/table-setup.d.ts +36 -0
  120. package/dist/data-table/table-setup.js +130 -0
  121. package/dist/data-table/table-styles.d.ts +17 -0
  122. package/dist/data-table/table-styles.js +48 -0
  123. package/dist/helpers.d.ts +1 -0
  124. package/dist/helpers.js +3 -0
  125. package/dist/index.d.ts +15 -7
  126. package/dist/index.js +31 -14
  127. package/dist/range-calendar/range-calendar-cell.svelte +1 -1
  128. package/dist/range-calendar/range-calendar-day.svelte +11 -12
  129. package/dist/range-calendar/range-calendar-head-cell.svelte +1 -1
  130. package/dist/range-calendar/range-calendar-header.svelte +1 -1
  131. package/dist/range-calendar/range-calendar-month-select.svelte +1 -1
  132. package/dist/range-calendar/range-calendar-next-button.svelte +3 -3
  133. package/dist/range-calendar/range-calendar-prev-button.svelte +3 -3
  134. package/dist/range-calendar/range-calendar.svelte +1 -1
  135. package/dist/sonner/index.d.ts +1 -0
  136. package/dist/sonner/index.js +1 -0
  137. package/dist/sonner/sonner.svelte +44 -0
  138. package/dist/sonner/sonner.svelte.d.ts +4 -0
  139. package/dist/svg/CheckBadge.svelte +18 -0
  140. package/dist/svg/CheckBadge.svelte.d.ts +26 -0
  141. package/dist/svg/IconDelivery.svelte +86 -0
  142. package/dist/svg/IconDelivery.svelte.d.ts +20 -0
  143. package/dist/svg/IconEmpty.svelte +113 -121
  144. package/dist/svg/IconOrder.svelte +81 -0
  145. package/dist/svg/IconOrder.svelte.d.ts +20 -0
  146. package/dist/svg/IconPayment.svelte +86 -0
  147. package/dist/svg/IconPayment.svelte.d.ts +20 -0
  148. package/dist/table/table-body.svelte +5 -1
  149. package/dist/table/table-cell.svelte +4 -2
  150. package/dist/table/table-footer.svelte +1 -1
  151. package/dist/table/table-head.svelte +4 -2
  152. package/dist/table/table-header.svelte +1 -1
  153. package/dist/table/table-row.svelte +4 -2
  154. package/dist/table/table.svelte +2 -2
  155. package/dist/tabs/tabs-list.svelte +8 -2
  156. package/dist/tabs/tabs-list.svelte.d.ts +4 -1
  157. package/dist/tabs/tabs-trigger.svelte +5 -3
  158. package/dist/tabs/tabs-trigger.svelte.d.ts +4 -1
  159. package/dist/tailwind.theme.css +998 -0
  160. package/dist/tooltip/tooltip-content.svelte +2 -2
  161. package/dist/types.d.ts +71 -50
  162. package/package.json +20 -10
  163. package/dist/CounterWorkflow.svelte +0 -19
  164. package/dist/CounterWorkflow.svelte.d.ts +0 -4
  165. package/dist/DrawerContextWorkspace.svelte +0 -126
  166. package/dist/DrawerContextWorkspace.svelte.d.ts +0 -4
  167. package/dist/EmptyStateIcon.svelte +0 -52
  168. package/dist/EmptyStateIcon.svelte.d.ts +0 -4
  169. package/dist/EmptyStateIllustration.svelte +0 -66
  170. package/dist/EmptyStateIllustration.svelte.d.ts +0 -4
  171. package/dist/FormLayoutModal.svelte +0 -14
  172. package/dist/FormLayoutModal.svelte.d.ts +0 -4
  173. package/dist/ProfileSelector.svelte +0 -41
  174. package/dist/ProfileSelector.svelte.d.ts +0 -4
  175. package/dist/SectionLayout.svelte +0 -13
  176. package/dist/SectionLayout.svelte.d.ts +0 -4
  177. package/dist/tw.theme.d.ts +0 -142
  178. package/dist/tw.theme.js +0 -158
@@ -5,50 +5,48 @@
5
5
  let { label = '', status = 'grey', dot = false }: TagStatusProps = $props()
6
6
 
7
7
  let tagStyles = $derived(
8
- clsx({
9
- 'bg-positive-100 text-positive-500': status === 'green',
10
- 'border border-positive-200': status === 'green' && dot,
11
- 'bg-yellow-100 text-yellow-500': status === 'yellow',
12
- 'border border-yellow-200': status === 'yellow' && dot,
13
- 'bg-danger-100 text-danger-500': status === 'red',
14
- 'border border-danger-200': status === 'red' && dot,
15
- 'bg-warning-100 text-warning-500': status === 'orange',
16
- 'border border-warning-200': status === 'orange' && dot,
17
- 'bg-blue-100 text-blue-500': status === 'blue',
18
- 'border border-blue-200': status === 'blue' && dot,
19
- 'bg-purple-100 text-purple-500': status === 'purple',
20
- 'border border-purple-200': status === 'purple' && dot,
21
- 'border border-dashed border-neutral-200 text-neutral-400': status === 'empty',
22
- 'bg-neutral-100 text-neutral-500': status === 'grey',
23
- 'border border-neutral-200': status === 'grey' && dot,
24
- 'pl-1.5 pr-[5px] py-0.5': dot && label,
25
- 'p-0.5': dot && !label,
26
- 'px-1 py-0.5': !dot
8
+ clsx('rounded inline-flex items-center text-sm font-medium gap-1 box-border leading-4 py-0.5', {
9
+ 'bg-background-status-paid text-foreground-status-paid': status === 'green',
10
+ 'bg-background-status-processing text-foreground-status-processing': status === 'yellow',
11
+ 'bg-background-status-error text-foreground-status-error': status === 'red',
12
+ 'bg-background-status-draft text-foreground-status-draft': status === 'orange',
13
+ 'bg-background-status-sent text-foreground-status-sent': status === 'blue',
14
+ 'bg-background-status-registered text-foreground-status-registered': status === 'purple',
15
+ 'bg-background-status-completed text-foreground-status-completed': status === 'teal',
16
+ 'bg-background-status-received text-foreground-status-received': status === 'steelBlue',
17
+ 'bg-background-status-rejected text-foreground-status-rejected': status === 'crimson',
18
+ 'bg-sherwood-alpha-10 text-sherwood-60': status === 'olive',
19
+ 'bg-background-status-void text-foreground-default-secondary': status === 'grey',
20
+ 'shadow-avatar text-foreground-default-secondary': status === 'empty',
21
+ 'px-1.5': dot,
22
+ 'p-1!': dot && !label,
23
+ 'px-1': !dot
27
24
  })
28
25
  )
29
26
 
30
27
  let dotStyles = $derived(
31
- clsx({
32
- 'bg-positive-500': status === 'green',
33
- 'bg-yellow-500': status === 'yellow',
34
- 'bg-danger-500': status === 'red',
35
- 'bg-warning-500': status === 'orange',
36
- 'bg-blue-500': status === 'blue',
37
- 'bg-purple-500': status === 'purple',
38
- 'bg-neutral-300': status === 'empty',
39
- 'bg-neutral-500': status === 'grey'
28
+ clsx('rounded-[2px] shrink-0', {
29
+ 'bg-icon-status-paid': status === 'green',
30
+ 'bg-icon-status-processing': status === 'yellow',
31
+ 'bg-icon-status-error': status === 'red',
32
+ 'bg-icon-status-draft': status === 'orange',
33
+ 'bg-icon-status-sent': status === 'blue',
34
+ 'bg-icon-status-registered': status === 'purple',
35
+ 'bg-icon-status-completed': status === 'teal',
36
+ 'bg-icon-status-received': status === 'steelBlue',
37
+ 'bg-icon-status-rejected': status === 'crimson',
38
+ 'bg-sherwood-50': status === 'olive',
39
+ 'bg-icon-status-void': status === 'grey',
40
+ 'bg-icon-default-secondary': status === 'empty'
40
41
  })
41
42
  )
42
43
  </script>
43
44
 
44
- <span
45
- class:h-5={Boolean(label)}
46
- class="{tagStyles} rounded text-sm inline-flex items-center font-medium gap-1 box-border"
47
- >
45
+ <span class={tagStyles}>
48
46
  {#if dot}
49
- <span class="{dotStyles} w-2 h-2 rounded-sm"></span>
47
+ <span class="{dotStyles} size-2"></span>
50
48
  {/if}
51
49
  {#if label}
52
- <span>{label}</span>
50
+ <span class="whitespace-nowrap">{label}</span>
53
51
  {/if}
54
52
  </span>
@@ -4,7 +4,7 @@
4
4
  let { title = '', children }: TitleMainProps = $props()
5
5
  </script>
6
6
 
7
- <h1 class="text-neutral-800 font-medium text-lg font-sans tracking-tightest">
7
+ <h1 class="text-foreground font-medium text-lg">
8
8
  {#if children}
9
9
  {@render children()}
10
10
  {:else}
@@ -4,7 +4,7 @@
4
4
  let { title = '', children }: TitleSectionProps = $props()
5
5
  </script>
6
6
 
7
- <h1 class="text-neutral-800 font-medium text-lg font-sans tracking-tighter">
7
+ <h1 class="text-foreground font-medium text-lg">
8
8
  {#if children}
9
9
  {@render children()}
10
10
  {:else}
@@ -35,11 +35,11 @@
35
35
  'justify-end': rightAlign,
36
36
  'text-sm': small,
37
37
  'text-base': !small,
38
- 'text-neutral-800': dark,
39
- 'text-neutral-500': !dark,
38
+ 'text-foreground': dark,
39
+ 'text-foreground-default-secondary': !dark,
40
40
  'justify-between': !compact,
41
41
  'w-full': full,
42
- 'border border-neutral-800/10 rounded-md pl-2.5 pr-2 py-[5px]': !full
42
+ 'border border-border rounded-md pl-2.5 pr-2 py-[5px]': !full
43
43
  })
44
44
  )
45
45
 
@@ -65,6 +65,6 @@
65
65
  {formattedUuid}
66
66
  </button>
67
67
  <button class="p-1 cursor-pointer" onclick={handleIconClick}>
68
- <Icon src={link ? ExternalLink : Duplicate} class="w-4 h-4 text-neutral-500" />
68
+ <Icon src={link ? ExternalLink : Duplicate} class="w-4 h-4 text-foreground-default-secondary" />
69
69
  </button>
70
70
  </div>
@@ -6,16 +6,20 @@
6
6
  ref = $bindable(null),
7
7
  class: className,
8
8
  destructive = false,
9
- children
9
+ children,
10
+ ...restProps
10
11
  }: AlertDialogPrimitive.ActionProps & { destructive: boolean } = $props()
11
12
 
12
- let variant = $derived((destructive ? 'destructive' : 'primary') as ButtonVariant)
13
+ let variant = $derived((destructive ? 'danger' : 'primary') as ButtonVariant)
13
14
  </script>
14
15
 
15
16
  <AlertDialogPrimitive.Action
16
17
  bind:ref
17
18
  data-slot="alert-dialog-action"
18
- class={cn(buttonVariants({ variant }), className)}
19
+ class={cn(buttonVariants({ variant }), 'group', className)}
20
+ {...restProps}
19
21
  >
20
- {@render children?.()}
22
+ <div class="inline-flex items-center transition-transform group-active:translate-y-px">
23
+ {@render children?.()}
24
+ </div>
21
25
  </AlertDialogPrimitive.Action>
@@ -5,15 +5,19 @@
5
5
  let {
6
6
  ref = $bindable(null),
7
7
  class: className,
8
- children
8
+ children,
9
+ ...restProps
9
10
  }: AlertDialogPrimitive.CancelProps = $props()
10
11
  </script>
11
12
 
12
13
  <AlertDialogPrimitive.Cancel
13
14
  bind:ref
14
15
  data-slot="alert-dialog-cancel"
15
- class={cn(buttonVariants({ variant: 'secondary' }), 'mt-2 sm:mt-0', className)}
16
+ class={cn(buttonVariants({ variant: 'secondary' }), 'group mt-2 sm:mt-0', className)}
16
17
  {onkeydown}
18
+ {...restProps}
17
19
  >
18
- {@render children?.()}
20
+ <div class="inline-flex items-center transition-transform group-active:translate-y-px">
21
+ {@render children?.()}
22
+ </div>
19
23
  </AlertDialogPrimitive.Cancel>
@@ -18,7 +18,7 @@
18
18
  bind:ref
19
19
  data-slot="alert-dialog-content"
20
20
  class={cn(
21
- 'bg-white fixed left-[50%] top-[50%] z-[1002] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-5 pt-3 px-4 pb-4 sm:rounded-lg md:w-full',
21
+ 'bg-background fixed left-1/2 top-1/2 z-[1002] flex flex-col w-full max-w-lg -translate-x-1/2 -translate-y-1/2 rounded-xl overflow-clip',
22
22
  className
23
23
  )}
24
24
  >
@@ -12,7 +12,7 @@
12
12
  bind:ref
13
13
  data-slot="alert-dialog-description"
14
14
  class={cn(
15
- 'text-neutral-500 text-base flex flex-col space-y-2 justify-start items-start !mt-2',
15
+ 'text-base font-normal leading-5 tracking-tight text-foreground-default-secondary',
16
16
  className
17
17
  )}
18
18
  >
@@ -11,7 +11,7 @@
11
11
  <div
12
12
  bind:this={ref}
13
13
  data-slot="alert-dialog-footer"
14
- class={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-3', className)}
14
+ class={cn('flex gap-3 justify-end px-3 pb-3', className)}
15
15
  >
16
16
  {@render children?.()}
17
17
  </div>
@@ -11,7 +11,7 @@
11
11
  <div
12
12
  bind:this={ref}
13
13
  data-slot="alert-dialog-header"
14
- class={cn('flex flex-col space-y-1 text-center sm:text-left', className)}
14
+ class={cn('flex flex-col gap-1 px-4 py-3', className)}
15
15
  >
16
16
  {@render children?.()}
17
17
  </div>
@@ -8,7 +8,7 @@
8
8
  bind:ref
9
9
  data-slot="alert-dialog-overlay"
10
10
  class={cn(
11
- 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 bg-neutral-800/30 fixed inset-0 z-[1001]',
11
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 bg-neutral-80/30 fixed inset-0 z-[1001]',
12
12
  className
13
13
  )}
14
14
  />
@@ -11,7 +11,7 @@
11
11
  <AlertDialogPrimitive.Title
12
12
  bind:ref
13
13
  data-slot="alert-dialog-title"
14
- class={cn('text-lg font-semibold text-neutral-800', className)}
14
+ class={cn('text-lg font-semibold leading-6 tracking-tight text-foreground', className)}
15
15
  >
16
16
  {@render children?.()}
17
17
  </AlertDialogPrimitive.Title>
@@ -1,6 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { AlertDialog as AlertDialogPrimitive } from 'bits-ui'
3
- let { ref = $bindable(null) }: AlertDialogPrimitive.TriggerProps = $props()
3
+ let { ref = $bindable(null), children }: AlertDialogPrimitive.TriggerProps = $props()
4
4
  </script>
5
5
 
6
- <AlertDialogPrimitive.Trigger bind:ref data-slot="alert-dialog-trigger" />
6
+ <AlertDialogPrimitive.Trigger bind:ref data-slot="alert-dialog-trigger">
7
+ {@render children?.()}
8
+ </AlertDialogPrimitive.Trigger>
@@ -2,77 +2,253 @@
2
2
  import { cn, type WithElementRef } from '../utils.js'
3
3
  import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements'
4
4
  import { type VariantProps, tv } from 'tailwind-variants'
5
+ import type { IconSource } from '@steeze-ui/svelte-icon'
6
+
5
7
  export const buttonVariants = tv({
6
- base: 'ring-workspace-accent-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 flex items-center justify-center font-medium font-sans relative group tracking-tight rounded-md text-base text-neutral-800 box-border',
8
+ base: 'inline-flex items-center justify-center font-medium text-base whitespace-nowrap focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-selected focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-30 relative overflow-hidden box-border cursor-pointer',
7
9
  variants: {
8
10
  variant: {
9
- default: 'bg-white text-neutral-800 hover:bg-primary/90',
10
- destructive:
11
- 'ring-danger-200 bg-danger-500 border border-danger-500 hover:bg-danger-600 hover:border-danger-600 active:bg-danger-700 active:border-danger-700 text-white',
12
- outline:
13
- 'border-neutral-200 bg-white hover:border-neutral-300 border shadow-button active:shadow-button-active',
14
11
  primary:
15
- 'bg-workspace-accent-500 hover:bg-workspace-accent-600 active:bg-workspace-accent-700 text-white',
12
+ 'bg-background-accent text-foreground-inverse border border-border shadow-button-primary hover:bg-background-accent-hover active:bg-background-accent-hover active:shadow-button-pressed [&_svg]:text-icon-inverse',
13
+ warning:
14
+ 'bg-background-warning-inverse text-foreground-inverse border border-border shadow-button-primary hover:bg-background-warning-bold active:bg-background-warning-bold active:shadow-button-pressed [&_svg]:text-icon-inverse',
15
+ danger:
16
+ 'bg-background-default-tertiary text-foreground-critical border border-border shadow-button-default hover:bg-background-critical-bold hover:text-foreground-inverse hover:border-background-critical-bold active:bg-background-critical-bold active:text-foreground-inverse active:border-background-critical-bold active:shadow-[0px_4px_4px_-1px_inset_rgba(11,11,16,0.16)] [&_svg]:text-icon-critical hover:[&_svg]:text-icon-inverse active:[&_svg]:text-icon-inverse',
17
+ outline:
18
+ 'bg-background text-foreground border border-border-default-secondary shadow-button-default hover:border-border-default-secondary-hover active:shadow-button-pressed [&_svg]:text-icon',
19
+ ghost:
20
+ 'bg-transparent text-foreground hover:shadow-button-default active:shadow-button-pressed hover:bg-background-default-tertiary-hover active:bg-background-default-tertiary-hover [&_svg]:text-icon',
16
21
  secondary:
17
- 'bg-neutral-100 border border-neutral-100 hover:bg-neutral-200 hover:border-neutral-200 active:bg-neutral-300 active:border-neutral-300',
18
- ghost: 'hover:bg-accent hover:text-accent-foreground',
19
- link: 'text-primary underline-offset-4 hover:underline'
22
+ 'bg-background-default-tertiary text-foreground shadow-button-default hover:bg-background-default-tertiary-hover active:bg-background-default-tertiary-hover active:shadow-button-pressed [&_svg]:text-icon',
23
+ dark: 'bg-transparent text-foreground-inverse border border-border-inverse-secondary hover:bg-background-selected-inverse active:bg-background-inverse-tertiary active:shadow-button-dark-pressed [&_svg]:text-icon-inverse',
24
+ 'dark-ghost':
25
+ 'bg-transparent text-foreground-inverse hover:bg-background-selected-inverse active:bg-background-inverse-tertiary active:shadow-button-dark-pressed [&_svg]:text-icon-inverse'
20
26
  },
21
27
  size: {
22
- default: 'h-7 px-2 py-1',
23
- sm: 'h-9 rounded-md px-3',
24
- lg: 'h-11 rounded-md px-8',
25
- icon: 'h-7 p-1.5',
26
- 'icon-sm': 'size-6 p-1 active:pt-[5px] active:pb-[3px]'
28
+ sm: 'h-6 rounded-sm',
29
+ md: 'h-7 rounded-md',
30
+ lg: 'h-8 rounded-lg'
31
+ },
32
+ iconOnly: {
33
+ true: '',
34
+ false: ''
35
+ },
36
+ hasIcon: {
37
+ true: '',
38
+ false: ''
27
39
  }
28
40
  },
41
+ compoundVariants: [
42
+ // Icon-only padding (varies by size) - must come first to avoid conflicts
43
+ {
44
+ size: 'sm',
45
+ iconOnly: true,
46
+ class: '!p-1'
47
+ },
48
+ {
49
+ size: 'md',
50
+ iconOnly: true,
51
+ class: '!p-1.5'
52
+ },
53
+ {
54
+ size: 'lg',
55
+ iconOnly: true,
56
+ class: '!p-2'
57
+ },
58
+ // Vertical padding for buttons with text
59
+ {
60
+ size: ['sm', 'md'],
61
+ iconOnly: false,
62
+ class: 'py-1'
63
+ },
64
+ {
65
+ size: 'lg',
66
+ iconOnly: false,
67
+ class: 'py-1.5'
68
+ },
69
+ // No icon - symmetric padding
70
+ {
71
+ size: ['sm', 'md'],
72
+ iconOnly: false,
73
+ hasIcon: false,
74
+ class: 'px-2'
75
+ },
76
+ {
77
+ size: 'lg',
78
+ iconOnly: false,
79
+ hasIcon: false,
80
+ class: 'px-3'
81
+ },
82
+ // Icon-left - asymmetric padding (less on icon side)
83
+ {
84
+ size: ['sm', 'md'],
85
+ iconOnly: false,
86
+ hasIcon: true,
87
+ class: 'pl-1.5 pr-2'
88
+ },
89
+ {
90
+ size: 'lg',
91
+ iconOnly: false,
92
+ hasIcon: true,
93
+ class: 'pl-2 pr-3'
94
+ },
95
+ // Icon-only uses bold icon variants
96
+ {
97
+ variant: ['secondary', 'outline', 'ghost'],
98
+ iconOnly: true,
99
+ class: '[&_svg]:!text-icon-default-bold'
100
+ },
101
+ {
102
+ variant: ['primary', 'warning', 'dark-ghost'],
103
+ iconOnly: true,
104
+ class: '[&_svg]:!text-icon-inverse-bold'
105
+ },
106
+ {
107
+ variant: 'dark',
108
+ iconOnly: true,
109
+ class: '[&_svg]:!text-icon-inverse-bold'
110
+ },
111
+ {
112
+ size: 'sm',
113
+ iconOnly: true,
114
+ class: 'w-6'
115
+ },
116
+ {
117
+ size: 'md',
118
+ iconOnly: true,
119
+ class: 'w-7'
120
+ },
121
+ {
122
+ size: 'lg',
123
+ iconOnly: true,
124
+ class: 'w-8'
125
+ }
126
+ ],
29
127
  defaultVariants: {
30
- variant: 'default',
31
- size: 'default'
128
+ variant: 'primary',
129
+ size: 'md',
130
+ iconOnly: false,
131
+ hasIcon: false
32
132
  }
33
133
  })
134
+
34
135
  export type ButtonVariant = VariantProps<typeof buttonVariants>['variant']
35
136
  export type ButtonSize = VariantProps<typeof buttonVariants>['size']
36
137
  export type ButtonProps = WithElementRef<HTMLButtonAttributes> &
37
138
  WithElementRef<HTMLAnchorAttributes> & {
38
139
  variant?: ButtonVariant
39
140
  size?: ButtonSize
141
+ icon?: IconSource
142
+ iconPosition?: 'left' | 'right'
143
+ iconClass?: string
40
144
  }
41
145
  </script>
42
146
 
43
147
  <script lang="ts">
148
+ import { Icon } from '@steeze-ui/svelte-icon'
149
+
44
150
  let {
45
151
  class: className,
46
- variant = 'default',
47
- size = 'default',
152
+ variant = 'primary',
153
+ size = 'lg',
154
+ icon,
155
+ iconPosition = 'left',
156
+ iconClass = '',
48
157
  ref = $bindable(null),
49
158
  href = undefined,
50
159
  type = 'button',
51
160
  disabled,
52
- children
161
+ children,
162
+ onclick,
163
+ ...rest
53
164
  }: ButtonProps = $props()
165
+
166
+ let iconOnly = $derived(!children)
167
+ let hasIcon = $derived(!!icon && !iconOnly)
168
+
169
+ let iconSize = $derived(
170
+ {
171
+ sm: 'size-3',
172
+ md: 'size-4',
173
+ lg: 'size-4'
174
+ }[size]
175
+ )
176
+
177
+ // For icon-right, we need to reverse the padding
178
+ let paddingClass = $derived(
179
+ iconPosition === 'right' && hasIcon ? (size === 'lg' ? 'pl-3 pr-2' : 'pl-2 pr-1.5') : ''
180
+ )
54
181
  </script>
55
182
 
183
+ {#snippet iconContent()}
184
+ {#if icon}
185
+ <div class={cn('relative z-10', iconClass && `[&_svg]:${iconClass}`)}>
186
+ <Icon src={icon} class={iconSize} />
187
+ </div>
188
+ {/if}
189
+ {/snippet}
190
+
191
+ {#snippet buttonContent()}
192
+ <div
193
+ class={cn(
194
+ 'inline-flex items-center transition-transform group-active:translate-y-px',
195
+ !iconOnly && 'gap-1'
196
+ )}
197
+ >
198
+ {#if icon && !children}
199
+ {@render iconContent()}
200
+ {:else if iconPosition === 'right'}
201
+ {#if children}
202
+ <span class="z-10">{@render children()}</span>
203
+ {/if}
204
+ {#if icon}
205
+ {@render iconContent()}
206
+ {/if}
207
+ {:else}
208
+ {#if icon}
209
+ {@render iconContent()}
210
+ {/if}
211
+ {#if children}
212
+ <span class="z-10">{@render children()}</span>
213
+ {/if}
214
+ {/if}
215
+ </div>
216
+ {/snippet}
217
+
56
218
  {#if href}
57
219
  <a
58
220
  bind:this={ref}
59
221
  data-slot="button"
60
- class={cn(buttonVariants({ variant, size }), className)}
222
+ class={cn(
223
+ buttonVariants({ variant, size, iconOnly, hasIcon }),
224
+ iconPosition === 'right' && 'flex-row-reverse',
225
+ paddingClass,
226
+ className
227
+ )}
61
228
  href={disabled ? undefined : href}
62
229
  aria-disabled={disabled}
63
230
  role={disabled ? 'link' : undefined}
64
231
  tabindex={disabled ? -1 : undefined}
232
+ {...rest}
65
233
  >
66
- {@render children?.()}
234
+ {@render buttonContent()}
67
235
  </a>
68
236
  {:else}
69
237
  <button
70
238
  bind:this={ref}
71
239
  data-slot="button"
72
- class={cn(buttonVariants({ variant, size }), className)}
240
+ class={cn(
241
+ buttonVariants({ variant, size, iconOnly, hasIcon }),
242
+ 'group',
243
+ iconPosition === 'right' && 'flex-row-reverse',
244
+ paddingClass,
245
+ className
246
+ )}
73
247
  {type}
74
248
  {disabled}
249
+ {onclick}
250
+ {...rest}
75
251
  >
76
- {@render children?.()}
252
+ {@render buttonContent()}
77
253
  </button>
78
254
  {/if}
@@ -1,63 +1,88 @@
1
1
  import { type WithElementRef } from '../utils.js';
2
2
  import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements';
3
3
  import { type VariantProps } from 'tailwind-variants';
4
+ import type { IconSource } from '@steeze-ui/svelte-icon';
4
5
  export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
5
6
  variant: {
6
- default: string;
7
- destructive: string;
8
- outline: string;
9
7
  primary: string;
10
- secondary: string;
8
+ warning: string;
9
+ danger: string;
10
+ outline: string;
11
11
  ghost: string;
12
- link: string;
12
+ secondary: string;
13
+ dark: string;
14
+ 'dark-ghost': string;
13
15
  };
14
16
  size: {
15
- default: string;
16
17
  sm: string;
18
+ md: string;
17
19
  lg: string;
18
- icon: string;
19
- 'icon-sm': string;
20
20
  };
21
- }, undefined, "ring-workspace-accent-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 flex items-center justify-center font-medium font-sans relative group tracking-tight rounded-md text-base text-neutral-800 box-border", {
21
+ iconOnly: {
22
+ true: string;
23
+ false: string;
24
+ };
25
+ hasIcon: {
26
+ true: string;
27
+ false: string;
28
+ };
29
+ }, undefined, "inline-flex items-center justify-center font-medium text-base whitespace-nowrap focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-selected focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-30 relative overflow-hidden box-border cursor-pointer", {
22
30
  variant: {
23
- default: string;
24
- destructive: string;
25
- outline: string;
26
31
  primary: string;
27
- secondary: string;
32
+ warning: string;
33
+ danger: string;
34
+ outline: string;
28
35
  ghost: string;
29
- link: string;
36
+ secondary: string;
37
+ dark: string;
38
+ 'dark-ghost': string;
30
39
  };
31
40
  size: {
32
- default: string;
33
41
  sm: string;
42
+ md: string;
34
43
  lg: string;
35
- icon: string;
36
- 'icon-sm': string;
44
+ };
45
+ iconOnly: {
46
+ true: string;
47
+ false: string;
48
+ };
49
+ hasIcon: {
50
+ true: string;
51
+ false: string;
37
52
  };
38
53
  }, undefined, import("tailwind-variants").TVReturnType<{
39
54
  variant: {
40
- default: string;
41
- destructive: string;
42
- outline: string;
43
55
  primary: string;
44
- secondary: string;
56
+ warning: string;
57
+ danger: string;
58
+ outline: string;
45
59
  ghost: string;
46
- link: string;
60
+ secondary: string;
61
+ dark: string;
62
+ 'dark-ghost': string;
47
63
  };
48
64
  size: {
49
- default: string;
50
65
  sm: string;
66
+ md: string;
51
67
  lg: string;
52
- icon: string;
53
- 'icon-sm': string;
54
68
  };
55
- }, undefined, "ring-workspace-accent-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 flex items-center justify-center font-medium font-sans relative group tracking-tight rounded-md text-base text-neutral-800 box-border", unknown, unknown, undefined>>;
69
+ iconOnly: {
70
+ true: string;
71
+ false: string;
72
+ };
73
+ hasIcon: {
74
+ true: string;
75
+ false: string;
76
+ };
77
+ }, undefined, "inline-flex items-center justify-center font-medium text-base whitespace-nowrap focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-selected focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-30 relative overflow-hidden box-border cursor-pointer", unknown, unknown, undefined>>;
56
78
  export type ButtonVariant = VariantProps<typeof buttonVariants>['variant'];
57
79
  export type ButtonSize = VariantProps<typeof buttonVariants>['size'];
58
80
  export type ButtonProps = WithElementRef<HTMLButtonAttributes> & WithElementRef<HTMLAnchorAttributes> & {
59
81
  variant?: ButtonVariant;
60
82
  size?: ButtonSize;
83
+ icon?: IconSource;
84
+ iconPosition?: 'left' | 'right';
85
+ iconClass?: string;
61
86
  };
62
87
  declare const Button: import("svelte").Component<ButtonProps, {}, "ref">;
63
88
  type Button = ReturnType<typeof Button>;
@@ -1,4 +1,7 @@
1
- /** Dispatch event on click outside of node */
2
- export function clickOutside(node: any): {
1
+ /**
2
+ * Dispatch event on click outside of node
3
+ * @param {HTMLElement} node
4
+ */
5
+ export function clickOutside(node: HTMLElement): {
3
6
  destroy(): void;
4
7
  };