@texaryn/react-bootstrap 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @texaryn/react-bootstrap
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 04270e8: Give every array action control an accessible name that says which row it acts on.
8
+
9
+ Five buttons all announced as "Remove" leave a screen reader user guessing. Each now carries the current 1-based position and whatever schema titles exist, so "Remove Contact 2 from Contacts", degrading to "Remove item 2" when nothing is titled. Reorder controls read "Move up Contact 2 in Contacts", and the per-array control reads "Add item to Contacts". The visible words stay "Remove", "Up" and "Add", with the longer string in `aria-label`, which contains the visible text so speech input still works.
10
+
11
+ The row's own value is deliberately not used: it is mutable, often blank, frequently duplicated, and sometimes sensitive. The position is recomputed on every render rather than captured when a row is created, because a row survives a move while its position does not.
12
+
13
+ The add control is named from the item template rather than from the first row, so an empty array still says "Add Tag" where naming it matters most. That needed the template's annotations, which the projection did not carry: `NodeProjection.itemAnnotations` is new and optional, so an adapter that cannot supply it stays valid, and `ArrayMeta.itemTitle` carries the result to renderers.
14
+
15
+ React exposes the decision as `useArrayActions` so its three widget sets cannot drift, and the name builders are exported for custom widgets. Reorder-control parity is unchanged: the three React sets still expose no reorder button.
16
+ - c9b930f: Show a required field's requirement to a sighted user, without announcing it twice.
17
+
18
+ Required was conveyed only through `aria-required`, so a sighted user had nothing to tell a required field from an optional one. Every required label now carries a visible `(required)`.
19
+
20
+ Three channels carry that one fact and are deliberately kept separate. The visible label reads "Full Name (required)". The accessible name stays exactly "Full Name", because the indicator is `aria-hidden` and `aria-required` already reports the state; putting it in the name as well makes some screen readers say it twice. WCAG's Label in Name allows exactly this omission when the state is surfaced programmatically.
21
+
22
+ The indicator is the word rather than an asterisk, so nothing has to be explained elsewhere on the form. `field.label` and `fieldLabel()` still return the raw schema title: the decoration lives in the label rendering, so a visual convention does not become the canonical field title a custom widget sees. React exposes `FieldLabelContent` so its three widget sets cannot drift, and each binding exports `REQUIRED_INDICATOR` so a custom widget can match the wording.
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies [04270e8]
27
+ - Updated dependencies [c9b930f]
28
+ - @texaryn/core@0.7.0
29
+ - @texaryn/react@0.4.0
30
+
3
31
  ## 0.2.0
4
32
 
5
33
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapArrayControl.d.ts","sourceRoot":"","sources":["../../src/widgets/BootstrapArrayControl.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAiB,MAAM,EAAE,MAAM,eAAe,CAAA;AAG1D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;CACb;AAED,iBAAS,yBAAyB,CAAC,EAAE,IAAI,EAAE,EAAE,WAAW,qBA6BvD;AAED,eAAO,MAAM,qBAAqB,6DAGjC,CAAA"}
1
+ {"version":3,"file":"BootstrapArrayControl.d.ts","sourceRoot":"","sources":["../../src/widgets/BootstrapArrayControl.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,EAAiB,MAAM,EAAE,MAAM,eAAe,CAAA;AAG1D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;CACb;AAED,iBAAS,yBAAyB,CAAC,EAAE,IAAI,EAAE,EAAE,WAAW,qBAwCvD;AAED,eAAO,MAAM,qBAAqB,6DAGjC,CAAA"}
@@ -1,14 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { NodeRenderer, useFieldArray, useRendererContext } from '@texaryn/react';
3
+ import { NodeRenderer, useArrayActions, useFieldArray, useRendererContext } from '@texaryn/react';
4
4
  function BootstrapArrayControlImpl({ node }) {
5
5
  const containerNode = node;
6
6
  const fieldArray = useFieldArray(containerNode.id);
7
7
  const { document, registry } = useRendererContext();
8
+ const actions = useArrayActions(node);
8
9
  return (_jsxs("div", { children: [fieldArray.items.map((item, index) => {
9
10
  const childNode = item.nodeId ? document.nodes[item.nodeId] : undefined;
10
- return (_jsxs("div", { className: "mb-3", children: [childNode ? (_jsx(NodeRenderer, { node: childNode, document: document, registry: registry })) : null, fieldArray.canRemove ? (_jsx("button", { type: "button", className: "btn btn-outline-danger btn-sm", onClick: () => fieldArray.remove(index), children: "Remove" })) : null] }, item.id));
11
- }), fieldArray.canAdd ? (_jsx("button", { type: "button", className: "btn btn-primary", onClick: () => fieldArray.add(), children: "Add" })) : null] }));
11
+ return (_jsxs("div", { className: "mb-3", children: [childNode ? (_jsx(NodeRenderer, { node: childNode, document: document, registry: registry })) : null, fieldArray.canRemove ? (_jsx("button", { type: "button", className: "btn btn-outline-danger btn-sm", "aria-label": actions.removeName(index + 1, childNode), onClick: () => fieldArray.remove(index), children: "Remove" })) : null] }, item.id));
12
+ }), fieldArray.canAdd ? (_jsx("button", { type: "button", className: "btn btn-primary", "aria-label": actions.addName, onClick: () => fieldArray.add(), children: "Add" })) : null] }));
12
13
  }
13
14
  export const BootstrapArrayControl = React.memo(BootstrapArrayControlImpl, (prev, next) => prev.node.id === next.node.id);
14
15
  //# sourceMappingURL=BootstrapArrayControl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapArrayControl.js","sourceRoot":"","sources":["../../src/widgets/BootstrapArrayControl.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAMhF,SAAS,yBAAyB,CAAC,EAAE,IAAI,EAAe;IACtD,MAAM,aAAa,GAAG,IAAqB,CAAA;IAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAClD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,kBAAkB,EAAE,CAAA;IAEnD,OAAO,CACL,0BACG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;gBACvE,OAAO,CACL,eAAmB,SAAS,EAAC,MAAM,aAChC,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,YAAY,IAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAC1E,CAAC,CAAC,CAAC,IAAI,EACP,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CACtB,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,+BAA+B,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,uBAE9F,CACV,CAAC,CAAC,CAAC,IAAI,KARA,IAAI,CAAC,EAAE,CASX,CACP,CAAA;YACH,CAAC,CAAC,EACD,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CACnB,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,iBAAiB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,oBAExE,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAC7C,yBAAyB,EACzB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9C,CAAA"}
1
+ {"version":3,"file":"BootstrapArrayControl.js","sourceRoot":"","sources":["../../src/widgets/BootstrapArrayControl.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAMjG,SAAS,yBAAyB,CAAC,EAAE,IAAI,EAAe;IACtD,MAAM,aAAa,GAAG,IAAqB,CAAA;IAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAClD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,kBAAkB,EAAE,CAAA;IACnD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IAErC,OAAO,CACL,0BACG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;gBACvE,OAAO,CACL,eAAmB,SAAS,EAAC,MAAM,aAChC,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,YAAY,IAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAC1E,CAAC,CAAC,CAAC,IAAI,EACP,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CACtB,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,+BAA+B,gBAC7B,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,SAAS,CAAC,EACpD,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,uBAGhC,CACV,CAAC,CAAC,CAAC,IAAI,KAbA,IAAI,CAAC,EAAE,CAcX,CACP,CAAA;YACH,CAAC,CAAC,EACD,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CACnB,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,iBAAiB,gBACf,OAAO,CAAC,OAAO,EAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,oBAGxB,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAC7C,yBAAyB,EACzB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9C,CAAA"}
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { useFieldBinding } from '@texaryn/react';
3
+ import { FieldLabelContent, useFieldBinding } from '@texaryn/react';
4
4
  import { BootstrapFeedback } from './BootstrapFeedback.js';
5
5
  function BootstrapCheckboxImpl({ node }) {
6
6
  const field = useFieldBinding(node);
7
- return (_jsxs("div", { className: "form-check mb-3", children: [_jsx("input", { ...field.domCheckboxProps, type: "checkbox", className: field.invalid ? 'form-check-input is-invalid' : 'form-check-input' }), _jsx("label", { ...field.labelProps, className: "form-check-label", children: field.label }), _jsx(BootstrapFeedback, { field: field })] }));
7
+ return (_jsxs("div", { className: "form-check mb-3", children: [_jsx("input", { ...field.domCheckboxProps, type: "checkbox", className: field.invalid ? 'form-check-input is-invalid' : 'form-check-input' }), _jsx("label", { ...field.labelProps, className: "form-check-label", children: _jsx(FieldLabelContent, { label: field.label, required: field.required }) }), _jsx(BootstrapFeedback, { field: field })] }));
8
8
  }
9
9
  export const BootstrapCheckbox = React.memo(BootstrapCheckboxImpl, (prev, next) => prev.node.id === next.node.id);
10
10
  //# sourceMappingURL=BootstrapCheckbox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapCheckbox.js","sourceRoot":"","sources":["../../src/widgets/BootstrapCheckbox.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,qBAAqB,CAAC,EAAE,IAAI,EAAe;IAClD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,iBAAiB,aAC9B,mBAAW,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAC,UAAU,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,kBAAkB,GAAI,EACpI,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,kBAAkB,YAAE,KAAK,CAAC,KAAK,GAAS,EAC/E,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"BootstrapCheckbox.js","sourceRoot":"","sources":["../../src/widgets/BootstrapCheckbox.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,qBAAqB,CAAC,EAAE,IAAI,EAAe;IAClD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,iBAAiB,aAC9B,mBAAW,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAC,UAAU,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,kBAAkB,GAAI,EACpI,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,kBAAkB,YAAC,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAI,GAAQ,EACrI,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { useFieldBinding } from '@texaryn/react';
3
+ import { FieldLabelContent, useFieldBinding } from '@texaryn/react';
4
4
  import { BootstrapFeedback } from './BootstrapFeedback.js';
5
5
  function BootstrapNumberInputImpl({ node }) {
6
6
  const field = useFieldBinding(node);
7
- return (_jsxs("div", { className: "mb-3", children: [_jsx("label", { ...field.labelProps, className: "form-label", children: field.label }), _jsx("input", { ...field.domInputProps, type: "number", className: field.invalid ? 'form-control is-invalid' : 'form-control' }), _jsx(BootstrapFeedback, { field: field })] }));
7
+ return (_jsxs("div", { className: "mb-3", children: [_jsx("label", { ...field.labelProps, className: "form-label", children: _jsx(FieldLabelContent, { label: field.label, required: field.required }) }), _jsx("input", { ...field.domInputProps, type: "number", className: field.invalid ? 'form-control is-invalid' : 'form-control' }), _jsx(BootstrapFeedback, { field: field })] }));
8
8
  }
9
9
  export const BootstrapNumberInput = React.memo(BootstrapNumberInputImpl, (prev, next) => prev.node.id === next.node.id);
10
10
  //# sourceMappingURL=BootstrapNumberInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapNumberInput.js","sourceRoot":"","sources":["../../src/widgets/BootstrapNumberInput.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,wBAAwB,CAAC,EAAE,IAAI,EAAe;IACrD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,YAAY,YAAE,KAAK,CAAC,KAAK,GAAS,EACzE,mBAAW,KAAK,CAAC,aAAa,EAAE,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,cAAc,GAAI,EACvH,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"BootstrapNumberInput.js","sourceRoot":"","sources":["../../src/widgets/BootstrapNumberInput.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,wBAAwB,CAAC,EAAE,IAAI,EAAe;IACrD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,YAAY,YAAC,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAI,GAAQ,EAC/H,mBAAW,KAAK,CAAC,aAAa,EAAE,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,cAAc,GAAI,EACvH,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
@@ -1,11 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { useFieldBinding } from '@texaryn/react';
3
+ import { FieldLabelContent, useFieldBinding } from '@texaryn/react';
4
4
  import { BootstrapFeedback } from './BootstrapFeedback.js';
5
5
  function BootstrapSelectImpl({ node }) {
6
6
  const field = useFieldBinding(node);
7
7
  const enumValues = field.node.enumValues ?? [];
8
- return (_jsxs("div", { className: "mb-3", children: [_jsx("label", { ...field.labelProps, className: "form-label", children: field.label }), _jsx("select", { ...field.domInputProps, className: field.invalid ? 'form-select is-invalid' : 'form-select', children: enumValues.map((option) => (_jsx("option", { value: String(option.value), children: option.title ?? String(option.value) }, String(option.value)))) }), _jsx(BootstrapFeedback, { field: field })] }));
8
+ return (_jsxs("div", { className: "mb-3", children: [_jsx("label", { ...field.labelProps, className: "form-label", children: _jsx(FieldLabelContent, { label: field.label, required: field.required }) }), _jsx("select", { ...field.domInputProps, className: field.invalid ? 'form-select is-invalid' : 'form-select', children: enumValues.map((option) => (_jsx("option", { value: String(option.value), children: option.title ?? String(option.value) }, String(option.value)))) }), _jsx(BootstrapFeedback, { field: field })] }));
9
9
  }
10
10
  export const BootstrapSelect = React.memo(BootstrapSelectImpl, (prev, next) => prev.node.id === next.node.id);
11
11
  //# sourceMappingURL=BootstrapSelect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapSelect.js","sourceRoot":"","sources":["../../src/widgets/BootstrapSelect.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,mBAAmB,CAAC,EAAE,IAAI,EAAe;IAChD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;IAE9C,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,YAAY,YAAE,KAAK,CAAC,KAAK,GAAS,EACzE,oBAAY,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,aAAa,YACjG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC1B,iBAAmC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAC3D,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAD1B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAExB,CACV,CAAC,GACK,EACT,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"BootstrapSelect.js","sourceRoot":"","sources":["../../src/widgets/BootstrapSelect.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,mBAAmB,CAAC,EAAE,IAAI,EAAe;IAChD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;IAE9C,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,YAAY,YAAC,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAI,GAAQ,EAC/H,oBAAY,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,aAAa,YACjG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC1B,iBAAmC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAC3D,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAD1B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAExB,CACV,CAAC,GACK,EACT,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { useFieldBinding } from '@texaryn/react';
3
+ import { FieldLabelContent, useFieldBinding } from '@texaryn/react';
4
4
  import { BootstrapFeedback } from './BootstrapFeedback.js';
5
5
  function BootstrapTextInputImpl({ node }) {
6
6
  const field = useFieldBinding(node);
7
- return (_jsxs("div", { className: "mb-3", children: [_jsx("label", { ...field.labelProps, className: "form-label", children: field.label }), _jsx("input", { ...field.domInputProps, type: "text", className: field.invalid ? 'form-control is-invalid' : 'form-control' }), _jsx(BootstrapFeedback, { field: field })] }));
7
+ return (_jsxs("div", { className: "mb-3", children: [_jsx("label", { ...field.labelProps, className: "form-label", children: _jsx(FieldLabelContent, { label: field.label, required: field.required }) }), _jsx("input", { ...field.domInputProps, type: "text", className: field.invalid ? 'form-control is-invalid' : 'form-control' }), _jsx(BootstrapFeedback, { field: field })] }));
8
8
  }
9
9
  export const BootstrapTextInput = React.memo(BootstrapTextInputImpl, (prev, next) => prev.node.id === next.node.id);
10
10
  //# sourceMappingURL=BootstrapTextInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapTextInput.js","sourceRoot":"","sources":["../../src/widgets/BootstrapTextInput.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,sBAAsB,CAAC,EAAE,IAAI,EAAe;IACnD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,YAAY,YAAE,KAAK,CAAC,KAAK,GAAS,EACzE,mBAAW,KAAK,CAAC,aAAa,EAAE,IAAI,EAAC,MAAM,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,cAAc,GAAI,EACrH,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"BootstrapTextInput.js","sourceRoot":"","sources":["../../src/widgets/BootstrapTextInput.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,sBAAsB,CAAC,EAAE,IAAI,EAAe;IACnD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,YAAY,YAAC,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAI,GAAQ,EAC/H,mBAAW,KAAK,CAAC,aAAa,EAAE,IAAI,EAAC,MAAM,EAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,cAAc,GAAI,EACrH,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { useFieldBinding } from '@texaryn/react';
3
+ import { FieldLabelContent, useFieldBinding } from '@texaryn/react';
4
4
  import { BootstrapFeedback } from './BootstrapFeedback.js';
5
5
  function BootstrapTextareaImpl({ node }) {
6
6
  const field = useFieldBinding(node);
7
- return (_jsxs("div", { className: "mb-3", children: [_jsx("label", { ...field.labelProps, className: "form-label", children: field.label }), _jsx("textarea", { ...field.domInputProps, className: field.invalid ? 'form-control is-invalid' : 'form-control' }), _jsx(BootstrapFeedback, { field: field })] }));
7
+ return (_jsxs("div", { className: "mb-3", children: [_jsx("label", { ...field.labelProps, className: "form-label", children: _jsx(FieldLabelContent, { label: field.label, required: field.required }) }), _jsx("textarea", { ...field.domInputProps, className: field.invalid ? 'form-control is-invalid' : 'form-control' }), _jsx(BootstrapFeedback, { field: field })] }));
8
8
  }
9
9
  export const BootstrapTextarea = React.memo(BootstrapTextareaImpl, (prev, next) => prev.node.id === next.node.id);
10
10
  //# sourceMappingURL=BootstrapTextarea.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BootstrapTextarea.js","sourceRoot":"","sources":["../../src/widgets/BootstrapTextarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,qBAAqB,CAAC,EAAE,IAAI,EAAe;IAClD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,YAAY,YAAE,KAAK,CAAC,KAAK,GAAS,EACzE,sBAAc,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,cAAc,GAAI,EAC5G,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"BootstrapTextarea.js","sourceRoot":"","sources":["../../src/widgets/BootstrapTextarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAM1D,SAAS,qBAAqB,CAAC,EAAE,IAAI,EAAe;IAClD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAiB,CAAC,CAAA;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,mBAAW,KAAK,CAAC,UAAU,EAAE,SAAS,EAAC,YAAY,YAAC,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAI,GAAQ,EAC/H,sBAAc,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,cAAc,GAAI,EAC5G,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,IAC/B,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@texaryn/react-bootstrap",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Bootstrap 5 widgets for Texaryn: native markup and Bootstrap classes on top of @texaryn/react",
5
5
  "keywords": [
6
6
  "react",
@@ -41,12 +41,12 @@
41
41
  "CHANGELOG.md"
42
42
  ],
43
43
  "dependencies": {
44
- "@texaryn/core": "^0.6.0"
44
+ "@texaryn/core": "^0.7.0"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "react": ">=18.0.0",
48
48
  "bootstrap": "^5.3",
49
- "@texaryn/react": "^0.3.0"
49
+ "@texaryn/react": "^0.4.0"
50
50
  },
51
51
  "peerDependenciesMeta": {
52
52
  "bootstrap": {
@@ -59,8 +59,8 @@
59
59
  "jsdom": "^25.0.0",
60
60
  "react": "^19.0.0",
61
61
  "react-dom": "^19.0.0",
62
- "@texaryn/schema-json": "0.2.5",
63
- "@texaryn/react": "0.3.0"
62
+ "@texaryn/schema-json": "0.3.0",
63
+ "@texaryn/react": "0.4.0"
64
64
  },
65
65
  "scripts": {
66
66
  "build": "tsc --build"