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.
- package/dist/controls/ButtonLink.svelte +5 -1
- package/dist/controls/Input.svelte.d.ts +1 -1
- package/dist/controls/Option.svelte +3 -3
- package/dist/controls/Select.svelte +4 -3
- package/dist/controls/Slider.svelte +5 -1
- package/dist/cssprops.js +3 -0
- package/dist/dropdowns/DropdownMenu.svelte +40 -31
- package/dist/layout/Bar.svelte +4 -2
- package/dist/layout/Container.svelte.d.ts +6 -4
- package/dist/layout/DataListItem.svelte +1 -1
- package/dist/layout/FormProvider.svelte +3 -1
- package/dist/layout/GridLayout.svelte +1 -1
- package/dist/layout/Inline.svelte +5 -1
- package/dist/layout/Page.svelte +29 -1
- package/dist/layout/ResponsiveText.svelte +1 -1
- package/dist/layout/ResponsiveText.svelte.d.ts +2 -0
- package/dist/layout/Sidebar.svelte +22 -7
- package/dist/layout/SplitPane.svelte +3 -3
- package/dist/layout/Stack.svelte +5 -1
- package/dist/layout/TabBar.svelte +2 -3
- package/dist/layout/Table.svelte +21 -11
- package/dist/layout/Tile.svelte +1 -0
- package/dist/overlays/Dialog.svelte +2 -2
- package/dist/overlays/Dialog.svelte.d.ts +2 -2
- package/dist/overlays/Tooltip.svelte +65 -27
- package/dist/overlays/Tooltip.svelte.d.ts +1 -0
- package/dist/review/loadReviewAppPage.d.ts +1 -1
- package/dist/review/scenarios/IncredibleAppShell.svelte +44 -37
- package/dist/review/scenarios/LaunchStudio.svelte +108 -83
- package/dist/review/scenarios/LayoutWorkbench.svelte +49 -34
- package/dist/review/scenarios/TableWorkbench.svelte +82 -74
- package/dist/review/scenarios/VisualSystemBoard.svelte +387 -0
- package/dist/review/scenarios/VisualSystemBoard.svelte.d.ts +3 -0
- package/dist/review/scenarios.d.ts +8 -4
- package/dist/review/scenarios.js +9 -4
- package/dist/types.d.ts +3 -0
- package/dist/vars/colors.css +1 -1
- package/dist/vars/defaults.css +8 -1
- package/dist/vars/layout.css +7 -0
- package/dist/vars/themes/bootstrap.css +1 -0
- 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
|
|
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,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">let { children, value, ...restProps } = $props();
|
|
2
|
-
let template = $state(
|
|
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(
|
|
10
|
-
|
|
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
|
|
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", [
|
|
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(
|
|
46
|
+
function triggerMenu(_e) {
|
|
38
47
|
if (!isOpen) {
|
|
39
48
|
injectVariablesIntoDropdown();
|
|
40
49
|
computePosition();
|
|
41
50
|
}
|
|
42
51
|
}
|
|
43
|
-
function dismissPopover(
|
|
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
|
|
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
|
|
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 {
|
package/dist/layout/Bar.svelte
CHANGED
|
@@ -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,
|
|
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
|
|
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?:
|
|
12
|
-
}
|
|
13
|
-
declare const Container: import("svelte").Component
|
|
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;
|
|
@@ -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
|
|
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",
|
package/dist/layout/Page.svelte
CHANGED
|
@@ -216,7 +216,8 @@ footer {
|
|
|
216
216
|
margin: 0;
|
|
217
217
|
box-sizing: border-box;
|
|
218
218
|
gap: var(--column-gap);
|
|
219
|
-
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,
|
|
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:
|
|
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(--
|
|
256
|
-
height: var(--
|
|
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(--
|
|
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(
|
|
307
|
-
|
|
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();
|
package/dist/layout/Stack.svelte
CHANGED
|
@@ -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
|
|
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
|
|
25
|
-
{@const 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={() => {
|
package/dist/layout/Table.svelte
CHANGED
|
@@ -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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
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
|
-
|
|
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);
|
package/dist/layout/Tile.svelte
CHANGED
|
@@ -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>;
|