bref-ui 2.0.0 → 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 +30 -3
  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
@@ -7,9 +7,12 @@
7
7
  --surface-color: var(--color-foreground, black);
8
8
  --surface-base: var(--color-background, white);
9
9
  --surface-foreground: var(--color-foreground, black);
10
- --surface-strength: 0%;
10
+ --surface-tint: var(--surface-color);
11
+ --surface-soft-strength: 24%;
12
+ --surface-neutral-strength: 2%;
13
+ --surface-strength: var(--surface-neutral-strength);
11
14
  --surface-hover: 0%;
12
- --surface-fill: transparent;
15
+ --surface-fill: color-mix(in srgb, var(--surface-tint) var(--surface-strength), transparent);
13
16
  --surface-border: transparent;
14
17
  --surface-content: var(--surface-color);
15
18
  --surface-neutral-content: color-mix(
@@ -19,16 +22,11 @@
19
22
  );
20
23
  --surface-highlight: 0 0 0 transparent;
21
24
  --surface-shadow: 0 0 0 transparent;
22
- --surface-glow: 0 0 0 transparent;
23
- --surface-glow-size: 0;
24
- --surface-blur: none;
25
25
  box-sizing: border-box;
26
26
  border: 1px solid var(--surface-border);
27
27
  background: var(--surface-fill);
28
28
  color: var(--surface-content);
29
- box-shadow: var(--surface-highlight), var(--surface-shadow), var(--surface-glow);
30
- -webkit-backdrop-filter: var(--surface-blur);
31
- backdrop-filter: var(--surface-blur);
29
+ box-shadow: var(--surface-highlight), var(--surface-shadow);
32
30
  transition:
33
31
  background-color 150ms ease,
34
32
  border-color 150ms ease,
@@ -49,6 +47,8 @@
49
47
  }
50
48
  :global(.surface-background) {
51
49
  --surface-color: var(--color-background, white);
50
+ --surface-tint: var(--surface-foreground);
51
+ --surface-soft-strength: 5%;
52
52
  --surface-content: inherit;
53
53
  --surface-neutral-content: inherit;
54
54
  }
@@ -67,26 +67,14 @@
67
67
  :global(.surface-error) {
68
68
  --surface-color: var(--color-error, red);
69
69
  }
70
- :global(.surface-soft),
71
- :global(.surface-filled) {
72
- --surface-fill: color-mix(
73
- in srgb,
74
- var(--surface-color) var(--surface-strength),
75
- var(--surface-base)
76
- );
77
- --surface-highlight: inset 0 1px 0
78
- color-mix(in srgb, var(--surface-foreground) 16%, transparent);
79
- }
80
70
  :global(.surface-soft) {
81
- --surface-strength: 16%;
71
+ --surface-strength: var(--surface-soft-strength);
82
72
  --surface-fill: color-mix(
83
73
  in srgb,
84
- color-mix(in srgb, var(--surface-color) var(--surface-strength), var(--surface-base)) 85%,
85
- transparent
74
+ var(--surface-tint) var(--surface-strength),
75
+ var(--surface-base)
86
76
  );
87
- --surface-border: color-mix(in srgb, var(--surface-color) 30%, transparent);
88
77
  --surface-content: color-mix(in srgb, var(--surface-color) 80%, var(--surface-foreground));
89
- --surface-blur: blur(0.5rem) saturate(120%);
90
78
  }
91
79
  :global(.surface-filled) {
92
80
  --surface-strength: 100%;
@@ -95,45 +83,35 @@
95
83
  var(--surface-color) var(--surface-strength),
96
84
  var(--surface-foreground)
97
85
  );
98
- --surface-border: color-mix(in srgb, var(--surface-color) 68%, var(--surface-foreground));
99
86
  --surface-content: var(--surface-base);
100
- --surface-highlight: inset 0 1px 0
101
- color-mix(in srgb, var(--surface-foreground) 28%, transparent);
87
+ }
88
+ :global(.surface-background.surface-filled) {
89
+ --surface-fill: color-mix(
90
+ in srgb,
91
+ var(--surface-base) var(--surface-strength),
92
+ var(--surface-foreground)
93
+ );
102
94
  }
103
95
  :global(.surface-background:is(.surface-soft, .surface-filled)) {
104
96
  --surface-content: var(--surface-foreground);
105
97
  }
106
98
  :global(.surface-shadow-small) {
107
- --surface-shadow: 0 2px 6px color-mix(in srgb, var(--surface-foreground) 8%, transparent);
99
+ --surface-shadow: 0 2px 6px color-mix(in srgb, black 8%, transparent);
108
100
  }
109
101
  :global(.surface-shadow-medium) {
110
- --surface-shadow: 0 0.5rem 1.5rem color-mix(in srgb, var(--surface-foreground) 12%, transparent);
102
+ --surface-shadow: 0 0.5rem 1.5rem color-mix(in srgb, black 12%, transparent);
111
103
  }
112
104
  :global(.surface-shadow-large) {
113
- --surface-shadow: 0 1.5rem 4rem color-mix(in srgb, var(--surface-foreground) 20%, transparent);
105
+ --surface-shadow: 0 1.5rem 4rem color-mix(in srgb, black 20%, transparent);
114
106
  }
115
107
  :global(.surface-hover-small) {
116
108
  --surface-hover: 2%;
117
- --surface-glow-size: 0.5rem;
118
109
  }
119
110
  :global(.surface-hover-medium) {
120
111
  --surface-hover: 4%;
121
- --surface-glow-size: 1rem;
122
112
  }
123
113
  :global(.surface-hover-large) {
124
114
  --surface-hover: 8%;
125
- --surface-glow-size: 1.5rem;
126
- }
127
- :global(
128
- .surface:is(.surface-hover-small, .surface-hover-medium, .surface-hover-large):not(
129
- :disabled,
130
- [aria-disabled='true'],
131
- [data-surface-disabled='true']
132
- ):is(:hover, :focus-visible, [data-surface-pressed='true'])
133
- ) {
134
- --surface-glow: 0 0 var(--surface-glow-size)
135
- color-mix(in srgb, var(--surface-color) 10%, transparent);
136
- --surface-border: color-mix(in srgb, var(--surface-color) 40%, transparent);
137
115
  }
138
116
  :global(
139
117
  .surface-soft:is(.surface-hover-small, .surface-hover-medium, .surface-hover-large):not(
@@ -142,7 +120,7 @@
142
120
  [data-surface-disabled='true']
143
121
  ):is(:hover, :focus-visible, [data-surface-pressed='true'])
144
122
  ) {
145
- --surface-strength: calc(16% + var(--surface-hover));
123
+ --surface-strength: calc(var(--surface-soft-strength) + var(--surface-hover));
146
124
  }
147
125
  :global(
148
126
  .surface-filled:is(.surface-hover-small, .surface-hover-medium, .surface-hover-large):not(
@@ -160,7 +138,7 @@
160
138
  [data-surface-disabled='true']
161
139
  ):is(:hover, :focus-visible, [data-surface-pressed='true'])
162
140
  ) {
163
- --surface-fill: color-mix(in srgb, var(--surface-color) var(--surface-hover), transparent);
141
+ --surface-strength: calc(var(--surface-neutral-strength) + var(--surface-hover));
164
142
  --surface-content: var(--surface-neutral-content);
165
143
  }
166
144
  :global(
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import Colors from './colors.svelte';
3
3
  import Surfaces from './surfaces.svelte';
4
+ import Glass from './glass.svelte';
4
5
  import Fonts from './fonts.svelte';
5
6
  import Styles from './styles.svelte';
6
7
  import type { ThemeProps } from './types.js';
@@ -10,6 +11,7 @@
10
11
 
11
12
  <Colors {palette} />
12
13
  <Surfaces />
14
+ <Glass />
13
15
  <Fonts />
14
16
  <Styles />
15
17
 
@@ -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;