contain-css-svelte 1.1.4 → 1.1.6

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 (41) hide show
  1. package/dist/controls/ButtonLink.svelte +5 -1
  2. package/dist/controls/Input.svelte.d.ts +1 -1
  3. package/dist/controls/Option.svelte +3 -3
  4. package/dist/controls/Select.svelte +4 -3
  5. package/dist/controls/Slider.svelte +5 -1
  6. package/dist/cssprops.js +3 -0
  7. package/dist/dropdowns/DropdownMenu.svelte +40 -31
  8. package/dist/layout/Bar.svelte +4 -2
  9. package/dist/layout/Container.svelte.d.ts +6 -4
  10. package/dist/layout/DataListItem.svelte +1 -1
  11. package/dist/layout/FormProvider.svelte +3 -1
  12. package/dist/layout/GridLayout.svelte +1 -1
  13. package/dist/layout/Inline.svelte +5 -1
  14. package/dist/layout/Page.svelte +29 -1
  15. package/dist/layout/ResponsiveText.svelte +1 -1
  16. package/dist/layout/ResponsiveText.svelte.d.ts +2 -0
  17. package/dist/layout/Sidebar.svelte +22 -7
  18. package/dist/layout/SplitPane.svelte +3 -3
  19. package/dist/layout/Stack.svelte +5 -1
  20. package/dist/layout/TabBar.svelte +2 -3
  21. package/dist/layout/Table.svelte +21 -11
  22. package/dist/layout/Tile.svelte +1 -0
  23. package/dist/overlays/Dialog.svelte +2 -2
  24. package/dist/overlays/Dialog.svelte.d.ts +2 -2
  25. package/dist/overlays/Tooltip.svelte +65 -27
  26. package/dist/overlays/Tooltip.svelte.d.ts +1 -0
  27. package/dist/review/loadReviewAppPage.d.ts +1 -1
  28. package/dist/review/scenarios/IncredibleAppShell.svelte +44 -37
  29. package/dist/review/scenarios/LaunchStudio.svelte +108 -83
  30. package/dist/review/scenarios/LayoutWorkbench.svelte +49 -34
  31. package/dist/review/scenarios/TableWorkbench.svelte +82 -74
  32. package/dist/review/scenarios/VisualSystemBoard.svelte +387 -0
  33. package/dist/review/scenarios/VisualSystemBoard.svelte.d.ts +3 -0
  34. package/dist/review/scenarios.d.ts +8 -4
  35. package/dist/review/scenarios.js +9 -4
  36. package/dist/types.d.ts +3 -0
  37. package/dist/vars/colors.css +1 -1
  38. package/dist/vars/defaults.css +8 -1
  39. package/dist/vars/layout.css +7 -0
  40. package/dist/vars/themes/bootstrap.css +1 -0
  41. package/package.json +1 -1
@@ -1,6 +1,10 @@
1
1
  <script lang="ts">import { injectVars } from "../util";
2
2
  let { primary = false, secondary = false, warning = false, danger = false, success = false, info = false, href = "#", id = null, icon, children, ...restProps } = $props();
3
- const { style: inlineStyle, ...elementProps } = restProps;
3
+ const inlineStyle = $derived(restProps.style);
4
+ const elementProps = $derived.by(() => {
5
+ const { style: _, ...rest } = restProps;
6
+ return rest;
7
+ });
4
8
  const style = $derived(`${injectVars(elementProps, "button", [
5
9
  "bg",
6
10
  "fg",
@@ -1,6 +1,6 @@
1
1
  import type { HTMLInputAttributes } from "svelte/elements";
2
2
  type Props = {
3
- value?: string;
3
+ value?: string | number;
4
4
  placeholder?: string;
5
5
  } & HTMLInputAttributes;
6
6
  declare const Input: import("svelte").Component<Props, {}, "value">;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">let { children, value, ...restProps } = $props();
2
- let template = $state(null);
2
+ let template = $state();
3
3
  // Extract text content from rendered children
4
- let textContent = $derived(template ? template.textContent : "");
4
+ let textContent = $derived(template ? template.textContent ?? "" : "");
5
5
  let htmlContent = $derived(template ? template.innerHTML : "");
6
6
  export {};
7
7
  </script>
@@ -10,6 +10,6 @@ export {};
10
10
  {@html textContent}
11
11
  </option>
12
12
 
13
- <div bind:this={template} style="display: none;" class="option-template hidden">
13
+ <div bind:this={template} style="display: none;" class="option-template hidden" aria-hidden="true">
14
14
  {@render children?.()}
15
15
  </div>
@@ -6,9 +6,8 @@ let observer;
6
6
  let resizeObserver;
7
7
  let targetWidth = $state("");
8
8
  let optionButtons = $state([]);
9
- onMount(async () => {
10
- await tick(); // Ensure slot content is rendered
11
- updateOptions();
9
+ onMount(() => {
10
+ tick().then(() => updateOptions());
12
11
  // Observe changes in the select element
13
12
  observer = new MutationObserver((mutations) => {
14
13
  mutations.forEach((mutation) => {
@@ -56,6 +55,8 @@ function updateTargetWidth() {
56
55
  targetWidth = maxWidth ? maxWidth + "px" : "100%"; // || 150; // Fallback width if measurement fails
57
56
  }
58
57
  function setValue(idx) {
58
+ if (!selectElement)
59
+ return;
59
60
  selectElement.selectedIndex = idx;
60
61
  selectElement.dispatchEvent(new Event("change", { bubbles: true }));
61
62
  activeOption = options[idx];
@@ -1,6 +1,10 @@
1
1
  <script lang="ts">import { injectVars } from "../util";
2
2
  let { value = $bindable(0), min = 0, max = 100, step = 1, ...restProps } = $props();
3
- const { style: inlineStyle, ...elementProps } = restProps;
3
+ const inlineStyle = $derived(restProps.style);
4
+ const elementProps = $derived.by(() => {
5
+ const { style: _, ...rest } = restProps;
6
+ return rest;
7
+ });
4
8
  const normalizedMin = $derived(Number.isFinite(min) ? min : 0);
5
9
  const normalizedMax = $derived(Number.isFinite(max) && max > normalizedMin ? max : normalizedMin + 1);
6
10
  const clampedValue = $derived(Math.min(Math.max(Number(value) || 0, normalizedMin), normalizedMax));
package/dist/cssprops.js CHANGED
@@ -41,8 +41,10 @@ const miscComponentProps = [
41
41
  "--split-pane-right-width",
42
42
  "--split-pane-left-width",
43
43
  "--sidebar-collapse",
44
+ "--sidebar-compact-side-padding",
44
45
  "--sidebar-expand",
45
46
  "--sidebar-transition",
47
+ "--sidebar-mobile-icon-filter",
46
48
  "--resizer-grab-width",
47
49
  "--resizer-grab-height",
48
50
  "--resizer-color",
@@ -124,6 +126,7 @@ const components = [
124
126
  ...[
125
127
  "button",
126
128
  "mini-button",
129
+ "menu-trigger",
127
130
  "menu-item",
128
131
  "dropdown-menu",
129
132
  "select",
@@ -13,7 +13,16 @@ let buttonElement = $state();
13
13
  let dropdownContentElement = $state();
14
14
  let isOpen = $state(false);
15
15
  // Style injection
16
- const style = $derived(injectVars(props, "menu", ["bg", "fg", "padding", "width", "height"]));
16
+ const style = $derived(injectVars(props, "menu", [
17
+ "bg",
18
+ "fg",
19
+ "padding",
20
+ "width",
21
+ "height",
22
+ "triggerBg",
23
+ "triggerFg",
24
+ "triggerPadding",
25
+ ]));
17
26
  let dropdownTop = $state(0);
18
27
  let dropdownLeft = $state(0);
19
28
  let dropdownMaxHeight = $state(0);
@@ -34,13 +43,13 @@ function computePosition() {
34
43
  }
35
44
  dropdownMaxHeight = window.innerHeight - dropdownTop;
36
45
  }
37
- function triggerMenu(e) {
46
+ function triggerMenu(_e) {
38
47
  if (!isOpen) {
39
48
  injectVariablesIntoDropdown();
40
49
  computePosition();
41
50
  }
42
51
  }
43
- function dismissPopover(e) {
52
+ function dismissPopover(_e) {
44
53
  if (!popoverDiv)
45
54
  return;
46
55
  popoverDiv.hidePopover();
@@ -63,7 +72,7 @@ function handleKeystroke(event) {
63
72
  else {
64
73
  searchString = "";
65
74
  if (event.key === "Escape") {
66
- popoverDiv.hidePopover();
75
+ popoverDiv?.hidePopover();
67
76
  }
68
77
  else if (event.key === "ArrowDown" || event.key === "ArrowUp") {
69
78
  event.preventDefault(); // Prevent default to stop scrolling the page
@@ -87,7 +96,7 @@ function maybeFocusMatch(searchString) {
87
96
  }
88
97
  }
89
98
  function navigateMenu(direction) {
90
- if (!popoverDiv.matches(":popover-open") && buttonElement) {
99
+ if (!popoverDiv?.matches(":popover-open") && buttonElement) {
91
100
  buttonElement.click();
92
101
  return;
93
102
  }
@@ -171,48 +180,48 @@ let popoverDiv = $state();
171
180
  */
172
181
  /* Convenience groupings */
173
182
  button {
174
- --_background-color: var(--menu-bg, var(--button-bg, var(--surface-bg, var(--bg, unset))));
175
- --_color: var(--menu-fg, var(--button-fg, var(--surface-fg, var(--fg, unset))));
176
- --link-bg: var(--menu-link-bg, var(--button-link-bg, var(--surface-link-bg, inherit)));
177
- --link-fg: var(--menu-link-fg, var(--button-link-fg, var(--surface-link-fg, inherit)));
183
+ --_background-color: var(--menu-trigger-bg, var(--menu-bg, var(--button-bg, var(--surface-bg, var(--bg, unset)))));
184
+ --_color: var(--menu-trigger-fg, var(--menu-fg, var(--button-fg, var(--surface-fg, var(--fg, unset)))));
185
+ --link-bg: var(--menu-trigger-link-bg, var(--menu-link-bg, var(--button-link-bg, var(--surface-link-bg, inherit))));
186
+ --link-fg: var(--menu-trigger-link-fg, var(--menu-link-fg, var(--button-link-fg, var(--surface-link-fg, inherit))));
178
187
  background-color: var(--_background-color);
179
188
  color: var(--_color);
180
189
  box-sizing: border-box;
181
- border: var(--menu-border, var(--button-border, var(--surface-border, var(--border, inherit))));
182
- border-width: var(--menu-border-width, var(--button-border-width, var(--surface-border-width, var(--__missing-border-width))));
183
- border-style: var(--menu-border-style, var(--button-border-style, var(--surface-border-style, var(--__missing-border-style))));
184
- border-color: var(--menu-border-color, var(--button-border-color, var(--surface-border-color, var(--__missing-border-color))));
185
- border-top: var(--menu-border-top, var(--button-border-top, var(--surface-border-top, var(--border-top, var(--menu-border, var(--button-border, var(--surface-border, var(--border, none))))))));
186
- border-right: var(--menu-border-right, var(--button-border-right, var(--surface-border-right, var(--border-right, var(--menu-border, var(--button-border, var(--surface-border, var(--border, none))))))));
187
- border-bottom: var(--menu-border-bottom, var(--button-border-bottom, var(--surface-border-bottom, var(--border-bottom, var(--menu-border, var(--button-border, var(--surface-border, var(--border, none))))))));
188
- border-left: var(--menu-border-left, var(--button-border-left, var(--surface-border-left, var(--border-left, var(--menu-border, var(--button-border, var(--surface-border, var(--border, none))))))));
189
- --_padding: var(--menu-padding, var(--button-padding, var(--surface-padding, var(--padding, 4px))));
190
+ border: var(--menu-trigger-border, var(--menu-border, var(--button-border, var(--surface-border, var(--border, inherit)))));
191
+ border-width: var(--menu-trigger-border-width, var(--menu-border-width, var(--button-border-width, var(--surface-border-width, var(--__missing-border-width)))));
192
+ border-style: var(--menu-trigger-border-style, var(--menu-border-style, var(--button-border-style, var(--surface-border-style, var(--__missing-border-style)))));
193
+ border-color: var(--menu-trigger-border-color, var(--menu-border-color, var(--button-border-color, var(--surface-border-color, var(--__missing-border-color)))));
194
+ border-top: var(--menu-trigger-border-top, var(--menu-border-top, var(--button-border-top, var(--surface-border-top, var(--border-top, var(--menu-trigger-border, var(--menu-border, var(--button-border, var(--surface-border, var(--border, none))))))))));
195
+ border-right: var(--menu-trigger-border-right, var(--menu-border-right, var(--button-border-right, var(--surface-border-right, var(--border-right, var(--menu-trigger-border, var(--menu-border, var(--button-border, var(--surface-border, var(--border, none))))))))));
196
+ border-bottom: var(--menu-trigger-border-bottom, var(--menu-border-bottom, var(--button-border-bottom, var(--surface-border-bottom, var(--border-bottom, var(--menu-trigger-border, var(--menu-border, var(--button-border, var(--surface-border, var(--border, none))))))))));
197
+ border-left: var(--menu-trigger-border-left, var(--menu-border-left, var(--button-border-left, var(--surface-border-left, var(--border-left, var(--menu-trigger-border, var(--menu-border, var(--button-border, var(--surface-border, var(--border, none))))))))));
198
+ --_padding: var(--menu-trigger-padding, var(--menu-padding, var(--button-padding, var(--surface-padding, var(--padding, 4px)))));
190
199
  padding: var(--_padding);
191
- border-radius: var(--menu-square-radius, var(--button-square-radius, var(--surface-square-radius, var(--square-radius, 0))));
192
- cursor: var(--menu-cursor, var(--button-cursor, var(--control-cursor, var(--cursor, pointer))));
193
- transition: filter var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms)))), background-color var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms)))), border-color var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms)))), box-shadow var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms)))), transform var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms))));
200
+ border-radius: var(--menu-trigger-square-radius, var(--menu-square-radius, var(--button-square-radius, var(--surface-square-radius, var(--square-radius, 0)))));
201
+ cursor: var(--menu-trigger-cursor, var(--menu-cursor, var(--button-cursor, var(--control-cursor, var(--cursor, pointer)))));
202
+ transition: filter var(--menu-trigger-transition, var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms))))), background-color var(--menu-trigger-transition, var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms))))), border-color var(--menu-trigger-transition, var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms))))), box-shadow var(--menu-trigger-transition, var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms))))), transform var(--menu-trigger-transition, var(--menu-transition, var(--button-transition, var(--control-transition, var(--transition, 300ms)))));
194
203
  }
195
204
 
196
205
  button:hover {
197
- filter: var(--menu-hover-filter, var(--button-hover-filter, var(--control-hover-filter, var(--hover-filter, brightness(1.05)))));
198
- transform: var(--menu-hover-transform, var(--button-hover-transform, var(--control-hover-transform, var(--hover-transform, none))));
206
+ filter: var(--menu-trigger-hover-filter, var(--menu-hover-filter, var(--button-hover-filter, var(--control-hover-filter, var(--hover-filter, brightness(1.05))))));
207
+ transform: var(--menu-trigger-hover-transform, var(--menu-hover-transform, var(--button-hover-transform, var(--control-hover-transform, var(--hover-transform, none)))));
199
208
  background-color: color-mix(in oklch, var(--_background-color) var(--hover-base-color-percentage, 90%), var(--hover-color-mix, white) calc(100% - var(--hover-base-color-percentage, 90%)));
200
- box-shadow: var(--menu-hover-box-shadow, var(--button-hover-box-shadow, var(--control-hover-box-shadow, var(--hover-box-shadow, var(--_box-shadow, none)))));
209
+ box-shadow: var(--menu-trigger-hover-box-shadow, var(--menu-hover-box-shadow, var(--button-hover-box-shadow, var(--control-hover-box-shadow, var(--hover-box-shadow, var(--_box-shadow, none))))));
201
210
  }
202
211
 
203
212
  button:active {
204
- filter: var(--menu-active-filter, var(--button-active-filter, var(--control-active-filter, var(--active-filter, brightness(0.9)))));
205
- transform: var(--menu-active-transform, var(--button-active-transform, var(--control-active-transform, var(--active-transform, none))));
213
+ filter: var(--menu-trigger-active-filter, var(--menu-active-filter, var(--button-active-filter, var(--control-active-filter, var(--active-filter, brightness(0.9))))));
214
+ transform: var(--menu-trigger-active-transform, var(--menu-active-transform, var(--button-active-transform, var(--control-active-transform, var(--active-transform, none)))));
206
215
  background-color: color-mix(in oklch, var(--_background-color) var(--active-base-color-percentage, 90%), var(--active-color-mix, black) calc(100% - var(--active-base-color-percentage, 90%)));
207
- box-shadow: var(--menu-active-box-shadow, var(--button-active-box-shadow, var(--control-active-box-shadow, var(--active-box-shadow, var(--_box-shadow, none)))));
216
+ box-shadow: var(--menu-trigger-active-box-shadow, var(--menu-active-box-shadow, var(--button-active-box-shadow, var(--control-active-box-shadow, var(--active-box-shadow, var(--_box-shadow, none))))));
208
217
  }
209
218
 
210
219
  button:disabled {
211
- cursor: var(--menu-disabled-cursor, var(--button-disabled-cursor, var(--control-disabled-cursor, var(--disabled-cursor, not-allowed))));
212
- transform: var(--menu-disabled-transform, var(--button-disabled-transform, var(--control-disabled-transform, var(--disabled-transform, none))));
213
- filter: var(--menu-disabled-filter, var(--button-disabled-filter, var(--control-disabled-filter, var(--disabled-filter, grayscale(0.5)))));
220
+ cursor: var(--menu-trigger-disabled-cursor, var(--menu-disabled-cursor, var(--button-disabled-cursor, var(--control-disabled-cursor, var(--disabled-cursor, not-allowed)))));
221
+ transform: var(--menu-trigger-disabled-transform, var(--menu-disabled-transform, var(--button-disabled-transform, var(--control-disabled-transform, var(--disabled-transform, none)))));
222
+ filter: var(--menu-trigger-disabled-filter, var(--menu-disabled-filter, var(--button-disabled-filter, var(--control-disabled-filter, var(--disabled-filter, grayscale(0.5))))));
214
223
  background-color: color-mix(in oklch, var(--_background-color) var(--disabled-base-color-percentage, 50%), var(--disabled-color-mix, gray) calc(100% - var(--disabled-base-color-percentage, 50%)));
215
- box-shadow: var(--menu-disabled-box-shadow, var(--button-disabled-box-shadow, var(--control-disabled-box-shadow, var(--disabled-box-shadow, var(--_box-shadow, none)))));
224
+ box-shadow: var(--menu-trigger-disabled-box-shadow, var(--menu-disabled-box-shadow, var(--button-disabled-box-shadow, var(--control-disabled-box-shadow, var(--disabled-box-shadow, var(--_box-shadow, none))))));
216
225
  }
217
226
 
218
227
  button:focus-visible {
@@ -32,14 +32,16 @@ const extraStyle = $derived(primary
32
32
  /* Convenience groupings */
33
33
  .bar {
34
34
  display: flex;
35
+ container-type: inline-size;
36
+ flex-wrap: var(--bar-wrap, wrap);
35
37
  align-items: var(--bar-align, center);
36
38
  justify-content: var(--bar-justify, space-between);
37
39
  padding: var(--bar-padding, var(--padding, 8px));
38
40
  border-bottom: var(--bar-border-bottom, var(--bar-border-width, var(--border-width, 1px)) var(--bar-border-style, var(--border-style, 1px)) var(--bar-border-color, var(--border-color, 1px)));
39
41
  border-top: var(--bar-border-top, var(--bar-border-width, var(--border-width, 1px)) var(--bar-border-style, var(--border-style, 1px)) var(--bar-border-color, var(--border-color, 1px)));
40
42
  margin-bottom: var(--bar-margin-bottom, 1em);
41
- min-height: var(--bar-min-height);
42
- height: var(--bar-height, 3em);
43
+ min-height: var(--bar-min-height, var(--bar-height, 3em));
44
+ height: var(--bar-height, auto);
43
45
  max-height: var(--bar-max-height);
44
46
  --_background-color: var(--bar-bg, var(--surface-bg, var(--bg, unset)));
45
47
  --_color: var(--bar-fg, var(--surface-fg, var(--fg, unset)));
@@ -1,4 +1,6 @@
1
- type $$ComponentProps = {
1
+ import type { Snippet } from "svelte";
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ type Props = {
2
4
  bg?: string | null;
3
5
  fg?: string | null;
4
6
  margin?: string | null;
@@ -8,8 +10,8 @@ type $$ComponentProps = {
8
10
  border?: boolean;
9
11
  paddingTop?: string | null;
10
12
  borderTop?: string | null;
11
- children?: import("svelte").Snippet;
12
- };
13
- declare const Container: import("svelte").Component<$$ComponentProps, {}, "">;
13
+ children?: Snippet;
14
+ } & HTMLAttributes<HTMLElement>;
15
+ declare const Container: import("svelte").Component<Props, {}, "">;
14
16
  type Container = ReturnType<typeof Container>;
15
17
  export default Container;
@@ -108,7 +108,7 @@ function handleKeydown(event) {
108
108
  <Checkbox
109
109
  bind:checked
110
110
  padding="0"
111
- tabindex="-1"
111
+ tabindex={-1}
112
112
  aria-label={checked ? "Unselect row" : "Select row"}
113
113
  />
114
114
  {/if}
@@ -2,7 +2,9 @@
2
2
  let { layout, collapseSide, fullWidth, globalInputStyles, multiline, children, } = $props();
3
3
  // Get parent context if it exists
4
4
  const parentContext = getContext("formItemDefaults");
5
- // Make context reactive using $state, merging with parent
5
+ // Make context reactive using $state, merging with parent.
6
+ // The $effect below keeps these in sync; the initial values are intentional.
7
+ // svelte-ignore state_referenced_locally
6
8
  let contextValue = $state({
7
9
  layout: layout ?? parentContext?.layout,
8
10
  collapseSide: collapseSide ?? parentContext?.collapseSide,
@@ -20,7 +20,7 @@ export {};
20
20
  /* Convenience groupings */
21
21
  .grid-layout {
22
22
  display: grid;
23
- grid-template-columns: repeat(auto-fill, var(--grid-layout-item-width, var(--item-width, 250px)));
23
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--grid-layout-item-width, var(--item-width, 250px))), 1fr));
24
24
  gap: var(--grid-layout-gap, var(--gap, 8px));
25
25
  justify-content: var(--grid-justify-content, center);
26
26
  place-content: var(--grid-place-content, center);
@@ -1,6 +1,10 @@
1
1
  <script lang="ts">import { injectVars } from "../util";
2
2
  let { fill = false, stretch = false, split = false, justify = null, align = null, gap = null, wrap = null, children, ...restProps } = $props();
3
- const { style: inlineStyle, ...elementProps } = restProps;
3
+ const inlineStyle = $derived(restProps.style);
4
+ const elementProps = $derived.by(() => {
5
+ const { style: _, ...rest } = restProps;
6
+ return rest;
7
+ });
4
8
  const style = $derived(injectVars({ justify, align, gap, wrap, ...elementProps }, "inline", [
5
9
  "bg",
6
10
  "fg",
@@ -216,7 +216,8 @@ footer {
216
216
  margin: 0;
217
217
  box-sizing: border-box;
218
218
  gap: var(--column-gap);
219
- padding: var(--padding);
219
+ padding: 0;
220
+ position: relative;
220
221
  }
221
222
 
222
223
  .right .side-by-side {
@@ -231,4 +232,31 @@ footer {
231
232
 
232
233
  .page.sticky.freeze :global(*) {
233
234
  overflow: hidden;
235
+ }
236
+
237
+ @container (max-width: 600px) {
238
+ .side-by-side {
239
+ gap: 0;
240
+ }
241
+ .hasSidebar > .side-by-side > .aside {
242
+ position: absolute;
243
+ inset-block: 0;
244
+ inset-inline-start: 0;
245
+ z-index: 3;
246
+ display: flex;
247
+ }
248
+ .hasSidebar > .side-by-side > .content {
249
+ padding-inline-start: max(var(--_padding, var(--padding, 0px)), var(--sidebar-compact-side-padding, calc(max(var(--sidebar-icon-width, 0.65rem), var(--sidebar-icon-height, 1rem), var(--icon-size, 32px)) + var(--gap, 8px))));
250
+ }
251
+ .hasSidebar.right > .side-by-side > .aside {
252
+ inset-inline-start: auto;
253
+ inset-inline-end: 0;
254
+ }
255
+ .hasSidebar.right > .side-by-side > .content {
256
+ padding-inline-start: var(--_padding, var(--padding, 0px));
257
+ padding-inline-end: max(var(--_padding, var(--padding, 0px)), var(--sidebar-compact-side-padding, calc(max(var(--sidebar-icon-width, 0.65rem), var(--sidebar-icon-height, 1rem), var(--icon-size, 32px)) + var(--gap, 8px))));
258
+ }
259
+ .page > div > .content {
260
+ min-width: 0;
261
+ }
234
262
  }</style>
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">const breakpoints = ["xs", "small", "medium", "large", "xl"];
2
- const { greaterThan = null, smallerThan = null, xs, small, medium, large, xl, else: elseSnippet, greaterThan: greaterThanSnippet, smallerThan: smallerThanSnippet, } = $props();
2
+ const { greaterThan = null, smallerThan = null, xs, small, medium, large, xl, else: elseSnippet, greaterThanContent: greaterThanSnippet, smallerThanContent: smallerThanSnippet, } = $props();
3
3
  function computeSmallerThan(value) {
4
4
  if (!value)
5
5
  return "";
@@ -8,6 +8,8 @@ declare const ResponsiveText: import("svelte").Component<{
8
8
  large?: Snippet;
9
9
  xl?: Snippet;
10
10
  else?: Snippet;
11
+ greaterThanContent?: Snippet;
12
+ smallerThanContent?: Snippet;
11
13
  }, {}, "">;
12
14
  type ResponsiveText = ReturnType<typeof ResponsiveText>;
13
15
  export default ResponsiveText;
@@ -238,6 +238,14 @@ aside .content:hover::-webkit-scrollbar-thumb:hover {
238
238
  color: var(--_color);
239
239
  }
240
240
  aside > button {
241
+ --_sidebar-expander-width: max(
242
+ var(--sidebar-icon-width, 0.65rem),
243
+ var(--icon-size, 32px)
244
+ );
245
+ --_sidebar-expander-height: max(
246
+ var(--sidebar-icon-height, 1rem),
247
+ var(--icon-size, 32px)
248
+ );
241
249
  transition: left var(--sidebar-transition);
242
250
  transform: translateX(0);
243
251
  z-index: 3;
@@ -247,13 +255,13 @@ aside .content:hover::-webkit-scrollbar-thumb:hover {
247
255
  display: block;
248
256
  position: absolute;
249
257
  top: var(--padding);
250
- left: calc(-1 * var(--padding));
258
+ left: 0;
251
259
  border-radius: var(--mini-button-radius, var(--button-radius, var(--radius, 50%)));
252
260
  border-top-left-radius: 0;
253
261
  border-bottom-left-radius: 0;
254
262
  border: var(--mini-button-border);
255
- width: var(--icon-size, 32px);
256
- height: var(--icon-size, 32px);
263
+ width: var(--_sidebar-expander-width);
264
+ height: var(--_sidebar-expander-height);
257
265
  --_background-color: var(--mini-button-bg, var(--button-bg, var(--control-bg, var(--secondary-bg, var(--bg, unset)))));
258
266
  --_color: var(--mini-button-fg, var(--button-fg, var(--control-fg, var(--secondary-fg, var(--fg, unset)))));
259
267
  --link-bg: var(--mini-button-link-bg, var(--button-link-bg, var(--control-link-bg, var(--secondary-link-bg, inherit))));
@@ -287,8 +295,12 @@ aside .content:hover::-webkit-scrollbar-thumb:hover {
287
295
  outline-offset: var(--focus-outline-offset, 2px);
288
296
  box-shadow: var(--focus-ring-box-shadow, 0 0 0 3px var(--focus-shadow-color, rgba(100, 150, 250, 0.5)));
289
297
  }
298
+ aside > button::after {
299
+ color: var(--mini-button-fg, currentColor);
300
+ filter: var(--sidebar-mobile-icon-filter, none);
301
+ }
290
302
  aside > button.close {
291
- left: calc(var(--sidebar-width) - var(--icon-size, 32px) + var(--padding));
303
+ left: calc(var(--sidebar-width) - var(--_sidebar-expander-width) + var(--padding));
292
304
  border-radius: var(--mini-button-radius, var(--button-radius, var(--radius, 50%)));
293
305
  border-top-right-radius: 0;
294
306
  border-bottom-right-radius: 0;
@@ -298,13 +310,16 @@ aside .content:hover::-webkit-scrollbar-thumb:hover {
298
310
  color: var(--mini-button-hover-fg);
299
311
  } */
300
312
  aside {
301
- width: calc(var(--gap) + var(--icon-size));
313
+ width: calc(var(--gap) + max(var(--sidebar-icon-width, 0.65rem), var(--icon-size, 32px)));
302
314
  flex: 0 0 auto;
303
315
  }
304
316
  aside .content {
305
317
  position: absolute;
306
- --top: calc(var(--padding) + var(--icon-size));
307
- left: var(--padding);
318
+ --top: calc(
319
+ var(--padding) +
320
+ max(var(--sidebar-icon-height, 1rem), var(--icon-size, 32px))
321
+ );
322
+ left: 0;
308
323
  width: var(--sidebar-width);
309
324
  z-index: 2;
310
325
  }
@@ -10,9 +10,9 @@ const style = $derived(injectVars(restProps, "split-pane", [
10
10
  "rightWidth",
11
11
  ]));
12
12
  let resizeStyle = $state("");
13
- let startWidthLeft = $state();
14
- let startWidthRight = $state();
15
- let startX = $state();
13
+ let startWidthLeft = $state(0);
14
+ let startWidthRight = $state(0);
15
+ let startX = $state(0);
16
16
  let splitPaneContainer = $state();
17
17
  let resizerDiv = $state();
18
18
  let leftPane = $state();
@@ -1,7 +1,11 @@
1
1
  <script lang="ts">import { injectVars } from "../util";
2
2
  let { fill = false, stretch = false, split = false, center = false, justify = null, align = null, gap = null, children, ...restProps } = $props();
3
3
  const resolvedAlign = $derived(align ?? (center ? "center" : null));
4
- const { style: inlineStyle, ...elementProps } = restProps;
4
+ const inlineStyle = $derived(restProps.style);
5
+ const elementProps = $derived.by(() => {
6
+ const { style: _, ...rest } = restProps;
7
+ return rest;
8
+ });
5
9
  const style = $derived(injectVars({ justify, align: resolvedAlign, gap, ...elementProps }, "stack", ["bg", "fg", "padding", "width", "height", "gap", "justify", "align"]) + (inlineStyle ?? ""));
6
10
  </script>
7
11
 
@@ -7,7 +7,6 @@ let lastActive = $state(active);
7
7
  <div class="tabs" class:sticky>
8
8
  <Bar
9
9
  padding="0"
10
- borderTop="none"
11
10
  --button-height="var(--tab-bar-height, 3em)"
12
11
  --bar-justify="var(--tab-bar-justify, start)"
13
12
  --bar-gap="var(--tab-bar-gap, var(--space-md))"
@@ -21,8 +20,8 @@ let lastActive = $state(active);
21
20
  --bar-border-bottom="var(--tab-bar-border-bottom, var(--border-width) var(--border-style) var(--border-color))"
22
21
  >
23
22
  {#each items as item}
24
- {@const value = item.value || item}
25
- {@const label = item.label || item}
23
+ {@const value = typeof item === "string" ? item : item.value}
24
+ {@const label = typeof item === "string" ? item : item.label}
26
25
  <TabItem
27
26
  active={value === active}
28
27
  onclick={() => {
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">import { run } from "svelte/legacy";
2
2
  let { sticky = false, column_widths = null, thead, tbody, children, } = $props();
3
+ // svelte-ignore state_referenced_locally
3
4
  let columns = $state(column_widths || []);
4
5
  /* Code for syncing column widths for scrolling table solution */
5
6
  let headClone = $state(null);
@@ -40,18 +41,19 @@ function syncColumnWidths() {
40
41
  return 0;
41
42
  return Array.from(row.children).reduce((acc, cell) => acc + parseInt(cell.getAttribute("colspan") || "1", 10), 0);
42
43
  };
44
+ const hasNoColspan = (row) => !Array.from(row.children).some((cell) => cell.hasAttribute("colspan"));
43
45
  const findBestRow = (table) => {
44
- const rows = Array.from(table.querySelectorAll("tr"));
45
- // First: find a row with no colspans
46
- for (const row of rows) {
47
- const hasColspan = Array.from(row.children).some((cell) => cell.hasAttribute("colspan"));
48
- if (!hasColspan)
49
- return row;
50
- }
51
- // Otherwise: row with smallest total colspans
46
+ // Fast path: first row covers the vast majority of real tables
47
+ const firstRow = table.querySelector("tbody tr, tr");
48
+ if (firstRow && hasNoColspan(firstRow))
49
+ return firstRow;
50
+ // Slow path: single pass — return on first no-colspan row found,
51
+ // while simultaneously tracking the least-colspan row as a fallback.
52
52
  let best = null;
53
53
  let bestSpanCount = Infinity;
54
- for (const row of rows) {
54
+ for (const row of table.querySelectorAll("tr")) {
55
+ if (hasNoColspan(row))
56
+ return row;
55
57
  const spanCount = getTotalCols(row);
56
58
  if (spanCount < bestSpanCount) {
57
59
  bestSpanCount = spanCount;
@@ -109,12 +111,20 @@ function setupWidths() {
109
111
  columns = [];
110
112
  if (thead && sticky && headClone && bodyClone) {
111
113
  syncColumnWidths();
112
- // Set up ResizeObserver to keep columns in sync when content or size changes
114
+ // Set up ResizeObserver to keep columns in sync when content or size changes.
115
+ // Debounce via rAF so rapid Svelte updates only trigger one sync per frame.
113
116
  if (!resizeObserver &&
114
117
  typeof window !== "undefined" &&
115
118
  window.ResizeObserver) {
119
+ let rafPending = false;
116
120
  resizeObserver = new ResizeObserver(() => {
117
- syncColumnWidths();
121
+ if (!rafPending) {
122
+ rafPending = true;
123
+ requestAnimationFrame(() => {
124
+ rafPending = false;
125
+ syncColumnWidths();
126
+ });
127
+ }
118
128
  });
119
129
  if (headClone)
120
130
  resizeObserver.observe(headClone);
@@ -372,6 +372,7 @@ export {};
372
372
  /* Override typography max-width */
373
373
  max-width: var(--tile-width, calc(var(--space-lg) * 24));
374
374
  display: inline-flex;
375
+ vertical-align: top;
375
376
  flex-direction: column;
376
377
  justify-content: var(--tile-justify, var(--justify, flex-start));
377
378
  align-items: var(--tile-align, var(--align, center));
@@ -23,7 +23,7 @@ function handleBackdropClick(event) {
23
23
  event.clientX > rect.right ||
24
24
  event.clientY < rect.top ||
25
25
  event.clientY > rect.bottom)) {
26
- onclose();
26
+ onclose?.();
27
27
  }
28
28
  }
29
29
  $effect(() => {
@@ -44,7 +44,7 @@ $effect(() => {
44
44
  else if (dialogElement) {
45
45
  dialogElement.close();
46
46
  dialogElement.removeEventListener("click", handleBackdropClick);
47
- onclose();
47
+ onclose?.();
48
48
  }
49
49
  }
50
50
  });
@@ -4,8 +4,8 @@ type PropsType = {
4
4
  modal?: boolean;
5
5
  dismissible?: boolean;
6
6
  children?: Snippet;
7
- onclose?: () => void | null;
8
- onClose?: () => void | null;
7
+ onclose?: (() => void) | null;
8
+ onClose?: (() => void) | null;
9
9
  } & Record<string, unknown>;
10
10
  declare const Dialog: import("svelte").Component<PropsType, {}, "">;
11
11
  type Dialog = ReturnType<typeof Dialog>;