@octane-xplat/ui 0.2.1 → 0.3.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.
Files changed (94) hide show
  1. package/dist/native/octane-client-build.json +1 -1
  2. package/dist/native/ui.js +40 -19
  3. package/dist/native/ui10.js +19 -48
  4. package/dist/native/ui11.js +118 -56
  5. package/dist/native/ui12.js +114 -16
  6. package/dist/native/ui13.js +54 -18
  7. package/dist/native/ui14.js +76 -13
  8. package/dist/native/ui15.js +128 -18
  9. package/dist/native/ui16.js +48 -136
  10. package/dist/native/ui17.js +42 -19
  11. package/dist/native/ui18.js +50 -9
  12. package/dist/native/ui19.js +34 -12
  13. package/dist/native/ui2.js +10 -48
  14. package/dist/native/ui20.js +17 -0
  15. package/dist/native/ui21.js +93 -0
  16. package/dist/native/ui22.js +124 -0
  17. package/dist/native/ui23.js +103 -0
  18. package/dist/native/ui24.js +58 -0
  19. package/dist/native/ui25.js +19 -0
  20. package/dist/native/ui26.js +27 -0
  21. package/dist/native/ui27.js +35 -0
  22. package/dist/native/ui28.js +146 -0
  23. package/dist/native/ui29.js +28 -0
  24. package/dist/native/ui3.js +17 -20
  25. package/dist/native/ui30.js +35 -0
  26. package/dist/native/ui31.js +39 -0
  27. package/dist/native/ui32.js +70 -0
  28. package/dist/native/ui33.js +30 -0
  29. package/dist/native/ui34.js +10 -0
  30. package/dist/native/ui35.js +27 -0
  31. package/dist/native/ui36.js +34 -0
  32. package/dist/native/ui37.js +17 -0
  33. package/dist/native/ui38.js +68 -0
  34. package/dist/native/ui39.js +33 -0
  35. package/dist/native/ui4.js +21 -48
  36. package/dist/native/ui40.js +14 -0
  37. package/dist/native/ui41.js +104 -0
  38. package/dist/native/ui42.js +148 -0
  39. package/dist/native/ui43.js +22 -0
  40. package/dist/native/ui44.js +8 -0
  41. package/dist/native/ui5.js +70 -27
  42. package/dist/native/ui6.js +36 -20
  43. package/dist/native/ui7.js +24 -61
  44. package/dist/native/ui8.js +16 -18
  45. package/dist/native/ui9.js +16 -13
  46. package/dist/web/octane-client-build.json +1 -1
  47. package/dist/web/ui.js +40 -19
  48. package/dist/web/ui10.js +187 -31
  49. package/dist/web/ui11.js +419 -53
  50. package/dist/web/ui12.js +83 -15
  51. package/dist/web/ui13.js +107 -19
  52. package/dist/web/ui14.js +98 -18
  53. package/dist/web/ui15.js +83 -47
  54. package/dist/web/ui16.js +100 -93
  55. package/dist/web/ui17.js +36 -22
  56. package/dist/web/ui18.js +29 -15
  57. package/dist/web/ui19.js +9 -7
  58. package/dist/web/ui2.js +15 -103
  59. package/dist/web/ui20.js +114 -0
  60. package/dist/web/ui21.js +82 -0
  61. package/dist/web/ui22.js +68 -0
  62. package/dist/web/ui23.js +57 -0
  63. package/dist/web/ui24.js +16 -0
  64. package/dist/web/ui25.js +22 -0
  65. package/dist/web/ui26.js +39 -0
  66. package/dist/web/ui27.js +127 -0
  67. package/dist/web/ui28.js +112 -0
  68. package/dist/web/ui29.js +108 -0
  69. package/dist/web/ui3.js +19 -27
  70. package/dist/web/ui30.js +43 -0
  71. package/dist/web/ui31.js +42 -0
  72. package/dist/web/ui32.js +77 -0
  73. package/dist/web/ui33.js +43 -0
  74. package/dist/web/ui34.js +67 -0
  75. package/dist/web/ui35.js +9 -0
  76. package/dist/web/ui36.js +45 -0
  77. package/dist/web/ui37.js +47 -0
  78. package/dist/web/ui38.js +17 -0
  79. package/dist/web/ui39.js +100 -0
  80. package/dist/web/ui4.js +145 -17
  81. package/dist/web/ui40.js +41 -0
  82. package/dist/web/ui41.js +17 -0
  83. package/dist/web/ui42.js +9 -0
  84. package/dist/web/ui43.js +22 -0
  85. package/dist/web/ui44.js +8 -0
  86. package/dist/web/ui5.js +54 -52
  87. package/dist/web/ui6.js +43 -16
  88. package/dist/web/ui7.js +29 -46
  89. package/dist/web/ui8.js +29 -18
  90. package/dist/web/ui9.js +24 -16
  91. package/package.json +6 -3
  92. package/src/theme/tokens.css +166 -0
  93. package/types/index.d.ts +108 -1
  94. package/types/props.d.ts +333 -8
package/dist/web/ui16.js CHANGED
@@ -1,101 +1,108 @@
1
- import { useRoute } from "./ui15.js";
2
- import { __s, bag3, bag4, bag9, child, clone, delegateEvents, forBlock, hookSlots, ifBlock, setEventHandler, setStyle, sibling, template, useState, withSlot } from "octane";
3
- import { bindSignalAttribute, bindSignalChild, childTextHoleUpdate, enableSignalBindings, updateFreshClassName } from "octane/internal/client";
4
- //#region src/Tabs.web.tsrx
1
+ import { applyEscapeProps } from "./ui2.js";
2
+ import { layoutChildProps } from "./ui3.js";
3
+ import { __s, bag8, clone, snapshotSpread, template } from "octane";
4
+ import { bindSignalHostPropSources, enableSignalBindings } from "octane/internal/client";
5
+ //#region src/Image.web.tsrx
5
6
  enableSignalBindings(1, true);
6
- delegateEvents(["click"]);
7
- var _t$0 = /* @__PURE__ */ template("<div class=\"vx-route\"></div>");
8
- var _t$1 = /* @__PURE__ */ template("<button></button>");
9
- var _t$2 = /* @__PURE__ */ template("<div><div class=\"vx-tabbar\"><!></div><div class=\"vx-tabpane\"></div></div>");
10
- var _hs$ = /* @__PURE__ */ hookSlots(4);
11
- var _h$1 = /* @__PURE__ */ Symbol(_hs$ + 1);
12
- var _h$2 = /* @__PURE__ */ Symbol(_hs$ + 2);
13
- function __then$0(__props, __s, __extra) {
14
- const props = __extra[2];
15
- const rootRoute = __extra[3];
7
+ var _t$0 = /* @__PURE__ */ template("<img/>");
8
+ var _rm$0 = [
9
+ "s",
10
+ "h",
11
+ "g"
12
+ ];
13
+ var Image = /* @__PURE__ */ __s(function Image(props, __s, __extra) {
16
14
  let _b = __s.slots[0];
17
15
  if (_b === void 0) {
18
- let _m0;
16
+ let _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7;
19
17
  const _root = clone(_t$0);
20
- _m0 = _root;
21
- _b = bag3(__s, _root, _m0, null, void 0);
22
- }
23
- {
24
- const _v = props.resolveScreen(rootRoute.name, rootRoute.params);
25
- _b.b = childTextHoleUpdate(__s, 1, _b.a, _v, _b.b, _b.c);
26
- _b.c = _v;
27
- }
28
- }
29
- var _key$3 = (t) => t.title;
30
- function __item$4(t, __s, __extra) {
31
- const active = __extra[0];
32
- const props = __extra[1];
33
- const setInternal = __extra[2];
34
- let _b = __s.slots[0];
35
- if (_b === void 0) {
36
- let _m1;
37
- const _root = clone(_t$1);
38
- _m1 = _root;
39
- setEventHandler(_root, "$$click", () => {
40
- const i = props.tabs.indexOf(t);
41
- setInternal(i);
42
- props.onSelectedIndexChanged?.(i);
43
- });
44
- _b = bag4(__s, _root, void 0, _m1, null, void 0);
45
- } else setEventHandler(_b.b, "$$click", () => {
46
- const i = props.tabs.indexOf(t);
47
- setInternal(i);
48
- props.onSelectedIndexChanged?.(i);
49
- });
50
- _b.a = updateFreshClassName(["vx-tab", active === props.tabs.indexOf(t) ? "active" : ""], _b.a, _b.b);
51
- _b.e = bindSignalChild(__s, _b.e, 1, _b.b, t.title, "b:6a83ceed", null, void 0, void 0, void 0, true);
52
- }
53
- function __else$2(__props, __s, __extra) {
54
- const active = __extra[0];
55
- const paneRoute = __extra[1];
56
- const props = __extra[2];
57
- const setInternal = __extra[4];
58
- let _b = __s.slots[0];
59
- if (_b === void 0) {
60
- let _m1, _m4, _m5, _m6;
61
- const _root = clone(_t$2);
62
- _m1 = _root;
63
- const _el0 = child(_root);
64
- _m4 = _el0;
65
- _m5 = child(_el0);
66
- _m6 = sibling(_el0, 1);
67
- _b = bag9(__s, _root, void 0, _m1, void 0, void 0, _m4, _m5, _m6, null, void 0);
68
- }
69
- _b.a = bindSignalAttribute(__s, _b.a, _b.b, "id", props.id, "b:dd012c22", "attr");
70
- _b.c = updateFreshClassName(["vx-tabs", props.className], _b.c, _b.b);
71
- {
72
- const _v = props.style;
73
- if (_b.d !== _v) {
74
- setStyle(_b.b, _v, _b.d);
75
- _b.d = _v;
18
+ _m0 = (e) => applyEscapeProps(e, props);
19
+ _m1 = props.id;
20
+ _m2 = props.className;
21
+ _m3 = snapshotSpread(layoutChildProps(props));
22
+ _m4 = props.src;
23
+ _m5 = props.alt;
24
+ _m6 = _root;
25
+ _m7 = bindSignalHostPropSources(__s, void 0, _root, [
26
+ [
27
+ false,
28
+ "ref",
29
+ _m0
30
+ ],
31
+ [
32
+ false,
33
+ "id",
34
+ _m1
35
+ ],
36
+ [
37
+ false,
38
+ "className",
39
+ _m2
40
+ ],
41
+ [true, _m3],
42
+ [
43
+ false,
44
+ "src",
45
+ _m4
46
+ ],
47
+ [
48
+ false,
49
+ "alt",
50
+ _m5
51
+ ]
52
+ ], "b:ed5f7791", false);
53
+ _b = bag8(__s, _root, _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7);
54
+ __s.refFields = _rm$0;
55
+ } else {
56
+ {
57
+ const _v = (e) => applyEscapeProps(e, props);
58
+ if (_b.a !== _v) _b.a = _v;
59
+ }
60
+ {
61
+ const _v = props.id;
62
+ if (_b.b !== _v) _b.b = _v;
63
+ }
64
+ {
65
+ const _v = props.className;
66
+ if (_b.c !== _v) _b.c = _v;
67
+ }
68
+ _b.d = snapshotSpread(layoutChildProps(props));
69
+ {
70
+ const _v = props.src;
71
+ if (_b.e !== _v) _b.e = _v;
72
+ }
73
+ {
74
+ const _v = props.alt;
75
+ if (_b.f !== _v) _b.f = _v;
76
76
  }
77
+ _b.h = bindSignalHostPropSources(__s, _b.h, _b.g, [
78
+ [
79
+ false,
80
+ "ref",
81
+ _b.a
82
+ ],
83
+ [
84
+ false,
85
+ "id",
86
+ _b.b
87
+ ],
88
+ [
89
+ false,
90
+ "className",
91
+ _b.c
92
+ ],
93
+ [true, _b.d],
94
+ [
95
+ false,
96
+ "src",
97
+ _b.e
98
+ ],
99
+ [
100
+ false,
101
+ "alt",
102
+ _b.f
103
+ ]
104
+ ], "b:ed5f7791", false);
77
105
  }
78
- forBlock(__s, 1, _b.e, props.tabs, _key$3, __item$4, 26, [
79
- active,
80
- props,
81
- setInternal
82
- ], null, _b.f, true);
83
- _b.j = bindSignalChild(__s, _b.j, 2, _b.g, paneRoute && props.resolveScreen ? props.resolveScreen(paneRoute.name, paneRoute.params) : props.tabs[active]?.render(), "b:945751f6", null, void 0, void 0, void 0, true);
84
- }
85
- var Tabs = /* @__PURE__ */ __s(function Tabs(props, __s, __extra) {
86
- const __block = __s.block;
87
- const [internal, setInternal] = useState(0, _hs$ + 0);
88
- const active = props.selectedIndex ?? internal;
89
- const rootRoute = withSlot(_h$1, useRoute, "root");
90
- const paneRoute = withSlot(_h$2, useRoute, props.tabs[active]?.stack ?? "");
91
- if (__s.block.pending && !__s.block.crossRenderUpdate) return;
92
- ifBlock(__s, 0, __block.parentNode, rootRoute && props.resolveScreen, __then$0, __else$2, __block.endMarker, [
93
- active,
94
- paneRoute,
95
- props,
96
- rootRoute,
97
- setInternal
98
- ]);
99
106
  });
100
107
  //#endregion
101
- export { Tabs };
108
+ export { Image };
package/dist/web/ui17.js CHANGED
@@ -1,31 +1,45 @@
1
- import { __s, bag5, clone, delegateEvents, setEventHandler, setStyle, template } from "octane";
2
- import { bindSignalAttribute, bindSignalChecked, enableSignalBindings, updateFreshClassName } from "octane/internal/client";
3
- //#region src/Switch.web.tsrx
1
+ import { __s, bag5, clone, createElement, delegateEvents, hookSlots, queueRefAttach, queueRefDetach, setEventHandler, template, useEffect, useMemo, useRef } from "octane";
2
+ import { bindSignalChild, enableSignalBindings, replaceRef, setClassNameIfChanged } from "octane/internal/client";
3
+ //#region src/Modal.web.tsrx
4
4
  enableSignalBindings(1, true);
5
- delegateEvents(["change"]);
6
- var _t$0 = /* @__PURE__ */ template("<input type=\"checkbox\" data-octane-input=\"i:86e2d28a\"/>");
7
- var Switch = /* @__PURE__ */ __s(function Switch(props, __s, __extra) {
5
+ delegateEvents(["close"]);
6
+ var _t$0 = /* @__PURE__ */ template("<dialog></dialog>");
7
+ var _hs$ = /* @__PURE__ */ hookSlots(3);
8
+ var _rm$1 = [
9
+ "r",
10
+ "b",
11
+ "a"
12
+ ];
13
+ var Modal = /* @__PURE__ */ __s(function Modal(props, __s, __extra) {
14
+ const el = useRef(null, _hs$ + 0);
15
+ const content = useMemo(() => props.component ? createElement(props.component, props.params ?? {}) : props.children, [props], _hs$ + 1);
16
+ const presentation = props.presentation;
17
+ const className = presentation === "sheet" ? "vx-modal vx-modal--sheet" : presentation === "dialog" ? "vx-modal vx-modal--dialog" : presentation === "fullscreen" || !presentation && props.fullscreen ? "vx-modal vx-modal--fullscreen" : "vx-modal";
18
+ useEffect(() => {
19
+ const d = el.current;
20
+ if (!d) return;
21
+ if (props.open && !d.open) d.showModal();
22
+ else if (!props.open && d.open) d.close();
23
+ }, [props.open], _hs$ + 2);
24
+ if (__s.block.pending && !__s.block.crossRenderUpdate) return;
8
25
  let _b = __s.slots[0];
9
26
  if (_b === void 0) {
10
- let _m1, _m4;
27
+ let _m0, _m1;
11
28
  const _root = clone(_t$0);
12
- _m1 = _root;
13
- _m4 = bindSignalChecked(__s, void 0, _root, props.checked, "i:86e2d28a");
14
- setEventHandler(_root, "$$change", (e) => props.onCheckedChange?.(e.target.checked));
15
- _b = bag5(__s, _root, void 0, _m1, void 0, void 0, _m4);
29
+ queueRefAttach(__s, _m1 = el, _m0 = _root);
30
+ (__s.cleanups ??= []).push(() => _b && queueRefDetach(_b.b, _b.a));
31
+ setEventHandler(_root, "$$close", () => props.onClose?.());
32
+ _b = bag5(__s, _root, _m0, _m1, void 0, null, void 0);
33
+ __s.refFields = _rm$1;
16
34
  } else {
17
- _b.e = bindSignalChecked(__s, _b.e, _b.b, props.checked, "i:86e2d28a");
18
- setEventHandler(_b.b, "$$change", (e) => props.onCheckedChange?.(e.target.checked));
19
- }
20
- _b.a = bindSignalAttribute(__s, _b.a, _b.b, "id", props.id, "b:c6de5afb", "attr");
21
- _b.c = updateFreshClassName(["vx-switch", props.className], _b.c, _b.b);
22
- {
23
- const _v = props.style;
24
- if (_b.d !== _v) {
25
- setStyle(_b.b, _v, _b.d);
26
- _b.d = _v;
35
+ {
36
+ const _r = el;
37
+ if (_r !== _b.b) _b.b = replaceRef(__s, _b.b, _r, _b.a);
27
38
  }
39
+ setEventHandler(_b.a, "$$close", () => props.onClose?.());
28
40
  }
41
+ _b.c = setClassNameIfChanged(className, _b.c, _b.a);
42
+ _b.f = bindSignalChild(__s, _b.f, 1, _b.a, content, "b:386c9c7e", null, void 0, void 0, void 0, true);
29
43
  });
30
44
  //#endregion
31
- export { Switch };
45
+ export { Modal };
package/dist/web/ui18.js CHANGED
@@ -1,17 +1,31 @@
1
- import { __s, bag2, clone, template } from "octane";
2
- import { bindSignalAttribute, enableSignalBindings } from "octane/internal/client";
3
- //#region src/PlatformBadge.web.tsrx
4
- enableSignalBindings(1, true);
5
- var _t$0 = /* @__PURE__ */ template("<span>web</span>");
6
- var PlatformBadge = /* @__PURE__ */ __s(function PlatformBadge(props, __s, __extra) {
7
- let _b = __s.slots[0];
8
- if (_b === void 0) {
9
- let _m1;
10
- const _root = clone(_t$0);
11
- _m1 = _root;
12
- _b = bag2(__s, _root, void 0, _m1);
13
- }
14
- _b.a = bindSignalAttribute(__s, _b.a, _b.b, "class", props.className, "b:f3cb9a4b", "class");
1
+ import { createRoot } from "octane";
2
+ //#region src/modal-service.web.ts
3
+ /** Open a component in a document-level dialog and resolve with close(value). */
4
+ var openModal = (Component, params, options = {}) => new Promise((resolve) => {
5
+ const dialog = document.createElement("dialog");
6
+ dialog.className = options.presentation === "sheet" ? "vx-modal vx-modal--sheet" : options.presentation === "dialog" ? "vx-modal vx-modal--dialog" : options.presentation === "fullscreen" || !options.presentation && options.fullscreen ? "vx-modal vx-modal--fullscreen" : "vx-modal";
7
+ document.body.appendChild(dialog);
8
+ const root = createRoot(dialog);
9
+ let finished = false;
10
+ const finish = (result) => {
11
+ if (finished) return;
12
+ finished = true;
13
+ root.unmount();
14
+ dialog.remove();
15
+ resolve(result);
16
+ };
17
+ const close = (result) => {
18
+ if (finished) return;
19
+ if (dialog.open) dialog.close();
20
+ finish(result);
21
+ };
22
+ dialog.addEventListener("close", () => finish());
23
+ dialog.addEventListener("cancel", () => finish());
24
+ root.render(Component, {
25
+ params,
26
+ close
27
+ });
28
+ dialog.showModal();
15
29
  });
16
30
  //#endregion
17
- export { PlatformBadge };
31
+ export { openModal };
package/dist/web/ui19.js CHANGED
@@ -1,9 +1,11 @@
1
- //#region src/stacks.web.ts
2
- /** Web twin — one linear URL stack; named stacks don't apply. */
3
- function registerStack(_name, _frame) {}
4
- function getStack(_name) {}
5
- function stackEntries() {
6
- return [].values();
1
+ //#region src/cx.ts
2
+ /** NS `className` splits on ' ' only, and the universal driver applies the
3
+ * prop via `String(value)` — an array would arrive comma-joined and match
4
+ * no class at all. Native leaves normalize through cx() before handing
5
+ * className to an intrinsic. (The DOM renderer already flattens arrays,
6
+ * so web leaves don't need this.) */
7
+ function cx(...parts) {
8
+ return parts.flat(Infinity).filter(Boolean).join(" ");
7
9
  }
8
10
  //#endregion
9
- export { getStack, registerStack, stackEntries };
11
+ export { cx };
package/dist/web/ui2.js CHANGED
@@ -1,105 +1,17 @@
1
- import { __s, bag7, clone, hookSlots, queueRefAttach, queueRefDetach, setStyle, template, useEffect, useRef } from "octane";
2
- import { bindSignalAttribute, bindSignalChild, enableSignalBindings, replaceRef, updateFreshClassName } from "octane/internal/client";
3
- //#region src/View.web.tsrx
4
- enableSignalBindings(1, true);
5
- var _t$0 = /* @__PURE__ */ template("<div></div>");
6
- var _hs$ = /* @__PURE__ */ hookSlots(2);
7
- var _rm$1 = [
8
- "r",
9
- "c",
10
- "b"
11
- ];
12
- var View = /* @__PURE__ */ __s(function View(props, __s, __extra) {
13
- const el = useRef(null, _hs$ + 0);
14
- useEffect(() => {
15
- const node = el.current;
16
- const cb = props.onPan;
17
- if (!node || !cb) return;
18
- let sx = 0, sy = 0, active = false, last = 0, lx = 0, t0 = 0;
19
- const emit = (e, state) => {
20
- const now = performance.now();
21
- const dt = Math.max(now - t0, 1) / 1e3;
22
- const vx = (e.clientX - lx) / dt;
23
- const vy = (e.clientY - last) / dt;
24
- lx = e.clientX;
25
- last = e.clientY;
26
- t0 = now;
27
- cb({
28
- x: e.clientX - sx,
29
- y: e.clientY - sy,
30
- dx: e.clientX - sx,
31
- dy: e.clientY - sy,
32
- vx,
33
- vy,
34
- state,
35
- target: node
36
- });
37
- };
38
- const down = (e) => {
39
- active = true;
40
- sx = e.clientX;
41
- sy = e.clientY;
42
- t0 = performance.now();
43
- lx = sx;
44
- last = sy;
45
- node.setPointerCapture?.(e.pointerId);
46
- emit(e, "began");
47
- };
48
- const move = (e) => {
49
- if (active) emit(e, "moved");
50
- };
51
- const up = (e) => {
52
- if (active) {
53
- active = false;
54
- emit(e, "ended");
55
- }
56
- };
57
- const cancel = (e) => {
58
- if (active) {
59
- active = false;
60
- emit(e, "cancelled");
61
- }
62
- };
63
- node.addEventListener("pointerdown", down);
64
- node.addEventListener("pointermove", move);
65
- node.addEventListener("pointerup", up);
66
- node.addEventListener("pointercancel", cancel);
67
- return () => {
68
- node.removeEventListener("pointerdown", down);
69
- node.removeEventListener("pointermove", move);
70
- node.removeEventListener("pointerup", up);
71
- node.removeEventListener("pointercancel", cancel);
72
- };
73
- }, [props.onPan], _hs$ + 1);
74
- let _b = __s.slots[0];
75
- if (_b === void 0) {
76
- let _m1, _m2;
77
- const _root = clone(_t$0);
78
- _m1 = _root;
79
- queueRefAttach(__s, _m2 = (e) => {
80
- el.current = e;
81
- props.bind?.(e);
82
- }, _m1);
83
- (__s.cleanups ??= []).push(() => _b && queueRefDetach(_b.c, _b.b));
84
- _b = bag7(__s, _root, void 0, _m1, _m2, void 0, void 0, null, void 0);
85
- __s.refFields = _rm$1;
86
- } else {
87
- const _r = (e) => {
88
- el.current = e;
89
- props.bind?.(e);
90
- };
91
- if (_r !== _b.c) _b.c = replaceRef(__s, _b.c, _r, _b.b);
1
+ //#region src/escape-props.web.ts
2
+ /** Apply DOM escape props after the primitive's own props. Dash-named keys
3
+ * are attributes; other keys use the DOM property where available. */
4
+ function applyEscapeProps(element, props) {
5
+ if (!element || !props.web) return;
6
+ for (const [key, value] of Object.entries(props.web)) if (key.includes("-")) {
7
+ if (value == null || value === false) element.removeAttribute(key);
8
+ else element.setAttribute(key, value === true ? "" : String(value));
9
+ } else if (key in element) try {
10
+ element[key] = value;
11
+ } catch {
12
+ element.setAttribute(key, String(value));
92
13
  }
93
- _b.a = bindSignalAttribute(__s, _b.a, _b.b, "id", props.id, "b:82d7ce4a", "attr");
94
- _b.d = updateFreshClassName(["vx-view", props.className], _b.d, _b.b);
95
- {
96
- const _v = props.style;
97
- if (_b.e !== _v) {
98
- setStyle(_b.b, _v, _b.e);
99
- _b.e = _v;
100
- }
101
- }
102
- _b.h = bindSignalChild(__s, _b.h, 1, _b.b, props.children, "b:f8e3deeb", null, void 0, void 0, void 0, true);
103
- });
14
+ else if (value != null) element.setAttribute(key, String(value));
15
+ }
104
16
  //#endregion
105
- export { View };
17
+ export { applyEscapeProps };
@@ -0,0 +1,114 @@
1
+ import { cx } from "./ui19.js";
2
+ import { bag1, bag2, bag9, child, clone, delegateEvents, drainFrag, ifBlock, markDangerouslySetInnerHTMLChildren, portal, setEventHandler, sibling, snapshotSpread, template } from "octane";
3
+ import { bindSignalChild, bindSignalHostPropSources, enableSignalBindings } from "octane/internal/client";
4
+ //#region src/Overlay.web.tsrx
5
+ enableSignalBindings(1, true);
6
+ delegateEvents(["click"]);
7
+ var _t$0 = /* @__PURE__ */ template("<div class=\"vx-overlay-shade\"></div>");
8
+ var _t$1 = /* @__PURE__ */ template("<div><!><div class=\"vx-overlay-content\"></div></div>");
9
+ var _t$2 = /* @__PURE__ */ template("<!>", 0, 1);
10
+ function __then$2(__props, __s, __extra) {
11
+ const props = __extra[0];
12
+ let _b = __s.slots[0];
13
+ if (_b === void 0) {
14
+ let _m0;
15
+ const _root = clone(_t$0);
16
+ _m0 = _root;
17
+ setEventHandler(_root, "$$click", props.onDismiss);
18
+ _b = bag1(__s, _root, _m0);
19
+ } else setEventHandler(_b.a, "$$click", props.onDismiss);
20
+ }
21
+ var _rm$5 = [
22
+ "s",
23
+ "e",
24
+ "d"
25
+ ];
26
+ function __portal$1(__props, __s, __extra) {
27
+ const props = __extra[0];
28
+ let _b = __s.slots[0];
29
+ if (_b === void 0) {
30
+ let _m0, _m1, _m2, _m3, _m4, _m5, _m6;
31
+ const _root = clone(_t$1);
32
+ _m0 = cx("vx-overlay", props.className);
33
+ _m1 = {
34
+ ...props.style,
35
+ position: "fixed",
36
+ inset: 0
37
+ };
38
+ _m2 = snapshotSpread(props.web);
39
+ _m3 = _root;
40
+ _m4 = bindSignalHostPropSources(__s, void 0, _root, [
41
+ [
42
+ false,
43
+ "className",
44
+ _m0
45
+ ],
46
+ [
47
+ false,
48
+ "style",
49
+ _m1
50
+ ],
51
+ [true, _m2]
52
+ ], "b:4cb93a35", true);
53
+ const _el0 = sibling(child(_root), 1);
54
+ _m5 = _el0;
55
+ setEventHandler(_el0, "$$click", (event) => event.stopPropagation());
56
+ markDangerouslySetInnerHTMLChildren(_root);
57
+ _m6 = child(_root);
58
+ _b = bag9(__s, _root, _m0, _m1, _m2, _m3, _m4, _m5, _m6, null, void 0);
59
+ __s.refFields = _rm$5;
60
+ } else {
61
+ {
62
+ const _v = cx("vx-overlay", props.className);
63
+ if (_b.a !== _v) _b.a = _v;
64
+ }
65
+ {
66
+ const _v = {
67
+ ...props.style,
68
+ position: "fixed",
69
+ inset: 0
70
+ };
71
+ if (_b.b !== _v) _b.b = _v;
72
+ }
73
+ _b.c = snapshotSpread(props.web);
74
+ _b.e = bindSignalHostPropSources(__s, _b.e, _b.d, [
75
+ [
76
+ false,
77
+ "className",
78
+ _b.a
79
+ ],
80
+ [
81
+ false,
82
+ "style",
83
+ _b.b
84
+ ],
85
+ [true, _b.c]
86
+ ], "b:4cb93a35", true);
87
+ setEventHandler(_b.f, "$$click", (event) => event.stopPropagation());
88
+ }
89
+ ifBlock(__s, 1, _b.d, props.shadeCover, __then$2, null, _b.g, __extra);
90
+ _b.j = bindSignalChild(__s, _b.j, 2, _b.f, props.children, "b:69179142", null, void 0, void 0, void 0, true);
91
+ }
92
+ function __then$0(__props, __s, __extra) {
93
+ const __block = __s.block;
94
+ const props = __extra[0];
95
+ let _b = __s.slots[0];
96
+ if (_b === void 0) {
97
+ let _m0, _m1;
98
+ const _root = clone(_t$2);
99
+ _m0 = __block.parentNode;
100
+ _m1 = child(_root);
101
+ drainFrag(_root, __block.parentNode, __block.endMarker);
102
+ _b = bag2(__s, null, _m0, _m1);
103
+ }
104
+ portal(__s, 1, document.body, __portal$1, void 0, _b.a, [props], void 0, _b.b);
105
+ }
106
+ var Overlay = function Overlay(props, __s, __extra) {
107
+ const __block = __s.block;
108
+ {
109
+ const __ifCondition = props.open;
110
+ ifBlock(__s, 0, __block.parentNode, __ifCondition, __then$0, null, __block.endMarker, __ifCondition ? [props] : void 0);
111
+ }
112
+ };
113
+ //#endregion
114
+ export { Overlay };
@@ -0,0 +1,82 @@
1
+ import { cx } from "./ui19.js";
2
+ import { bag4, child, clone, createPortal, createScopedElement, createScopedValue, drainFrag, hookSlots, ifBlock, template, useEffect, useState } from "octane";
3
+ import { textHoleUpdate } from "octane/internal/client";
4
+ //#region src/Popover.web.tsrx
5
+ var _t$0 = /* @__PURE__ */ template("<!>", 0, 1);
6
+ var _hs$ = /* @__PURE__ */ hookSlots(2);
7
+ function __then$0(__props, __s, __extra) {
8
+ const __block = __s.block;
9
+ const position = __extra[0];
10
+ const props = __extra[1];
11
+ let _b = __s.slots[0];
12
+ if (_b === void 0) {
13
+ let _m0, _m1;
14
+ const _root = clone(_t$0);
15
+ _m0 = __block.parentNode;
16
+ _m1 = child(_root);
17
+ drainFrag(_root, __block.parentNode, __block.endMarker);
18
+ _b = bag4(__s, null, _m0, _m1, null, void 0);
19
+ }
20
+ {
21
+ const _v = createPortal(createScopedValue(() => createScopedElement("div", {
22
+ className: cx("vx-popover", props.className),
23
+ style: {
24
+ ...props.style,
25
+ position: "fixed",
26
+ top: position.top,
27
+ left: position.left,
28
+ transform: props.placement === "top" ? "translateY(-100%)" : props.placement === "left" ? "translateX(-100%)" : void 0
29
+ },
30
+ ...props.web
31
+ }, () => props.children)), document.body);
32
+ _b.c = textHoleUpdate(__s, 1, _b.a, _v, _b.c, _b.d, _b.b, true, true);
33
+ _b.d = _v;
34
+ }
35
+ }
36
+ var Popover = function Popover(props, __s, __extra) {
37
+ const __block = __s.block;
38
+ const [position, setPosition] = useState(null, _hs$ + 0);
39
+ const anchor = props.anchor?.current ?? props.anchor;
40
+ useEffect(() => {
41
+ if (!props.open || !anchor?.getBoundingClientRect) {
42
+ setPosition(null);
43
+ return;
44
+ }
45
+ const update = () => {
46
+ const rect = anchor.getBoundingClientRect();
47
+ const gap = 8;
48
+ let top = rect.bottom + gap;
49
+ let left = rect.left;
50
+ if (props.placement === "top") top = rect.top - gap;
51
+ if (props.placement === "left") {
52
+ top = rect.top;
53
+ left = rect.left - gap;
54
+ }
55
+ if (props.placement === "right") {
56
+ top = rect.top;
57
+ left = rect.right + gap;
58
+ }
59
+ setPosition({
60
+ top,
61
+ left
62
+ });
63
+ };
64
+ update();
65
+ window.addEventListener("resize", update);
66
+ window.addEventListener("scroll", update, true);
67
+ return () => {
68
+ window.removeEventListener("resize", update);
69
+ window.removeEventListener("scroll", update, true);
70
+ };
71
+ }, [
72
+ props.open,
73
+ anchor,
74
+ props.placement
75
+ ], _hs$ + 1);
76
+ {
77
+ const __ifCondition = props.open && position;
78
+ ifBlock(__s, 0, __block.parentNode, __ifCondition, __then$0, null, __block.endMarker, __ifCondition ? [position, props] : void 0);
79
+ }
80
+ };
81
+ //#endregion
82
+ export { Popover };