@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
@@ -15,8 +15,24 @@
15
15
  $sw.checked = checked
16
16
  })
17
17
 
18
- let togleStyles = $derived(
19
- clsx({ 'bg-gray-200': !$sw.checked }, { 'bg-workspace-accent': $sw.checked })
18
+ let toggleStyles = $derived(
19
+ clsx(
20
+ 'relative inline-flex h-5 w-[30px] shrink-0 cursor-pointer items-center rounded-md transition-colors duration-200 ease-in-out focus:outline-none focus:ring-0',
21
+ {
22
+ 'bg-background-default-tertiary': !$sw.checked,
23
+ 'bg-background-accent': $sw.checked
24
+ }
25
+ )
26
+ )
27
+
28
+ let circleStyles = $derived(
29
+ clsx(
30
+ 'pointer-events-none inline-block size-4 transform rounded bg-icon-inverse-bold transition duration-200 ease-in-out',
31
+ {
32
+ 'translate-x-[2px]': !$sw.checked,
33
+ 'translate-x-[12px]': $sw.checked
34
+ }
35
+ )
20
36
  )
21
37
 
22
38
  function handleChange() {
@@ -25,22 +41,12 @@
25
41
  }
26
42
  </script>
27
43
 
28
- <label for={id} class="flex w-full items-center justify-between space-x-2">
29
- {#if label}
30
- <span class="text-base text-neutral-500">{label}</span>
31
- {/if}
32
- <button
33
- {id}
34
- class="{togleStyles} relative inline-flex h-5 w-8 flex-shrink-0 cursor-pointer rounded-md border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-0 focus:ring-offset-0"
35
- use:sw.toggle
36
- onclick={handleChange}
37
- >
44
+ <label for={id} class="inline-flex items-center gap-2 cursor-pointer">
45
+ <button {id} class={toggleStyles} use:sw.toggle onclick={handleChange}>
38
46
  <span class="sr-only">Use setting</span>
39
- <span
40
- aria-hidden="true"
41
- class="{$sw.checked
42
- ? 'translate-x-3'
43
- : 'translate-x-0'} pointer-events-none inline-block h-4 w-4 transform rounded bg-white shadow ring-0 transition duration-200 ease-in-out"
44
- ></span>
47
+ <span aria-hidden="true" class={circleStyles}></span>
45
48
  </button>
49
+ {#if label}
50
+ <span class="text-base text-foreground">{label}</span>
51
+ {/if}
46
52
  </label>
@@ -36,18 +36,22 @@
36
36
  let leaveHoverTimeout: ReturnType<typeof setTimeout> | null = null
37
37
  let itemStyles = $derived(
38
38
  clsx(
39
- { 'text-white font-medium': !isFolderItem },
40
- { 'text-white-40': isFolderItem && !active },
41
- { 'bg-white-10': active },
42
- { 'border border-transparent hover:border-white-5 group p-2': collapsedSidebar },
43
- { 'w-full px-2 py-1.5': !collapsedSidebar },
39
+ { 'text-foreground-inverse font-medium': !isFolderItem },
40
+ { 'text-foreground-inverse-secondary': isFolderItem && !active },
44
41
  {
45
- 'bg-white-10 border-white-5 text-white': active
42
+ 'border border-transparent hover:bg-background-selected-inverse group p-[7px] size-8':
43
+ collapsedSidebar
46
44
  },
47
- { 'hover:bg-white-5 focus:bg-white-10': !active }
45
+ { 'w-full px-2 py-1.5 h-8': !collapsedSidebar },
46
+ {
47
+ 'bg-background-selected-inverse text-white': active
48
+ },
49
+ { 'hover:bg-background-selected-inverse': !active }
48
50
  )
49
51
  )
50
- let iconStyles = $derived(clsx({ 'group-hover:text-white': collapsedSidebar }))
52
+ let iconStyles = $derived(
53
+ clsx({ 'group-hover:text-white text-icon-inverse-bold!': collapsedSidebar })
54
+ )
51
55
  let wrapperStyles = $derived(
52
56
  clsx({
53
57
  'ml-4 border-l border-white-10 pl-2 pt-0.5 relative': isFolderItem
@@ -106,11 +110,11 @@
106
110
  onmouseleave={handleBlur}
107
111
  onclick={handleClick}
108
112
  title={label}
109
- class="{itemStyles} text-base border border-transparent flex items-center justify-between hover:text-white focus:text-white rounded-md"
113
+ class="cursor-pointer {itemStyles} text-base border border-transparent flex items-center justify-between hover:text-white focus:text-white rounded-lg"
110
114
  >
111
- <span class="flex items-center space-x-2">
115
+ <span class="flex items-center space-x-1.5">
112
116
  {#if resolvedIcon}
113
- <Icon src={resolvedIcon} theme={iconTheme} class="{iconStyles} h-4 w-4 text-white-70" />
117
+ <Icon src={resolvedIcon} theme={iconTheme} class="{iconStyles} h-4 w-4 text-icon-inverse" />
114
118
  {/if}
115
119
  {#if !collapsedSidebar}
116
120
  <span class="whitespace-nowrap tracking-normal">{label}</span>
@@ -118,6 +122,7 @@
118
122
  </span>
119
123
  {#if collapsable && !collapsedSidebar}
120
124
  <button
125
+ class="cursor-pointer"
121
126
  onclick={(e) => {
122
127
  e.stopPropagation()
123
128
  open = !open
@@ -17,29 +17,29 @@
17
17
  clsx(
18
18
  { 'p-1': collapsed },
19
19
  { 'space-x-2 w-full p-[7px]': !collapsed },
20
- { 'border-white-30 bg-white-10': active },
21
- { 'border-transparent hover:bg-white-5': !active },
22
- { 'font-semibold': bold }
20
+ { 'bg-selected-inverse': active },
21
+ { 'hover:bg-background-selected-inverse': !active },
22
+ { 'font-medium': bold }
23
23
  )
24
24
  )
25
25
  </script>
26
26
 
27
27
  <span
28
28
  {title}
29
- class="{styles} text-white text-base flex items-center justify-between border rounded"
29
+ class="{styles} text-foreground-inverse text-base flex items-center justify-between rounded-lg h-8 font-medium"
30
30
  >
31
31
  <span class:space-x-2={!collapsed} class="flex items-center">
32
32
  {@render children?.()}
33
33
  {#if !collapsed}
34
34
  <div>
35
- <div class="whitespace-nowrap max-w-[140px] truncate tracking-tight">{title}</div>
35
+ <div class="whitespace-nowrap max-w-[118px] truncate tracking-tight">{title}</div>
36
36
  {#if subtitle}
37
- <div class="text-sm font-medium text-yellow-600">{subtitle}</div>
37
+ <div class="text-sm text-foreground-inverse-secondary">{subtitle}</div>
38
38
  {/if}
39
39
  </div>
40
40
  {/if}
41
41
  </span>
42
42
  {#if icon}
43
- <Icon src={icon} class="h-4 w-4 text-white-40 mt-px" />
43
+ <Icon src={icon} class="h-4 w-4 text-icon-inverse" />
44
44
  {/if}
45
45
  </span>
@@ -1,44 +1,79 @@
1
1
  <script lang="ts">
2
2
  import clsx from 'clsx'
3
- import { Alert, Failure, Success } from '@invopop/ui-icons'
3
+ import { Warning, Failure, Success, InfoBold } from '@invopop/ui-icons'
4
4
  import { Icon } from '@steeze-ui/svelte-icon'
5
- import type { NotificationProps, Status } from './types'
5
+ import type { NotificationProps } from './types'
6
6
 
7
- let { message = '', type = 'success', children }: NotificationProps = $props()
7
+ let { title = '', description = '', type = 'neutral', children }: NotificationProps = $props()
8
8
 
9
- function getIcon(type: Status) {
9
+ let icon = $derived.by(() => {
10
10
  switch (type) {
11
11
  case 'success':
12
12
  return Success
13
13
  case 'error':
14
14
  return Failure
15
15
  case 'warning':
16
- return Alert
16
+ return Warning
17
+ case 'info':
18
+ return InfoBold
19
+ case 'neutral':
20
+ return InfoBold
17
21
  default:
18
- return null
22
+ return InfoBold
19
23
  }
20
- }
21
- let icon = $derived(getIcon(type))
22
- let styles = $derived(
23
- clsx(
24
- { 'bg-positive-50': type === 'success' },
25
- { 'bg-danger-50': type === 'error' },
26
- { 'bg-yellow-50': type === 'warning' }
27
- )
24
+ })
25
+
26
+ let containerStyles = $derived(
27
+ clsx('flex items-center gap-1.5 pl-3 rounded-xl', {
28
+ 'py-1.5': children,
29
+ 'py-2': !children,
30
+ 'bg-background border border-border shadow-sm': type === 'neutral',
31
+ 'bg-background-info': type === 'info',
32
+ 'bg-background-success': type === 'success',
33
+ 'bg-background-warning': type === 'warning',
34
+ 'bg-background-critical': type === 'error',
35
+ 'pr-3': description,
36
+ 'min-h-9 rounded-[10px] pl-3 py-1.5 pr-1.5': !description
37
+ })
38
+ )
39
+
40
+ let titleStyles = $derived(
41
+ clsx('text-base font-medium leading-5 tracking-tight', {
42
+ 'text-foreground': type === 'neutral',
43
+ 'text-foreground-info': type === 'info',
44
+ 'text-foreground-success': type === 'success',
45
+ 'text-foreground-warning': type === 'warning',
46
+ 'text-foreground-critical': type === 'error'
47
+ })
28
48
  )
29
- let textStyles = $derived(
30
- clsx(
31
- { 'text-positive-500': type === 'success' },
32
- { 'text-danger-500': type === 'error' },
33
- { 'text-yellow-500': type === 'warning' }
34
- )
49
+
50
+ let iconStyles = $derived(
51
+ clsx('size-4', {
52
+ 'mt-0.5': description,
53
+ 'text-icon': type === 'neutral',
54
+ 'text-icon-info': type === 'info',
55
+ 'text-icon-success': type === 'success',
56
+ 'text-icon-warning': type === 'warning',
57
+ 'text-icon-critical': type === 'error'
58
+ })
35
59
  )
36
60
  </script>
37
61
 
38
- <div class="{styles} pl-3 pr-2 py-2 text-base font-medium rounded-lg flex items-center space-x-1">
39
- {#if icon}
40
- <Icon src={icon} class="h-4 w-4" />
41
- {/if}
42
- <span class="{textStyles} flex-1">{message}</span>
62
+ <div class={containerStyles}>
63
+ <div class:items-start={description} class:items-center={!description} class="flex self-stretch">
64
+ <div class="relative size-4 shrink-0">
65
+ {#if icon}
66
+ <Icon src={icon} class={iconStyles} />
67
+ {/if}
68
+ </div>
69
+ </div>
70
+ <div class="flex flex-col gap-0.5 grow justify-center min-w-0">
71
+ <p class={titleStyles}>{title}</p>
72
+ {#if description}
73
+ <p class="text-sm text-foreground-default-secondary leading-5 tracking-tight">
74
+ {description}
75
+ </p>
76
+ {/if}
77
+ </div>
43
78
  {@render children?.()}
44
79
  </div>
@@ -1,43 +1,72 @@
1
1
  <script lang="ts">
2
2
  import clsx from 'clsx'
3
3
  import BaseFlag from './BaseFlag.svelte'
4
+ import { Icon } from '@steeze-ui/svelte-icon'
4
5
  import type { ProfileAvatarProps } from './types'
5
6
 
6
7
  let {
7
8
  name = '',
8
- small = false,
9
- large = false,
9
+ variant = 'sm',
10
10
  dark = false,
11
11
  picture = $bindable(''),
12
- country = ''
12
+ country = '',
13
+ icon
13
14
  }: ProfileAvatarProps = $props()
14
15
 
15
- let avatarStyles = $derived(
16
+ let containerStyles = $derived(
16
17
  clsx(
17
- { 'text-sm': !large },
18
- { 'h-4 w-4': small },
19
- { 'h-5 w-5': !large && !small },
20
- { 'h-8 w-8': large },
21
- { 'bg-neutral-50 border-neutral-100 text-neutral-500': !dark },
22
- { 'bg-white-5 border-white-10 text-white-70': dark },
23
- { border: !picture }
18
+ 'overflow-clip relative flex items-center justify-center after:content-[""] after:absolute after:inset-0 after:pointer-events-none after:rounded-[inherit]',
19
+ { 'size-4 rounded': variant === 'xs' },
20
+ { 'size-5 rounded-md': variant === 'sm' },
21
+ { 'size-7 rounded-md': variant === 'md' },
22
+ { 'size-8 rounded-lg': variant === 'lg' },
23
+ { 'size-10 rounded-lg': variant === 'xl' },
24
+ {
25
+ 'bg-background after:shadow-avatar': !dark
26
+ },
27
+ { 'bg-background-inverse after:shadow-avatar-inverse': dark }
28
+ )
29
+ )
30
+
31
+ let textStyles = $derived(
32
+ clsx(
33
+ 'font-sans font-medium tracking-tight',
34
+ { 'text-sm leading-4': variant === 'xs' || variant === 'sm' },
35
+ { 'text-base leading-5': variant === 'md' },
36
+ { 'text-lg leading-6': variant === 'lg' },
37
+ { 'text-xl leading-7': variant === 'xl' },
38
+ { 'text-foreground-default-secondary': !dark },
39
+ { 'text-foreground-inverse-secondary': dark }
40
+ )
41
+ )
42
+
43
+ let iconStyles = $derived(
44
+ clsx(
45
+ { 'size-3': variant === 'xs' || variant === 'sm' },
46
+ { 'size-4': variant === 'md' },
47
+ { 'size-[25px]': variant === 'lg' || variant === 'xl' },
48
+ { 'text-icon-default-default': !dark },
49
+ { 'text-icon-inverse-default': dark }
24
50
  )
25
51
  )
26
52
  </script>
27
53
 
28
- <div class="{avatarStyles} rounded flex items-center justify-center font-semibold relative">
54
+ <div class={containerStyles}>
29
55
  {#if picture}
30
56
  <img
31
- class="h-full w-full rounded object-cover"
32
57
  src={picture}
33
58
  alt={name}
59
+ class="absolute inset-0 size-full object-cover"
34
60
  onerror={() => {
35
61
  picture = ''
36
62
  }}
37
63
  />
64
+ {:else if icon}
65
+ <Icon src={icon} class={iconStyles} />
38
66
  {:else}
39
- <span>{name?.charAt(0)}</span>
67
+ <span class={textStyles}>{name?.charAt(0)?.toUpperCase()}</span>
40
68
  {/if}
69
+
41
70
  {#if country}
42
71
  <div class="absolute -bottom-0.5 -right-0.5">
43
72
  <BaseFlag {country} />
@@ -0,0 +1,42 @@
1
+ <script lang="ts">
2
+ import clsx from 'clsx'
3
+ import type { ProgressBarProps } from './types'
4
+
5
+ let {
6
+ percentage = 0,
7
+ current = 0,
8
+ total = 0,
9
+ allowOverage = true,
10
+ warningPercentage = 80
11
+ }: ProgressBarProps = $props()
12
+
13
+ let isOverage = $derived(current > total && allowOverage)
14
+ let overagePercentage = $derived(isOverage && total > 0 ? ((current - total) / current) * 100 : 0)
15
+ let usedPercentage = $derived(isOverage ? 100 - overagePercentage : percentage)
16
+ let isCritical = $derived(percentage >= 100 || (current > total && !allowOverage))
17
+ let isWarning = $derived(percentage >= warningPercentage && percentage < 100)
18
+
19
+ let barColor = $derived(
20
+ clsx({
21
+ 'bg-background-critical-inverse': isCritical,
22
+ 'bg-background-warning-inverse': isWarning || isOverage,
23
+ 'bg-icon-inverse-bold': !isCritical && !isWarning && !isOverage
24
+ })
25
+ )
26
+
27
+ let barWidth = $derived(isOverage ? usedPercentage : Math.min(percentage, 100))
28
+ </script>
29
+
30
+ <div class="flex gap-0.5 w-full h-1">
31
+ {#if isOverage}
32
+ <div class="h-1 rounded-full bg-icon-inverse-bold" style="width: {barWidth}%"></div>
33
+ <div class="h-1 rounded-full bg-background-warning-inverse flex-1"></div>
34
+ {:else if percentage >= 100}
35
+ <div class="h-1 rounded-full {barColor} w-full"></div>
36
+ {:else}
37
+ {#if barWidth > 0}
38
+ <div class="h-1 rounded-full {barColor}" style="width: {barWidth}%"></div>
39
+ {/if}
40
+ <div class="h-1 rounded-full bg-background-selected-inverse flex-1"></div>
41
+ {/if}
42
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { ProgressBarProps } from './types';
2
+ declare const ProgressBar: import("svelte").Component<ProgressBarProps, {}, "">;
3
+ type ProgressBar = ReturnType<typeof ProgressBar>;
4
+ export default ProgressBar;
@@ -0,0 +1,46 @@
1
+ <script lang="ts">
2
+ import type { ProgressBarCircleProps } from './types'
3
+
4
+ let { progress, size, variant = 'default' }: ProgressBarCircleProps = $props()
5
+
6
+ let angle = $derived(360 * progress)
7
+ let filledColor = $derived(
8
+ variant === 'dark' ? 'var(--color-icon-inverse-bold)' : 'var(--color-icon-selected-default)'
9
+ )
10
+ let restColor = $derived(
11
+ variant === 'dark'
12
+ ? 'var(--color-background-selected-inverse-hover)'
13
+ : 'var(--color-background-default-tertiary)'
14
+ )
15
+ let background = $derived(
16
+ `conic-gradient(${filledColor} 0deg ${angle}deg, ${restColor} ${angle}deg 360deg)`
17
+ )
18
+ let cssVarStyles = $derived(`--background:${background}; --size: ${size}px; --ring: 1.5px;`)
19
+ </script>
20
+
21
+ <div id="progress-circle" style={cssVarStyles}></div>
22
+
23
+ <style>
24
+ #progress-circle {
25
+ background: var(--background);
26
+ -webkit-mask: radial-gradient(
27
+ circle,
28
+ transparent 0,
29
+ transparent calc(50% - var(--ring)),
30
+ black calc(50% - var(--ring)),
31
+ black 100%
32
+ );
33
+ mask: radial-gradient(
34
+ circle,
35
+ transparent 0,
36
+ transparent calc(50% - var(--ring)),
37
+ black calc(50% - var(--ring)),
38
+ black 100%
39
+ );
40
+ border-radius: 50%;
41
+ width: var(--size);
42
+ height: var(--size);
43
+ transition: all 500ms ease-in;
44
+ will-change: transform;
45
+ }
46
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { ProgressBarCircleProps } from './types';
2
+ declare const ProgressBarCircle: import("svelte").Component<ProgressBarCircleProps, {}, "">;
3
+ type ProgressBarCircle = ReturnType<typeof ProgressBarCircle>;
4
+ export default ProgressBarCircle;
@@ -4,8 +4,8 @@
4
4
  .hr-separator {
5
5
  border-image: repeating-linear-gradient(
6
6
  90deg,
7
- rgba(209, 213, 219, 1),
8
- rgba(209, 213, 219, 1) 3px,
7
+ var(--color-border-default-secondary),
8
+ var(--color-border-default-secondary) 3px,
9
9
  transparent 3px,
10
10
  transparent 7px
11
11
  );
@@ -1,12 +1,21 @@
1
1
  <script lang="ts">
2
2
  import type { ShortcutWrapperProps } from './types'
3
+ import clsx from 'clsx'
3
4
 
4
- let { children }: ShortcutWrapperProps = $props()
5
+ let { size = 'sm', theme = 'light', children }: ShortcutWrapperProps = $props()
6
+
7
+ const styles = $derived(
8
+ clsx('inline-flex items-center justify-center border', {
9
+ 'size-4 rounded': size === 'sm',
10
+ 'size-5 rounded-md': size === 'md',
11
+ 'bg-background-default-secondary border-border-default-secondary shadow-shortcut text-foreground-default-secondary':
12
+ theme === 'light',
13
+ 'bg-background-inverse-secondary border-border-inverse-secondary shadow-[0px_1px_0px_rgba(255,255,255,0.20)] text-foreground-inverse-secondary':
14
+ theme === 'navigation'
15
+ })
16
+ )
5
17
  </script>
6
18
 
7
- <div
8
- class="h-4 w-4 bg-white-5 rounded border border-white-20 inline-flex items-center justify-center"
9
- style="box-shadow: 0px 1px 0px rgba(255, 255, 255, 0.25);"
10
- >
19
+ <div class={styles}>
11
20
  {@render children?.()}
12
21
  </div>
@@ -7,11 +7,10 @@
7
7
 
8
8
  let styles = $derived(
9
9
  clsx({
10
- 'text-positive-500': status === 'success',
11
- 'text-neutral-500': status === 'queued',
12
- 'text-warning-500': status === 'alert',
13
- 'text-danger-500': status === 'failure',
14
- 'text-yellow-500': status === 'run'
10
+ 'text-foreground-success': status === 'success',
11
+ 'text-foreground-critical': status === 'failure',
12
+ 'text-foreground-attention': ['run', 'alert'].includes(status),
13
+ 'text-foreground-default-secondary': status === 'queued'
15
14
  })
16
15
  )
17
16
  </script>
@@ -9,31 +9,33 @@
9
9
  let restIcons = $derived(icons.slice(maxItems, icons.length))
10
10
  </script>
11
11
 
12
+ {#snippet separator()}
13
+ <div class="hidden sm:block h-px w-3 bg-border shrink-0"></div>
14
+ {/snippet}
15
+
12
16
  <TooltipProvider>
13
17
  <div class="flex flex-col space-y-2 sm:flex-row sm:space-y-0 items-center">
14
18
  {#each mainIcons as icon, i (i)}
15
19
  <Tooltip>
16
- <TooltipTrigger class="flex-shrink-0">
20
+ <TooltipTrigger class="shrink-0">
17
21
  <div
18
- class="p-1.5 border rounded-md border-neutral-200 flex items-center space-x-1 bg-white text-neutral-800"
22
+ class="p-1.5 rounded-md border border-border flex items-center space-x-1 bg-background text-icon"
19
23
  >
20
- <img src={icon.url} alt={icon.name} class="w-4 h-4" />
24
+ <img src={icon.url} alt={icon.name} class="size-4" />
21
25
  </div>
22
26
  </TooltipTrigger>
23
27
  <TooltipContent>{icon.name}</TooltipContent>
24
28
  </Tooltip>
25
29
 
26
30
  {#if i < mainIcons.length - 1}
27
- <div class="hidden sm:block h-px w-3 border border-neutral-200 mx-px flex-shrink-0"></div>
31
+ {@render separator()}
28
32
  {/if}
29
33
  {/each}
30
34
  {#if restIcons.length}
31
- <div class="hidden sm:block h-px w-3 border border-neutral-200 mx-px flex-shrink-0"></div>
35
+ {@render separator()}
32
36
  <Tooltip>
33
- <TooltipTrigger class="flex-shrink-0">
34
- <div
35
- class="flex items-center justify-center text-neutral-500 font-medium text-base h-7 w-7"
36
- >
37
+ <TooltipTrigger class="shrink-0">
38
+ <div class="flex items-center justify-center text-icon font-medium text-base size-7">
37
39
  +{restIcons.length}
38
40
  </div>
39
41
  </TooltipTrigger>
@@ -1,23 +1,35 @@
1
- <div class="rounded p-px beta-tag relative">
2
- <svg viewBox="0 0 37 20" fill="none" xmlns="http://www.w3.org/2000/svg" class="absolute">
3
- <path
4
- fill-rule="evenodd"
5
- clip-rule="evenodd"
6
- d="M4 4L4 7.5H0V8H4L4 11.5H0V12H4V15.5H0V16H4V20H4.5V16H8V20H8.5V16H12V20H12.5V16H16V20H16.5V16H20V20H20.5V16H24V20H24.5V16H28V20H28.5V16H32V20H32.5V16H37V15.5H32.5V12H37V11.5H32.5V8H37V7.5H32.5V4H37V3.5H32.5V0H32V3.5H28.5V0H28V3.5H24.5V0H24V3.5H20.5V0H20V3.5H16.5V0H16V3.5H12.5V0H12V3.5H8.5V0H8V3.5H4.5V0H4L4 3.5H0V4H4ZM32 4H28.5V7.5H32V4ZM32 8H28.5V11.5H32V8ZM32 12H28.5V15.5H32V12ZM28 12V15.5H24.5V12H28ZM28 8V11.5H24.5V8H28ZM28 4V7.5H24.5V4H28ZM24 4H20.5V7.5H24V4ZM24 8H20.5V11.5H24V8ZM24 12H20.5V15.5H24V12ZM20 12V15.5H16.5V12H20ZM20 8V11.5H16.5V8H20ZM20 4V7.5H16.5V4H20ZM16 4H12.5V7.5H16V4ZM16 8H12.5L12.5 11.5H16L16 8ZM16 12H12.5V15.5H16V12ZM12 12V15.5H8.5V12H12ZM12 8L12 11.5H8.5L8.5 8H12ZM12 4V7.5H8.5V4H12ZM8 4H4.5V7.5H8L8 4ZM8 8H4.5L4.5 11.5H8V8ZM8 12H4.5V15.5H8L8 12Z"
7
- fill="white"
8
- fill-opacity="0.05"
9
- />
10
- </svg>
1
+ <div class="flex gap-2 items-start">
11
2
  <div
12
- class="rounded-[3px] py-px px-1 text-white font-mono"
13
- style="border: 0.5px solid var(--white-60, rgba(255, 255, 255, 0.60));"
3
+ class="beta-tag flex flex-col gap-2 items-start overflow-hidden p-px rounded relative shrink-0"
14
4
  >
15
- Beta
5
+ <div class="border-[0.5px] border-white-60 rounded-[3px] relative shrink-0">
6
+ <div class="flex gap-2 items-start overflow-hidden px-1 py-px rounded-[inherit]">
7
+ <span class="font-medium text-sm leading-4 text-white whitespace-nowrap">Beta</span>
8
+ </div>
9
+ </div>
10
+ <div class="absolute h-5 left-0 right-0 top-0 pointer-events-none">
11
+ <svg
12
+ viewBox="0 0 37 20"
13
+ fill="none"
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ class="block max-w-none size-full"
16
+ >
17
+ <path
18
+ fill-rule="evenodd"
19
+ clip-rule="evenodd"
20
+ d="M4 4L4 7.5H0V8H4L4 11.5H0V12H4V15.5H0V16H4V20H4.5V16H8V20H8.5V16H12V20H12.5V16H16V20H16.5V16H20V20H20.5V16H24V20H24.5V16H28V20H28.5V16H32V20H32.5V16H37V15.5H32.5V12H37V11.5H32.5V8H37V7.5H32.5V4H37V3.5H32.5V0H32V3.5H28.5V0H28V3.5H24.5V0H24V3.5H20.5V0H20V3.5H16.5V0H16V3.5H12.5V0H12V3.5H8.5V0H8V3.5H4.5V0H4L4 3.5H0V4H4ZM32 4H28.5V7.5H32V4ZM32 8H28.5V11.5H32V8ZM32 12H28.5V15.5H32V12ZM28 12V15.5H24.5V12H28ZM28 8V11.5H24.5V8H28ZM28 4V7.5H24.5V4H28ZM24 4H20.5V7.5H24V4ZM24 8H20.5V11.5H24V8ZM24 12H20.5V15.5H24V12ZM20 12V15.5H16.5V12H20ZM20 8V11.5H16.5V8H20ZM20 4V7.5H16.5V4H20ZM16 4H12.5V7.5H16V4ZM16 8H12.5L12.5 11.5H16L16 8ZM16 12H12.5V15.5H16V12ZM12 12V15.5H8.5V12H12ZM12 8L12 11.5H8.5L8.5 8H12ZM12 4V7.5H8.5V4H12ZM8 4H4.5V7.5H8L8 4ZM8 8H4.5L4.5 11.5H8V8ZM8 12H4.5V15.5H8L8 12Z"
21
+ fill="white"
22
+ fill-opacity="0.05"
23
+ />
24
+ </svg>
25
+ </div>
16
26
  </div>
17
27
  </div>
18
28
 
19
29
  <style>
20
30
  .beta-tag {
21
- background: linear-gradient(180deg, #0072f5 0%, rgba(0, 77, 164, 0.4) 100%), #0072f5;
31
+ background-image:
32
+ linear-gradient(rgb(0, 114, 245) 0%, rgba(0, 77, 164, 0.4) 100%),
33
+ linear-gradient(90deg, rgb(0, 114, 245) 0%, rgb(0, 114, 245) 100%);
22
34
  }
23
35
  </style>
@@ -0,0 +1,28 @@
1
+ <script lang="ts">
2
+ import clsx from 'clsx'
3
+ import ProgressBarCircle from './ProgressBarCircle.svelte'
4
+ import type { TagProgressProps } from './types'
5
+
6
+ let { progress, variant = 'default' }: TagProgressProps = $props()
7
+
8
+ let percentage = $derived(Math.round(progress * 100))
9
+
10
+ let containerStyles = $derived(
11
+ clsx('inline-flex items-center gap-1 rounded-full overflow-hidden pl-0.5 pr-1 py-0.5', {
12
+ 'bg-background-selected-inverse': variant === 'dark',
13
+ 'bg-background-default-secondary': variant === 'default'
14
+ })
15
+ )
16
+
17
+ let textStyles = $derived(
18
+ clsx('text-sm font-medium leading-4 whitespace-nowrap', {
19
+ 'text-foreground-inverse-default': variant === 'dark',
20
+ 'text-foreground-default-default': variant === 'default'
21
+ })
22
+ )
23
+ </script>
24
+
25
+ <div class={containerStyles}>
26
+ <ProgressBarCircle {progress} size={16} {variant} />
27
+ <span class={textStyles}>{percentage}%</span>
28
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { TagProgressProps } from './types';
2
+ declare const TagProgress: import("svelte").Component<TagProgressProps, {}, "">;
3
+ type TagProgress = ReturnType<typeof TagProgress>;
4
+ export default TagProgress;
@@ -20,15 +20,15 @@
20
20
  <span
21
21
  class:pl-2={icon}
22
22
  class:pl-3={!icon}
23
- class="border rounded pr-1.5 text-sm inline-flex items-center border-workspace-accent-100 bg-workspace-accent-50"
23
+ class="border rounded pr-1.5 text-sm inline-flex items-center border-border-selected bg-background-selected"
24
24
  >
25
25
  {#if resolvedIcon}
26
- <Icon src={resolvedIcon} theme={iconTheme} class="h-4 w-4 mr-1 text-workspace-accent" />
26
+ <Icon src={resolvedIcon} theme={iconTheme} class="h-4 w-4 mr-1 text-foreground-selected" />
27
27
  {/if}
28
- <span class="py-1 pr-2 text-workspace-accent tracking-normal">{label}</span>
28
+ <span class="py-1 pr-2 text-foreground-selected tracking-normal">{label}</span>
29
29
  <button
30
30
  aria-label="Clear"
31
- class="py-1 border-l border-workspace-accent-100 pl-1 text-neutral-500"
31
+ class="cursor-pointer py-1 border-l border-border-selected pl-1 text-foreground-default-secondary"
32
32
  onclick={handleClear}
33
33
  >
34
34
  <svg