hs-uix 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/datatable.js CHANGED
@@ -999,10 +999,11 @@ var DataTable = ({
999
999
  selectedCount: selectedIds.size,
1000
1000
  displayCount,
1001
1001
  countLabel,
1002
+ allSelected: selectedIds.size >= (serverSide ? totalCount || data.length : allRowIds.length),
1002
1003
  onSelectAll: handleSelectAllRows,
1003
1004
  onDeselectAll: handleDeselectAll,
1004
1005
  selectionActions
1005
- }) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: 3 }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ import_react.default.createElement(
1006
+ }) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: 3 }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), selectedIds.size < (serverSide ? totalCount || data.length : allRowIds.length) && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ import_react.default.createElement(
1006
1007
  import_ui_extensions.Button,
1007
1008
  {
1008
1009
  key: i,
@@ -994,10 +994,11 @@ var DataTable = ({
994
994
  selectedCount: selectedIds.size,
995
995
  displayCount,
996
996
  countLabel,
997
+ allSelected: selectedIds.size >= (serverSide ? totalCount || data.length : allRowIds.length),
997
998
  onSelectAll: handleSelectAllRows,
998
999
  onDeselectAll: handleDeselectAll,
999
1000
  selectionActions
1000
- }) : /* @__PURE__ */ React.createElement(Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ React.createElement(Box, { flex: 3 }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ React.createElement(Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), /* @__PURE__ */ React.createElement(Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ React.createElement(Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ React.createElement(
1001
+ }) : /* @__PURE__ */ React.createElement(Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ React.createElement(Box, { flex: 3 }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ React.createElement(Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), selectedIds.size < (serverSide ? totalCount || data.length : allRowIds.length) && /* @__PURE__ */ React.createElement(Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ React.createElement(Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ React.createElement(
1001
1002
  Button,
1002
1003
  {
1003
1004
  key: i,
package/dist/form.js CHANGED
@@ -509,6 +509,118 @@ var FormBuilder = (0, import_react.forwardRef)(function FormBuilder2(props, ref)
509
509
  }
510
510
  prevSuccessRef.current = formSuccess;
511
511
  }, [addAlert, formSuccess, successTitle]);
512
+ if (process.env.NODE_ENV !== "production") {
513
+ const KNOWN_FIELD_PROPS = /* @__PURE__ */ new Set([
514
+ "name",
515
+ "type",
516
+ "label",
517
+ "description",
518
+ "placeholder",
519
+ "tooltip",
520
+ "required",
521
+ "readOnly",
522
+ "disabled",
523
+ "defaultValue",
524
+ "fieldProps",
525
+ "colSpan",
526
+ "width",
527
+ "visible",
528
+ "dependsOn",
529
+ "dependsOnConfig",
530
+ "group",
531
+ "debounce",
532
+ "pattern",
533
+ "patternMessage",
534
+ "minLength",
535
+ "maxLength",
536
+ "min",
537
+ "max",
538
+ "validate",
539
+ "validators",
540
+ "validateDebounce",
541
+ "useDefaultValidators",
542
+ "transformIn",
543
+ "transformOut",
544
+ "onFieldChange",
545
+ "onInput",
546
+ "onBlur",
547
+ "options",
548
+ "variant",
549
+ "inline",
550
+ "render",
551
+ "fields",
552
+ "items",
553
+ "showItemLabel",
554
+ "columns",
555
+ "repeaterProps",
556
+ "size",
557
+ "labelDisplay",
558
+ "textChecked",
559
+ "textUnchecked",
560
+ "rows",
561
+ "cols",
562
+ "resize",
563
+ "stepSize",
564
+ "precision",
565
+ "formatStyle",
566
+ "minValueReachedTooltip",
567
+ "maxValueReachedTooltip",
568
+ "currency",
569
+ "format",
570
+ "timezone",
571
+ "clearButtonLabel",
572
+ "todayButtonLabel",
573
+ "minValidationMessage",
574
+ "maxValidationMessage",
575
+ "interval",
576
+ "properties",
577
+ "direction",
578
+ "objectId",
579
+ "objectTypeId",
580
+ "associationLabels",
581
+ "filters",
582
+ "sort"
583
+ ]);
584
+ const FIELD_SUGGESTIONS = {
585
+ fullWidth: 'Use width: "full" or colSpan instead',
586
+ title: "Use label instead",
587
+ maxColumns: "maxColumns is a FormBuilder prop, not a field prop"
588
+ };
589
+ const KNOWN_SECTION_PROPS = /* @__PURE__ */ new Set([
590
+ "id",
591
+ "label",
592
+ "fields",
593
+ "defaultOpen",
594
+ "info",
595
+ "renderBefore",
596
+ "renderAfter"
597
+ ]);
598
+ const SECTION_SUGGESTIONS = {
599
+ title: "Use label instead",
600
+ name: "Use id instead",
601
+ open: "Use defaultOpen instead"
602
+ };
603
+ for (const field of fields) {
604
+ for (const key of Object.keys(field)) {
605
+ if (!KNOWN_FIELD_PROPS.has(key)) {
606
+ const suggestion = FIELD_SUGGESTIONS[key];
607
+ const hint = suggestion ? ` ${suggestion}.` : "";
608
+ console.warn(`[hs-uix] Warning: Field "${field.name}" has unknown prop "${key}".${hint}`);
609
+ }
610
+ }
611
+ }
612
+ if (Array.isArray(sections)) {
613
+ for (const sec of sections) {
614
+ for (const key of Object.keys(sec)) {
615
+ if (!KNOWN_SECTION_PROPS.has(key)) {
616
+ const suggestion = SECTION_SUGGESTIONS[key];
617
+ const hint = suggestion ? ` ${suggestion}.` : "";
618
+ console.warn(`[hs-uix] Warning: Section "${sec.id || "(unnamed)"}" has unknown prop "${key}".${hint}`);
619
+ }
620
+ }
621
+ }
622
+ }
623
+ }
512
624
  const computeInitialValues = () => {
513
625
  const resolved = transformInitialValues && initialValues ? transformInitialValues(initialValues) : initialValues;
514
626
  const vals = {};
@@ -1199,7 +1311,9 @@ var FormBuilder = (0, import_react.forwardRef)(function FormBuilder2(props, ref)
1199
1311
  if (field.type === "display") {
1200
1312
  if (field.render) {
1201
1313
  return field.render({
1314
+ values: formValues,
1202
1315
  allValues: formValues,
1316
+ // deprecated — use `values`
1203
1317
  setFieldValue: (name, value) => handleFieldChange(name, value),
1204
1318
  setFieldError: (name, message) => updateErrors({ [name]: message })
1205
1319
  });
@@ -1347,7 +1461,9 @@ var FormBuilder = (0, import_react.forwardRef)(function FormBuilder2(props, ref)
1347
1461
  value: fieldValue,
1348
1462
  onChange: fieldOnChange,
1349
1463
  error: hasError,
1464
+ values: formValues,
1350
1465
  allValues: formValues
1466
+ // deprecated — use `values`
1351
1467
  });
1352
1468
  }
1353
1469
  const plugin = fieldTypes && fieldTypes[field.type];
@@ -1357,7 +1473,9 @@ var FormBuilder = (0, import_react.forwardRef)(function FormBuilder2(props, ref)
1357
1473
  onChange: fieldOnChange,
1358
1474
  error: hasError,
1359
1475
  field,
1476
+ values: formValues,
1360
1477
  allValues: formValues
1478
+ // deprecated — use `values`
1361
1479
  });
1362
1480
  }
1363
1481
  const commonProps = {
@@ -1781,13 +1899,21 @@ var FormBuilder = (0, import_react.forwardRef)(function FormBuilder2(props, ref)
1781
1899
  const elements = [];
1782
1900
  let currentRow = [];
1783
1901
  let currentRowSpan = 0;
1902
+ const gridColumnWidth = Math.floor(100 / columns);
1784
1903
  const flushRow = () => {
1785
1904
  if (currentRow.length === 0) return;
1905
+ const allUniform = currentRow.every((f) => getFieldColSpan(f) === 1);
1786
1906
  const totalSpan = currentRow.reduce((s, f) => s + getFieldColSpan(f), 0);
1787
1907
  const remainder = columns - totalSpan;
1788
- elements.push(
1789
- /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { key: `row-${currentRow[0].name}`, direction: "row", gap }, currentRow.map((f) => /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { key: f.name, flex: getFieldColSpan(f) }, renderField(f))), remainder > 0 && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: remainder }))
1790
- );
1908
+ if (allUniform) {
1909
+ elements.push(
1910
+ /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.AutoGrid, { key: `row-${currentRow[0].name}`, columnWidth: gridColumnWidth, flexible: true, gap }, currentRow.map((f) => /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, { key: f.name }, renderField(f))), remainder > 0 && Array.from({ length: remainder }, (_, i) => /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { key: `spacer-${i}` })))
1911
+ );
1912
+ } else {
1913
+ elements.push(
1914
+ /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { key: `row-${currentRow[0].name}`, direction: "row", gap }, currentRow.map((f) => /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { key: f.name, flex: getFieldColSpan(f) }, renderField(f))), remainder > 0 && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: remainder }))
1915
+ );
1916
+ }
1791
1917
  currentRow = [];
1792
1918
  currentRowSpan = 0;
1793
1919
  };
package/dist/form.mjs CHANGED
@@ -513,6 +513,118 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
513
513
  }
514
514
  prevSuccessRef.current = formSuccess;
515
515
  }, [addAlert, formSuccess, successTitle]);
516
+ if (process.env.NODE_ENV !== "production") {
517
+ const KNOWN_FIELD_PROPS = /* @__PURE__ */ new Set([
518
+ "name",
519
+ "type",
520
+ "label",
521
+ "description",
522
+ "placeholder",
523
+ "tooltip",
524
+ "required",
525
+ "readOnly",
526
+ "disabled",
527
+ "defaultValue",
528
+ "fieldProps",
529
+ "colSpan",
530
+ "width",
531
+ "visible",
532
+ "dependsOn",
533
+ "dependsOnConfig",
534
+ "group",
535
+ "debounce",
536
+ "pattern",
537
+ "patternMessage",
538
+ "minLength",
539
+ "maxLength",
540
+ "min",
541
+ "max",
542
+ "validate",
543
+ "validators",
544
+ "validateDebounce",
545
+ "useDefaultValidators",
546
+ "transformIn",
547
+ "transformOut",
548
+ "onFieldChange",
549
+ "onInput",
550
+ "onBlur",
551
+ "options",
552
+ "variant",
553
+ "inline",
554
+ "render",
555
+ "fields",
556
+ "items",
557
+ "showItemLabel",
558
+ "columns",
559
+ "repeaterProps",
560
+ "size",
561
+ "labelDisplay",
562
+ "textChecked",
563
+ "textUnchecked",
564
+ "rows",
565
+ "cols",
566
+ "resize",
567
+ "stepSize",
568
+ "precision",
569
+ "formatStyle",
570
+ "minValueReachedTooltip",
571
+ "maxValueReachedTooltip",
572
+ "currency",
573
+ "format",
574
+ "timezone",
575
+ "clearButtonLabel",
576
+ "todayButtonLabel",
577
+ "minValidationMessage",
578
+ "maxValidationMessage",
579
+ "interval",
580
+ "properties",
581
+ "direction",
582
+ "objectId",
583
+ "objectTypeId",
584
+ "associationLabels",
585
+ "filters",
586
+ "sort"
587
+ ]);
588
+ const FIELD_SUGGESTIONS = {
589
+ fullWidth: 'Use width: "full" or colSpan instead',
590
+ title: "Use label instead",
591
+ maxColumns: "maxColumns is a FormBuilder prop, not a field prop"
592
+ };
593
+ const KNOWN_SECTION_PROPS = /* @__PURE__ */ new Set([
594
+ "id",
595
+ "label",
596
+ "fields",
597
+ "defaultOpen",
598
+ "info",
599
+ "renderBefore",
600
+ "renderAfter"
601
+ ]);
602
+ const SECTION_SUGGESTIONS = {
603
+ title: "Use label instead",
604
+ name: "Use id instead",
605
+ open: "Use defaultOpen instead"
606
+ };
607
+ for (const field of fields) {
608
+ for (const key of Object.keys(field)) {
609
+ if (!KNOWN_FIELD_PROPS.has(key)) {
610
+ const suggestion = FIELD_SUGGESTIONS[key];
611
+ const hint = suggestion ? ` ${suggestion}.` : "";
612
+ console.warn(`[hs-uix] Warning: Field "${field.name}" has unknown prop "${key}".${hint}`);
613
+ }
614
+ }
615
+ }
616
+ if (Array.isArray(sections)) {
617
+ for (const sec of sections) {
618
+ for (const key of Object.keys(sec)) {
619
+ if (!KNOWN_SECTION_PROPS.has(key)) {
620
+ const suggestion = SECTION_SUGGESTIONS[key];
621
+ const hint = suggestion ? ` ${suggestion}.` : "";
622
+ console.warn(`[hs-uix] Warning: Section "${sec.id || "(unnamed)"}" has unknown prop "${key}".${hint}`);
623
+ }
624
+ }
625
+ }
626
+ }
627
+ }
516
628
  const computeInitialValues = () => {
517
629
  const resolved = transformInitialValues && initialValues ? transformInitialValues(initialValues) : initialValues;
518
630
  const vals = {};
@@ -1203,7 +1315,9 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
1203
1315
  if (field.type === "display") {
1204
1316
  if (field.render) {
1205
1317
  return field.render({
1318
+ values: formValues,
1206
1319
  allValues: formValues,
1320
+ // deprecated — use `values`
1207
1321
  setFieldValue: (name, value) => handleFieldChange(name, value),
1208
1322
  setFieldError: (name, message) => updateErrors({ [name]: message })
1209
1323
  });
@@ -1351,7 +1465,9 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
1351
1465
  value: fieldValue,
1352
1466
  onChange: fieldOnChange,
1353
1467
  error: hasError,
1468
+ values: formValues,
1354
1469
  allValues: formValues
1470
+ // deprecated — use `values`
1355
1471
  });
1356
1472
  }
1357
1473
  const plugin = fieldTypes && fieldTypes[field.type];
@@ -1361,7 +1477,9 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
1361
1477
  onChange: fieldOnChange,
1362
1478
  error: hasError,
1363
1479
  field,
1480
+ values: formValues,
1364
1481
  allValues: formValues
1482
+ // deprecated — use `values`
1365
1483
  });
1366
1484
  }
1367
1485
  const commonProps = {
@@ -1785,13 +1903,21 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
1785
1903
  const elements = [];
1786
1904
  let currentRow = [];
1787
1905
  let currentRowSpan = 0;
1906
+ const gridColumnWidth = Math.floor(100 / columns);
1788
1907
  const flushRow = () => {
1789
1908
  if (currentRow.length === 0) return;
1909
+ const allUniform = currentRow.every((f) => getFieldColSpan(f) === 1);
1790
1910
  const totalSpan = currentRow.reduce((s, f) => s + getFieldColSpan(f), 0);
1791
1911
  const remainder = columns - totalSpan;
1792
- elements.push(
1793
- /* @__PURE__ */ React.createElement(Flex, { key: `row-${currentRow[0].name}`, direction: "row", gap }, currentRow.map((f) => /* @__PURE__ */ React.createElement(Box, { key: f.name, flex: getFieldColSpan(f) }, renderField(f))), remainder > 0 && /* @__PURE__ */ React.createElement(Box, { flex: remainder }))
1794
- );
1912
+ if (allUniform) {
1913
+ elements.push(
1914
+ /* @__PURE__ */ React.createElement(AutoGrid, { key: `row-${currentRow[0].name}`, columnWidth: gridColumnWidth, flexible: true, gap }, currentRow.map((f) => /* @__PURE__ */ React.createElement(React.Fragment, { key: f.name }, renderField(f))), remainder > 0 && Array.from({ length: remainder }, (_, i) => /* @__PURE__ */ React.createElement(Box, { key: `spacer-${i}` })))
1915
+ );
1916
+ } else {
1917
+ elements.push(
1918
+ /* @__PURE__ */ React.createElement(Flex, { key: `row-${currentRow[0].name}`, direction: "row", gap }, currentRow.map((f) => /* @__PURE__ */ React.createElement(Box, { key: f.name, flex: getFieldColSpan(f) }, renderField(f))), remainder > 0 && /* @__PURE__ */ React.createElement(Box, { flex: remainder }))
1919
+ );
1920
+ }
1795
1921
  currentRow = [];
1796
1922
  currentRowSpan = 0;
1797
1923
  };
package/dist/index.js CHANGED
@@ -1001,10 +1001,11 @@ var DataTable = ({
1001
1001
  selectedCount: selectedIds.size,
1002
1002
  displayCount,
1003
1003
  countLabel,
1004
+ allSelected: selectedIds.size >= (serverSide ? totalCount || data.length : allRowIds.length),
1004
1005
  onSelectAll: handleSelectAllRows,
1005
1006
  onDeselectAll: handleDeselectAll,
1006
1007
  selectionActions
1007
- }) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: 3 }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ import_react.default.createElement(
1008
+ }) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: 3 }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), selectedIds.size < (serverSide ? totalCount || data.length : allRowIds.length) && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ import_react.default.createElement(
1008
1009
  import_ui_extensions.Button,
1009
1010
  {
1010
1011
  key: i,
@@ -1579,6 +1580,118 @@ var FormBuilder = (0, import_react2.forwardRef)(function FormBuilder2(props, ref
1579
1580
  }
1580
1581
  prevSuccessRef.current = formSuccess;
1581
1582
  }, [addAlert, formSuccess, successTitle]);
1583
+ if (process.env.NODE_ENV !== "production") {
1584
+ const KNOWN_FIELD_PROPS = /* @__PURE__ */ new Set([
1585
+ "name",
1586
+ "type",
1587
+ "label",
1588
+ "description",
1589
+ "placeholder",
1590
+ "tooltip",
1591
+ "required",
1592
+ "readOnly",
1593
+ "disabled",
1594
+ "defaultValue",
1595
+ "fieldProps",
1596
+ "colSpan",
1597
+ "width",
1598
+ "visible",
1599
+ "dependsOn",
1600
+ "dependsOnConfig",
1601
+ "group",
1602
+ "debounce",
1603
+ "pattern",
1604
+ "patternMessage",
1605
+ "minLength",
1606
+ "maxLength",
1607
+ "min",
1608
+ "max",
1609
+ "validate",
1610
+ "validators",
1611
+ "validateDebounce",
1612
+ "useDefaultValidators",
1613
+ "transformIn",
1614
+ "transformOut",
1615
+ "onFieldChange",
1616
+ "onInput",
1617
+ "onBlur",
1618
+ "options",
1619
+ "variant",
1620
+ "inline",
1621
+ "render",
1622
+ "fields",
1623
+ "items",
1624
+ "showItemLabel",
1625
+ "columns",
1626
+ "repeaterProps",
1627
+ "size",
1628
+ "labelDisplay",
1629
+ "textChecked",
1630
+ "textUnchecked",
1631
+ "rows",
1632
+ "cols",
1633
+ "resize",
1634
+ "stepSize",
1635
+ "precision",
1636
+ "formatStyle",
1637
+ "minValueReachedTooltip",
1638
+ "maxValueReachedTooltip",
1639
+ "currency",
1640
+ "format",
1641
+ "timezone",
1642
+ "clearButtonLabel",
1643
+ "todayButtonLabel",
1644
+ "minValidationMessage",
1645
+ "maxValidationMessage",
1646
+ "interval",
1647
+ "properties",
1648
+ "direction",
1649
+ "objectId",
1650
+ "objectTypeId",
1651
+ "associationLabels",
1652
+ "filters",
1653
+ "sort"
1654
+ ]);
1655
+ const FIELD_SUGGESTIONS = {
1656
+ fullWidth: 'Use width: "full" or colSpan instead',
1657
+ title: "Use label instead",
1658
+ maxColumns: "maxColumns is a FormBuilder prop, not a field prop"
1659
+ };
1660
+ const KNOWN_SECTION_PROPS = /* @__PURE__ */ new Set([
1661
+ "id",
1662
+ "label",
1663
+ "fields",
1664
+ "defaultOpen",
1665
+ "info",
1666
+ "renderBefore",
1667
+ "renderAfter"
1668
+ ]);
1669
+ const SECTION_SUGGESTIONS = {
1670
+ title: "Use label instead",
1671
+ name: "Use id instead",
1672
+ open: "Use defaultOpen instead"
1673
+ };
1674
+ for (const field of fields) {
1675
+ for (const key of Object.keys(field)) {
1676
+ if (!KNOWN_FIELD_PROPS.has(key)) {
1677
+ const suggestion = FIELD_SUGGESTIONS[key];
1678
+ const hint = suggestion ? ` ${suggestion}.` : "";
1679
+ console.warn(`[hs-uix] Warning: Field "${field.name}" has unknown prop "${key}".${hint}`);
1680
+ }
1681
+ }
1682
+ }
1683
+ if (Array.isArray(sections)) {
1684
+ for (const sec of sections) {
1685
+ for (const key of Object.keys(sec)) {
1686
+ if (!KNOWN_SECTION_PROPS.has(key)) {
1687
+ const suggestion = SECTION_SUGGESTIONS[key];
1688
+ const hint = suggestion ? ` ${suggestion}.` : "";
1689
+ console.warn(`[hs-uix] Warning: Section "${sec.id || "(unnamed)"}" has unknown prop "${key}".${hint}`);
1690
+ }
1691
+ }
1692
+ }
1693
+ }
1694
+ }
1582
1695
  const computeInitialValues = () => {
1583
1696
  const resolved = transformInitialValues && initialValues ? transformInitialValues(initialValues) : initialValues;
1584
1697
  const vals = {};
@@ -2269,7 +2382,9 @@ var FormBuilder = (0, import_react2.forwardRef)(function FormBuilder2(props, ref
2269
2382
  if (field.type === "display") {
2270
2383
  if (field.render) {
2271
2384
  return field.render({
2385
+ values: formValues,
2272
2386
  allValues: formValues,
2387
+ // deprecated — use `values`
2273
2388
  setFieldValue: (name, value) => handleFieldChange(name, value),
2274
2389
  setFieldError: (name, message) => updateErrors({ [name]: message })
2275
2390
  });
@@ -2417,7 +2532,9 @@ var FormBuilder = (0, import_react2.forwardRef)(function FormBuilder2(props, ref
2417
2532
  value: fieldValue,
2418
2533
  onChange: fieldOnChange,
2419
2534
  error: hasError,
2535
+ values: formValues,
2420
2536
  allValues: formValues
2537
+ // deprecated — use `values`
2421
2538
  });
2422
2539
  }
2423
2540
  const plugin = fieldTypes && fieldTypes[field.type];
@@ -2427,7 +2544,9 @@ var FormBuilder = (0, import_react2.forwardRef)(function FormBuilder2(props, ref
2427
2544
  onChange: fieldOnChange,
2428
2545
  error: hasError,
2429
2546
  field,
2547
+ values: formValues,
2430
2548
  allValues: formValues
2549
+ // deprecated — use `values`
2431
2550
  });
2432
2551
  }
2433
2552
  const commonProps = {
@@ -2851,13 +2970,21 @@ var FormBuilder = (0, import_react2.forwardRef)(function FormBuilder2(props, ref
2851
2970
  const elements = [];
2852
2971
  let currentRow = [];
2853
2972
  let currentRowSpan = 0;
2973
+ const gridColumnWidth = Math.floor(100 / columns);
2854
2974
  const flushRow = () => {
2855
2975
  if (currentRow.length === 0) return;
2976
+ const allUniform = currentRow.every((f) => getFieldColSpan(f) === 1);
2856
2977
  const totalSpan = currentRow.reduce((s, f) => s + getFieldColSpan(f), 0);
2857
2978
  const remainder = columns - totalSpan;
2858
- elements.push(
2859
- /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { key: `row-${currentRow[0].name}`, direction: "row", gap }, currentRow.map((f) => /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { key: f.name, flex: getFieldColSpan(f) }, renderField(f))), remainder > 0 && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { flex: remainder }))
2860
- );
2979
+ if (allUniform) {
2980
+ elements.push(
2981
+ /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.AutoGrid, { key: `row-${currentRow[0].name}`, columnWidth: gridColumnWidth, flexible: true, gap }, currentRow.map((f) => /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, { key: f.name }, renderField(f))), remainder > 0 && Array.from({ length: remainder }, (_, i) => /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { key: `spacer-${i}` })))
2982
+ );
2983
+ } else {
2984
+ elements.push(
2985
+ /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { key: `row-${currentRow[0].name}`, direction: "row", gap }, currentRow.map((f) => /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { key: f.name, flex: getFieldColSpan(f) }, renderField(f))), remainder > 0 && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { flex: remainder }))
2986
+ );
2987
+ }
2861
2988
  currentRow = [];
2862
2989
  currentRowSpan = 0;
2863
2990
  };
package/dist/index.mjs CHANGED
@@ -994,10 +994,11 @@ var DataTable = ({
994
994
  selectedCount: selectedIds.size,
995
995
  displayCount,
996
996
  countLabel,
997
+ allSelected: selectedIds.size >= (serverSide ? totalCount || data.length : allRowIds.length),
997
998
  onSelectAll: handleSelectAllRows,
998
999
  onDeselectAll: handleDeselectAll,
999
1000
  selectionActions
1000
- }) : /* @__PURE__ */ React.createElement(Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ React.createElement(Box, { flex: 3 }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ React.createElement(Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), /* @__PURE__ */ React.createElement(Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ React.createElement(Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ React.createElement(
1001
+ }) : /* @__PURE__ */ React.createElement(Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ React.createElement(Box, { flex: 3 }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ React.createElement(Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), selectedIds.size < (serverSide ? totalCount || data.length : allRowIds.length) && /* @__PURE__ */ React.createElement(Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ React.createElement(Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ React.createElement(
1001
1002
  Button,
1002
1003
  {
1003
1004
  key: i,
@@ -1612,6 +1613,118 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
1612
1613
  }
1613
1614
  prevSuccessRef.current = formSuccess;
1614
1615
  }, [addAlert, formSuccess, successTitle]);
1616
+ if (process.env.NODE_ENV !== "production") {
1617
+ const KNOWN_FIELD_PROPS = /* @__PURE__ */ new Set([
1618
+ "name",
1619
+ "type",
1620
+ "label",
1621
+ "description",
1622
+ "placeholder",
1623
+ "tooltip",
1624
+ "required",
1625
+ "readOnly",
1626
+ "disabled",
1627
+ "defaultValue",
1628
+ "fieldProps",
1629
+ "colSpan",
1630
+ "width",
1631
+ "visible",
1632
+ "dependsOn",
1633
+ "dependsOnConfig",
1634
+ "group",
1635
+ "debounce",
1636
+ "pattern",
1637
+ "patternMessage",
1638
+ "minLength",
1639
+ "maxLength",
1640
+ "min",
1641
+ "max",
1642
+ "validate",
1643
+ "validators",
1644
+ "validateDebounce",
1645
+ "useDefaultValidators",
1646
+ "transformIn",
1647
+ "transformOut",
1648
+ "onFieldChange",
1649
+ "onInput",
1650
+ "onBlur",
1651
+ "options",
1652
+ "variant",
1653
+ "inline",
1654
+ "render",
1655
+ "fields",
1656
+ "items",
1657
+ "showItemLabel",
1658
+ "columns",
1659
+ "repeaterProps",
1660
+ "size",
1661
+ "labelDisplay",
1662
+ "textChecked",
1663
+ "textUnchecked",
1664
+ "rows",
1665
+ "cols",
1666
+ "resize",
1667
+ "stepSize",
1668
+ "precision",
1669
+ "formatStyle",
1670
+ "minValueReachedTooltip",
1671
+ "maxValueReachedTooltip",
1672
+ "currency",
1673
+ "format",
1674
+ "timezone",
1675
+ "clearButtonLabel",
1676
+ "todayButtonLabel",
1677
+ "minValidationMessage",
1678
+ "maxValidationMessage",
1679
+ "interval",
1680
+ "properties",
1681
+ "direction",
1682
+ "objectId",
1683
+ "objectTypeId",
1684
+ "associationLabels",
1685
+ "filters",
1686
+ "sort"
1687
+ ]);
1688
+ const FIELD_SUGGESTIONS = {
1689
+ fullWidth: 'Use width: "full" or colSpan instead',
1690
+ title: "Use label instead",
1691
+ maxColumns: "maxColumns is a FormBuilder prop, not a field prop"
1692
+ };
1693
+ const KNOWN_SECTION_PROPS = /* @__PURE__ */ new Set([
1694
+ "id",
1695
+ "label",
1696
+ "fields",
1697
+ "defaultOpen",
1698
+ "info",
1699
+ "renderBefore",
1700
+ "renderAfter"
1701
+ ]);
1702
+ const SECTION_SUGGESTIONS = {
1703
+ title: "Use label instead",
1704
+ name: "Use id instead",
1705
+ open: "Use defaultOpen instead"
1706
+ };
1707
+ for (const field of fields) {
1708
+ for (const key of Object.keys(field)) {
1709
+ if (!KNOWN_FIELD_PROPS.has(key)) {
1710
+ const suggestion = FIELD_SUGGESTIONS[key];
1711
+ const hint = suggestion ? ` ${suggestion}.` : "";
1712
+ console.warn(`[hs-uix] Warning: Field "${field.name}" has unknown prop "${key}".${hint}`);
1713
+ }
1714
+ }
1715
+ }
1716
+ if (Array.isArray(sections)) {
1717
+ for (const sec of sections) {
1718
+ for (const key of Object.keys(sec)) {
1719
+ if (!KNOWN_SECTION_PROPS.has(key)) {
1720
+ const suggestion = SECTION_SUGGESTIONS[key];
1721
+ const hint = suggestion ? ` ${suggestion}.` : "";
1722
+ console.warn(`[hs-uix] Warning: Section "${sec.id || "(unnamed)"}" has unknown prop "${key}".${hint}`);
1723
+ }
1724
+ }
1725
+ }
1726
+ }
1727
+ }
1615
1728
  const computeInitialValues = () => {
1616
1729
  const resolved = transformInitialValues && initialValues ? transformInitialValues(initialValues) : initialValues;
1617
1730
  const vals = {};
@@ -2302,7 +2415,9 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
2302
2415
  if (field.type === "display") {
2303
2416
  if (field.render) {
2304
2417
  return field.render({
2418
+ values: formValues,
2305
2419
  allValues: formValues,
2420
+ // deprecated — use `values`
2306
2421
  setFieldValue: (name, value) => handleFieldChange(name, value),
2307
2422
  setFieldError: (name, message) => updateErrors({ [name]: message })
2308
2423
  });
@@ -2450,7 +2565,9 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
2450
2565
  value: fieldValue,
2451
2566
  onChange: fieldOnChange,
2452
2567
  error: hasError,
2568
+ values: formValues,
2453
2569
  allValues: formValues
2570
+ // deprecated — use `values`
2454
2571
  });
2455
2572
  }
2456
2573
  const plugin = fieldTypes && fieldTypes[field.type];
@@ -2460,7 +2577,9 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
2460
2577
  onChange: fieldOnChange,
2461
2578
  error: hasError,
2462
2579
  field,
2580
+ values: formValues,
2463
2581
  allValues: formValues
2582
+ // deprecated — use `values`
2464
2583
  });
2465
2584
  }
2466
2585
  const commonProps = {
@@ -2884,13 +3003,21 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
2884
3003
  const elements = [];
2885
3004
  let currentRow = [];
2886
3005
  let currentRowSpan = 0;
3006
+ const gridColumnWidth = Math.floor(100 / columns);
2887
3007
  const flushRow = () => {
2888
3008
  if (currentRow.length === 0) return;
3009
+ const allUniform = currentRow.every((f) => getFieldColSpan(f) === 1);
2889
3010
  const totalSpan = currentRow.reduce((s, f) => s + getFieldColSpan(f), 0);
2890
3011
  const remainder = columns - totalSpan;
2891
- elements.push(
2892
- /* @__PURE__ */ React2.createElement(Flex2, { key: `row-${currentRow[0].name}`, direction: "row", gap }, currentRow.map((f) => /* @__PURE__ */ React2.createElement(Box2, { key: f.name, flex: getFieldColSpan(f) }, renderField(f))), remainder > 0 && /* @__PURE__ */ React2.createElement(Box2, { flex: remainder }))
2893
- );
3012
+ if (allUniform) {
3013
+ elements.push(
3014
+ /* @__PURE__ */ React2.createElement(AutoGrid, { key: `row-${currentRow[0].name}`, columnWidth: gridColumnWidth, flexible: true, gap }, currentRow.map((f) => /* @__PURE__ */ React2.createElement(React2.Fragment, { key: f.name }, renderField(f))), remainder > 0 && Array.from({ length: remainder }, (_, i) => /* @__PURE__ */ React2.createElement(Box2, { key: `spacer-${i}` })))
3015
+ );
3016
+ } else {
3017
+ elements.push(
3018
+ /* @__PURE__ */ React2.createElement(Flex2, { key: `row-${currentRow[0].name}`, direction: "row", gap }, currentRow.map((f) => /* @__PURE__ */ React2.createElement(Box2, { key: f.name, flex: getFieldColSpan(f) }, renderField(f))), remainder > 0 && /* @__PURE__ */ React2.createElement(Box2, { flex: remainder }))
3019
+ );
3020
+ }
2894
3021
  currentRow = [];
2895
3022
  currentRowSpan = 0;
2896
3023
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hs-uix",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Production-ready UI components for HubSpot UI Extensions — DataTable, FormBuilder, and more",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",