@clyrex-digital/clyrex-controls-dev 0.8.1-dev.20260922042401 → 0.8.1-dev.20260923102653

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.
@@ -762,6 +762,11 @@ var flattenNodeText = (nodes) => {
762
762
  if (isTextNode(node)) return node.text ?? "";
763
763
  const element = asElementNode(node);
764
764
  if (element.type === "linebreak" || element.type === "line-break") return "\n";
765
+ if (element.type === "bulletList" || element.type === "numberedList") {
766
+ const items = Array.isArray(element.items) ? element.items : [];
767
+ return items.map((item) => `${flattenNodeText(item.children)}
768
+ `).join("");
769
+ }
765
770
  const inner = flattenNodeText(element.children);
766
771
  return element.type === "paragraph" ? `${inner}
767
772
  ` : inner;
@@ -865,6 +870,18 @@ var CommentNodeRenderer = ({ node, assetBaseUrl }) => {
865
870
  case "listitem":
866
871
  case "list-item":
867
872
  return /* @__PURE__ */ jsx6("li", { className: "comment-node-listitem", children: renderChildren(element.children, key, assetBaseUrl) });
873
+ // ContentComposer's shape: items are paragraph-like nodes (their own
874
+ // `children`), not wrapped in a separate "listitem" node.
875
+ case "bulletList":
876
+ case "numberedList": {
877
+ const ListTag = element.type === "numberedList" ? "ol" : "ul";
878
+ const items = Array.isArray(element.items) ? element.items : [];
879
+ return /* @__PURE__ */ jsx6(ListTag, { className: "comment-node-list", children: items.map((item, index) => {
880
+ const itemChildren = item.children ?? [];
881
+ const isEmptyItem = itemChildren.length === 0 || itemChildren.every((child) => isTextNode(child) && (child.text ?? "").length === 0);
882
+ return /* @__PURE__ */ jsx6("li", { className: "comment-node-listitem", children: isEmptyItem ? null : renderChildren(item.children, key, assetBaseUrl) }, item.id ?? `${key}-${index}`);
883
+ }) });
884
+ }
868
885
  case "quote":
869
886
  case "blockquote":
870
887
  return /* @__PURE__ */ jsx6("blockquote", { className: "comment-node-quote", children: renderChildren(element.children, key, assetBaseUrl) });
@@ -764,6 +764,11 @@ var flattenNodeText = (nodes) => {
764
764
  if (isTextNode(node)) return node.text ?? "";
765
765
  const element = asElementNode(node);
766
766
  if (element.type === "linebreak" || element.type === "line-break") return "\n";
767
+ if (element.type === "bulletList" || element.type === "numberedList") {
768
+ const items = Array.isArray(element.items) ? element.items : [];
769
+ return items.map((item) => `${flattenNodeText(item.children)}
770
+ `).join("");
771
+ }
767
772
  const inner = flattenNodeText(element.children);
768
773
  return element.type === "paragraph" ? `${inner}
769
774
  ` : inner;
@@ -867,6 +872,18 @@ var CommentNodeRenderer = ({ node, assetBaseUrl }) => {
867
872
  case "listitem":
868
873
  case "list-item":
869
874
  return /* @__PURE__ */ jsx6("li", { className: "comment-node-listitem", children: renderChildren(element.children, key, assetBaseUrl) });
875
+ // ContentComposer's shape: items are paragraph-like nodes (their own
876
+ // `children`), not wrapped in a separate "listitem" node.
877
+ case "bulletList":
878
+ case "numberedList": {
879
+ const ListTag = element.type === "numberedList" ? "ol" : "ul";
880
+ const items = Array.isArray(element.items) ? element.items : [];
881
+ return /* @__PURE__ */ jsx6(ListTag, { className: "comment-node-list", children: items.map((item, index) => {
882
+ const itemChildren = item.children ?? [];
883
+ const isEmptyItem = itemChildren.length === 0 || itemChildren.every((child) => isTextNode(child) && (child.text ?? "").length === 0);
884
+ return /* @__PURE__ */ jsx6("li", { className: "comment-node-listitem", children: isEmptyItem ? null : renderChildren(item.children, key, assetBaseUrl) }, item.id ?? `${key}-${index}`);
885
+ }) });
886
+ }
870
887
  case "quote":
871
888
  case "blockquote":
872
889
  return /* @__PURE__ */ jsx6("blockquote", { className: "comment-node-quote", children: renderChildren(element.children, key, assetBaseUrl) });
@@ -3,7 +3,7 @@
3
3
  "use client";
4
4
  import {
5
5
  InputControl_default
6
- } from "./chunk-5NI44TXC.mjs";
6
+ } from "./chunk-XDTWUEVR.mjs";
7
7
  import {
8
8
  Button_default
9
9
  } from "./chunk-LSKD5U3S.mjs";
@@ -13,7 +13,7 @@ import { useRouter } from "next/navigation";
13
13
 
14
14
  // src/components/controls/edit/InputControl.tsx
15
15
  import dynamic from "next/dynamic";
16
- var InputControl = dynamic(() => import("./InputControlClient-KQPQC6LK.mjs"), {
16
+ var InputControl = dynamic(() => import("./InputControlClient-NHXG4QBU.mjs"), {
17
17
  ssr: false
18
18
  });
19
19
  var InputControl_default = InputControl;
@@ -18,7 +18,7 @@ import {
18
18
  SelectWithSearchInput_default,
19
19
  Select_default,
20
20
  TimeInput_default
21
- } from "./chunk-WQ7BAR74.mjs";
21
+ } from "./chunk-N57RANHY.mjs";
22
22
  import {
23
23
  Hyperlink,
24
24
  Icon_default
@@ -188,20 +188,26 @@ var SelectWithSearchPanel = (props) => {
188
188
  " ",
189
189
  props?.attributes?.required && /* @__PURE__ */ jsx("span", { className: "bg-error-weak", children: "*" })
190
190
  ] }),
191
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
192
- "input",
193
- {
194
- type: "text",
195
- value: searchTerm,
196
- onChange: textChangeHandler,
197
- onFocus: () => setIsOpen(true),
198
- onKeyDown: handleKeyDown,
199
- placeholder: props.attributes?.placeholder,
200
- className: `peer mt-1 py-1.5 block w-full text-black rounded border-gray-300 shadow-sm
201
- ${isError ? "focus:border-red-300 focus:ring focus:ring-red-200 focus:ring-opacity-50" : "focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"}
191
+ /* @__PURE__ */ jsxs("div", { children: [
192
+ /* @__PURE__ */ jsx(
193
+ "input",
194
+ {
195
+ type: "text",
196
+ name: props.name,
197
+ id: props.name,
198
+ value: searchTerm,
199
+ onChange: textChangeHandler,
200
+ onFocus: () => setIsOpen(true),
201
+ onKeyDown: handleKeyDown,
202
+ placeholder: props.attributes?.placeholder,
203
+ required: props.attributes?.required,
204
+ className: `peer mt-1 py-1.5 block w-full text-black rounded border-gray-300 shadow-sm
205
+ ${isError ? "focus:border-red-300 focus:ring focus:ring-red-200 focus:ring-opacity-50" : "focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"}
202
206
  disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none`
203
- }
204
- ) }),
207
+ }
208
+ ),
209
+ /* @__PURE__ */ jsx("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props.attributes?.errorMessage ?? "" })
210
+ ] }),
205
211
  /* @__PURE__ */ jsx("div", { ref: containerRef, children: isOpen && /* @__PURE__ */ jsxs(React.Fragment, { children: [
206
212
  /* @__PURE__ */ jsxs("div", { className: "fixed z-50 right-0 bg-white top-[62px] w-1/4 border-l border-gray-200", children: [
207
213
  /* @__PURE__ */ jsx("div", { className: "flex flex-col p-2 bg-accent-950 text-white", children: /* @__PURE__ */ jsxs("h5", { className: "text-md text-white font-medium", children: [
@@ -506,21 +512,18 @@ var SwitchInput = (props) => {
506
512
  if (props.value != void 0 && props.value != null && props.value != "" && (props.value == "true" || props.value.toString() == "true")) {
507
513
  value = true;
508
514
  }
509
- return /* @__PURE__ */ jsx3(React3.Fragment, { children: /* @__PURE__ */ jsxs3("div", { className: "flex items-start justify-between gap-4 py-3", children: [
510
- /* @__PURE__ */ jsxs3("div", { className: "min-w-0", children: [
511
- props?.attributes?.label && /* @__PURE__ */ jsxs3(
512
- "label",
513
- {
514
- htmlFor: props.name,
515
- className: "inline-block text-sm font-semibold text-slate-800",
516
- children: [
517
- props.attributes.label,
518
- props?.attributes?.required && /* @__PURE__ */ jsx3("span", { className: "bg-error-weak", children: "*" })
519
- ]
520
- }
521
- ),
522
- /* @__PURE__ */ jsx3("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props?.attributes?.errorMessage || "" })
523
- ] }),
515
+ return /* @__PURE__ */ jsx3(React3.Fragment, { children: /* @__PURE__ */ jsxs3("div", { className: "relative flex items-start justify-between gap-4 py-3", children: [
516
+ /* @__PURE__ */ jsx3("div", { className: "min-w-0", children: props?.attributes?.label && /* @__PURE__ */ jsxs3(
517
+ "label",
518
+ {
519
+ htmlFor: props.name,
520
+ className: "inline-block text-sm font-semibold text-slate-800",
521
+ children: [
522
+ props.attributes.label,
523
+ props?.attributes?.required && /* @__PURE__ */ jsx3("span", { className: "bg-error-weak", children: "*" })
524
+ ]
525
+ }
526
+ ) }),
524
527
  /* @__PURE__ */ jsxs3(
525
528
  "label",
526
529
  {
@@ -551,7 +554,8 @@ var SwitchInput = (props) => {
551
554
  {
552
555
  className: "absolute left-0.5 top-0.5 h-5 w-5 rounded-full bg-default shadow\n transition-transform duration-200 ease-in-out\n peer-checked:translate-x-5\n peer-disabled:bg-slate-50"
553
556
  }
554
- )
557
+ ),
558
+ /* @__PURE__ */ jsx3("p", { className: "hidden group-[.validated]:peer-invalid:block absolute left-0 top-full mt-1 w-max max-w-[220px] whitespace-normal bg-error-weak text-sm", children: props?.attributes?.errorMessage || "" })
555
559
  ]
556
560
  }
557
561
  )
@@ -858,6 +858,8 @@ var SelectWithSearchInput = (props) => {
858
858
  "input",
859
859
  {
860
860
  type: "text",
861
+ name: props.name,
862
+ id: props.name,
861
863
  value: searchTerm,
862
864
  onChange: (e) => {
863
865
  if (!isReadOnly) {
@@ -875,6 +877,7 @@ var SelectWithSearchInput = (props) => {
875
877
  placeholder: props.attributes?.placeholder ?? "Search...",
876
878
  readOnly: isReadOnly,
877
879
  disabled: isReadOnly,
880
+ required: props.attributes?.required,
878
881
  className: `peer mt-2 py-1.5 select block w-full text-black rounded border-gray-300 shadow-sm
879
882
  focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50
880
883
  disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none
@@ -913,7 +916,8 @@ var SelectWithSearchInput = (props) => {
913
916
  }
914
917
  )
915
918
  }
916
- )
919
+ ),
920
+ /* @__PURE__ */ jsx12("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props.attributes?.errorMessage ?? "" })
917
921
  ] }),
918
922
  !isReadOnly && isOpen && /* @__PURE__ */ jsx12(
919
923
  "div",
@@ -1088,20 +1092,26 @@ var SelectWithSearchPanel = (props) => {
1088
1092
  " ",
1089
1093
  props?.attributes?.required && /* @__PURE__ */ jsx13("span", { className: "bg-error-weak", children: "*" })
1090
1094
  ] }),
1091
- /* @__PURE__ */ jsx13("div", { children: /* @__PURE__ */ jsx13(
1092
- "input",
1093
- {
1094
- type: "text",
1095
- value: searchTerm,
1096
- onChange: textChangeHandler,
1097
- onFocus: () => setIsOpen(true),
1098
- onKeyDown: handleKeyDown,
1099
- placeholder: props.attributes?.placeholder,
1100
- className: `peer mt-1 py-1.5 block w-full text-black rounded border-gray-300 shadow-sm
1101
- ${isError ? "focus:border-red-300 focus:ring focus:ring-red-200 focus:ring-opacity-50" : "focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"}
1095
+ /* @__PURE__ */ jsxs13("div", { children: [
1096
+ /* @__PURE__ */ jsx13(
1097
+ "input",
1098
+ {
1099
+ type: "text",
1100
+ name: props.name,
1101
+ id: props.name,
1102
+ value: searchTerm,
1103
+ onChange: textChangeHandler,
1104
+ onFocus: () => setIsOpen(true),
1105
+ onKeyDown: handleKeyDown,
1106
+ placeholder: props.attributes?.placeholder,
1107
+ required: props.attributes?.required,
1108
+ className: `peer mt-1 py-1.5 block w-full text-black rounded border-gray-300 shadow-sm
1109
+ ${isError ? "focus:border-red-300 focus:ring focus:ring-red-200 focus:ring-opacity-50" : "focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"}
1102
1110
  disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none`
1103
- }
1104
- ) }),
1111
+ }
1112
+ ),
1113
+ /* @__PURE__ */ jsx13("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props.attributes?.errorMessage ?? "" })
1114
+ ] }),
1105
1115
  /* @__PURE__ */ jsx13("div", { ref: containerRef, children: isOpen && /* @__PURE__ */ jsxs13(React13.Fragment, { children: [
1106
1116
  /* @__PURE__ */ jsxs13("div", { className: "fixed z-50 right-0 bg-white top-[62px] w-1/4 border-l border-gray-200", children: [
1107
1117
  /* @__PURE__ */ jsx13("div", { className: "flex flex-col p-2 bg-accent-950 text-white", children: /* @__PURE__ */ jsxs13("h5", { className: "text-md text-white font-medium", children: [
@@ -1505,21 +1515,18 @@ var SwitchInput = (props) => {
1505
1515
  if (props.value != void 0 && props.value != null && props.value != "" && (props.value == "true" || props.value.toString() == "true")) {
1506
1516
  value = true;
1507
1517
  }
1508
- return /* @__PURE__ */ jsx17(React17.Fragment, { children: /* @__PURE__ */ jsxs17("div", { className: "flex items-start justify-between gap-4 py-3", children: [
1509
- /* @__PURE__ */ jsxs17("div", { className: "min-w-0", children: [
1510
- props?.attributes?.label && /* @__PURE__ */ jsxs17(
1511
- "label",
1512
- {
1513
- htmlFor: props.name,
1514
- className: "inline-block text-sm font-semibold text-slate-800",
1515
- children: [
1516
- props.attributes.label,
1517
- props?.attributes?.required && /* @__PURE__ */ jsx17("span", { className: "bg-error-weak", children: "*" })
1518
- ]
1519
- }
1520
- ),
1521
- /* @__PURE__ */ jsx17("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props?.attributes?.errorMessage || "" })
1522
- ] }),
1518
+ return /* @__PURE__ */ jsx17(React17.Fragment, { children: /* @__PURE__ */ jsxs17("div", { className: "relative flex items-start justify-between gap-4 py-3", children: [
1519
+ /* @__PURE__ */ jsx17("div", { className: "min-w-0", children: props?.attributes?.label && /* @__PURE__ */ jsxs17(
1520
+ "label",
1521
+ {
1522
+ htmlFor: props.name,
1523
+ className: "inline-block text-sm font-semibold text-slate-800",
1524
+ children: [
1525
+ props.attributes.label,
1526
+ props?.attributes?.required && /* @__PURE__ */ jsx17("span", { className: "bg-error-weak", children: "*" })
1527
+ ]
1528
+ }
1529
+ ) }),
1523
1530
  /* @__PURE__ */ jsxs17(
1524
1531
  "label",
1525
1532
  {
@@ -1550,7 +1557,8 @@ var SwitchInput = (props) => {
1550
1557
  {
1551
1558
  className: "absolute left-0.5 top-0.5 h-5 w-5 rounded-full bg-default shadow\n transition-transform duration-200 ease-in-out\n peer-checked:translate-x-5\n peer-disabled:bg-slate-50"
1552
1559
  }
1553
- )
1560
+ ),
1561
+ /* @__PURE__ */ jsx17("p", { className: "hidden group-[.validated]:peer-invalid:block absolute left-0 top-full mt-1 w-max max-w-[220px] whitespace-normal bg-error-weak text-sm", children: props?.attributes?.errorMessage || "" })
1554
1562
  ]
1555
1563
  }
1556
1564
  )
@@ -842,6 +842,8 @@ var SelectWithSearchInput = (props) => {
842
842
  "input",
843
843
  {
844
844
  type: "text",
845
+ name: props.name,
846
+ id: props.name,
845
847
  value: searchTerm,
846
848
  onChange: (e) => {
847
849
  if (!isReadOnly) {
@@ -859,6 +861,7 @@ var SelectWithSearchInput = (props) => {
859
861
  placeholder: props.attributes?.placeholder ?? "Search...",
860
862
  readOnly: isReadOnly,
861
863
  disabled: isReadOnly,
864
+ required: props.attributes?.required,
862
865
  className: `peer mt-2 py-1.5 select block w-full text-black rounded border-gray-300 shadow-sm
863
866
  focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50
864
867
  disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none
@@ -897,7 +900,8 @@ var SelectWithSearchInput = (props) => {
897
900
  }
898
901
  )
899
902
  }
900
- )
903
+ ),
904
+ /* @__PURE__ */ jsx12("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props.attributes?.errorMessage ?? "" })
901
905
  ] }),
902
906
  !isReadOnly && isOpen && /* @__PURE__ */ jsx12(
903
907
  "div",
@@ -3,7 +3,7 @@
3
3
 
4
4
  // src/components/controls/edit/InputControl.tsx
5
5
  import dynamic from "next/dynamic";
6
- var InputControl = dynamic(() => import("./InputControlClient-AKEKO6LT.mjs"), {
6
+ var InputControl = dynamic(() => import("./InputControlClient-A3V5YRWH.mjs"), {
7
7
  ssr: false
8
8
  });
9
9
  var InputControl_default = InputControl;
package/dist/index.js CHANGED
@@ -1748,6 +1748,11 @@ var init_CommentNodeRenderer = __esm({
1748
1748
  if (isTextNode(node)) return node.text ?? "";
1749
1749
  const element = asElementNode(node);
1750
1750
  if (element.type === "linebreak" || element.type === "line-break") return "\n";
1751
+ if (element.type === "bulletList" || element.type === "numberedList") {
1752
+ const items = Array.isArray(element.items) ? element.items : [];
1753
+ return items.map((item) => `${flattenNodeText(item.children)}
1754
+ `).join("");
1755
+ }
1751
1756
  const inner = flattenNodeText(element.children);
1752
1757
  return element.type === "paragraph" ? `${inner}
1753
1758
  ` : inner;
@@ -1851,6 +1856,18 @@ var init_CommentNodeRenderer = __esm({
1851
1856
  case "listitem":
1852
1857
  case "list-item":
1853
1858
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("li", { className: "comment-node-listitem", children: renderChildren(element.children, key, assetBaseUrl) });
1859
+ // ContentComposer's shape: items are paragraph-like nodes (their own
1860
+ // `children`), not wrapped in a separate "listitem" node.
1861
+ case "bulletList":
1862
+ case "numberedList": {
1863
+ const ListTag = element.type === "numberedList" ? "ol" : "ul";
1864
+ const items = Array.isArray(element.items) ? element.items : [];
1865
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ListTag, { className: "comment-node-list", children: items.map((item, index) => {
1866
+ const itemChildren = item.children ?? [];
1867
+ const isEmptyItem = itemChildren.length === 0 || itemChildren.every((child) => isTextNode(child) && (child.text ?? "").length === 0);
1868
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("li", { className: "comment-node-listitem", children: isEmptyItem ? null : renderChildren(item.children, key, assetBaseUrl) }, item.id ?? `${key}-${index}`);
1869
+ }) });
1870
+ }
1854
1871
  case "quote":
1855
1872
  case "blockquote":
1856
1873
  return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("blockquote", { className: "comment-node-quote", children: renderChildren(element.children, key, assetBaseUrl) });
@@ -3101,6 +3118,8 @@ var init_SelectWithSearchInput = __esm({
3101
3118
  "input",
3102
3119
  {
3103
3120
  type: "text",
3121
+ name: props.name,
3122
+ id: props.name,
3104
3123
  value: searchTerm,
3105
3124
  onChange: (e) => {
3106
3125
  if (!isReadOnly) {
@@ -3118,6 +3137,7 @@ var init_SelectWithSearchInput = __esm({
3118
3137
  placeholder: props.attributes?.placeholder ?? "Search...",
3119
3138
  readOnly: isReadOnly,
3120
3139
  disabled: isReadOnly,
3140
+ required: props.attributes?.required,
3121
3141
  className: `peer mt-2 py-1.5 select block w-full text-black rounded border-gray-300 shadow-sm
3122
3142
  focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50
3123
3143
  disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none
@@ -3156,7 +3176,8 @@ var init_SelectWithSearchInput = __esm({
3156
3176
  }
3157
3177
  )
3158
3178
  }
3159
- )
3179
+ ),
3180
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props.attributes?.errorMessage ?? "" })
3160
3181
  ] }),
3161
3182
  !isReadOnly && isOpen && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
3162
3183
  "div",
@@ -3629,20 +3650,26 @@ var init_SelectWithSearchPanel = __esm({
3629
3650
  " ",
3630
3651
  props?.attributes?.required && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "bg-error-weak", children: "*" })
3631
3652
  ] }),
3632
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
3633
- "input",
3634
- {
3635
- type: "text",
3636
- value: searchTerm,
3637
- onChange: textChangeHandler,
3638
- onFocus: () => setIsOpen(true),
3639
- onKeyDown: handleKeyDown,
3640
- placeholder: props.attributes?.placeholder,
3641
- className: `peer mt-1 py-1.5 block w-full text-black rounded border-gray-300 shadow-sm
3642
- ${isError ? "focus:border-red-300 focus:ring focus:ring-red-200 focus:ring-opacity-50" : "focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"}
3653
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { children: [
3654
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
3655
+ "input",
3656
+ {
3657
+ type: "text",
3658
+ name: props.name,
3659
+ id: props.name,
3660
+ value: searchTerm,
3661
+ onChange: textChangeHandler,
3662
+ onFocus: () => setIsOpen(true),
3663
+ onKeyDown: handleKeyDown,
3664
+ placeholder: props.attributes?.placeholder,
3665
+ required: props.attributes?.required,
3666
+ className: `peer mt-1 py-1.5 block w-full text-black rounded border-gray-300 shadow-sm
3667
+ ${isError ? "focus:border-red-300 focus:ring focus:ring-red-200 focus:ring-opacity-50" : "focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"}
3643
3668
  disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none`
3644
- }
3645
- ) }),
3669
+ }
3670
+ ),
3671
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props.attributes?.errorMessage ?? "" })
3672
+ ] }),
3646
3673
  /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { ref: containerRef, children: isOpen && /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_react38.default.Fragment, { children: [
3647
3674
  /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "fixed z-50 right-0 bg-white top-[62px] w-1/4 border-l border-gray-200", children: [
3648
3675
  /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "flex flex-col p-2 bg-accent-950 text-white", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("h5", { className: "text-md text-white font-medium", children: [
@@ -4197,21 +4224,18 @@ var init_SwitchInput = __esm({
4197
4224
  if (props.value != void 0 && props.value != null && props.value != "" && (props.value == "true" || props.value.toString() == "true")) {
4198
4225
  value = true;
4199
4226
  }
4200
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_react42.default.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "flex items-start justify-between gap-4 py-3", children: [
4201
- /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "min-w-0", children: [
4202
- props?.attributes?.label && /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
4203
- "label",
4204
- {
4205
- htmlFor: props.name,
4206
- className: "inline-block text-sm font-semibold text-slate-800",
4207
- children: [
4208
- props.attributes.label,
4209
- props?.attributes?.required && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "bg-error-weak", children: "*" })
4210
- ]
4211
- }
4212
- ),
4213
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props?.attributes?.errorMessage || "" })
4214
- ] }),
4227
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_react42.default.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "relative flex items-start justify-between gap-4 py-3", children: [
4228
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "min-w-0", children: props?.attributes?.label && /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
4229
+ "label",
4230
+ {
4231
+ htmlFor: props.name,
4232
+ className: "inline-block text-sm font-semibold text-slate-800",
4233
+ children: [
4234
+ props.attributes.label,
4235
+ props?.attributes?.required && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "bg-error-weak", children: "*" })
4236
+ ]
4237
+ }
4238
+ ) }),
4215
4239
  /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
4216
4240
  "label",
4217
4241
  {
@@ -4242,7 +4266,8 @@ var init_SwitchInput = __esm({
4242
4266
  {
4243
4267
  className: "absolute left-0.5 top-0.5 h-5 w-5 rounded-full bg-default shadow\n transition-transform duration-200 ease-in-out\n peer-checked:translate-x-5\n peer-disabled:bg-slate-50"
4244
4268
  }
4245
- )
4269
+ ),
4270
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { className: "hidden group-[.validated]:peer-invalid:block absolute left-0 top-full mt-1 w-max max-w-[220px] whitespace-normal bg-error-weak text-sm", children: props?.attributes?.errorMessage || "" })
4246
4271
  ]
4247
4272
  }
4248
4273
  )
package/dist/index.mjs CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-SNDGEYWZ.mjs";
9
9
  import {
10
10
  InputControl_default
11
- } from "./chunk-5NI44TXC.mjs";
11
+ } from "./chunk-XDTWUEVR.mjs";
12
12
  import "./chunk-JDX47MFV.mjs";
13
13
  import {
14
14
  CheckboxInput_default,
@@ -27,7 +27,7 @@ import {
27
27
  SelectWithSearchInput_default,
28
28
  Select_default,
29
29
  TimeInput_default
30
- } from "./chunk-WQ7BAR74.mjs";
30
+ } from "./chunk-N57RANHY.mjs";
31
31
  import {
32
32
  Hyperlink,
33
33
  Icon_default
@@ -410,7 +410,7 @@ var TimeUntilStarts_default = TimeUntilStarts;
410
410
 
411
411
  // src/components/controls/view/Commentrenderer.tsx
412
412
  import dynamic5 from "next/dynamic";
413
- var CommentRenderer = dynamic5(() => import("./CommentRendererClient-52UOUQAD.mjs"), {
413
+ var CommentRenderer = dynamic5(() => import("./CommentRendererClient-TBATG5LD.mjs"), {
414
414
  ssr: false
415
415
  });
416
416
  var Commentrenderer_default = CommentRenderer;
@@ -2391,7 +2391,7 @@ var GoogleMapNode_default = GoogleMapNode;
2391
2391
  // src/components/pageRenderingEngine/nodes/DivContainer.tsx
2392
2392
  import { jsx as jsx36, jsxs as jsxs14 } from "react/jsx-runtime";
2393
2393
  var Pagination = dynamic13(() => import("./Pagination-3SOPLEQN.mjs"), { ssr: true });
2394
- var DataBindingControls = dynamic13(() => import("./DataBindingControls-ZUBNGEMX.mjs"), {
2394
+ var DataBindingControls = dynamic13(() => import("./DataBindingControls-CUZ34EVI.mjs"), {
2395
2395
  ssr: true
2396
2396
  });
2397
2397
  var Slider = dynamic13(() => import("./Slider-IVPJBPE5.mjs"), {
package/dist/server.js CHANGED
@@ -2538,6 +2538,11 @@ var init_CommentNodeRenderer = __esm({
2538
2538
  if (isTextNode(node)) return node.text ?? "";
2539
2539
  const element = asElementNode(node);
2540
2540
  if (element.type === "linebreak" || element.type === "line-break") return "\n";
2541
+ if (element.type === "bulletList" || element.type === "numberedList") {
2542
+ const items = Array.isArray(element.items) ? element.items : [];
2543
+ return items.map((item) => `${flattenNodeText(item.children)}
2544
+ `).join("");
2545
+ }
2541
2546
  const inner = flattenNodeText(element.children);
2542
2547
  return element.type === "paragraph" ? `${inner}
2543
2548
  ` : inner;
@@ -2641,6 +2646,18 @@ var init_CommentNodeRenderer = __esm({
2641
2646
  case "listitem":
2642
2647
  case "list-item":
2643
2648
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("li", { className: "comment-node-listitem", children: renderChildren(element.children, key, assetBaseUrl) });
2649
+ // ContentComposer's shape: items are paragraph-like nodes (their own
2650
+ // `children`), not wrapped in a separate "listitem" node.
2651
+ case "bulletList":
2652
+ case "numberedList": {
2653
+ const ListTag = element.type === "numberedList" ? "ol" : "ul";
2654
+ const items = Array.isArray(element.items) ? element.items : [];
2655
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(ListTag, { className: "comment-node-list", children: items.map((item, index) => {
2656
+ const itemChildren = item.children ?? [];
2657
+ const isEmptyItem = itemChildren.length === 0 || itemChildren.every((child) => isTextNode(child) && (child.text ?? "").length === 0);
2658
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("li", { className: "comment-node-listitem", children: isEmptyItem ? null : renderChildren(item.children, key, assetBaseUrl) }, item.id ?? `${key}-${index}`);
2659
+ }) });
2660
+ }
2644
2661
  case "quote":
2645
2662
  case "blockquote":
2646
2663
  return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("blockquote", { className: "comment-node-quote", children: renderChildren(element.children, key, assetBaseUrl) });
@@ -4580,6 +4597,8 @@ var init_SelectWithSearchInput = __esm({
4580
4597
  "input",
4581
4598
  {
4582
4599
  type: "text",
4600
+ name: props.name,
4601
+ id: props.name,
4583
4602
  value: searchTerm,
4584
4603
  onChange: (e) => {
4585
4604
  if (!isReadOnly) {
@@ -4597,6 +4616,7 @@ var init_SelectWithSearchInput = __esm({
4597
4616
  placeholder: props.attributes?.placeholder ?? "Search...",
4598
4617
  readOnly: isReadOnly,
4599
4618
  disabled: isReadOnly,
4619
+ required: props.attributes?.required,
4600
4620
  className: `peer mt-2 py-1.5 select block w-full text-black rounded border-gray-300 shadow-sm
4601
4621
  focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50
4602
4622
  disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none
@@ -4635,7 +4655,8 @@ var init_SelectWithSearchInput = __esm({
4635
4655
  }
4636
4656
  )
4637
4657
  }
4638
- )
4658
+ ),
4659
+ /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props.attributes?.errorMessage ?? "" })
4639
4660
  ] }),
4640
4661
  !isReadOnly && isOpen && /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
4641
4662
  "div",
@@ -4813,20 +4834,26 @@ var init_SelectWithSearchPanel = __esm({
4813
4834
  " ",
4814
4835
  props?.attributes?.required && /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("span", { className: "bg-error-weak", children: "*" })
4815
4836
  ] }),
4816
- /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
4817
- "input",
4818
- {
4819
- type: "text",
4820
- value: searchTerm,
4821
- onChange: textChangeHandler,
4822
- onFocus: () => setIsOpen(true),
4823
- onKeyDown: handleKeyDown,
4824
- placeholder: props.attributes?.placeholder,
4825
- className: `peer mt-1 py-1.5 block w-full text-black rounded border-gray-300 shadow-sm
4826
- ${isError ? "focus:border-red-300 focus:ring focus:ring-red-200 focus:ring-opacity-50" : "focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"}
4837
+ /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { children: [
4838
+ /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
4839
+ "input",
4840
+ {
4841
+ type: "text",
4842
+ name: props.name,
4843
+ id: props.name,
4844
+ value: searchTerm,
4845
+ onChange: textChangeHandler,
4846
+ onFocus: () => setIsOpen(true),
4847
+ onKeyDown: handleKeyDown,
4848
+ placeholder: props.attributes?.placeholder,
4849
+ required: props.attributes?.required,
4850
+ className: `peer mt-1 py-1.5 block w-full text-black rounded border-gray-300 shadow-sm
4851
+ ${isError ? "focus:border-red-300 focus:ring focus:ring-red-200 focus:ring-opacity-50" : "focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"}
4827
4852
  disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none`
4828
- }
4829
- ) }),
4853
+ }
4854
+ ),
4855
+ /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props.attributes?.errorMessage ?? "" })
4856
+ ] }),
4830
4857
  /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { ref: containerRef, children: isOpen && /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)(import_react51.default.Fragment, { children: [
4831
4858
  /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("div", { className: "fixed z-50 right-0 bg-white top-[62px] w-1/4 border-l border-gray-200", children: [
4832
4859
  /* @__PURE__ */ (0, import_jsx_runtime76.jsx)("div", { className: "flex flex-col p-2 bg-accent-950 text-white", children: /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)("h5", { className: "text-md text-white font-medium", children: [
@@ -5261,21 +5288,18 @@ var init_SwitchInput = __esm({
5261
5288
  if (props.value != void 0 && props.value != null && props.value != "" && (props.value == "true" || props.value.toString() == "true")) {
5262
5289
  value = true;
5263
5290
  }
5264
- return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(import_react55.default.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)("div", { className: "flex items-start justify-between gap-4 py-3", children: [
5265
- /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)("div", { className: "min-w-0", children: [
5266
- props?.attributes?.label && /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(
5267
- "label",
5268
- {
5269
- htmlFor: props.name,
5270
- className: "inline-block text-sm font-semibold text-slate-800",
5271
- children: [
5272
- props.attributes.label,
5273
- props?.attributes?.required && /* @__PURE__ */ (0, import_jsx_runtime80.jsx)("span", { className: "bg-error-weak", children: "*" })
5274
- ]
5275
- }
5276
- ),
5277
- /* @__PURE__ */ (0, import_jsx_runtime80.jsx)("p", { className: "hidden group-[.validated]:peer-invalid:block mt-1 bg-error-weak text-sm", children: props?.attributes?.errorMessage || "" })
5278
- ] }),
5291
+ return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(import_react55.default.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)("div", { className: "relative flex items-start justify-between gap-4 py-3", children: [
5292
+ /* @__PURE__ */ (0, import_jsx_runtime80.jsx)("div", { className: "min-w-0", children: props?.attributes?.label && /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(
5293
+ "label",
5294
+ {
5295
+ htmlFor: props.name,
5296
+ className: "inline-block text-sm font-semibold text-slate-800",
5297
+ children: [
5298
+ props.attributes.label,
5299
+ props?.attributes?.required && /* @__PURE__ */ (0, import_jsx_runtime80.jsx)("span", { className: "bg-error-weak", children: "*" })
5300
+ ]
5301
+ }
5302
+ ) }),
5279
5303
  /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(
5280
5304
  "label",
5281
5305
  {
@@ -5306,7 +5330,8 @@ var init_SwitchInput = __esm({
5306
5330
  {
5307
5331
  className: "absolute left-0.5 top-0.5 h-5 w-5 rounded-full bg-default shadow\n transition-transform duration-200 ease-in-out\n peer-checked:translate-x-5\n peer-disabled:bg-slate-50"
5308
5332
  }
5309
- )
5333
+ ),
5334
+ /* @__PURE__ */ (0, import_jsx_runtime80.jsx)("p", { className: "hidden group-[.validated]:peer-invalid:block absolute left-0 top-full mt-1 w-max max-w-[220px] whitespace-normal bg-error-weak text-sm", children: props?.attributes?.errorMessage || "" })
5310
5335
  ]
5311
5336
  }
5312
5337
  )
package/dist/server.mjs CHANGED
@@ -746,7 +746,7 @@ var TimeUntilStarts_default = TimeUntilStarts;
746
746
 
747
747
  // src/components/controls/view/Commentrenderer.tsx
748
748
  import dynamic7 from "next/dynamic";
749
- var CommentRenderer = dynamic7(() => import("./CommentRendererClient-QC65XBT2.mjs"), {
749
+ var CommentRenderer = dynamic7(() => import("./CommentRendererClient-OHYVSNU5.mjs"), {
750
750
  ssr: false
751
751
  });
752
752
  var Commentrenderer_default = CommentRenderer;
@@ -2359,7 +2359,7 @@ var GoogleMapNode_default = GoogleMapNode;
2359
2359
  // src/components/pageRenderingEngine/nodes/DivContainer.tsx
2360
2360
  import { jsx as jsx36, jsxs as jsxs14 } from "react/jsx-runtime";
2361
2361
  var Pagination = dynamic13(() => import("./Pagination-FEXY7ERI.mjs"), { ssr: true });
2362
- var DataBindingControls = dynamic13(() => import("./DataBindingControls-KJJLT3V6.mjs"), {
2362
+ var DataBindingControls = dynamic13(() => import("./DataBindingControls-TBDJBK62.mjs"), {
2363
2363
  ssr: true
2364
2364
  });
2365
2365
  var Slider = dynamic13(() => import("./Slider-QIGKP6AE.mjs"), {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clyrex-digital/clyrex-controls-dev",
3
- "version": "0.8.1-dev.20260922042401",
3
+ "version": "0.8.1-dev.20260923102653",
4
4
  "description": "Reusable React components",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",