basefn 1.9.1 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/rescript.json +1 -1
- package/src/Basefn.res +5 -0
- package/src/Basefn.res.mjs +4 -0
- package/src/Basefn__Responsive.res.mjs +5 -5
- package/src/Basefn__Utils.res.mjs +2 -2
- package/src/Demo.res +59 -59
- package/src/Demo.res.mjs +630 -628
- package/src/Example.res +3 -3
- package/src/Example.res.mjs +48 -47
- package/src/components/Basefn__Accordion.res +5 -5
- package/src/components/Basefn__Accordion.res.mjs +25 -26
- package/src/components/Basefn__Alert.res +4 -4
- package/src/components/Basefn__Alert.res.mjs +20 -18
- package/src/components/Basefn__AlertDialog.res +5 -5
- package/src/components/Basefn__AlertDialog.res.mjs +23 -21
- package/src/components/Basefn__AppLayout.res +3 -3
- package/src/components/Basefn__AppLayout.res.mjs +25 -24
- package/src/components/Basefn__AspectRatio.res +1 -1
- package/src/components/Basefn__AspectRatio.res.mjs +2 -2
- package/src/components/Basefn__Avatar.res.mjs +3 -3
- package/src/components/Basefn__Badge.res +1 -1
- package/src/components/Basefn__Badge.res.mjs +2 -2
- package/src/components/Basefn__Breadcrumb.res +5 -5
- package/src/components/Basefn__Breadcrumb.res.mjs +14 -14
- package/src/components/Basefn__Button.res +1 -1
- package/src/components/Basefn__Button.res.mjs +10 -9
- package/src/components/Basefn__ButtonGroup.res +1 -1
- package/src/components/Basefn__ButtonGroup.res.mjs +2 -2
- package/src/components/Basefn__Card.res +3 -3
- package/src/components/Basefn__Card.res.mjs +11 -11
- package/src/components/Basefn__Checkbox.res +1 -1
- package/src/components/Basefn__Checkbox.res.mjs +7 -7
- package/src/components/Basefn__ContextMenu.res +4 -4
- package/src/components/Basefn__ContextMenu.res.mjs +22 -20
- package/src/components/Basefn__Drawer.res +5 -5
- package/src/components/Basefn__Drawer.res.mjs +22 -20
- package/src/components/Basefn__Dropdown.res +4 -4
- package/src/components/Basefn__Dropdown.res.mjs +20 -18
- package/src/components/Basefn__Grid.res.mjs +15 -14
- package/src/components/Basefn__HoverCard.res +3 -3
- package/src/components/Basefn__HoverCard.res.mjs +14 -12
- package/src/components/Basefn__Icon.res.mjs +8 -7
- package/src/components/Basefn__Input.res.mjs +4 -4
- package/src/components/Basefn__Kbd.res +2 -2
- package/src/components/Basefn__Kbd.res.mjs +5 -5
- package/src/components/Basefn__Label.res +1 -1
- package/src/components/Basefn__Label.res.mjs +4 -4
- package/src/components/Basefn__Modal.res +5 -5
- package/src/components/Basefn__Modal.res.mjs +20 -18
- package/src/components/Basefn__Popover.res +3 -3
- package/src/components/Basefn__Popover.res.mjs +15 -13
- package/src/components/Basefn__Progress.res +2 -2
- package/src/components/Basefn__Progress.res.mjs +16 -14
- package/src/components/Basefn__Radio.res +1 -1
- package/src/components/Basefn__Radio.res.mjs +7 -7
- package/src/components/Basefn__Resizable.css +156 -0
- package/src/components/Basefn__Resizable.res +318 -0
- package/src/components/Basefn__Resizable.res.mjs +343 -0
- package/src/components/Basefn__ScrollArea.res +1 -1
- package/src/components/Basefn__ScrollArea.res.mjs +2 -2
- package/src/components/Basefn__Select.res +2 -2
- package/src/components/Basefn__Select.res.mjs +7 -6
- package/src/components/Basefn__Separator.res +1 -1
- package/src/components/Basefn__Separator.res.mjs +9 -9
- package/src/components/Basefn__Sidebar.res +7 -7
- package/src/components/Basefn__Sidebar.res.mjs +28 -24
- package/src/components/Basefn__Skeleton.res.mjs +2 -2
- package/src/components/Basefn__Slider.res +4 -4
- package/src/components/Basefn__Slider.res.mjs +21 -20
- package/src/components/Basefn__Spinner.res +1 -1
- package/src/components/Basefn__Spinner.res.mjs +8 -8
- package/src/components/Basefn__Spotlight.res +22 -14
- package/src/components/Basefn__Spotlight.res.mjs +79 -65
- package/src/components/Basefn__Stepper.res +6 -6
- package/src/components/Basefn__Stepper.res.mjs +20 -24
- package/src/components/Basefn__Switch.res +1 -1
- package/src/components/Basefn__Switch.res.mjs +16 -14
- package/src/components/Basefn__Tabs.res +4 -4
- package/src/components/Basefn__Tabs.res.mjs +19 -17
- package/src/components/Basefn__Textarea.res.mjs +4 -4
- package/src/components/Basefn__ThemeToggle.res +1 -1
- package/src/components/Basefn__ThemeToggle.res.mjs +13 -10
- package/src/components/Basefn__Timeline.res +6 -6
- package/src/components/Basefn__Timeline.res.mjs +21 -21
- package/src/components/Basefn__Toast.res +4 -4
- package/src/components/Basefn__Toast.res.mjs +23 -20
- package/src/components/Basefn__Toggle.res +1 -1
- package/src/components/Basefn__Toggle.res.mjs +8 -7
- package/src/components/Basefn__ToggleGroup.res +2 -2
- package/src/components/Basefn__ToggleGroup.res.mjs +12 -10
- package/src/components/Basefn__Tooltip.res +3 -3
- package/src/components/Basefn__Tooltip.res.mjs +14 -12
- package/src/components/Basefn__Topbar.res +7 -7
- package/src/components/Basefn__Topbar.res.mjs +22 -22
- package/src/components/Basefn__Typography.res +2 -2
- package/src/components/Basefn__Typography.res.mjs +13 -13
- package/src/styles/Basefn__Theme.res.mjs +5 -5
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Node$Xote from "xote/src/Node.res.mjs";
|
|
4
|
+
import * as Signal$Xote from "xote/src/Signal.res.mjs";
|
|
5
|
+
import * as Core__Option from "@rescript/core/src/Core__Option.res.mjs";
|
|
6
|
+
import * as XoteJSX$Xote from "xote/src/XoteJSX.res.mjs";
|
|
7
|
+
import * as Computed$Xote from "xote/src/Computed.res.mjs";
|
|
8
|
+
|
|
9
|
+
import './Basefn__Resizable.css'
|
|
10
|
+
;
|
|
11
|
+
|
|
12
|
+
function directionToString(d) {
|
|
13
|
+
if (d === "Horizontal") {
|
|
14
|
+
return "horizontal";
|
|
15
|
+
} else {
|
|
16
|
+
return "vertical";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let getClientX = (function(e) {
|
|
21
|
+
var t = e.touches ? e.touches[0] : e;
|
|
22
|
+
return t.clientX;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
let getClientY = (function(e) {
|
|
26
|
+
var t = e.touches ? e.touches[0] : e;
|
|
27
|
+
return t.clientY;
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
let addDocListener = (function(ev, fn) {
|
|
31
|
+
document.addEventListener(ev, fn);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
let removeDocListener = (function(ev, fn) {
|
|
35
|
+
document.removeEventListener(ev, fn);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
let disableSelect = (function() {
|
|
39
|
+
document.body.style.userSelect = "none";
|
|
40
|
+
document.body.style.webkitUserSelect = "none";
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
let enableSelect = (function() {
|
|
44
|
+
document.body.style.userSelect = "";
|
|
45
|
+
document.body.style.webkitUserSelect = "";
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
let findClosest = (function(el, sel) {
|
|
49
|
+
return el.closest(sel);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
let getElementRect = (function(el) {
|
|
53
|
+
return el.getBoundingClientRect();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
let getKey = (function(e) { return e.key || "" });
|
|
57
|
+
|
|
58
|
+
let getEventTarget = (function(e) {
|
|
59
|
+
return e.target;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
let preventDefault = (function(e) { e.preventDefault() });
|
|
63
|
+
|
|
64
|
+
let genId = (function() {
|
|
65
|
+
return "basefn-resizable-" + Math.random().toString(36).substr(2, 9);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
let registerInstance = (function(id, cb) {
|
|
69
|
+
if (!window.__basefn_resizable) {
|
|
70
|
+
window.__basefn_resizable = {};
|
|
71
|
+
|
|
72
|
+
function handler(e) {
|
|
73
|
+
var target = e.target;
|
|
74
|
+
if (!target || !target.closest) return;
|
|
75
|
+
var handle = target.closest(".basefn-resizable__handle");
|
|
76
|
+
if (!handle) return;
|
|
77
|
+
var container = handle.closest(".basefn-resizable");
|
|
78
|
+
if (!container || !container.id) return;
|
|
79
|
+
var entry = window.__basefn_resizable[container.id];
|
|
80
|
+
if (!entry) return;
|
|
81
|
+
// Find the handle index among direct children of the container
|
|
82
|
+
var children = container.children;
|
|
83
|
+
var handleIndex = 0;
|
|
84
|
+
for (var i = 0; i < children.length; i++) {
|
|
85
|
+
if (children[i].classList.contains("basefn-resizable__handle")) {
|
|
86
|
+
if (children[i] === handle) {
|
|
87
|
+
entry(handleIndex, e);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
handleIndex++;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
document.addEventListener("mousedown", handler);
|
|
96
|
+
document.addEventListener("touchstart", handler, { passive: false });
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
window.__basefn_resizable[id] = cb;
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
let initHandle = (function(el, idx, cb) {
|
|
103
|
+
if (el._basefnInit) return;
|
|
104
|
+
el._basefnInit = true;
|
|
105
|
+
el.addEventListener("mousedown", function(e) { cb(idx, e); });
|
|
106
|
+
el.addEventListener("touchstart", function(e) { cb(idx, e); }, { passive: false });
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
let getCurrentTarget = (function(e) {
|
|
110
|
+
return e.currentTarget;
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
function Basefn__Resizable(props) {
|
|
114
|
+
let __class = props.class;
|
|
115
|
+
let onResize = props.onResize;
|
|
116
|
+
let __withHandle = props.withHandle;
|
|
117
|
+
let __direction = props.direction;
|
|
118
|
+
let panels = props.panels;
|
|
119
|
+
let direction = __direction !== undefined ? __direction : "Horizontal";
|
|
120
|
+
let withHandle = __withHandle !== undefined ? __withHandle : true;
|
|
121
|
+
let $$class = __class !== undefined ? __class : "";
|
|
122
|
+
let containerId = genId();
|
|
123
|
+
let sizes = Signal$Xote.make(panels.map(p => p.defaultSize), undefined, undefined);
|
|
124
|
+
let isDragging = Signal$Xote.make(false, undefined, undefined);
|
|
125
|
+
let dragRef = {
|
|
126
|
+
contents: undefined
|
|
127
|
+
};
|
|
128
|
+
let getPos = evt => {
|
|
129
|
+
if (direction === "Horizontal") {
|
|
130
|
+
return getClientX(evt);
|
|
131
|
+
} else {
|
|
132
|
+
return getClientY(evt);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
let getContainerDimension = container => {
|
|
136
|
+
let rect = getElementRect(container);
|
|
137
|
+
if (direction === "Horizontal") {
|
|
138
|
+
return rect.width;
|
|
139
|
+
} else {
|
|
140
|
+
return rect.height;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
let clampSizes = (leftIdx, rightIdx, newLeft, newRight) => {
|
|
144
|
+
let lp = panels[leftIdx];
|
|
145
|
+
let rp = panels[rightIdx];
|
|
146
|
+
let lMin = Core__Option.getOr(lp.minSize, 0.0);
|
|
147
|
+
let lMax = Core__Option.getOr(lp.maxSize, 100.0);
|
|
148
|
+
let rMin = Core__Option.getOr(rp.minSize, 0.0);
|
|
149
|
+
let rMax = Core__Option.getOr(rp.maxSize, 100.0);
|
|
150
|
+
let total = newLeft + newRight;
|
|
151
|
+
if (newLeft < lMin) {
|
|
152
|
+
return [
|
|
153
|
+
lMin,
|
|
154
|
+
total - lMin
|
|
155
|
+
];
|
|
156
|
+
} else if (newLeft > lMax) {
|
|
157
|
+
return [
|
|
158
|
+
lMax,
|
|
159
|
+
total - lMax
|
|
160
|
+
];
|
|
161
|
+
} else if (newRight < rMin) {
|
|
162
|
+
return [
|
|
163
|
+
total - rMin,
|
|
164
|
+
rMin
|
|
165
|
+
];
|
|
166
|
+
} else if (newRight > rMax) {
|
|
167
|
+
return [
|
|
168
|
+
total - rMax,
|
|
169
|
+
rMax
|
|
170
|
+
];
|
|
171
|
+
} else {
|
|
172
|
+
return [
|
|
173
|
+
newLeft,
|
|
174
|
+
newRight
|
|
175
|
+
];
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
let applySizes = newSizes => {
|
|
179
|
+
Signal$Xote.set(sizes, newSizes);
|
|
180
|
+
if (onResize !== undefined) {
|
|
181
|
+
return onResize(newSizes);
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
let onMouseMove = evt => {
|
|
185
|
+
let info = dragRef.contents;
|
|
186
|
+
if (info === undefined) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
let containerSize = getContainerDimension(info.container);
|
|
190
|
+
if (containerSize <= 0.0) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
let delta = getPos(evt) - info.startPos;
|
|
194
|
+
let deltaPercent = delta / containerSize * 100.0;
|
|
195
|
+
let li = info.handleIndex;
|
|
196
|
+
let ri = info.handleIndex + 1 | 0;
|
|
197
|
+
let origLeft = info.startSizes[li];
|
|
198
|
+
let origRight = info.startSizes[ri];
|
|
199
|
+
let match = clampSizes(li, ri, origLeft + deltaPercent, origRight - deltaPercent);
|
|
200
|
+
let newSizes = Signal$Xote.get(sizes).slice();
|
|
201
|
+
newSizes[li] = match[0];
|
|
202
|
+
newSizes[ri] = match[1];
|
|
203
|
+
applySizes(newSizes);
|
|
204
|
+
};
|
|
205
|
+
let onMouseUp = param => {
|
|
206
|
+
dragRef.contents = undefined;
|
|
207
|
+
Signal$Xote.set(isDragging, false);
|
|
208
|
+
enableSelect();
|
|
209
|
+
removeDocListener("mousemove", onMouseMove);
|
|
210
|
+
removeDocListener("mouseup", onMouseUp);
|
|
211
|
+
removeDocListener("touchmove", onMouseMove);
|
|
212
|
+
removeDocListener("touchend", onMouseUp);
|
|
213
|
+
};
|
|
214
|
+
let startDrag = (handleIndex, evt) => {
|
|
215
|
+
preventDefault(evt);
|
|
216
|
+
let target = getEventTarget(evt);
|
|
217
|
+
let maybeContainer = findClosest(target, ".basefn-resizable");
|
|
218
|
+
if (!(maybeContainer == null)) {
|
|
219
|
+
dragRef.contents = {
|
|
220
|
+
handleIndex: handleIndex,
|
|
221
|
+
startPos: getPos(evt),
|
|
222
|
+
startSizes: Signal$Xote.get(sizes).slice(),
|
|
223
|
+
container: maybeContainer
|
|
224
|
+
};
|
|
225
|
+
Signal$Xote.set(isDragging, true);
|
|
226
|
+
disableSelect();
|
|
227
|
+
addDocListener("mousemove", onMouseMove);
|
|
228
|
+
addDocListener("mouseup", onMouseUp);
|
|
229
|
+
addDocListener("touchmove", onMouseMove);
|
|
230
|
+
return addDocListener("touchend", onMouseUp);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
registerInstance(containerId, startDrag);
|
|
234
|
+
let containerClass = "basefn-resizable basefn-resizable--" + directionToString(direction) + (
|
|
235
|
+
$$class !== "" ? " " + $$class : ""
|
|
236
|
+
);
|
|
237
|
+
let elements = [];
|
|
238
|
+
panels.forEach((panel, index) => {
|
|
239
|
+
let panelStyle = Computed$Xote.make(() => {
|
|
240
|
+
let size = Signal$Xote.get(sizes)[index];
|
|
241
|
+
return "flex-basis:" + size.toString() + "%;flex-grow:0;flex-shrink:0";
|
|
242
|
+
}, undefined);
|
|
243
|
+
let panelClass = Computed$Xote.make(() => {
|
|
244
|
+
let base = "basefn-resizable__panel";
|
|
245
|
+
if (Signal$Xote.get(isDragging)) {
|
|
246
|
+
return base + " basefn-resizable__panel--dragging";
|
|
247
|
+
} else {
|
|
248
|
+
return base;
|
|
249
|
+
}
|
|
250
|
+
}, undefined);
|
|
251
|
+
elements.push(XoteJSX$Xote.Elements.jsxKeyed("div", {
|
|
252
|
+
class: panelClass,
|
|
253
|
+
style: panelStyle,
|
|
254
|
+
children: panel.content
|
|
255
|
+
}, "panel-" + index.toString(), undefined));
|
|
256
|
+
if (index >= (panels.length - 1 | 0)) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
let handleClass = "basefn-resizable__handle basefn-resizable__handle--" + directionToString(direction) + (
|
|
260
|
+
withHandle ? " basefn-resizable__handle--with-grip" : ""
|
|
261
|
+
);
|
|
262
|
+
elements.push(XoteJSX$Xote.Elements.jsxKeyed("div", {
|
|
263
|
+
class: handleClass,
|
|
264
|
+
role: "separator",
|
|
265
|
+
tabIndex: 0,
|
|
266
|
+
onKeyDown: evt => {
|
|
267
|
+
let key = getKey(evt);
|
|
268
|
+
let ri = index + 1 | 0;
|
|
269
|
+
let currentSizes = Signal$Xote.get(sizes);
|
|
270
|
+
let left = currentSizes[index];
|
|
271
|
+
let right = currentSizes[ri];
|
|
272
|
+
let delta;
|
|
273
|
+
if (direction === "Horizontal") {
|
|
274
|
+
switch (key) {
|
|
275
|
+
case "ArrowLeft" :
|
|
276
|
+
delta = - 1.0;
|
|
277
|
+
break;
|
|
278
|
+
case "ArrowRight" :
|
|
279
|
+
delta = 1.0;
|
|
280
|
+
break;
|
|
281
|
+
default:
|
|
282
|
+
delta = undefined;
|
|
283
|
+
}
|
|
284
|
+
} else {
|
|
285
|
+
switch (key) {
|
|
286
|
+
case "ArrowDown" :
|
|
287
|
+
delta = 1.0;
|
|
288
|
+
break;
|
|
289
|
+
case "ArrowUp" :
|
|
290
|
+
delta = - 1.0;
|
|
291
|
+
break;
|
|
292
|
+
default:
|
|
293
|
+
delta = undefined;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (delta === undefined) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
preventDefault(evt);
|
|
300
|
+
let match = clampSizes(index, ri, left + delta, right - delta);
|
|
301
|
+
let newSizes = currentSizes.slice();
|
|
302
|
+
newSizes[index] = match[0];
|
|
303
|
+
newSizes[ri] = match[1];
|
|
304
|
+
applySizes(newSizes);
|
|
305
|
+
},
|
|
306
|
+
onMouseEnter: evt => {
|
|
307
|
+
let el = getCurrentTarget(evt);
|
|
308
|
+
initHandle(el, index, startDrag);
|
|
309
|
+
},
|
|
310
|
+
children: withHandle ? XoteJSX$Xote.Elements.jsx("div", {
|
|
311
|
+
class: "basefn-resizable__handle-grip"
|
|
312
|
+
}) : XoteJSX$Xote.jsx(XoteJSX$Xote.jsxFragment, {})
|
|
313
|
+
}, "handle-" + index.toString(), undefined));
|
|
314
|
+
});
|
|
315
|
+
return XoteJSX$Xote.Elements.jsx("div", {
|
|
316
|
+
id: containerId,
|
|
317
|
+
class: containerClass,
|
|
318
|
+
children: Node$Xote.fragment(elements)
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
let make = Basefn__Resizable;
|
|
323
|
+
|
|
324
|
+
export {
|
|
325
|
+
directionToString,
|
|
326
|
+
getClientX,
|
|
327
|
+
getClientY,
|
|
328
|
+
addDocListener,
|
|
329
|
+
removeDocListener,
|
|
330
|
+
disableSelect,
|
|
331
|
+
enableSelect,
|
|
332
|
+
findClosest,
|
|
333
|
+
getElementRect,
|
|
334
|
+
getKey,
|
|
335
|
+
getEventTarget,
|
|
336
|
+
preventDefault,
|
|
337
|
+
genId,
|
|
338
|
+
registerInstance,
|
|
339
|
+
initHandle,
|
|
340
|
+
getCurrentTarget,
|
|
341
|
+
make,
|
|
342
|
+
}
|
|
343
|
+
/* Not a pure module */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as
|
|
3
|
+
import * as XoteJSX$Xote from "xote/src/XoteJSX.res.mjs";
|
|
4
4
|
|
|
5
5
|
import './Basefn__ScrollArea.css'
|
|
6
6
|
;
|
|
@@ -46,7 +46,7 @@ function Basefn__ScrollArea(props) {
|
|
|
46
46
|
let maxWidthStyle = maxWidth !== undefined ? "max-width: " + maxWidth + ";" : "";
|
|
47
47
|
return maxHeightStyle + maxWidthStyle;
|
|
48
48
|
};
|
|
49
|
-
return
|
|
49
|
+
return XoteJSX$Xote.Elements.jsx("div", {
|
|
50
50
|
class: getClassName(),
|
|
51
51
|
style: getStyle(),
|
|
52
52
|
children: props.children
|
|
@@ -26,8 +26,8 @@ let make = (
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
<select name="test" class="basefn-select" value={value} disabled onChange>
|
|
29
|
-
{
|
|
30
|
-
<option value={opt.value}> {
|
|
29
|
+
{Node.list(options, opt =>
|
|
30
|
+
<option value={opt.value}> {Node.text(opt.label)} </option>
|
|
31
31
|
)}
|
|
32
32
|
</select>
|
|
33
33
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as Xote from "xote/src/
|
|
4
|
-
import * as
|
|
3
|
+
import * as Node$Xote from "xote/src/Node.res.mjs";
|
|
4
|
+
import * as Signal$Xote from "xote/src/Signal.res.mjs";
|
|
5
|
+
import * as XoteJSX$Xote from "xote/src/XoteJSX.res.mjs";
|
|
5
6
|
|
|
6
7
|
import './Basefn__Select.css'
|
|
7
8
|
;
|
|
@@ -14,20 +15,20 @@ function Basefn__Select(props) {
|
|
|
14
15
|
let onChange$1 = e => {
|
|
15
16
|
let t = e.target;
|
|
16
17
|
let v = t.value;
|
|
17
|
-
Xote.
|
|
18
|
+
Signal$Xote.set(value, v);
|
|
18
19
|
if (onChange !== undefined) {
|
|
19
20
|
return onChange(v);
|
|
20
21
|
}
|
|
21
22
|
};
|
|
22
|
-
return
|
|
23
|
+
return XoteJSX$Xote.Elements.jsx("select", {
|
|
23
24
|
class: "basefn-select",
|
|
24
25
|
name: "test",
|
|
25
26
|
value: value,
|
|
26
27
|
disabled: disabled,
|
|
27
28
|
onChange: onChange$1,
|
|
28
|
-
children: Xote.
|
|
29
|
+
children: Node$Xote.list(props.options, opt => XoteJSX$Xote.Elements.jsx("option", {
|
|
29
30
|
value: opt.value,
|
|
30
|
-
children: Xote.
|
|
31
|
+
children: Node$Xote.text(opt.label)
|
|
31
32
|
}))
|
|
32
33
|
});
|
|
33
34
|
}
|
|
@@ -37,7 +37,7 @@ let make = (
|
|
|
37
37
|
| Some(text) =>
|
|
38
38
|
<div class={getClassName() ++ " basefn-separator--with-label"}>
|
|
39
39
|
<div class="basefn-separator__line" />
|
|
40
|
-
<span class="basefn-separator__label"> {
|
|
40
|
+
<span class="basefn-separator__label"> {Node.text(text)} </span>
|
|
41
41
|
<div class="basefn-separator__line" />
|
|
42
42
|
</div>
|
|
43
43
|
| None => <div class={getClassName()} role="separator" />
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as Xote from "xote/src/
|
|
4
|
-
import * as
|
|
3
|
+
import * as Node$Xote from "xote/src/Node.res.mjs";
|
|
4
|
+
import * as XoteJSX$Xote from "xote/src/XoteJSX.res.mjs";
|
|
5
5
|
|
|
6
6
|
import './Basefn__Separator.css'
|
|
7
7
|
;
|
|
@@ -37,23 +37,23 @@ function Basefn__Separator(props) {
|
|
|
37
37
|
return "basefn-separator " + orientationClass + " " + variantClass;
|
|
38
38
|
};
|
|
39
39
|
if (label !== undefined) {
|
|
40
|
-
return
|
|
40
|
+
return XoteJSX$Xote.Elements.jsxs("div", {
|
|
41
41
|
class: getClassName() + " basefn-separator--with-label",
|
|
42
|
-
children:
|
|
43
|
-
|
|
42
|
+
children: XoteJSX$Xote.array([
|
|
43
|
+
XoteJSX$Xote.Elements.jsx("div", {
|
|
44
44
|
class: "basefn-separator__line"
|
|
45
45
|
}),
|
|
46
|
-
|
|
46
|
+
XoteJSX$Xote.Elements.jsx("span", {
|
|
47
47
|
class: "basefn-separator__label",
|
|
48
|
-
children: Xote.
|
|
48
|
+
children: Node$Xote.text(label)
|
|
49
49
|
}),
|
|
50
|
-
|
|
50
|
+
XoteJSX$Xote.Elements.jsx("div", {
|
|
51
51
|
class: "basefn-separator__line"
|
|
52
52
|
})
|
|
53
53
|
])
|
|
54
54
|
});
|
|
55
55
|
} else {
|
|
56
|
-
return
|
|
56
|
+
return XoteJSX$Xote.Elements.jsx("div", {
|
|
57
57
|
class: getClassName(),
|
|
58
58
|
role: "separator"
|
|
59
59
|
});
|
|
@@ -26,9 +26,9 @@ let sizeToString = (size: size) => {
|
|
|
26
26
|
|
|
27
27
|
@jsx.component
|
|
28
28
|
let make = (
|
|
29
|
-
~logo: option<
|
|
29
|
+
~logo: option<Node.node>=?,
|
|
30
30
|
~sections: array<navSection>,
|
|
31
|
-
~footer: option<
|
|
31
|
+
~footer: option<Node.node>=?,
|
|
32
32
|
~size: size=Md,
|
|
33
33
|
~collapsed: bool=false,
|
|
34
34
|
) => {
|
|
@@ -66,7 +66,7 @@ let make = (
|
|
|
66
66
|
<div class="basefn-sidebar__section">
|
|
67
67
|
{switch section.title {
|
|
68
68
|
| Some(title) =>
|
|
69
|
-
<div class="basefn-sidebar__section-title"> {
|
|
69
|
+
<div class="basefn-sidebar__section-title"> {Node.text(title)} </div>
|
|
70
70
|
| None => <> </>
|
|
71
71
|
}}
|
|
72
72
|
{section.items
|
|
@@ -76,17 +76,17 @@ let make = (
|
|
|
76
76
|
|
|
77
77
|
Router.link(
|
|
78
78
|
~to={item.url},
|
|
79
|
-
~attrs=[
|
|
79
|
+
~attrs=[Node.attr("class", itemClass)],
|
|
80
80
|
~children=[
|
|
81
|
-
<div class="basefn-sidebar__item-text"> {
|
|
81
|
+
<div class="basefn-sidebar__item-text"> {Node.text(item.label)} </div>,
|
|
82
82
|
],
|
|
83
83
|
(),
|
|
84
84
|
)
|
|
85
85
|
})
|
|
86
|
-
->
|
|
86
|
+
->Node.fragment}
|
|
87
87
|
</div>
|
|
88
88
|
})
|
|
89
|
-
->
|
|
89
|
+
->Node.fragment}
|
|
90
90
|
</nav>
|
|
91
91
|
{switch footer {
|
|
92
92
|
| Some(footerContent) => <div class="basefn-sidebar__footer"> {footerContent} </div>
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as Xote from "xote/src/
|
|
4
|
-
import * as Xote__JSX from "xote/src/Xote__JSX.res.mjs";
|
|
3
|
+
import * as Node$Xote from "xote/src/Node.res.mjs";
|
|
5
4
|
import * as Basefn__Dom from "../Basefn__Dom.res.mjs";
|
|
5
|
+
import * as Effect$Xote from "xote/src/Effect.res.mjs";
|
|
6
|
+
import * as Router$Xote from "xote/src/Router.res.mjs";
|
|
7
|
+
import * as Signal$Xote from "xote/src/Signal.res.mjs";
|
|
8
|
+
import * as XoteJSX$Xote from "xote/src/XoteJSX.res.mjs";
|
|
9
|
+
import * as Computed$Xote from "xote/src/Computed.res.mjs";
|
|
6
10
|
|
|
7
11
|
import './Basefn__Sidebar.css'
|
|
8
12
|
;
|
|
@@ -25,63 +29,63 @@ function Basefn__Sidebar(props) {
|
|
|
25
29
|
let logo = props.logo;
|
|
26
30
|
let size = __size !== undefined ? __size : "Md";
|
|
27
31
|
let collapsed = __collapsed !== undefined ? __collapsed : false;
|
|
28
|
-
let scrolling = Xote.
|
|
32
|
+
let scrolling = Signal$Xote.make(false, undefined, undefined);
|
|
29
33
|
let getSidebarClass = () => {
|
|
30
34
|
let sizeClass = " basefn-sidebar--" + sizeToString(size);
|
|
31
35
|
let collapsedClass = collapsed ? " basefn-sidebar--collapsed" : "";
|
|
32
36
|
return "basefn-sidebar" + sizeClass + collapsedClass;
|
|
33
37
|
};
|
|
34
|
-
Xote.
|
|
38
|
+
Effect$Xote.run(() => Basefn__Dom.addEventListener("scroll", () => {
|
|
35
39
|
let scrollY = window.scrollY;
|
|
36
|
-
Xote.
|
|
40
|
+
Signal$Xote.set(scrolling, scrollY >= 64);
|
|
37
41
|
}), undefined);
|
|
38
42
|
let tmp;
|
|
39
43
|
if (logo !== undefined) {
|
|
40
|
-
let $$class = Xote.
|
|
41
|
-
Xote.
|
|
44
|
+
let $$class = Computed$Xote.make(() => "basefn-sidebar__header" + (
|
|
45
|
+
Signal$Xote.get(scrolling) ? " basefn-sidebar__header--scrolling" : ""
|
|
42
46
|
), undefined);
|
|
43
|
-
tmp =
|
|
47
|
+
tmp = XoteJSX$Xote.Elements.jsx("div", {
|
|
44
48
|
class: $$class,
|
|
45
|
-
children:
|
|
49
|
+
children: XoteJSX$Xote.Elements.jsx("div", {
|
|
46
50
|
class: "basefn-sidebar__logo",
|
|
47
51
|
children: logo
|
|
48
52
|
})
|
|
49
53
|
});
|
|
50
54
|
} else {
|
|
51
|
-
tmp =
|
|
55
|
+
tmp = XoteJSX$Xote.jsx(XoteJSX$Xote.jsxFragment, {});
|
|
52
56
|
}
|
|
53
|
-
return
|
|
57
|
+
return XoteJSX$Xote.Elements.jsxs("div", {
|
|
54
58
|
class: getSidebarClass(),
|
|
55
|
-
children:
|
|
59
|
+
children: XoteJSX$Xote.array([
|
|
56
60
|
tmp,
|
|
57
|
-
|
|
61
|
+
XoteJSX$Xote.Elements.jsx("nav", {
|
|
58
62
|
class: "basefn-sidebar__nav",
|
|
59
|
-
children: Xote.
|
|
63
|
+
children: Node$Xote.fragment(props.sections.map(section => {
|
|
60
64
|
let title = section.title;
|
|
61
|
-
return
|
|
65
|
+
return XoteJSX$Xote.Elements.jsxs("div", {
|
|
62
66
|
class: "basefn-sidebar__section",
|
|
63
|
-
children:
|
|
64
|
-
title !== undefined ?
|
|
67
|
+
children: XoteJSX$Xote.array([
|
|
68
|
+
title !== undefined ? XoteJSX$Xote.Elements.jsx("div", {
|
|
65
69
|
class: "basefn-sidebar__section-title",
|
|
66
|
-
children: Xote.
|
|
67
|
-
}) :
|
|
68
|
-
Xote.
|
|
70
|
+
children: Node$Xote.text(title)
|
|
71
|
+
}) : XoteJSX$Xote.jsx(XoteJSX$Xote.jsxFragment, {}),
|
|
72
|
+
Node$Xote.fragment(section.items.map((item, index) => {
|
|
69
73
|
let itemClass = "basefn-sidebar__item" + (
|
|
70
74
|
item.active ? " basefn-sidebar__item--active" : ""
|
|
71
75
|
);
|
|
72
|
-
return Xote.
|
|
76
|
+
return Router$Xote.link(item.url, [Node$Xote.attr("class", itemClass)], [XoteJSX$Xote.Elements.jsx("div", {
|
|
73
77
|
class: "basefn-sidebar__item-text",
|
|
74
|
-
children: Xote.
|
|
78
|
+
children: Node$Xote.text(item.label)
|
|
75
79
|
})], undefined);
|
|
76
80
|
}))
|
|
77
81
|
])
|
|
78
82
|
});
|
|
79
83
|
}))
|
|
80
84
|
}),
|
|
81
|
-
footer !== undefined ?
|
|
85
|
+
footer !== undefined ? XoteJSX$Xote.Elements.jsx("div", {
|
|
82
86
|
class: "basefn-sidebar__footer",
|
|
83
87
|
children: footer
|
|
84
|
-
}) :
|
|
88
|
+
}) : XoteJSX$Xote.jsx(XoteJSX$Xote.jsxFragment, {})
|
|
85
89
|
])
|
|
86
90
|
});
|
|
87
91
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as
|
|
3
|
+
import * as XoteJSX$Xote from "xote/src/XoteJSX.res.mjs";
|
|
4
4
|
|
|
5
5
|
import './Basefn__Skeleton.css'
|
|
6
6
|
;
|
|
@@ -46,7 +46,7 @@ function Basefn__Skeleton(props) {
|
|
|
46
46
|
let heightStyle = height !== undefined ? "height: " + height + ";" : "";
|
|
47
47
|
return widthStyle + heightStyle;
|
|
48
48
|
};
|
|
49
|
-
return
|
|
49
|
+
return XoteJSX$Xote.Elements.jsx("div", {
|
|
50
50
|
class: getClassName(),
|
|
51
51
|
style: getStyle()
|
|
52
52
|
});
|
|
@@ -31,12 +31,12 @@ let make = (
|
|
|
31
31
|
<div class="basefn-slider__header">
|
|
32
32
|
{switch label {
|
|
33
33
|
| Some(labelText) =>
|
|
34
|
-
<span class="basefn-slider__label"> {
|
|
34
|
+
<span class="basefn-slider__label"> {Node.text(labelText)} </span>
|
|
35
35
|
| None => <> </>
|
|
36
36
|
}}
|
|
37
37
|
{showValue
|
|
38
38
|
? <span class="basefn-slider__value">
|
|
39
|
-
{
|
|
39
|
+
{Node.signalText(() => Float.toString(Signal.get(value)))}
|
|
40
40
|
</span>
|
|
41
41
|
: <> </>}
|
|
42
42
|
</div>
|
|
@@ -57,9 +57,9 @@ let make = (
|
|
|
57
57
|
<div class="basefn-slider__markers">
|
|
58
58
|
{markerLabels
|
|
59
59
|
->Array.map(marker => {
|
|
60
|
-
<span class="basefn-slider__marker"> {
|
|
60
|
+
<span class="basefn-slider__marker"> {Node.text(marker)} </span>
|
|
61
61
|
})
|
|
62
|
-
->
|
|
62
|
+
->Node.fragment}
|
|
63
63
|
</div>
|
|
64
64
|
| None => <> </>
|
|
65
65
|
}}
|