@plitzi/sdk-elements 0.37.2 → 0.37.3

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 (158) hide show
  1. package/CHANGELOG.md +1155 -0
  2. package/dist/Component/ComponentProvider.mjs +10 -5
  3. package/dist/Element/JsxManager.mjs +1 -0
  4. package/dist/Element/PluginRemote.d.ts +3 -1
  5. package/dist/Element/PluginRemote.mjs +9 -9
  6. package/dist/Element/helpers/elementConstants.mjs +28 -0
  7. package/dist/Element/helpers/elementUtils.mjs +1 -1
  8. package/dist/Element/helpers/loadComponent.d.ts +6 -1
  9. package/dist/Element/helpers/loadComponent.mjs +7 -7
  10. package/dist/Element/helpers/pluginSelector.mjs +1 -0
  11. package/dist/Element/hooks/useElementDataSource.mjs +23 -16
  12. package/dist/Element/hooks/useElementInternal.mjs +60 -52
  13. package/dist/Element/hooks/useInternalClassName.mjs +19 -18
  14. package/dist/Element/hooks/useKeyTriggers.d.ts +18 -0
  15. package/dist/Element/hooks/useKeyTriggers.mjs +36 -0
  16. package/dist/Element/hooks/useRootElementInteractions.mjs +65 -56
  17. package/dist/Element/hooks/useRscData.mjs +20 -15
  18. package/dist/dataSource/GlobalSources.mjs +114 -80
  19. package/dist/dataSource/getSourcesByElementId.mjs +2 -2
  20. package/dist/elements/advanced/BlockJsx/BlockJsx.mjs +1 -1
  21. package/dist/elements/advanced/NodeHtml/declaration.d.ts +1 -1
  22. package/dist/elements/advanced/NodeHtml/index.d.ts +1 -1
  23. package/dist/elements/basic/Button/Button.d.ts +10 -3
  24. package/dist/elements/basic/Button/Button.mjs +5 -5
  25. package/dist/elements/basic/Button/Settings.d.ts +2 -1
  26. package/dist/elements/basic/Button/Settings.mjs +14 -7
  27. package/dist/elements/basic/Button/declaration.d.ts +8 -3
  28. package/dist/elements/basic/Button/declaration.mjs +14 -6
  29. package/dist/elements/basic/Button/index.d.ts +8 -3
  30. package/dist/elements/basic/Dropdown/Dropdown.mjs +48 -39
  31. package/dist/elements/basic/Dropdown/declaration.d.ts +3 -0
  32. package/dist/elements/basic/Dropdown/declaration.mjs +9 -3
  33. package/dist/elements/basic/Dropdown/index.d.ts +3 -0
  34. package/dist/elements/basic/Dropdown/useDropdown.d.ts +6 -1
  35. package/dist/elements/basic/Dropdown/useDropdown.mjs +58 -41
  36. package/dist/elements/basic/Dropdown/useDropdownTrigger.d.ts +26 -0
  37. package/dist/elements/basic/Dropdown/useDropdownTrigger.mjs +30 -0
  38. package/dist/elements/basic/Heading/declaration.d.ts +9 -6
  39. package/dist/elements/basic/Heading/declaration.mjs +17 -9
  40. package/dist/elements/basic/Heading/index.d.ts +9 -6
  41. package/dist/elements/basic/Link/Link.mjs +4 -1
  42. package/dist/elements/basic/Link/Settings.d.ts +2 -1
  43. package/dist/elements/basic/Link/Settings.mjs +31 -24
  44. package/dist/elements/basic/Link/declaration.d.ts +5 -1
  45. package/dist/elements/basic/Link/declaration.mjs +16 -3
  46. package/dist/elements/basic/Link/index.d.ts +5 -1
  47. package/dist/elements/basic/Markdown/declaration.d.ts +1 -1
  48. package/dist/elements/basic/Markdown/declaration.mjs +1 -1
  49. package/dist/elements/basic/Markdown/index.d.ts +1 -1
  50. package/dist/elements/basic/RichText/declaration.d.ts +3 -0
  51. package/dist/elements/basic/RichText/declaration.mjs +8 -3
  52. package/dist/elements/basic/RichText/index.d.ts +3 -0
  53. package/dist/elements/basic/Text/declaration.d.ts +1 -1
  54. package/dist/elements/basic/Text/declaration.mjs +1 -1
  55. package/dist/elements/basic/Text/index.d.ts +1 -1
  56. package/dist/elements/basic/ThemeToggle/ThemeToggle.mjs +3 -0
  57. package/dist/elements/basic/ThemeToggle/declaration.d.ts +3 -0
  58. package/dist/elements/basic/ThemeToggle/declaration.mjs +4 -3
  59. package/dist/elements/basic/ThemeToggle/index.d.ts +3 -0
  60. package/dist/elements/declarations/index.d.ts +217 -17
  61. package/dist/elements/declarations/index.mjs +24 -22
  62. package/dist/elements/form/Form/declaration.d.ts +3 -0
  63. package/dist/elements/form/Form/declaration.mjs +4 -3
  64. package/dist/elements/form/Form/index.d.ts +3 -0
  65. package/dist/elements/form/FormControl/FormControl.d.ts +18 -6
  66. package/dist/elements/form/FormControl/FormControl.mjs +135 -127
  67. package/dist/elements/form/FormControl/Settings.d.ts +3 -1
  68. package/dist/elements/form/FormControl/Settings.mjs +73 -57
  69. package/dist/elements/form/FormControl/components/Label.d.ts +3 -1
  70. package/dist/elements/form/FormControl/components/Label.mjs +20 -18
  71. package/dist/elements/form/FormControl/components/visuallyHidden.d.ts +6 -0
  72. package/dist/elements/form/FormControl/components/visuallyHidden.mjs +14 -0
  73. package/dist/elements/form/FormControl/declaration.d.ts +5 -0
  74. package/dist/elements/form/FormControl/declaration.mjs +46 -30
  75. package/dist/elements/form/FormControl/hocs/withFieldValue.mjs +68 -61
  76. package/dist/elements/form/FormControl/index.d.ts +5 -0
  77. package/dist/elements/form/FormControl/inputs/Checkbox.d.ts +6 -1
  78. package/dist/elements/form/FormControl/inputs/Checkbox.mjs +5 -3
  79. package/dist/elements/form/FormControl/inputs/Input.d.ts +8 -1
  80. package/dist/elements/form/FormControl/inputs/Input.mjs +44 -38
  81. package/dist/elements/form/FormControl/inputs/Select.d.ts +6 -1
  82. package/dist/elements/form/FormControl/inputs/Select.mjs +12 -10
  83. package/dist/elements/form/FormControl/inputs/Textarea.d.ts +8 -1
  84. package/dist/elements/form/FormControl/inputs/Textarea.mjs +26 -21
  85. package/dist/elements/form/FormControl/inputs/useFocusWhenShown.d.ts +7 -0
  86. package/dist/elements/form/FormControl/inputs/useFocusWhenShown.mjs +9 -0
  87. package/dist/elements/index.d.ts +3 -1
  88. package/dist/elements/index.mjs +16 -14
  89. package/dist/elements/internal/LayoutContainer/declaration.d.ts +3 -0
  90. package/dist/elements/internal/LayoutContainer/declaration.mjs +15 -3
  91. package/dist/elements/internal/LayoutContainer/index.d.ts +3 -0
  92. package/dist/elements/media/FontAwesome/FontAwesome.d.ts +8 -1
  93. package/dist/elements/media/FontAwesome/FontAwesome.mjs +12 -5
  94. package/dist/elements/media/FontAwesome/Settings.d.ts +2 -1
  95. package/dist/elements/media/FontAwesome/Settings.mjs +29 -22
  96. package/dist/elements/media/FontAwesome/declaration.d.ts +1 -0
  97. package/dist/elements/media/FontAwesome/index.d.ts +1 -0
  98. package/dist/elements/media/Image/Image.d.ts +13 -2
  99. package/dist/elements/media/Image/Image.mjs +25 -25
  100. package/dist/elements/media/Image/Settings.d.ts +3 -1
  101. package/dist/elements/media/Image/Settings.mjs +29 -15
  102. package/dist/elements/media/Image/declaration.d.ts +7 -1
  103. package/dist/elements/media/Image/declaration.mjs +16 -3
  104. package/dist/elements/media/Image/index.d.ts +7 -1
  105. package/dist/elements/provider/ApiContainer/ApiContainer.mjs +145 -137
  106. package/dist/elements/provider/ApiContainer/declaration.d.ts +14 -1
  107. package/dist/elements/provider/ApiContainer/declaration.mjs +41 -4
  108. package/dist/elements/provider/ApiContainer/helpers/isEmptyAnswer.d.ts +16 -0
  109. package/dist/elements/provider/ApiContainer/helpers/isEmptyAnswer.mjs +4 -0
  110. package/dist/elements/provider/ApiContainer/helpers/queryInput.d.ts +5 -0
  111. package/dist/elements/provider/ApiContainer/helpers/queryInput.mjs +12 -0
  112. package/dist/elements/provider/ApiContainer/index.d.ts +14 -1
  113. package/dist/elements/provider/Channel/Channel.d.ts +26 -0
  114. package/dist/elements/provider/Channel/Channel.mjs +92 -0
  115. package/dist/elements/provider/Channel/Settings.d.ts +9 -0
  116. package/dist/elements/provider/Channel/Settings.mjs +38 -0
  117. package/dist/elements/provider/Channel/declaration.d.ts +138 -0
  118. package/dist/elements/provider/Channel/declaration.mjs +125 -0
  119. package/dist/elements/provider/Channel/index.d.ts +137 -0
  120. package/dist/elements/provider/Channel/index.mjs +6 -0
  121. package/dist/elements/settings.mjs +25 -23
  122. package/dist/elements/structure/Container/Container.d.ts +16 -2
  123. package/dist/elements/structure/Container/Container.mjs +18 -9
  124. package/dist/elements/structure/Container/Settings.d.ts +4 -2
  125. package/dist/elements/structure/Container/Settings.mjs +110 -69
  126. package/dist/elements/structure/Container/declaration.d.ts +12 -1
  127. package/dist/elements/structure/Container/declaration.mjs +35 -3
  128. package/dist/elements/structure/Container/index.d.ts +6 -1
  129. package/dist/elements/structure/Container/index.mjs +3 -3
  130. package/dist/elements/structure/DialogContainer/DialogContainer.mjs +123 -100
  131. package/dist/elements/structure/List/declaration.d.ts +4 -0
  132. package/dist/elements/structure/List/declaration.mjs +7 -3
  133. package/dist/elements/structure/List/index.d.ts +4 -0
  134. package/dist/elements/structure/ModalContainer/ModalContainer.mjs +92 -80
  135. package/dist/elements/structure/ModalContainer/metadataFromText.d.ts +1 -0
  136. package/dist/elements/structure/ModalContainer/metadataFromText.mjs +10 -0
  137. package/dist/elements/structure/ModalContainer/useModalDialog.d.ts +20 -0
  138. package/dist/elements/structure/ModalContainer/useModalDialog.mjs +31 -0
  139. package/dist/elements/structure/Pagination/Pagination.d.ts +6 -1
  140. package/dist/elements/structure/Pagination/Pagination.mjs +23 -21
  141. package/dist/elements/structure/Pagination/Settings.d.ts +2 -1
  142. package/dist/elements/structure/Pagination/Settings.mjs +16 -9
  143. package/dist/elements/structure/Pagination/declaration.d.ts +5 -0
  144. package/dist/elements/structure/Pagination/declaration.mjs +7 -3
  145. package/dist/elements/structure/Pagination/index.d.ts +5 -0
  146. package/dist/elements/structure/TabContainer/TabContainer.mjs +19 -17
  147. package/dist/elements/structure/TabContainer/TabContainerBody/TabContainerBody.mjs +8 -6
  148. package/dist/elements/structure/TabContainer/TabContainerContext.d.ts +2 -0
  149. package/dist/elements/structure/TabContainer/TabContainerHeader/TabContainerHeader.mjs +18 -14
  150. package/dist/elements/structure/TabContainer/TabContainerItem/TabContainerItem.d.ts +5 -1
  151. package/dist/elements/structure/TabContainer/TabContainerItem/TabContainerItem.mjs +48 -13
  152. package/dist/elements/structure/TabContainer/TabContainerItem/declaration.d.ts +1 -1
  153. package/dist/index.d.ts +220 -16
  154. package/dist/index.mjs +20 -17
  155. package/dist/realtime/useChannel.d.ts +35 -0
  156. package/dist/realtime/useChannel.mjs +57 -0
  157. package/package.json +67 -11
  158. package/dist/elements/media/FontAwesome/FontAwesome.stories-paused.d.ts +0 -1
@@ -2,116 +2,128 @@ import e from "../../../Element/hocs/withElement.mjs";
2
2
  import t from "../../../Element/hooks/useElement.mjs";
3
3
  import { RootElement as n } from "../../../Element/RootElement.mjs";
4
4
  import r from "../../../dataSource/pathFields.mjs";
5
- import i from "./declaration.mjs";
6
- import { use as a, useCallback as o, useEffect as s, useMemo as c, useState as l } from "react";
7
- import u from "@plitzi/sdk-shared/hooks/usePlitziServiceContext";
8
- import { StoreProvider as d } from "@plitzi/nexus/react";
9
- import { emptyObject as f } from "@plitzi/sdk-shared/helpers/utils";
10
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
- import h from "clsx";
12
- import g from "@plitzi/sdk-shared/dataSource/helpers/getSourceName";
13
- import _ from "@plitzi/sdk-shared/dataSource/hooks/useRegisterSource";
5
+ import i from "./useModalDialog.mjs";
6
+ import a from "./declaration.mjs";
7
+ import { metadataFromText as o } from "./metadataFromText.mjs";
8
+ import { use as s, useCallback as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
9
+ import p from "@plitzi/sdk-shared/hooks/usePlitziServiceContext";
10
+ import { StoreProvider as m } from "@plitzi/nexus/react";
11
+ import { emptyObject as h } from "@plitzi/sdk-shared/helpers/utils";
12
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
13
+ import v from "clsx";
14
+ import y from "@plitzi/sdk-shared/dataSource/helpers/getSourceName";
15
+ import b from "@plitzi/sdk-shared/dataSource/hooks/useRegisterSource";
14
16
  //#region src/elements/structure/ModalContainer/ModalContainer.tsx
15
- var v = ({ ref: e, className: v = "", children: y, title: b = "Modal Header", autoHideAfterClick: x = !0 }) => {
16
- let { id: S, definition: { styleSelectors: C, label: w = "Modal" }, elementState: T, setElementState: E } = t(), D = g(i.sourceType, S), { contexts: { InteractionsContext: O } } = u(), { interactionsManager: k } = a(O), [A, j] = l({}), M = o((e) => {
17
+ var x = ({ ref: e, className: x = "", children: S, title: C = "Modal Header", autoHideAfterClick: w = !0 }) => {
18
+ let { id: T, rootId: E, visible: D, definition: { styleSelectors: O, label: k = "Modal" }, elementState: A, setElementState: j } = t(), M = y(a.sourceType, T), { settings: { previewMode: N }, contexts: { InteractionsContext: P } } = p(), { interactionsManager: F } = s(P), [I, L] = f({}), R = d(null), z = `${E}_${T}_title`, B = c((e) => {
17
19
  let { metadata: t } = e;
18
- if (t && typeof t == "object") j(t);
19
- else if (typeof t == "string") try {
20
- j(JSON.parse(t));
21
- } catch {
22
- j({ content: t });
23
- }
24
- else j(typeof t == "boolean" || typeof t == "number" ? { content: t } : {});
25
- E((e) => ({
20
+ L(t && typeof t == "object" ? t : typeof t == "string" ? o(t) : typeof t == "boolean" || typeof t == "number" ? { content: t } : {}), j((e) => ({
26
21
  ...e,
27
22
  visibility: !0
28
23
  }));
29
- }, [E, j]), N = o(() => {
30
- k.interactionTrigger(S, "onModalClose", { metadata: A }), j({}), E((e) => ({
24
+ }, [j, L]), V = c(() => {
25
+ F.interactionTrigger(T, "onModalClose", { metadata: I }), L({}), j((e) => ({
31
26
  ...e,
32
27
  visibility: !1
33
28
  }));
34
29
  }, [
35
- k,
36
- E,
30
+ F,
37
31
  j,
38
- A,
39
- S
40
- ]), P = o(() => {
41
- x && (k.interactionTrigger(S, "onModalClose", { metadata: A }), j({}), E((e) => ({
32
+ L,
33
+ I,
34
+ T
35
+ ]), H = c(() => {
36
+ w && (F.interactionTrigger(T, "onModalClose", { metadata: I }), L({}), j((e) => ({
42
37
  ...e,
43
38
  visibility: !1
44
39
  })));
45
40
  }, [
46
- k,
47
- x,
48
- E,
41
+ F,
42
+ w,
49
43
  j,
50
- A,
51
- S
52
- ]), F = c(() => ({
44
+ L,
45
+ I,
46
+ T
47
+ ]), U = u(() => ({
53
48
  openModal: {
54
- ...i.callbacks.openModal,
55
- title: `Open ${w}`,
56
- callback: M
49
+ ...a.callbacks.openModal,
50
+ title: `Open ${k}`,
51
+ callback: B
57
52
  },
58
53
  closeModal: {
59
- ...i.callbacks.closeModal,
60
- title: `Close ${w}`,
61
- callback: N
54
+ ...a.callbacks.closeModal,
55
+ title: `Close ${k}`,
56
+ callback: V
62
57
  }
63
58
  }), [
64
- N,
65
- M,
66
- w
59
+ V,
60
+ B,
61
+ k
67
62
  ]);
68
- s(() => {
69
- T.visibility !== !1 && k.interactionTrigger(S, "onModalOpen", { metadata: A });
63
+ i({
64
+ panelRef: R,
65
+ open: !!N && D,
66
+ onClose: V
67
+ }), l(() => {
68
+ A.visibility !== !1 && F.interactionTrigger(T, "onModalOpen", { metadata: I });
70
69
  }, [
71
- S,
72
- k,
73
- A,
74
- T.visibility
70
+ T,
71
+ F,
72
+ I,
73
+ A.visibility
75
74
  ]);
76
- let I = o(() => r(A), [A]);
77
- _({
78
- id: S,
79
- source: D,
80
- name: w || `Modal - ${S}`,
81
- fields: I
75
+ let W = c(() => r(I), [I]);
76
+ b({
77
+ id: T,
78
+ source: M,
79
+ name: k || `Modal - ${T}`,
80
+ fields: W
82
81
  });
83
- let L = c(() => D ? { runtime: { sources: { [D]: A } } } : f, [D, A]);
84
- return /* @__PURE__ */ m(n, {
82
+ let G = u(() => M ? { runtime: { sources: { [M]: I } } } : h, [M, I]);
83
+ return /* @__PURE__ */ _(n, {
85
84
  ref: e,
86
- className: h("plitzi-component__modal-container", v),
87
- interactionTriggers: i.triggers,
88
- interactionCallbacks: F,
89
- children: [/* @__PURE__ */ p("div", {
90
- className: h("modal-container__background", C.backgroundContainer),
91
- onClick: P
92
- }), /* @__PURE__ */ m("div", {
93
- className: h("modal-container__root", C.rootContainer),
94
- children: [/* @__PURE__ */ m("div", {
95
- className: h("modal-container__header", C.headerContainer),
96
- children: [/* @__PURE__ */ p("div", {
97
- className: h("modal-container__header__title", C.headerTitle),
98
- children: b || "Modal Header"
99
- }), /* @__PURE__ */ p("i", {
100
- className: h("fa-solid fa-xmark", C.headerCloseButton),
85
+ className: v("plitzi-component__modal-container", x),
86
+ interactionTriggers: a.triggers,
87
+ interactionCallbacks: U,
88
+ children: [/* @__PURE__ */ g("div", {
89
+ className: v("modal-container__background", O.backgroundContainer),
90
+ "aria-hidden": "true",
91
+ onClick: H
92
+ }), /* @__PURE__ */ _("div", {
93
+ ref: R,
94
+ className: v("modal-container__root", O.rootContainer),
95
+ role: "dialog",
96
+ "aria-modal": "true",
97
+ "aria-labelledby": z,
98
+ tabIndex: -1,
99
+ children: [/* @__PURE__ */ _("div", {
100
+ className: v("modal-container__header", O.headerContainer),
101
+ children: [/* @__PURE__ */ g("div", {
102
+ id: z,
103
+ className: v("modal-container__header__title", O.headerTitle),
104
+ children: C || "Modal Header"
105
+ }), /* @__PURE__ */ g("button", {
106
+ type: "button",
107
+ className: v("modal-container__close", O.headerCloseButton),
108
+ "aria-label": "Close",
101
109
  title: "Close",
102
- onClick: N
110
+ onClick: V,
111
+ children: /* @__PURE__ */ g("i", {
112
+ className: "fa-solid fa-xmark",
113
+ "aria-hidden": "true"
114
+ })
103
115
  })]
104
- }), /* @__PURE__ */ p("div", {
105
- className: h("modal-container__body", C.bodyContainer),
106
- children: /* @__PURE__ */ p(d, {
116
+ }), /* @__PURE__ */ g("div", {
117
+ className: v("modal-container__body", O.bodyContainer),
118
+ children: /* @__PURE__ */ g(m, {
107
119
  inherit: "live",
108
- name: `Modal:${S}`,
109
- value: L,
110
- children: y
120
+ name: `Modal:${T}`,
121
+ value: G,
122
+ children: S
111
123
  })
112
124
  })]
113
125
  })]
114
126
  });
115
- }, y = e(v);
127
+ }, S = e(x);
116
128
  //#endregion
117
- export { v as ModalContainer, y as default };
129
+ export { x as ModalContainer, S as default };
@@ -0,0 +1 @@
1
+ export declare const metadataFromText: (metadata: string) => Record<string, unknown>;
@@ -0,0 +1,10 @@
1
+ //#region src/elements/structure/ModalContainer/metadataFromText.ts
2
+ var e = (e) => typeof e == "object" && !!e && !Array.isArray(e), t = (t) => {
3
+ try {
4
+ let n = JSON.parse(t);
5
+ if (e(n)) return n;
6
+ } catch {}
7
+ return { content: t };
8
+ };
9
+ //#endregion
10
+ export { t as metadataFromText };
@@ -0,0 +1,20 @@
1
+ import { RefObject } from 'react';
2
+ export type UseModalDialogProps = {
3
+ /** The box that holds the dialog's content: what takes the focus, and what the focus is kept inside. */
4
+ panelRef: RefObject<HTMLElement | null>;
5
+ /** Shown, and on a rendered page — never in the builder, where the modal is something being edited. */
6
+ open: boolean;
7
+ /** What Escape does: the same as the close button. */
8
+ onClose: () => void;
9
+ };
10
+ /**
11
+ * What `aria-modal` promises, kept: while a modal is open the keyboard lives inside it.
12
+ *
13
+ * - **The focus moves in** as it opens — to the panel itself, so a screen reader reads its name first; a control inside
14
+ * that took the focus on its own (`autoFocus`) keeps it.
15
+ * - **Tab and Shift+Tab go round** the panel's controls instead of walking out into the page behind it.
16
+ * - **Escape closes it**, as its close button does.
17
+ * - **The focus goes back** to whatever had it before, so a person — or a browser agent — carries on where they were.
18
+ */
19
+ declare const useModalDialog: ({ panelRef, open, onClose }: UseModalDialogProps) => void;
20
+ export default useModalDialog;
@@ -0,0 +1,31 @@
1
+ import { useEffect as e, useEffectEvent as t } from "react";
2
+ //#region src/elements/structure/ModalContainer/useModalDialog.ts
3
+ var n = "a[href], button:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"]), [contenteditable=\"true\"]", r = (e) => [...e.querySelectorAll(n)].filter((e) => typeof e.checkVisibility != "function" || e.checkVisibility()), i = ({ panelRef: n, open: i, onClose: a }) => {
4
+ let o = t(a);
5
+ e(() => {
6
+ let e = n.current;
7
+ if (!i || !e) return;
8
+ let t = e.ownerDocument.activeElement;
9
+ e.contains(t) || e.focus({ preventScroll: !0 });
10
+ let a = (t) => {
11
+ if (t.defaultPrevented) return;
12
+ if (t.key === "Escape") {
13
+ t.preventDefault(), o();
14
+ return;
15
+ }
16
+ if (t.key !== "Tab") return;
17
+ let n = r(e);
18
+ if (n.length === 0) {
19
+ t.preventDefault(), e.focus({ preventScroll: !0 });
20
+ return;
21
+ }
22
+ let i = n[0], a = n[n.length - 1], s = e.ownerDocument.activeElement;
23
+ t.shiftKey && (s === i || s === e || !e.contains(s)) ? (t.preventDefault(), a.focus()) : !t.shiftKey && (s === a || !e.contains(s)) && (t.preventDefault(), i.focus());
24
+ }, s = e.ownerDocument.defaultView;
25
+ return s?.addEventListener("keydown", a), () => {
26
+ s?.removeEventListener("keydown", a), t instanceof HTMLElement && t.isConnected && t.focus({ preventScroll: !0 });
27
+ };
28
+ }, [i, n]);
29
+ };
30
+ //#endregion
31
+ export { i as default };
@@ -24,6 +24,11 @@ export type PaginationProps = {
24
24
  previousLabel?: string;
25
25
  nextLabel?: string;
26
26
  loadMoreLabel?: string;
27
+ /**
28
+ * The pager's name, in the site's language: a page often has more than one navigation, and a screen reader or a
29
+ * browser agent lists them by name.
30
+ */
31
+ label?: string;
27
32
  };
28
33
  /**
29
34
  * Renders a pager over any `pageInfo`-shaped source.
@@ -32,7 +37,7 @@ export type PaginationProps = {
32
37
  * interaction mode it only announces the page the visitor asked for. A plugin that publishes the same shape gets a
33
38
  * working pager for free.
34
39
  */
35
- declare const Pagination: ({ ref, className, children, pageInfo, mode, pageParam, target, windowSize, previousLabel, nextLabel, loadMoreLabel }: PaginationProps) => import('react').JSX.Element;
40
+ declare const Pagination: ({ ref, className, children, pageInfo, mode, pageParam, target, windowSize, previousLabel, nextLabel, loadMoreLabel, label }: PaginationProps) => import('react').JSX.Element;
36
41
  declare const _default: {
37
42
  (props: import('../../../Element/hocs/withElement').WithElementProps<PaginationProps>): import('react').JSX.Element;
38
43
  displayName: string;
@@ -14,59 +14,61 @@ var h = (e, t) => {
14
14
  if (typeof window > "u") return "";
15
15
  let n = new URL(window.location.href);
16
16
  return t <= 1 ? n.searchParams.delete(e) : n.searchParams.set(e, String(t)), `${n.pathname}${n.search}`;
17
- }, g = ({ ref: e, className: g = "", children: _, pageInfo: v = u, mode: y = "pages", pageParam: b = "page", target: x = "url", windowSize: S = 5, previousLabel: C = "Previous", nextLabel: w = "Next", loadMoreLabel: T = "Load more" }) => {
18
- let { id: E } = t(), { settings: { previewMode: D }, contexts: { InteractionsContext: O } } = c(), { interactionsManager: k } = a(O), [A] = l("navigation.navigate"), j = v.page ?? 1, M = v.pageCount ?? 0, N = v.hasPrevPage ?? j > 1, P = v.hasNextPage ?? !1, F = s(() => i(j, M, S), [
19
- j,
17
+ }, g = ({ ref: e, className: g = "", children: _, pageInfo: v = u, mode: y = "pages", pageParam: b = "page", target: x = "url", windowSize: S = 5, previousLabel: C = "Previous", nextLabel: w = "Next", loadMoreLabel: T = "Load more", label: E = "Pagination" }) => {
18
+ let { id: D } = t(), { settings: { previewMode: O }, contexts: { InteractionsContext: k } } = c(), { interactionsManager: A } = a(k), [j] = l("navigation.navigate"), M = v.page ?? 1, N = v.pageCount ?? 0, P = v.hasPrevPage ?? M > 1, F = v.hasNextPage ?? !1, I = s(() => i(M, N, S), [
20
19
  M,
20
+ N,
21
21
  S
22
- ]), I = o((e) => {
22
+ ]), L = o((e) => {
23
23
  let t = Math.max(e, 1);
24
- E && k.interactionTrigger(E, "onPageChange", { page: t }), x === "url" && A(h(b, t));
24
+ D && A.interactionTrigger(D, "onPageChange", { page: t }), x === "url" && j(h(b, t));
25
25
  }, [
26
- E,
27
- k,
28
- x,
26
+ D,
29
27
  A,
28
+ x,
29
+ j,
30
30
  b
31
- ]), L = o((e) => (t) => {
32
- t.preventDefault(), I(e);
33
- }, [I]), R = M === 0 && !P && !N;
31
+ ]), R = o((e) => (t) => {
32
+ t.preventDefault(), L(e);
33
+ }, [L]), z = N === 0 && !F && !P;
34
34
  return /* @__PURE__ */ p(n, {
35
35
  ref: e,
36
36
  tag: "nav",
37
+ "aria-label": E || void 0,
37
38
  className: m("plitzi-component__pagination", g),
38
39
  interactionTriggers: r.triggers,
39
40
  children: [
40
41
  y === "loadMore" && /* @__PURE__ */ f("button", {
41
42
  type: "button",
42
43
  className: "plitzi-component__pagination-more",
43
- disabled: !P && D,
44
- onClick: L(j + 1),
44
+ disabled: !F && O,
45
+ onClick: R(M + 1),
45
46
  children: T
46
47
  }),
47
48
  y === "pages" && /* @__PURE__ */ p(d, { children: [
48
49
  /* @__PURE__ */ f("button", {
49
50
  type: "button",
50
51
  className: "plitzi-component__pagination-prev",
51
- disabled: !N && D,
52
- onClick: L(j - 1),
52
+ disabled: !P && O,
53
+ onClick: R(M - 1),
53
54
  children: C
54
55
  }),
55
- F.map((e) => /* @__PURE__ */ f("button", {
56
+ I.map((e) => /* @__PURE__ */ f("button", {
56
57
  type: "button",
57
- className: m("plitzi-component__pagination-page", { "plitzi-component__pagination-page--current": e === j }),
58
- onClick: L(e),
58
+ className: m("plitzi-component__pagination-page", { "plitzi-component__pagination-page--current": e === M }),
59
+ "aria-current": e === M ? "page" : void 0,
60
+ onClick: R(e),
59
61
  children: e
60
62
  }, e)),
61
63
  /* @__PURE__ */ f("button", {
62
64
  type: "button",
63
65
  className: "plitzi-component__pagination-next",
64
- disabled: !P && D,
65
- onClick: L(j + 1),
66
+ disabled: !F && O,
67
+ onClick: R(M + 1),
66
68
  children: w
67
69
  })
68
70
  ] }),
69
- !D && R && /* @__PURE__ */ f("span", {
71
+ !O && z && /* @__PURE__ */ f("span", {
70
72
  className: "plitzi-component__pagination-hint",
71
73
  children: "Bind pageInfo"
72
74
  }),
@@ -6,7 +6,8 @@ type SettingsProps = {
6
6
  previousLabel?: string;
7
7
  nextLabel?: string;
8
8
  loadMoreLabel?: string;
9
+ label?: string;
9
10
  onUpdate?: (key: string, value: string | boolean | number | object) => void;
10
11
  };
11
- declare const Settings: ({ mode, target, pageParam, windowSize, previousLabel, nextLabel, loadMoreLabel, onUpdate }: SettingsProps) => import('react').JSX.Element;
12
+ declare const Settings: ({ mode, target, pageParam, windowSize, previousLabel, nextLabel, loadMoreLabel, label, onUpdate }: SettingsProps) => import('react').JSX.Element;
12
13
  export default Settings;
@@ -3,15 +3,15 @@ import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
3
3
  import i from "@plitzi/plitzi-ui/Input";
4
4
  import a from "@plitzi/plitzi-ui/Select";
5
5
  //#region src/elements/structure/Pagination/Settings.tsx
6
- var o = ({ mode: o = "pages", target: s = "url", pageParam: c = "page", windowSize: l = "5", previousLabel: u = "Previous", nextLabel: d = "Next", loadMoreLabel: f = "Load more", onUpdate: p }) => {
7
- let m = e((e) => (t) => p?.(e, t), [p]);
6
+ var o = ({ mode: o = "pages", target: s = "url", pageParam: c = "page", windowSize: l = "5", previousLabel: u = "Previous", nextLabel: d = "Next", loadMoreLabel: f = "Load more", label: p = "Pagination", onUpdate: m }) => {
7
+ let h = e((e) => (t) => m?.(e, t), [m]);
8
8
  return /* @__PURE__ */ r("div", {
9
9
  className: "flex grow flex-col gap-4 py-2",
10
10
  children: [
11
11
  /* @__PURE__ */ r(a, {
12
12
  value: o,
13
13
  label: "Mode",
14
- onChange: m("mode"),
14
+ onChange: h("mode"),
15
15
  size: "xs",
16
16
  children: [/* @__PURE__ */ n("option", {
17
17
  value: "pages",
@@ -24,7 +24,7 @@ var o = ({ mode: o = "pages", target: s = "url", pageParam: c = "page", windowSi
24
24
  /* @__PURE__ */ r(a, {
25
25
  value: s,
26
26
  label: "On Page Change",
27
- onChange: m("target"),
27
+ onChange: h("target"),
28
28
  size: "xs",
29
29
  children: [/* @__PURE__ */ n("option", {
30
30
  value: "url",
@@ -38,33 +38,40 @@ var o = ({ mode: o = "pages", target: s = "url", pageParam: c = "page", windowSi
38
38
  value: c,
39
39
  label: "Page parameter",
40
40
  title: "Must match the page parameter of the provider this pager belongs to.",
41
- onChange: m("pageParam"),
41
+ onChange: h("pageParam"),
42
42
  size: "xs"
43
43
  }),
44
44
  o === "pages" && /* @__PURE__ */ r(t, { children: [
45
45
  /* @__PURE__ */ n(i, {
46
46
  value: l,
47
47
  label: "Pages shown",
48
- onChange: m("windowSize"),
48
+ onChange: h("windowSize"),
49
49
  size: "xs"
50
50
  }),
51
51
  /* @__PURE__ */ n(i, {
52
52
  value: u,
53
53
  label: "Previous label",
54
- onChange: m("previousLabel"),
54
+ onChange: h("previousLabel"),
55
55
  size: "xs"
56
56
  }),
57
57
  /* @__PURE__ */ n(i, {
58
58
  value: d,
59
59
  label: "Next label",
60
- onChange: m("nextLabel"),
60
+ onChange: h("nextLabel"),
61
61
  size: "xs"
62
62
  })
63
63
  ] }),
64
64
  o === "loadMore" && /* @__PURE__ */ n(i, {
65
65
  value: f,
66
66
  label: "Button label",
67
- onChange: m("loadMoreLabel"),
67
+ onChange: h("loadMoreLabel"),
68
+ size: "xs"
69
+ }),
70
+ /* @__PURE__ */ n(i, {
71
+ value: p,
72
+ label: "Navigation name",
73
+ title: "What a screen reader calls this pager, in the site's language.",
74
+ onChange: h("label"),
68
75
  size: "xs"
69
76
  }),
70
77
  /* @__PURE__ */ r("span", {
@@ -4,6 +4,10 @@ import { AuthorableAttributes } from '@plitzi/sdk-shared/authoring/declare';
4
4
  export type PaginationAttributes = AuthorableAttributes<PaginationProps>;
5
5
  declare const declaration: {
6
6
  readonly type: "pagination";
7
+ readonly attributeValues: {
8
+ readonly mode: readonly string[];
9
+ readonly target: readonly string[];
10
+ };
7
11
  readonly triggers: {
8
12
  readonly onPageChange: {
9
13
  readonly action: "onPageChange";
@@ -76,6 +80,7 @@ declare const declaration: {
76
80
  };
77
81
  } & import('@plitzi/sdk-shared/authoring/declare').ElementAttributesBrand<Partial<{
78
82
  mode?: "pages" | "loadMore" | undefined;
83
+ label?: string | undefined;
79
84
  target?: "url" | "interaction" | undefined;
80
85
  pageParam?: string | undefined;
81
86
  pageInfo?: import('./Pagination').PaginationPageInfo | undefined;
@@ -1,7 +1,11 @@
1
- import { elementDeclaration as e } from "@plitzi/sdk-shared/authoring/declare";
1
+ import { elementDeclaration as e, valuesOf as t } from "@plitzi/sdk-shared/authoring/declare";
2
2
  //#region src/elements/structure/Pagination/declaration.ts
3
- var t = e()({
3
+ var n = e()({
4
4
  type: "pagination",
5
+ attributeValues: {
6
+ mode: t()(["pages", "loadMore"]),
7
+ target: t()(["url", "interaction"])
8
+ },
5
9
  triggers: { onPageChange: {
6
10
  action: "onPageChange",
7
11
  title: "On Page Change",
@@ -62,4 +66,4 @@ var t = e()({
62
66
  }
63
67
  });
64
68
  //#endregion
65
- export { t as default };
69
+ export { n as default };
@@ -3,6 +3,10 @@ declare const Pagination: {
3
3
  displayName: string;
4
4
  } & {
5
5
  readonly type: "pagination";
6
+ readonly attributeValues: {
7
+ readonly mode: readonly string[];
8
+ readonly target: readonly string[];
9
+ };
6
10
  readonly triggers: {
7
11
  readonly onPageChange: {
8
12
  readonly action: "onPageChange";
@@ -75,6 +79,7 @@ declare const Pagination: {
75
79
  };
76
80
  } & import('@plitzi/sdk-shared/authoring/declare').ElementAttributesBrand<Partial<{
77
81
  mode?: "pages" | "loadMore" | undefined;
82
+ label?: string | undefined;
78
83
  target?: "url" | "interaction" | undefined;
79
84
  pageParam?: string | undefined;
80
85
  pageInfo?: import('./Pagination').PaginationPageInfo | undefined;
@@ -1,23 +1,25 @@
1
1
  import e from "../../../Element/hocs/withElement.mjs";
2
- import { RootElement as t } from "../../../Element/RootElement.mjs";
3
- import n from "./TabContainerContext.mjs";
4
- import { useMemo as r, useState as i } from "react";
5
- import { jsx as a } from "react/jsx-runtime";
6
- import o from "clsx";
2
+ import t from "../../../Element/hooks/useElement.mjs";
3
+ import { RootElement as n } from "../../../Element/RootElement.mjs";
4
+ import r from "./TabContainerContext.mjs";
5
+ import { useMemo as i, useState as a } from "react";
6
+ import { jsx as o } from "react/jsx-runtime";
7
+ import s from "clsx";
7
8
  //#region src/elements/structure/TabContainer/TabContainer.tsx
8
- var s = ({ ref: e, className: s = "", children: c }) => {
9
- let [l, u] = i(0), d = r(() => ({
10
- tabSelected: l,
11
- onSelect: u
12
- }), [l]);
13
- return /* @__PURE__ */ a(t, {
9
+ var c = ({ ref: e, className: c = "", children: l }) => {
10
+ let { id: u, rootId: d } = t(), [f, p] = a(0), m = `${d}_${u}`, h = i(() => ({
11
+ baseId: m,
12
+ tabSelected: f,
13
+ onSelect: p
14
+ }), [m, f]);
15
+ return /* @__PURE__ */ o(n, {
14
16
  ref: e,
15
- className: o("plitzi-component__tab-container", s),
16
- children: /* @__PURE__ */ a(n, {
17
- value: d,
18
- children: c
17
+ className: s("plitzi-component__tab-container", c),
18
+ children: /* @__PURE__ */ o(r, {
19
+ value: h,
20
+ children: l
19
21
  })
20
22
  });
21
- }, c = e(s);
23
+ }, l = e(c);
22
24
  //#endregion
23
- export { s as TabContainer, c as default };
25
+ export { c as TabContainer, l as default };
@@ -6,7 +6,7 @@ import { jsx as c } from "react/jsx-runtime";
6
6
  import l from "clsx";
7
7
  //#region src/elements/structure/TabContainer/TabContainerBody/TabContainerBody.tsx
8
8
  var u = ({ ref: e, className: u = "", children: d }) => {
9
- let { tabSelected: f, onSelect: p } = o(n), { childrenParsed: m } = s(() => {
9
+ let { baseId: f, tabSelected: p, onSelect: m } = o(n), { childrenParsed: h } = s(() => {
10
10
  let e = { childrenParsed: [] };
11
11
  return r.forEach(d, (t, n) => {
12
12
  if (!a(t)) return;
@@ -15,21 +15,23 @@ var u = ({ ref: e, className: u = "", children: d }) => {
15
15
  ...r,
16
16
  internalProps: {
17
17
  ...r.internalProps,
18
- onSelect: p,
19
- tabSelected: f,
18
+ baseId: f,
19
+ onSelect: m,
20
+ tabSelected: p,
20
21
  tabIndex: n
21
22
  }
22
23
  }));
23
24
  }), e;
24
25
  }, [
26
+ f,
25
27
  d,
26
- p,
27
- f
28
+ m,
29
+ p
28
30
  ]);
29
31
  return /* @__PURE__ */ c(t, {
30
32
  ref: e,
31
33
  className: l("plitzi-component__tab-container-body", u),
32
- children: m
34
+ children: h
33
35
  });
34
36
  }, d = e(u);
35
37
  //#endregion
@@ -1,5 +1,7 @@
1
1
  import { Dispatch, SetStateAction } from 'react';
2
2
  export type TabContainerContextValue = {
3
+ /** What the tabs' and the panels' ids start with, so each tab can name the panel it shows and each panel its tab. */
4
+ baseId: string;
3
5
  tabSelected: number;
4
6
  onSelect: Dispatch<SetStateAction<number>>;
5
7
  };