contain-css-svelte 0.0.1

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 (74) hide show
  1. package/README.md +58 -0
  2. package/dist/Card.svelte +172 -0
  3. package/dist/Card.svelte.d.ts +27 -0
  4. package/dist/controls/Button.svelte +74 -0
  5. package/dist/controls/Button.svelte.d.ts +28 -0
  6. package/dist/controls/Checkbox.svelte +111 -0
  7. package/dist/controls/Checkbox.svelte.d.ts +18 -0
  8. package/dist/controls/Input.svelte +33 -0
  9. package/dist/controls/Input.svelte.d.ts +22 -0
  10. package/dist/controls/MiniButton.svelte +78 -0
  11. package/dist/controls/MiniButton.svelte.d.ts +31 -0
  12. package/dist/controls/RadioButton.svelte +109 -0
  13. package/dist/controls/RadioButton.svelte.d.ts +25 -0
  14. package/dist/controls/Select.svelte +135 -0
  15. package/dist/controls/Select.svelte.d.ts +20 -0
  16. package/dist/controls/Slider.svelte +45 -0
  17. package/dist/controls/Slider.svelte.d.ts +29 -0
  18. package/dist/controls/TabItem.svelte +56 -0
  19. package/dist/controls/TabItem.svelte.d.ts +29 -0
  20. package/dist/cssprops.d.ts +1 -0
  21. package/dist/cssprops.js +189 -0
  22. package/dist/dropdowns/DropdownMenu.svelte +234 -0
  23. package/dist/dropdowns/DropdownMenu.svelte.d.ts +19 -0
  24. package/dist/index.d.ts +23 -0
  25. package/dist/index.js +24 -0
  26. package/dist/layout/Bar.svelte +57 -0
  27. package/dist/layout/Bar.svelte.d.ts +27 -0
  28. package/dist/layout/Column.svelte +40 -0
  29. package/dist/layout/Column.svelte.d.ts +19 -0
  30. package/dist/layout/Columns.svelte +21 -0
  31. package/dist/layout/Columns.svelte.d.ts +27 -0
  32. package/dist/layout/Container.svelte +105 -0
  33. package/dist/layout/Container.svelte.d.ts +27 -0
  34. package/dist/layout/FormItem.svelte +97 -0
  35. package/dist/layout/FormItem.svelte.d.ts +35 -0
  36. package/dist/layout/GridLayout.svelte +22 -0
  37. package/dist/layout/GridLayout.svelte.d.ts +16 -0
  38. package/dist/layout/Hero.svelte +86 -0
  39. package/dist/layout/Hero.svelte.d.ts +23 -0
  40. package/dist/layout/MenuList.svelte +108 -0
  41. package/dist/layout/MenuList.svelte.d.ts +29 -0
  42. package/dist/layout/Page.svelte +189 -0
  43. package/dist/layout/Page.svelte.d.ts +31 -0
  44. package/dist/layout/ResponsiveText.svelte +99 -0
  45. package/dist/layout/ResponsiveText.svelte.d.ts +26 -0
  46. package/dist/layout/Row.svelte +39 -0
  47. package/dist/layout/Row.svelte.d.ts +19 -0
  48. package/dist/layout/Sidebar.svelte +264 -0
  49. package/dist/layout/Sidebar.svelte.d.ts +23 -0
  50. package/dist/layout/SplitPane.svelte +160 -0
  51. package/dist/layout/SplitPane.svelte.d.ts +21 -0
  52. package/dist/layout/TabBar.svelte +49 -0
  53. package/dist/layout/TabBar.svelte.d.ts +28 -0
  54. package/dist/layout/Tile.svelte +172 -0
  55. package/dist/layout/Tile.svelte.d.ts +27 -0
  56. package/dist/misc/Code.svelte +27 -0
  57. package/dist/misc/Code.svelte.d.ts +18 -0
  58. package/dist/sass/_containers.scss +117 -0
  59. package/dist/sass/_mixins.scss +309 -0
  60. package/dist/typography/TextLayout.svelte +46 -0
  61. package/dist/typography/TextLayout.svelte.d.ts +27 -0
  62. package/dist/util.d.ts +3 -0
  63. package/dist/util.js +13 -0
  64. package/dist/vars/affordances.css +26 -0
  65. package/dist/vars/colors.css +345 -0
  66. package/dist/vars/defaults.css +14 -0
  67. package/dist/vars/layout.css +39 -0
  68. package/dist/vars/themes/lightordark.css +39 -0
  69. package/dist/vars/themes/purple.css +18 -0
  70. package/dist/vars/themes/typography-airy.css +13 -0
  71. package/dist/vars/themes/typography-browser.css +20 -0
  72. package/dist/vars/themes/typography-carbon.css +20 -0
  73. package/dist/vars/typography.css +16 -0
  74. package/package.json +52 -0
@@ -0,0 +1,99 @@
1
+ <script>import { browser } from "$app/environment";
2
+ export let greaterThan = null;
3
+ export let smallerThan = null;
4
+ let smallerThanClasses = "";
5
+ let greaterThanClasses = "";
6
+ if (smallerThan) {
7
+ for (let className of ["xs", "small", "medium", "large", "xl"]) {
8
+ if (className === smallerThan) {
9
+ smallerThanClasses += ` ${className}`;
10
+ break;
11
+ }
12
+ smallerThanClasses += ` ${className}`;
13
+ }
14
+ }
15
+ if (greaterThan) {
16
+ for (let className of ["xl", "large", "medium", "small", "xs"]) {
17
+ if (className === greaterThan) {
18
+ greaterThanClasses += ` ${className}`;
19
+ break;
20
+ }
21
+ greaterThanClasses += ` ${className}`;
22
+ }
23
+ }
24
+ let xs;
25
+ let small;
26
+ let medium;
27
+ let large;
28
+ let xl;
29
+ </script>
30
+
31
+ <span class="xs" bind:this={xs}>
32
+ <slot name="xs" />
33
+ </span>
34
+ <span class="small" bind:this={small}>
35
+ <slot name="small" />
36
+ </span>
37
+ <span class="medium" bind:this={medium}>
38
+ <slot name="medium" />
39
+ </span>
40
+ <span class="large" bind:this={large}>
41
+ <slot name="large" />
42
+ </span>
43
+ <span class="xl" bind:this={xl}>
44
+ <slot name="xl" />
45
+ </span>
46
+ <span
47
+ class="else"
48
+ class:xs={!$$slots.xs}
49
+ class:small={!$$slots.small}
50
+ class:medium={!$$slots.medium}
51
+ class:large={!$$slots.large}
52
+ class:xl={!$$slots.xl}
53
+ >
54
+ <slot name="else" />
55
+ </span>
56
+ <span class={greaterThanClasses}>
57
+ <slot name="greaterThan" />
58
+ </span>
59
+ <span class={smallerThanClasses}>
60
+ <slot name="smallerThan" />
61
+ </span>
62
+
63
+ <style>
64
+ .xs,
65
+ .small,
66
+ .medium,
67
+ .large,
68
+ .xl {
69
+ display: none;
70
+ }
71
+ @container (max-width: 240px) {
72
+ .xs {
73
+ display: contents;
74
+ }
75
+ }
76
+ @container (min-width: 241px) and (max-width: 480px) {
77
+ .small {
78
+ display: contents;
79
+ }
80
+ }
81
+ @container (min-width: 481px) and (max-width: 720px) {
82
+ .medium {
83
+ display: contents;
84
+ }
85
+ }
86
+ @container (min-width: 721px) and (max-width: 1024px) {
87
+ .large {
88
+ display: contents;
89
+ }
90
+ }
91
+ @container (min-width: 1025px) {
92
+ .xl {
93
+ display: contents;
94
+ }
95
+ }
96
+ .else.render {
97
+ display: contents;
98
+ }
99
+ </style>
@@ -0,0 +1,26 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ greaterThan?: "small" | "medium" | "large" | "xs" | "xl" | null | undefined;
5
+ smallerThan?: "small" | "medium" | "large" | "xs" | "xl" | null | undefined;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ xs: {};
12
+ small: {};
13
+ medium: {};
14
+ large: {};
15
+ xl: {};
16
+ else: {};
17
+ greaterThan: {};
18
+ smallerThan: {};
19
+ };
20
+ };
21
+ export type ResponsiveTextProps = typeof __propDef.props;
22
+ export type ResponsiveTextEvents = typeof __propDef.events;
23
+ export type ResponsiveTextSlots = typeof __propDef.slots;
24
+ export default class ResponsiveText extends SvelteComponent<ResponsiveTextProps, ResponsiveTextEvents, ResponsiveTextSlots> {
25
+ }
26
+ export {};
@@ -0,0 +1,39 @@
1
+ <script>export let size = "medium";
2
+ export let customHeight = null;
3
+ </script>
4
+
5
+ <section
6
+ class="row"
7
+ class:small={size == "small"}
8
+ class:medium={size == "medium"}
9
+ class:large={size == "large"}
10
+ style:--custom-height={customHeight}
11
+ >
12
+ <slot />
13
+ </section>
14
+
15
+ <style>/* Convenience groupings */
16
+ /* Warning: because we define a fallback
17
+ media query, the media query can override the container
18
+ if we stack a bunch of these in a row and aren't thoughtful about the order.
19
+ Put min-width queries *after* max-width queries so that smaller
20
+ container queries don't get their styles overridden by large media queries.
21
+ */
22
+ .small {
23
+ --h: 120px;
24
+ }
25
+ .medium {
26
+ --h: 240px;
27
+ }
28
+ .large {
29
+ --h: 360px;
30
+ }
31
+ section {
32
+ display: flex;
33
+ flex-direction: row;
34
+ height: var(--custom-height, var(--h, 200px));
35
+ gap: var(--column-gap, var(--container-gap, var(--gap, 8px)));
36
+ container-type: size;
37
+ overflow: auto;
38
+ align-items: flex-start;
39
+ }</style>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ size?: "small" | "medium" | "large" | undefined;
5
+ customHeight?: string | null | undefined;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export type RowProps = typeof __propDef.props;
15
+ export type RowEvents = typeof __propDef.events;
16
+ export type RowSlots = typeof __propDef.slots;
17
+ export default class Row extends SvelteComponent<RowProps, RowEvents, RowSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,264 @@
1
+ <script>import { onMount } from "svelte";
2
+ import { injectVars } from "../util";
3
+ export let width = null;
4
+ export let bg = null;
5
+ export let fg = null;
6
+ export let right = false;
7
+ export let left = true;
8
+ let style = injectVars($$props, "sidebar", ["bg", "fg", "width"]);
9
+ let expandedHamburger = false;
10
+ let expandedBar = true;
11
+ </script>
12
+
13
+ <aside
14
+ class="sidebar"
15
+ class:right
16
+ class:left
17
+ class:expandedHamburger
18
+ class:expandedBar
19
+ {style}
20
+ >
21
+ <button
22
+ class:expander={!expandedHamburger}
23
+ class:close={expandedHamburger}
24
+ on:click={() => (expandedHamburger = !expandedHamburger)}
25
+ ></button>
26
+ <div class="content">
27
+ <slot />
28
+ </div>
29
+ <label class="edge-bar">
30
+ <button
31
+ on:click={() => (expandedBar = !expandedBar)}
32
+ class="expander"
33
+ class:expander={!expandedBar}
34
+ class:close={expandedBar}
35
+ aria-label="Expand sidebar"
36
+ ></button>
37
+ </label>
38
+ </aside>
39
+
40
+ <style>@charset "UTF-8";
41
+ /* Convenience groupings */
42
+ /* Warning: because we define a fallback
43
+ media query, the media query can override the container
44
+ if we stack a bunch of these in a row and aren't thoughtful about the order.
45
+ Put min-width queries *after* max-width queries so that smaller
46
+ container queries don't get their styles overridden by large media queries.
47
+ */
48
+ aside {
49
+ background: var(--sidebar-bg, var(--container-bg, var(--bg, white)));
50
+ color: var(--sidebar-fg, var(--container-fg, var(--fg, black)));
51
+ height: 100%;
52
+ width: calc(var(--sidebar-width) + var(--grab-bar-width));
53
+ box-sizing: border-box;
54
+ overflow: hidden;
55
+ }
56
+ aside .content {
57
+ background: var(--sidebar-bg, var(--container-bg, var(--bg, white)));
58
+ color: var(--sidebar-fg, var(--container-fg, var(--fg, black)));
59
+ width: var(--sidebar-width);
60
+ height: 100%;
61
+ overflow-x: hidden;
62
+ box-sizing: border-box;
63
+ overflow-y: auto;
64
+ scrollbar-width: var(--sidebar-scrollbar-width, var(--container-scrollbar-width, var(--scrollbar-width, thin)));
65
+ scrollbar-color: var(--sidebar-scrollbar-thumb-bg, var(--container-scrollbar-thumb-bg, var(--scrollbar-thumb-bg, #888))) var(--sidebar-scrollbar-track-bg, var(--container-scrollbar-track-bg, var(--scrollbar-track-bg, var(--border-color))));
66
+ }
67
+ aside .content::-webkit-scrollbar {
68
+ width: var(--sidebar-scrollbar-width, var(--container-scrollbar-width, var(--scrollbar-width, var(--space-md))));
69
+ height: var(--sidebar-scrollbar-height, var(--container-scrollbar-height, var(--scrollbar-height, var(--gap))));
70
+ }
71
+ aside .content::-webkit-scrollbar-track {
72
+ background: var(--sidebar-scrollbar-track-bg, var(--container-scrollbar-track-bg, var(--scrollbar-track-bg, var(--bg))));
73
+ }
74
+ aside .content::-webkit-scrollbar-thumb {
75
+ background: var(--sidebar-scrollbar-thumb-bg, var(--container-scrollbar-thumb-bg, var(--scrollbar-thumb-bg, var(--stripe-bg))));
76
+ border-radius: var(--sidebar-scrollbar-thumb-radius, var(--container-scrollbar-thumb-radius, var(--scrollbar-thumb-radius, var(--border-radius))));
77
+ }
78
+ aside .content::-webkit-scrollbar-thumb:hover {
79
+ background: var(--sidebar-scrollbar-thumb-hover-bg, var(--container-scrollbar-thumb-hover-bg, var(--scrollbar-thumb-hover-bg, var(--secondary-bg))));
80
+ }
81
+ .right {
82
+ border-left: var(--sidebar-border, var(--border, none));
83
+ }
84
+ .left {
85
+ border-right: var(--sidebar-border, var(--border, none));
86
+ }
87
+ /* Expander doo-dad */
88
+ /* Responsive sidebar... */
89
+ @container (min-width: 513px) {
90
+ /* Aside is a relative container whose width
91
+ will smoothly animate so our parent knows
92
+ how to lay us out */
93
+ aside {
94
+ transition: width var(--sidebar-transition);
95
+ position: relative;
96
+ height: 100%;
97
+ width: var(--grab-bar-width);
98
+ }
99
+ aside.expandedBar {
100
+ width: calc(var(--sidebar-width) + var(--grab-bar-width));
101
+ }
102
+ aside .content {
103
+ transition: transform var(--sidebar-transition);
104
+ transform: translateX(-110%);
105
+ }
106
+ aside.right .content {
107
+ transform: translateX(100%);
108
+ }
109
+ /* Positioning */
110
+ aside.expandedBar .content {
111
+ transform: translateX(0);
112
+ position: absolute;
113
+ top: 0;
114
+ left: 0;
115
+ width: var(--sidebar-width);
116
+ }
117
+ aside.expandedBar.right .content {
118
+ left: auto;
119
+ right: 0;
120
+ }
121
+ .edge-bar {
122
+ position: absolute;
123
+ right: 0;
124
+ top: 0;
125
+ height: 100%;
126
+ width: var(--grab-bar-width);
127
+ background: var(--body-bg);
128
+ display: flex;
129
+ flex-direction: column;
130
+ justify-content: center;
131
+ }
132
+ .right .edge-bar {
133
+ left: 0;
134
+ right: auto;
135
+ }
136
+ .edge-bar button {
137
+ display: block;
138
+ background: transparent;
139
+ color: var(--body-fg);
140
+ width: var(--grab-bar-width);
141
+ box-sizing: border-box;
142
+ padding: 0;
143
+ border: none;
144
+ }
145
+ /* Affordances */
146
+ .edge-bar:hover {
147
+ filter: var(--grab-bar-hover-filter);
148
+ background: var(--grab-bar-hover-bg);
149
+ }
150
+ aside .content,
151
+ .edge-bar {
152
+ transition: filter, background var(--transition);
153
+ }
154
+ .edge-bar:contains(:active) {
155
+ filter: var(--grab-bar-active-filter);
156
+ background: var(--grab-bar-active-bg);
157
+ }
158
+ aside:has(.edge-bar:hover) .content {
159
+ filter: var(--greyed-out-filter);
160
+ }
161
+ /* Hide hamburger expander when not in
162
+ hamburger mode */
163
+ button {
164
+ display: none;
165
+ }
166
+ }
167
+ @container (max-width: 512px) {
168
+ .edge-bar {
169
+ display: none;
170
+ }
171
+ .sidebar {
172
+ background: transparent;
173
+ }
174
+ .right,
175
+ .left {
176
+ border-left: none;
177
+ border-right: none;
178
+ }
179
+ aside > .content {
180
+ transform: translateX(-100%);
181
+ opacity: 0;
182
+ background: transparent;
183
+ pointer-events: none;
184
+ transition: transform var(--sidebar-transition) ease-in-out;
185
+ padding: var(--padding);
186
+ }
187
+ aside.left > .content {
188
+ border-right: var(--border-width) var(--border-style) var(--border-color);
189
+ }
190
+ aside.right > .content {
191
+ border-left: var(--border-width) var(--border-style) var(--border-color);
192
+ }
193
+ aside.expandedHamburger > .content {
194
+ transform: translateX(0);
195
+ height: 100%;
196
+ opacity: 1;
197
+ pointer-events: all;
198
+ background: var(--sidebar-bg, var(--container-bg, var(--bg, white)));
199
+ color: var(--sidebar-fg, var(--container-fg, var(--fg, black)));
200
+ }
201
+ aside > button {
202
+ transition: left var(--sidebar-transition);
203
+ transform: translateX(0);
204
+ z-index: 3;
205
+ position: absolute;
206
+ opacity: 1;
207
+ pointer-events: all;
208
+ display: block;
209
+ position: absolute;
210
+ top: var(--padding);
211
+ left: calc(-1 * var(--padding));
212
+ border-radius: var(--mini-button-radius, var(--button-radius, var(--radius, 50%)));
213
+ border-top-left-radius: 0;
214
+ border-bottom-left-radius: 0;
215
+ border: var(--mini-button-border);
216
+ width: var(--icon-size, 32px);
217
+ height: var(--icon-size, 32px);
218
+ background: var(--mini-button-bg, var(--button-bg, var(--control-bg, var(--secondary-bg, var(--bg, white)))));
219
+ color: var(--mini-button-fg, var(--button-fg, var(--control-fg, var(--secondary-fg, var(--fg, black)))));
220
+ cursor: pointer;
221
+ transition: filter, transform var(--button-transition, var(--control-transition, var(--transition, 300ms)));
222
+ }
223
+ aside > button:hover {
224
+ filter: var(--mini-button-hover-filter, var(--button-hover-filter, var(--control-hover-filter, var(--hover-filter, brightness(1.1)))));
225
+ transform: var(--mini-button-hover-transform, var(--button-hover-transform, var(--control-hover-transform, var(--hover-transform, none))));
226
+ }
227
+ aside > button:active {
228
+ filter: var(--mini-button-hover-filter, var(--button-hover-filter, var(--control-hover-filter, var(--hover-filter, brightness(0.9)))));
229
+ transform: var(--mini-button-hover-transform, var(--button-hover-transform, var(--control-hover-transform, var(--hover-transform, translate(var(--space), var(--space))))));
230
+ }
231
+ aside > button.close {
232
+ left: calc(var(--sidebar-width) - var(--icon-size, 32px) + var(--padding));
233
+ border-radius: var(--mini-button-radius, var(--button-radius, var(--radius, 50%)));
234
+ border-top-right-radius: 0;
235
+ border-bottom-right-radius: 0;
236
+ }
237
+ /* aside > button:hover {
238
+ background: var(--mini-button-hover-bg);
239
+ color: var(--mini-button-hover-fg);
240
+ } */
241
+ aside {
242
+ width: calc(var(--gap) + var(--icon-size));
243
+ flex: 0 0 auto;
244
+ }
245
+ aside .content {
246
+ position: absolute;
247
+ --top: calc(var(--padding) + var(--icon-size));
248
+ left: var(--padding);
249
+ width: var(--sidebar-width);
250
+ background: var(--sidebar-bg);
251
+ color: var(--sidebar-fg);
252
+ z-index: 2;
253
+ }
254
+ }
255
+ button.expander::after {
256
+ content: var(--sidebar-expand, "»");
257
+ }
258
+ button.close::after {
259
+ content: var(--sidebar-collapse, "«");
260
+ }
261
+ .right button::after {
262
+ display: inline-block;
263
+ transform: var(--mirror-sidebar-icons, scaleX(-1));
264
+ }</style>
@@ -0,0 +1,23 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: any;
5
+ width?: string | null | undefined;
6
+ bg?: string | null | undefined;
7
+ fg?: string | null | undefined;
8
+ right?: boolean | undefined;
9
+ left?: boolean | undefined;
10
+ };
11
+ events: {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {
15
+ default: {};
16
+ };
17
+ };
18
+ export type SidebarProps = typeof __propDef.props;
19
+ export type SidebarEvents = typeof __propDef.events;
20
+ export type SidebarSlots = typeof __propDef.slots;
21
+ export default class Sidebar extends SvelteComponent<SidebarProps, SidebarEvents, SidebarSlots> {
22
+ }
23
+ export {};
@@ -0,0 +1,160 @@
1
+ <script>import { injectVars } from "../util";
2
+ import { onMount } from "svelte";
3
+ export let leftWidth = "1fr";
4
+ export let rightWidth = "1fr";
5
+ const style = injectVars($$props, "split-pane", [
6
+ "bg",
7
+ "fg",
8
+ "border",
9
+ "height",
10
+ "leftWidth",
11
+ "rightWidth"
12
+ ]);
13
+ let resizeStyle = "";
14
+ let startWidthLeft;
15
+ let startWidthRight;
16
+ let startX;
17
+ let splitPaneContainer;
18
+ let resizerDiv;
19
+ let leftPane;
20
+ let rightPane;
21
+ function onMouseDown(event) {
22
+ startX = event.clientX;
23
+ startWidthLeft = leftPane.getBoundingClientRect().width;
24
+ startWidthRight = rightPane.getBoundingClientRect().width;
25
+ document.addEventListener("mousemove", onMouseMove);
26
+ document.addEventListener("mouseup", onMouseUp);
27
+ }
28
+ function onMouseMove(event) {
29
+ const delta = event.clientX - startX;
30
+ const newLeftWidth = startWidthLeft + delta;
31
+ const newRightWidth = startWidthRight - delta;
32
+ setSize(newLeftWidth, newRightWidth);
33
+ }
34
+ function setSize(newLeftWidth, newRightWidth) {
35
+ const MIN_SIZE = 32;
36
+ if (newLeftWidth < MIN_SIZE || newRightWidth < MIN_SIZE) {
37
+ return;
38
+ }
39
+ let containerWidth = splitPaneContainer.getBoundingClientRect().width;
40
+ let resizerWidth = resizerDiv.getBoundingClientRect().width;
41
+ if (newLeftWidth + newRightWidth + resizerWidth > containerWidth) {
42
+ newRightWidth = containerWidth - newLeftWidth - resizerWidth;
43
+ }
44
+ resizeStyle = `grid-template-columns: ${newLeftWidth}px 8px ${newRightWidth}px`;
45
+ }
46
+ function onMouseUp() {
47
+ document.removeEventListener("mousemove", onMouseMove);
48
+ document.removeEventListener("mouseup", onMouseUp);
49
+ }
50
+ function onKeyUp(event) {
51
+ const STEP_SIZE = 10;
52
+ if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
53
+ const delta = event.key === "ArrowLeft" ? -STEP_SIZE : STEP_SIZE;
54
+ startWidthLeft = leftPane.getBoundingClientRect().width;
55
+ startWidthRight = rightPane.getBoundingClientRect().width;
56
+ let newLeftWidth = startWidthLeft + delta;
57
+ let newRightWidth = startWidthRight - delta;
58
+ setSize(newLeftWidth, newRightWidth);
59
+ }
60
+ }
61
+ function handleWindowResize() {
62
+ if (!resizeStyle)
63
+ return;
64
+ const existingLeftWidth = leftPane.getBoundingClientRect().width;
65
+ const existingRightWidth = rightPane.getBoundingClientRect().width;
66
+ let w = splitPaneContainer.getBoundingClientRect().width;
67
+ let delta = w - existingLeftWidth - existingRightWidth;
68
+ setSize(existingLeftWidth + delta / 2, existingRightWidth + delta / 2);
69
+ }
70
+ onMount(() => {
71
+ if (window) {
72
+ window.addEventListener("resize", handleWindowResize);
73
+ }
74
+ return () => window.removeEventListener("resize", handleWindowResize);
75
+ });
76
+ </script>
77
+
78
+ <div
79
+ class="split-pane"
80
+ style={style + resizeStyle}
81
+ bind:this={splitPaneContainer}
82
+ >
83
+ <div class="left" bind:this={leftPane}>
84
+ <slot name="left" />
85
+ </div>
86
+ <div
87
+ bind:this={resizerDiv}
88
+ class="resizer"
89
+ tabindex="0"
90
+ aria-role="resizer"
91
+ on:mousedown={onMouseDown}
92
+ on:keydown={onKeyUp}
93
+ ></div>
94
+ <div class="right" bind:this={rightPane}>
95
+ <slot name="right" />
96
+ </div>
97
+ </div>
98
+
99
+ <style>/* Convenience groupings */
100
+ /* Warning: because we define a fallback
101
+ media query, the media query can override the container
102
+ if we stack a bunch of these in a row and aren't thoughtful about the order.
103
+ Put min-width queries *after* max-width queries so that smaller
104
+ container queries don't get their styles overridden by large media queries.
105
+ */
106
+ .split-pane {
107
+ display: grid;
108
+ grid-template-columns: var(--split-pane-columns, var(--split-pane-left-width, 1fr) var(--split-pane-resizer-width, var(--resizer-width, 4px)) var(--split-pane-right-width, 1fr));
109
+ justify-content: stretch;
110
+ height: var(--split-pane-height, auto);
111
+ width: var(--split-pane-width, 100%);
112
+ box-sizing: border-box;
113
+ gap: var(--split-pane-gap, var(--gap, 0.5rem));
114
+ border: var(--split-pane-border, var(--container-border, var(--border, 1px solid #ccc)));
115
+ }
116
+ .split-pane > div {
117
+ padding: var(--split-pane-content-padding, var(--split-pane-padding, var(--padding, 8px)));
118
+ container-type: inline-size;
119
+ }
120
+ /* Resizer */
121
+ .split-pane > .resizer {
122
+ padding: 0;
123
+ width: var(--resizer-grab-width, 12px);
124
+ cursor: col-resize;
125
+ position: relative;
126
+ display: flex;
127
+ justify-content: center;
128
+ align-items: stretch;
129
+ }
130
+ .split-pane > .resizer::before {
131
+ content: " ";
132
+ width: var(--resizer-width, var(--border-width, 1px));
133
+ background-color: var(--split-pane-resizer-color, var(--resizer-color, var(--fg)));
134
+ height: 100%;
135
+ display: block;
136
+ }
137
+ .split-pane > .resizer::after {
138
+ content: "";
139
+ display: block;
140
+ position: absolute;
141
+ top: 50%;
142
+ height: var(--resizer-grab-height, 1em);
143
+ width: var(--resizer-grab-width, 8px);
144
+ color: var(--fg);
145
+ transform: translateY(-50%);
146
+ background: var(--resizer-background, repeating-linear-gradient(90deg, var(--resizer-color, var(--fg)) 0px, var(--resizer-color, var(--fg)) 1px, transparent 1px, transparent 3px));
147
+ }
148
+ @container (max-width: 600px) {
149
+ .split-pane {
150
+ display: flex;
151
+ flex-direction: column;
152
+ gap: var(--gap, 4px);
153
+ }
154
+ .split-pane > div:first-child {
155
+ border-bottom: var(--resizer-border, var(--border, 1px solid #ccc));
156
+ }
157
+ .split-pane > .resizer {
158
+ display: none;
159
+ }
160
+ }</style>
@@ -0,0 +1,21 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: any;
5
+ leftWidth?: string | undefined;
6
+ rightWidth?: string | undefined;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {
12
+ left: {};
13
+ right: {};
14
+ };
15
+ };
16
+ export type SplitPaneProps = typeof __propDef.props;
17
+ export type SplitPaneEvents = typeof __propDef.events;
18
+ export type SplitPaneSlots = typeof __propDef.slots;
19
+ export default class SplitPane extends SvelteComponent<SplitPaneProps, SplitPaneEvents, SplitPaneSlots> {
20
+ }
21
+ export {};
@@ -0,0 +1,49 @@
1
+ <script>export let sticky = false;
2
+ import Bar from "./Bar.svelte";
3
+ import TabItem from "../controls/TabItem.svelte";
4
+ import { createEventDispatcher } from "svelte";
5
+ export let active = null;
6
+ export let items = [];
7
+ const dispatch = createEventDispatcher();
8
+ function setValue(value) {
9
+ active = value;
10
+ dispatch("change", { value });
11
+ }
12
+ </script>
13
+
14
+ <div class="tabs" class:sticky>
15
+ <Bar padding="0" borderTop="none">
16
+ {#each items as item}
17
+ {@const value = item.value || item}
18
+ {@const label = item.label || item}
19
+ <TabItem active={value === active} on:click={() => setValue(value)}>
20
+ {label}
21
+ </TabItem>
22
+ {/each}
23
+ <slot />
24
+ </Bar>
25
+ </div>
26
+
27
+ <style>/* Convenience groupings */
28
+ /* Warning: because we define a fallback
29
+ media query, the media query can override the container
30
+ if we stack a bunch of these in a row and aren't thoughtful about the order.
31
+ Put min-width queries *after* max-width queries so that smaller
32
+ container queries don't get their styles overridden by large media queries.
33
+ */
34
+ div > :global(.bar) {
35
+ background: var(--tab-bar-bg, var(--bar-bg, var(--container-bg, var(--bg, white))));
36
+ color: var(--tab-bar-fg, var(--bar-fg, var(--container-fg, var(--fg, black))));
37
+ justify-content: var(--tab-bar-justify, var(--justify, flex-start));
38
+ align-items: var(--tab-bar-align, var(--align, flex-end));
39
+ border-bottom: var(--tab-bar-border-bottom, var(--border-width) var(--border-style) var(--border-color));
40
+ border-left: var(--tab-bar-border-left, none);
41
+ border-right: var(--tab-bar-border-left, none);
42
+ border-top: var(--tab-bar-border-left, none);
43
+ gap: var(--tab-bar-gap, var(--space-md));
44
+ }
45
+ .sticky {
46
+ position: sticky;
47
+ top: calc(-1 * var(--container-padding, var(--block-padding, var(--padding, 8px))));
48
+ background-color: var(--tab-bar-bg, var(--bg, white));
49
+ }</style>