bref-ui 2.0.1 → 2.1.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 (109) hide show
  1. package/dist/button/button.svelte +67 -47
  2. package/dist/button/types.d.ts +1 -0
  3. package/dist/checkbox/checkbox.svelte +40 -35
  4. package/dist/combobox/combobox.svelte +2 -3
  5. package/dist/combobox/input.svelte +1 -1
  6. package/dist/combobox/list.svelte +5 -5
  7. package/dist/combobox/option.svelte +29 -9
  8. package/dist/dialog/dialog.svelte +15 -12
  9. package/dist/dialog/footer.svelte +2 -2
  10. package/dist/dialog/header.svelte +4 -4
  11. package/dist/icon/icon.svelte +6 -4
  12. package/dist/pill/content.svelte +11 -4
  13. package/dist/pill/content.svelte.d.ts +1 -1
  14. package/dist/pill/on-delete.svelte +42 -13
  15. package/dist/pill/pill.svelte +74 -94
  16. package/dist/pill/registry.json +1 -1
  17. package/dist/pill/types.d.ts +1 -0
  18. package/dist/pill-choice-group/pill-choice-group.svelte +19 -0
  19. package/dist/pill-choice-group/types.d.ts +1 -0
  20. package/dist/pill-group/pill-group.svelte +2 -0
  21. package/dist/pill-group/types.d.ts +1 -0
  22. package/dist/popover/popover.svelte +31 -6
  23. package/dist/popover/types.d.ts +1 -1
  24. package/dist/progress/progress.svelte +42 -55
  25. package/dist/select/empty.svelte +2 -3
  26. package/dist/select/list.svelte +2 -1
  27. package/dist/select/option.svelte +20 -6
  28. package/dist/select/select.svelte +7 -4
  29. package/dist/select/trigger.svelte +30 -7
  30. package/dist/spinner/spinner.svelte +8 -21
  31. package/dist/surface/surface.svelte +6 -1
  32. package/dist/surface/types.d.ts +2 -0
  33. package/dist/switch/switch.svelte +48 -51
  34. package/dist/text-area/registry.json +1 -1
  35. package/dist/text-area/text-area.svelte +33 -73
  36. package/dist/text-area/types.d.ts +1 -0
  37. package/dist/text-input/registry.json +1 -1
  38. package/dist/text-input/text-input.svelte +33 -73
  39. package/dist/text-input/types.d.ts +1 -0
  40. package/dist/theme/cli-theme.svelte +2 -0
  41. package/dist/theme/glass.svelte +60 -0
  42. package/dist/theme/glass.svelte.d.ts +26 -0
  43. package/dist/theme/registry.json +1 -0
  44. package/dist/theme/styles.svelte +6 -0
  45. package/dist/theme/surface.d.ts +1 -1
  46. package/dist/theme/surface.js +3 -2
  47. package/dist/theme/surfaces.svelte +23 -45
  48. package/dist/theme/theme.svelte +2 -0
  49. package/dist/tree-view/tree-node/chevron-button.svelte +9 -9
  50. package/dist/tree-view/tree-node/content.svelte +15 -12
  51. package/dist/tree-view/tree-node/delete-button.svelte +6 -5
  52. package/dist/tree-view/tree-node/tree-node.svelte +23 -24
  53. package/dist/tree-view/tree-view-section.svelte +9 -9
  54. package/dist/tree-view/tree-view.svelte +17 -9
  55. package/dist/tree-view/types.d.ts +2 -1
  56. package/package.json +1 -1
  57. package/readme.md +3 -1
  58. package/src/lib/button/button.svelte +67 -47
  59. package/src/lib/button/types.ts +1 -0
  60. package/src/lib/checkbox/checkbox.svelte +40 -35
  61. package/src/lib/combobox/combobox.svelte +2 -3
  62. package/src/lib/combobox/input.svelte +1 -1
  63. package/src/lib/combobox/list.svelte +5 -5
  64. package/src/lib/combobox/option.svelte +29 -9
  65. package/src/lib/dialog/dialog.svelte +15 -12
  66. package/src/lib/dialog/footer.svelte +2 -2
  67. package/src/lib/dialog/header.svelte +4 -4
  68. package/src/lib/icon/icon.svelte +6 -4
  69. package/src/lib/pill/content.svelte +11 -4
  70. package/src/lib/pill/on-delete.svelte +42 -13
  71. package/src/lib/pill/pill.svelte +74 -94
  72. package/src/lib/pill/registry.json +1 -1
  73. package/src/lib/pill/types.ts +1 -0
  74. package/src/lib/pill-choice-group/pill-choice-group.svelte +19 -0
  75. package/src/lib/pill-choice-group/types.ts +1 -0
  76. package/src/lib/pill-group/pill-group.svelte +2 -0
  77. package/src/lib/pill-group/types.ts +1 -0
  78. package/src/lib/popover/popover.svelte +31 -6
  79. package/src/lib/popover/types.ts +16 -1
  80. package/src/lib/progress/progress.svelte +42 -55
  81. package/src/lib/select/empty.svelte +2 -3
  82. package/src/lib/select/list.svelte +2 -1
  83. package/src/lib/select/option.svelte +20 -6
  84. package/src/lib/select/select.svelte +7 -4
  85. package/src/lib/select/trigger.svelte +30 -7
  86. package/src/lib/spinner/spinner.svelte +8 -21
  87. package/src/lib/surface/surface.svelte +6 -1
  88. package/src/lib/surface/types.ts +2 -0
  89. package/src/lib/switch/switch.svelte +48 -51
  90. package/src/lib/text-area/registry.json +1 -1
  91. package/src/lib/text-area/text-area.svelte +33 -73
  92. package/src/lib/text-area/types.ts +1 -0
  93. package/src/lib/text-input/registry.json +1 -1
  94. package/src/lib/text-input/text-input.svelte +33 -73
  95. package/src/lib/text-input/types.ts +1 -0
  96. package/src/lib/theme/cli-theme.svelte +2 -0
  97. package/src/lib/theme/glass.svelte +60 -0
  98. package/src/lib/theme/registry.json +1 -0
  99. package/src/lib/theme/styles.svelte +6 -0
  100. package/src/lib/theme/surface.ts +4 -2
  101. package/src/lib/theme/surfaces.svelte +23 -45
  102. package/src/lib/theme/theme.svelte +2 -0
  103. package/src/lib/tree-view/tree-node/chevron-button.svelte +9 -9
  104. package/src/lib/tree-view/tree-node/content.svelte +15 -12
  105. package/src/lib/tree-view/tree-node/delete-button.svelte +6 -5
  106. package/src/lib/tree-view/tree-node/tree-node.svelte +23 -24
  107. package/src/lib/tree-view/tree-view-section.svelte +9 -9
  108. package/src/lib/tree-view/tree-view.svelte +17 -9
  109. package/src/lib/tree-view/types.ts +2 -1
@@ -10,9 +10,6 @@
10
10
  </button>
11
11
 
12
12
  <style>
13
- * {
14
- transition: all 150ms;
15
- }
16
13
  button {
17
14
  position: relative;
18
15
  z-index: 1;
@@ -21,30 +18,33 @@
21
18
  justify-content: center;
22
19
  min-width: var(--tree-action-size);
23
20
  min-height: var(--tree-action-size);
24
- padding: 0.25rem 0.5rem;
21
+ padding: 0;
25
22
  border: 0;
26
- border-radius: 999px;
23
+ border-radius: 50%;
27
24
  background: transparent;
28
- color: inherit;
25
+ color: var(--tree-action-color, inherit);
29
26
  font: inherit;
30
27
  cursor: pointer;
28
+ transition: background-color 150ms ease;
31
29
  }
32
30
  span {
33
31
  display: inline-flex;
34
- font-size: 1.25em;
32
+ font-size: 1.125em;
33
+ transition: transform 150ms ease;
35
34
  }
36
35
  button[aria-expanded='true'] span {
37
36
  transform: rotate(90deg);
38
37
  }
39
38
  button:not(:disabled):hover {
40
- background: color-mix(in srgb, var(--color-primary) 12%, transparent);
39
+ background: color-mix(in srgb, currentColor 8%, transparent);
41
40
  }
42
41
  button:focus-visible {
43
42
  outline: 2px solid var(--color-primary);
44
43
  outline-offset: -2px;
45
44
  }
46
45
  @media (prefers-reduced-motion: reduce) {
47
- * {
46
+ button,
47
+ span {
48
48
  transition: none;
49
49
  }
50
50
  }
@@ -6,25 +6,29 @@
6
6
  </script>
7
7
 
8
8
  <button {...attributes} type="button" disabled={item.disabled}>
9
- {#if item.icon}<Icon {...item.icon} label={undefined} />{/if}
9
+ {#if item.icon}
10
+ <Icon
11
+ {...item.icon}
12
+ color={attributes['aria-pressed'] === true && !item.disabled ? 'primary' : undefined}
13
+ label={undefined}
14
+ />
15
+ {/if}
10
16
  <span>{item.label}</span>
11
17
  </button>
12
18
 
13
19
  <style>
14
- * {
15
- transition: all 150ms;
16
- }
17
20
  button {
18
- display: inline-flex;
21
+ display: grid;
22
+ grid-template-columns: 1em minmax(0, 1fr);
19
23
  align-items: center;
20
24
  justify-content: start;
21
25
  flex: 1;
22
26
  gap: 0.5rem;
23
27
  min-width: 0;
24
28
  min-height: var(--tree-action-size);
25
- padding: 0.25rem 0.5rem;
29
+ padding: 0.125rem 0.375rem;
26
30
  border: 0;
27
- border-radius: 999px;
31
+ border-radius: 0.375rem;
28
32
  outline: none;
29
33
  background: transparent;
30
34
  color: inherit;
@@ -32,6 +36,10 @@
32
36
  text-align: start;
33
37
  cursor: pointer;
34
38
  }
39
+ span {
40
+ grid-column: 2;
41
+ min-width: 0;
42
+ }
35
43
  button::before {
36
44
  position: absolute;
37
45
  inset: 0;
@@ -46,11 +54,6 @@
46
54
  color: var(--color-muted);
47
55
  cursor: default;
48
56
  }
49
- @media (prefers-reduced-motion: reduce) {
50
- * {
51
- transition: none;
52
- }
53
- }
54
57
  @media (forced-colors: active) {
55
58
  button:disabled {
56
59
  color: GrayText;
@@ -16,17 +16,18 @@
16
16
  justify-content: center;
17
17
  min-width: var(--tree-action-size);
18
18
  min-height: var(--tree-action-size);
19
- padding: 0.25rem 0.5rem;
19
+ padding: 0;
20
20
  border: 0;
21
- border-radius: 999px;
21
+ border-radius: 50%;
22
22
  background: transparent;
23
- color: inherit;
23
+ color: var(--tree-action-color, inherit);
24
24
  font: inherit;
25
+ font-size: 1.125em;
25
26
  cursor: pointer;
26
- transition: all 150ms;
27
+ transition: background-color 150ms ease;
27
28
  }
28
29
  button:not(:disabled):hover {
29
- background: color-mix(in srgb, var(--color-primary) 12%, transparent);
30
+ background: color-mix(in srgb, currentColor 8%, transparent);
30
31
  }
31
32
  button:focus-visible {
32
33
  outline: 2px solid var(--color-primary);
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { prefersReducedMotion } from 'svelte/motion';
3
3
  import { fly } from 'svelte/transition';
4
+ import { surface } from '../../theme/surface.js';
4
5
  import ChevronButton from './chevron-button.svelte';
5
6
  import DeleteButton from './delete-button.svelte';
6
7
  import Content from './content.svelte';
@@ -11,6 +12,7 @@
11
12
  item,
12
13
  selection = $bindable(),
13
14
  defaultExpanded = false,
15
+ glass = false,
14
16
  onDelete,
15
17
  indent = 0
16
18
  }: TreeNodeProps = $props();
@@ -32,10 +34,12 @@
32
34
  </script>
33
35
 
34
36
  <div
35
- in:fly|global={{ y: -4, duration: prefersReducedMotion.current ? 0 : 150 }}
37
+ class={selected ? surface({ variant: 'soft', color: 'primary', glass }) : undefined}
38
+ in:fly|global={{ x: -8, duration: prefersReducedMotion.current ? 0 : 200 }}
39
+ out:fly|global={{ x: -8, duration: prefersReducedMotion.current ? 0 : 150 }}
36
40
  data-selected={selected}
37
41
  data-disabled={item.disabled}
38
- style:padding-left={`calc(0.25rem + ${indent * 1.25}rem)`}
42
+ style:padding-left={`calc(0.25rem + ${indent} * var(--tree-action-size))`}
39
43
  >
40
44
  {#if item.children?.length}
41
45
  <ChevronButton
@@ -56,18 +60,20 @@
56
60
  />
57
61
  {/if}
58
62
  </div>
59
- {#if item.children?.length}
60
- <div role="group" id={childrenId} hidden={!expanded}>
61
- {#each item.children as child (child.id)}
62
- <RecursiveNode indent={indent + 1} item={child} bind:selection {defaultExpanded} {onDelete} />
63
- {/each}
64
- </div>
63
+ {#if item.children?.length && expanded}
64
+ {#each item.children as child (child.id)}
65
+ <RecursiveNode
66
+ indent={indent + 1}
67
+ item={child}
68
+ bind:selection
69
+ {defaultExpanded}
70
+ {onDelete}
71
+ {glass}
72
+ />
73
+ {/each}
65
74
  {/if}
66
75
 
67
76
  <style>
68
- * {
69
- transition: all 150ms;
70
- }
71
77
  div[data-selected] {
72
78
  box-sizing: border-box;
73
79
  position: relative;
@@ -79,33 +85,26 @@
79
85
  border: 1px solid transparent;
80
86
  border-radius: 999px;
81
87
  overflow-wrap: anywhere;
88
+ transition: all 150ms ease;
82
89
  }
83
90
  [data-spacer] {
84
91
  flex: 0 0 var(--tree-action-size);
85
92
  }
86
- div[role='group'] {
87
- display: contents;
88
- }
89
- div[hidden] {
90
- display: none;
91
- }
92
93
  div[data-selected='true'] {
93
- border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
94
- background: color-mix(in srgb, var(--color-primary) 16%, transparent);
95
- color: var(--color-primary);
94
+ --tree-action-color: var(--color-primary);
96
95
  }
97
96
  div[data-selected='false']:not([data-disabled='true']):hover {
98
- background: color-mix(in srgb, var(--color-primary) 12%, transparent);
97
+ background: color-mix(in srgb, var(--color-foreground) 5%, transparent);
99
98
  }
100
99
  @media (prefers-reduced-motion: reduce) {
101
- * {
100
+ div[data-selected] {
102
101
  transition: none;
103
102
  }
104
103
  }
105
104
  @media (forced-colors: active) {
106
105
  div[data-selected='true'] {
107
- border-color: Highlight;
108
- color: Highlight;
106
+ outline: 1px solid Highlight;
107
+ outline-offset: -1px;
109
108
  }
110
109
  }
111
110
  </style>
@@ -18,13 +18,10 @@
18
18
  display: flex;
19
19
  flex-direction: column;
20
20
  align-items: flex-start;
21
- gap: 0.25rem;
22
- padding: 0.75rem 0.5rem 0.25rem;
21
+ gap: 0.375rem;
22
+ padding: 1rem 0.75rem 0.75rem;
23
23
  color: var(--color-muted);
24
- font-size: 0.8em;
25
- font-weight: 600;
26
- letter-spacing: 0.06em;
27
- text-transform: uppercase;
24
+ line-height: 1.4;
28
25
  overflow-wrap: anywhere;
29
26
  }
30
27
  div {
@@ -32,11 +29,14 @@
32
29
  align-items: center;
33
30
  gap: 0.5rem;
34
31
  min-width: 0;
32
+ color: var(--color-foreground);
33
+ font-size: 0.875em;
34
+ font-weight: 500;
35
+ letter-spacing: 0.06em;
36
+ text-transform: uppercase;
35
37
  }
36
38
  p {
37
39
  margin: 0;
38
- font-weight: 400;
39
- letter-spacing: normal;
40
- text-transform: none;
40
+ font-size: 0.75em;
41
41
  }
42
42
  </style>
@@ -8,6 +8,7 @@
8
8
  sections = [],
9
9
  label = 'Tree view',
10
10
  size = 'medium',
11
+ glass = false,
11
12
  selection = $bindable(),
12
13
  defaultExpanded = false,
13
14
  onDelete,
@@ -21,7 +22,7 @@
21
22
  {#if node}
22
23
  {@render node(item)}
23
24
  {:else}
24
- <TreeNode {item} bind:selection {defaultExpanded} {onDelete} />
25
+ <TreeNode {item} bind:selection {defaultExpanded} {onDelete} {glass} />
25
26
  {/if}
26
27
  {/each}
27
28
  </div>
@@ -38,28 +39,35 @@
38
39
  </div>
39
40
 
40
41
  <style>
41
- div {
42
- --tree-height: 2.75rem;
43
- --tree-action-size: 2.25rem;
42
+ div[role='group'] {
43
+ --tree-height: 2rem;
44
+ --tree-action-size: 1.5rem;
44
45
  display: grid;
45
46
  gap: 0.375rem;
46
47
  min-width: 0;
47
48
  color: var(--color-foreground);
48
49
  font: inherit;
50
+ line-height: 1.25;
49
51
  }
50
52
  div[data-size='small'] {
51
- --tree-height: 2.5rem;
52
- --tree-action-size: 2rem;
53
+ --tree-height: 1.75rem;
53
54
  font-size: 0.875rem;
54
55
  }
55
56
  div[data-size='large'] {
56
- --tree-height: 3.25rem;
57
- --tree-action-size: 2.5rem;
57
+ --tree-height: 2.5rem;
58
+ --tree-action-size: 2rem;
58
59
  font-size: 1.125rem;
59
60
  }
60
61
  div[data-nodes] {
61
62
  display: flex;
62
63
  flex-direction: column;
63
- gap: 0.25rem;
64
+ gap: 0.125rem;
65
+ min-width: 0;
66
+ }
67
+ @media (pointer: coarse) {
68
+ div[role='group'] {
69
+ --tree-height: 2.75rem;
70
+ --tree-action-size: 2.75rem;
71
+ }
64
72
  }
65
73
  </style>
@@ -20,6 +20,7 @@ export interface TreeViewProps {
20
20
  sections?: TreeSectionProps[];
21
21
  label?: string;
22
22
  size?: BaseSize;
23
+ glass?: boolean;
23
24
  selection?: string | string[];
24
25
  defaultExpanded?: boolean;
25
26
  onDelete?: (id: string) => void;
@@ -28,7 +29,7 @@ export interface TreeViewProps {
28
29
 
29
30
  export interface TreeNodeProps extends Pick<
30
31
  TreeViewProps,
31
- 'selection' | 'defaultExpanded' | 'onDelete'
32
+ 'selection' | 'defaultExpanded' | 'onDelete' | 'glass'
32
33
  > {
33
34
  item: TreeItemProps;
34
35
  indent?: number;