@streamscloud/kit 0.9.5 → 0.9.7

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.
@@ -72,6 +72,8 @@ load / error / stub state machine.
72
72
  | `--sc-kit--avatar--badge--size` | Badge mini-avatar box | 45% of the avatar diameter |
73
73
  | `--sc-kit--avatar--badge--ring-color` | Badge separation ring (override on active/hover row backgrounds to blend) | `--sc-kit--color--bg--panel` |
74
74
  | `--sc-kit--avatar--badge--ring-width` | Badge separation ring thickness | `1.5px` |
75
+ | `--sc-kit--avatar--badge--initials--background` | Badge initials chip background (contrast element of org-with-user) | `--sc-kit--color--accent` |
76
+ | `--sc-kit--avatar--badge--initials--color` | Badge initials chip text color | `--sc-kit--color--text--on-accent` |
75
77
  -->
76
78
 
77
79
  <style>.avatar {
@@ -86,6 +88,8 @@ load / error / stub state machine.
86
88
  --_avatar--badge-size: var(--sc-kit--avatar--badge--size, calc(var(--_avatar--size) * 0.45));
87
89
  --_avatar--badge-ring-color: var(--sc-kit--avatar--badge--ring-color, var(--sc-kit--color--bg--panel));
88
90
  --_avatar--badge-ring-width: var(--sc-kit--avatar--badge--ring-width, 1.5px);
91
+ --_avatar--badge-initials-background: var(--sc-kit--avatar--badge--initials--background, var(--sc-kit--color--accent));
92
+ --_avatar--badge-initials-color: var(--sc-kit--avatar--badge--initials--color, var(--sc-kit--color--text--on-accent));
89
93
  --_avatar--border-radius: var(--sc-kit--avatar--border-radius, 50%);
90
94
  --sc-kit--image--border-radius: var(--_avatar--border-radius);
91
95
  --sc-kit--image--background: var(--_avatar--background);
@@ -133,6 +137,8 @@ load / error / stub state machine.
133
137
  .avatar__initials--badge {
134
138
  border-radius: var(--sc-kit--radius--sm);
135
139
  font-size: calc(var(--_avatar--badge-size) * 0.5);
140
+ background: var(--_avatar--badge-initials-background);
141
+ color: var(--_avatar--badge-initials-color);
136
142
  }
137
143
  .avatar__badge {
138
144
  position: absolute;
@@ -35,6 +35,8 @@ type Props = {
35
35
  * | `--sc-kit--avatar--badge--size` | Badge mini-avatar box | 45% of the avatar diameter |
36
36
  * | `--sc-kit--avatar--badge--ring-color` | Badge separation ring (override on active/hover row backgrounds to blend) | `--sc-kit--color--bg--panel` |
37
37
  * | `--sc-kit--avatar--badge--ring-width` | Badge separation ring thickness | `1.5px` |
38
+ * | `--sc-kit--avatar--badge--initials--background` | Badge initials chip background (contrast element of org-with-user) | `--sc-kit--color--accent` |
39
+ * | `--sc-kit--avatar--badge--initials--color` | Badge initials chip text color | `--sc-kit--color--text--on-accent` |
38
40
  */
39
41
  declare const Cmp: import("svelte").Component<Props, {}, "">;
40
42
  type Cmp = ReturnType<typeof Cmp>;
@@ -37,8 +37,11 @@ whole card becomes a clickable target with hover and focus state, no `interactiv
37
37
  | `--sc-kit--card--color` | Body text color | `var(--sc-kit--color--text--primary)` |
38
38
  | `--sc-kit--card--header--background` | Header bar background | `transparent` |
39
39
  | `--sc-kit--card--header--border-color` | Header bottom divider | `var(--sc-kit--color--border)` |
40
+ | `--sc-kit--card--header--padding` | Header padding (full shorthand) | block `var(--sc-kit--space--3)`, inline follows the `padding` preset |
41
+ | `--sc-kit--card--body--padding` | Body padding (full shorthand) | the `padding` preset value |
40
42
  | `--sc-kit--card--footer--background` | Footer bar background | `var(--sc-kit--color--bg--element)` |
41
43
  | `--sc-kit--card--footer--border-color` | Footer top divider | `var(--sc-kit--color--border)` |
44
+ | `--sc-kit--card--footer--padding` | Footer padding (full shorthand) | block `var(--sc-kit--space--3)`, inline follows the `padding` preset |
42
45
  -->
43
46
 
44
47
  <style>.card {
@@ -53,6 +56,9 @@ whole card becomes a clickable target with hover and focus state, no `interactiv
53
56
  --_card--header-border-color: var(--sc-kit--card--header--border-color, var(--sc-kit--color--border));
54
57
  --_card--footer-background: var(--sc-kit--card--footer--background, var(--sc-kit--color--bg--element));
55
58
  --_card--footer-border-color: var(--sc-kit--card--footer--border-color, var(--sc-kit--color--border));
59
+ --_card--header-padding: var(--sc-kit--card--header--padding, var(--sc-kit--space--3) var(--_card--chrome-padding-inline));
60
+ --_card--body-padding: var(--sc-kit--card--body--padding, var(--_card--body-padding-default));
61
+ --_card--footer-padding: var(--sc-kit--card--footer--padding, var(--sc-kit--space--3) var(--_card--chrome-padding-inline));
56
62
  display: block;
57
63
  width: 100%;
58
64
  box-sizing: border-box;
@@ -66,25 +72,32 @@ whole card becomes a clickable target with hover and focus state, no `interactiv
66
72
  .card--raised {
67
73
  box-shadow: var(--_card--shadow);
68
74
  }
69
- .card--pad-none .card__body {
70
- padding: 0;
75
+ .card--pad-none {
76
+ --_card--body-padding-default: 0;
77
+ --_card--chrome-padding-inline: var(--sc-kit--space--5);
71
78
  }
72
- .card--pad-sm .card__body {
73
- padding: var(--sc-kit--space--3);
79
+ .card--pad-sm {
80
+ --_card--body-padding-default: var(--sc-kit--space--3);
81
+ --_card--chrome-padding-inline: var(--sc-kit--space--3);
74
82
  }
75
- .card--pad-md .card__body {
76
- padding: var(--sc-kit--space--5);
83
+ .card--pad-md {
84
+ --_card--body-padding-default: var(--sc-kit--space--5);
85
+ --_card--chrome-padding-inline: var(--sc-kit--space--5);
77
86
  }
78
- .card--pad-lg .card__body {
79
- padding: var(--sc-kit--space--6);
87
+ .card--pad-lg {
88
+ --_card--body-padding-default: var(--sc-kit--space--6);
89
+ --_card--chrome-padding-inline: var(--sc-kit--space--6);
90
+ }
91
+ .card__body {
92
+ padding: var(--_card--body-padding);
80
93
  }
81
94
  .card__header {
82
- padding: var(--sc-kit--space--3) var(--sc-kit--space--5);
95
+ padding: var(--_card--header-padding);
83
96
  background: var(--_card--header-background);
84
97
  border-bottom: 1px solid var(--_card--header-border-color);
85
98
  }
86
99
  .card__footer {
87
- padding: var(--sc-kit--space--3) var(--sc-kit--space--5);
100
+ padding: var(--_card--footer-padding);
88
101
  background: var(--_card--footer-background);
89
102
  border-top: 1px solid var(--_card--footer-border-color);
90
103
  }
@@ -4,7 +4,7 @@ type CardPadding = 'none' | 'sm' | 'md' | 'lg';
4
4
  type Props = {
5
5
  /** Visual elevation. @default 'flat' */
6
6
  elevation?: CardElevation;
7
- /** Inner body padding preset. Header and footer have their own fixed chrome. @default 'md' */
7
+ /** Inner body padding preset. Header/footer inline padding follows it; their block padding stays fixed. @default 'md' */
8
8
  padding?: CardPadding;
9
9
  header?: Snippet;
10
10
  footer?: Snippet;
@@ -34,8 +34,11 @@ type Props = {
34
34
  * | `--sc-kit--card--color` | Body text color | `var(--sc-kit--color--text--primary)` |
35
35
  * | `--sc-kit--card--header--background` | Header bar background | `transparent` |
36
36
  * | `--sc-kit--card--header--border-color` | Header bottom divider | `var(--sc-kit--color--border)` |
37
+ * | `--sc-kit--card--header--padding` | Header padding (full shorthand) | block `var(--sc-kit--space--3)`, inline follows the `padding` preset |
38
+ * | `--sc-kit--card--body--padding` | Body padding (full shorthand) | the `padding` preset value |
37
39
  * | `--sc-kit--card--footer--background` | Footer bar background | `var(--sc-kit--color--bg--element)` |
38
40
  * | `--sc-kit--card--footer--border-color` | Footer top divider | `var(--sc-kit--color--border)` |
41
+ * | `--sc-kit--card--footer--padding` | Footer padding (full shorthand) | block `var(--sc-kit--space--3)`, inline follows the `padding` preset |
39
42
  */
40
43
  declare const Cmp: import("svelte").Component<Props, {}, "">;
41
44
  type Cmp = ReturnType<typeof Cmp>;
@@ -156,7 +156,8 @@ $effect(() => {
156
156
  {/if}
157
157
 
158
158
  {#if open}
159
- <div bind:this={panelEl} class="date-picker__panel">
159
+ <!-- preventDefault cancels FormField's <label> activation — a dead-space click inside the panel would forward to the trigger and close the calendar. -->
160
+ <div bind:this={panelEl} class="date-picker__panel" role="presentation" onclick={(e) => e.preventDefault()} onkeydown={() => undefined}>
160
161
  <DatePickerCalendar
161
162
  selectedDate={selectedDate}
162
163
  minDate={minDate}
@@ -74,6 +74,7 @@ const showClear = $derived(mode.clearable && hasValue && isInteractive && !core.
74
74
  class:singleselect--inert={inert}
75
75
  class:singleselect--borderless={borderless}
76
76
  onclick={core.handleClick}
77
+ onmousedown={core.handleMousedown}
77
78
  onkeydown={() => undefined}
78
79
  role="presentation">
79
80
  {#if icon}
@@ -185,6 +185,7 @@ const handleDndFinalize = (e) => {
185
185
  class:multiselect-trigger--inert={inert}
186
186
  class:multiselect-trigger--borderless={borderless}
187
187
  onclick={core.handleClick}
188
+ onmousedown={core.handleMousedown}
188
189
  onkeydown={() => undefined}
189
190
  role="presentation">
190
191
  {#if icon}
@@ -73,6 +73,7 @@ export type SelectCore<T> = {
73
73
  readonly interactionLocked: boolean;
74
74
  handleFocus: () => void;
75
75
  handleClick: (e: MouseEvent) => void;
76
+ handleMousedown: (e: MouseEvent) => void;
76
77
  handleInput: (e: Event) => void;
77
78
  handleKeydown: (e: KeyboardEvent) => void;
78
79
  openPopover: () => void;
@@ -250,6 +250,8 @@ export function createSelectCore(config) {
250
250
  };
251
251
  const handleFocus = () => undefined;
252
252
  const handleClick = (e) => {
253
+ // Cancels FormField's <label> activation — else its synthetic click re-toggles the popover on every pick.
254
+ e.preventDefault();
253
255
  if (!config.getInteractive() || isFiltering) {
254
256
  return;
255
257
  }
@@ -268,6 +270,12 @@ export function createSelectCore(config) {
268
270
  openPopover();
269
271
  }
270
272
  };
273
+ const handleMousedown = (e) => {
274
+ // Keeps the inner input focused — default mousedown on the chevron/padding blurs it (focus-ring flicker).
275
+ if (e.target !== config.getInputEl()) {
276
+ e.preventDefault();
277
+ }
278
+ };
271
279
  const handleInput = (e) => {
272
280
  if (!config.getInteractive()) {
273
281
  return;
@@ -357,6 +365,7 @@ export function createSelectCore(config) {
357
365
  },
358
366
  handleFocus,
359
367
  handleClick,
368
+ handleMousedown,
360
369
  handleInput,
361
370
  handleKeydown,
362
371
  openPopover,
@@ -116,7 +116,11 @@ $effect(() => {
116
116
  role="listbox"
117
117
  id={listboxId}
118
118
  tabindex="-1"
119
- onclick={(e) => e.stopPropagation()}
119
+ onclick={(e) => {
120
+ // preventDefault cancels FormField's <label> activation — stopPropagation alone doesn't.
121
+ e.preventDefault();
122
+ e.stopPropagation();
123
+ }}
120
124
  onmousedown={(e) => e.stopPropagation()}
121
125
  onkeydown={() => undefined}>
122
126
  {#if headerSnippet}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamscloud/kit",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "author": "StreamsCloud",
5
5
  "repository": {
6
6
  "type": "git",