@oods/components-react 0.4.0 → 0.4.1

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/ported.cjs CHANGED
@@ -658,6 +658,31 @@ var noSubscription = () => () => void 0;
658
658
  var useIsomorphicLayoutEffect = typeof window === "undefined" ? React3__namespace.useEffect : React3__namespace.useLayoutEffect;
659
659
  var canShowModal = () => typeof HTMLDialogElement !== "undefined" && typeof HTMLDialogElement.prototype.showModal === "function";
660
660
  var hasContent = (node) => node !== void 0 && node !== null && node !== false && node !== "";
661
+ var pageLocks = 0;
662
+ var pageStyle;
663
+ function lockPageScroll() {
664
+ const page = document.documentElement;
665
+ if (pageLocks++ === 0) {
666
+ const scrollbar = window.innerWidth - page.clientWidth;
667
+ pageStyle = { overflow: page.style.overflow, paddingRight: page.style.paddingRight };
668
+ if (scrollbar > 0) page.style.paddingRight = `${parseFloat(getComputedStyle(page).paddingRight) + scrollbar}px`;
669
+ page.style.overflow = "hidden";
670
+ }
671
+ let held = true;
672
+ return () => {
673
+ if (!held) return;
674
+ held = false;
675
+ if (--pageLocks === 0 && pageStyle) {
676
+ page.style.overflow = pageStyle.overflow;
677
+ page.style.paddingRight = pageStyle.paddingRight;
678
+ pageStyle = void 0;
679
+ }
680
+ };
681
+ }
682
+ var outsideBox = (event, dialog) => {
683
+ const box = dialog.getBoundingClientRect();
684
+ return event.clientX < box.left || event.clientX > box.right || event.clientY < box.top || event.clientY > box.bottom;
685
+ };
661
686
  var Dialog = React3__namespace.forwardRef(
662
687
  ({
663
688
  id,
@@ -672,12 +697,16 @@ var Dialog = React3__namespace.forwardRef(
672
697
  className,
673
698
  onClose,
674
699
  onKeyDown,
700
+ onMouseDown,
701
+ onClick,
675
702
  ...rest
676
703
  }, ref) => {
677
704
  const generatedId = React3__namespace.useId().replace(/[^\w-]/g, "");
678
705
  const dialogId = id ?? `oods-dialog-${generatedId}`;
679
706
  const element = React3__namespace.useRef(null);
680
707
  const openRef = React3__namespace.useRef(open);
708
+ const scrollLock = React3__namespace.useRef(null);
709
+ const pressedBackdrop = React3__namespace.useRef(false);
681
710
  const serverMarkup = React3__namespace.useSyncExternalStore(noSubscription, () => false, () => true);
682
711
  const managed = modal && !serverMarkup && canShowModal();
683
712
  const setRef = React3__namespace.useCallback((node) => {
@@ -685,13 +714,19 @@ var Dialog = React3__namespace.forwardRef(
685
714
  if (typeof ref === "function") ref(node);
686
715
  else if (ref) ref.current = node;
687
716
  }, [ref]);
717
+ const releaseScroll = React3__namespace.useCallback(() => {
718
+ scrollLock.current?.();
719
+ scrollLock.current = null;
720
+ }, []);
688
721
  useIsomorphicLayoutEffect(() => {
689
722
  openRef.current = open;
690
723
  const dialog = element.current;
691
724
  if (!dialog || !managed) return;
692
725
  if (open && !dialog.open) dialog.showModal();
693
726
  else if (!open && dialog.open) dialog.close();
727
+ if (open && dialog.open) scrollLock.current ??= lockPageScroll();
694
728
  }, [open, managed]);
729
+ React3__namespace.useEffect(() => releaseScroll, [releaseScroll]);
695
730
  const requestClose = (event) => {
696
731
  event.preventDefault();
697
732
  onClose?.();
@@ -713,7 +748,19 @@ var Dialog = React3__namespace.forwardRef(
713
748
  },
714
749
  onCancel: requestClose,
715
750
  onClose: () => {
716
- if (openRef.current && !element.current?.open) onClose?.();
751
+ if (element.current?.open) return;
752
+ releaseScroll();
753
+ if (openRef.current) onClose?.();
754
+ },
755
+ onMouseDown: (event) => {
756
+ onMouseDown?.(event);
757
+ pressedBackdrop.current = managed && event.target === event.currentTarget && outsideBox(event, event.currentTarget);
758
+ },
759
+ onClick: (event) => {
760
+ onClick?.(event);
761
+ const backdrop = pressedBackdrop.current && event.target === event.currentTarget && outsideBox(event, event.currentTarget);
762
+ pressedBackdrop.current = false;
763
+ if (backdrop && !event.defaultPrevented) onClose?.();
717
764
  },
718
765
  ...rest,
719
766
  children: [
package/dist/ported.js CHANGED
@@ -1,2 +1,2 @@
1
- export { AuditTimeline, CancellationSummary, PaginationBar, PriceBadge, RelativeTimestamp, SearchInput, StatusBadge, StatusTimeline } from './chunk-OFTMKX3W.js';
1
+ export { AuditTimeline, CancellationSummary, PaginationBar, PriceBadge, RelativeTimestamp, SearchInput, StatusBadge, StatusTimeline } from './chunk-NLWXBLPA.js';
2
2
  import './chunk-2VEQWKGK.js';
package/dist/types.d.cts CHANGED
@@ -390,6 +390,27 @@ interface SwitchProps extends NativeSwitchProps {
390
390
  readonly onCheckedChange?: (checked: boolean) => void;
391
391
  readonly onUpdate?: (checked: boolean) => void;
392
392
  }
393
+ type NativeSegmentedControlProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'id' | 'role' | 'children' | 'className' | 'style' | 'defaultValue' | 'onChange'>;
394
+ /**
395
+ * s223-m02 (#2527 ruling 10): one choice from two to five options, shown as joined segments. Select's value API on native
396
+ * radios: value (controlled) or defaultValue, onChange with the radio's change event, then onValueChange and onUpdate with
397
+ * the chosen value. Native div props reach the radiogroup.
398
+ */
399
+ interface SegmentedControlProps extends NativeSegmentedControlProps {
400
+ readonly id: string;
401
+ readonly label: React.ReactNode;
402
+ readonly options: readonly SelectOption[];
403
+ readonly value?: string;
404
+ readonly defaultValue?: string;
405
+ readonly name?: string;
406
+ readonly size?: 'xs' | 'sm' | 'md' | 'lg';
407
+ readonly disabled?: boolean;
408
+ readonly className?: string;
409
+ readonly style?: React.CSSProperties;
410
+ readonly onChange?: React.ChangeEventHandler<HTMLInputElement>;
411
+ readonly onValueChange?: (value: string) => void;
412
+ readonly onUpdate?: (value: string) => void;
413
+ }
393
414
  type SelectOption = {
394
415
  readonly value: string;
395
416
  readonly label: React.ReactNode;
@@ -404,6 +425,38 @@ interface SelectProps extends NativeSelectProps, CommonFieldProps {
404
425
  readonly onValueChange?: (value: string) => void;
405
426
  readonly onUpdate?: (value: string) => void;
406
427
  }
428
+ /** s223-m02 (#2527 ruling 11): a combobox option. Its label is text, because typing filters the list on it. */
429
+ type ComboboxOption = {
430
+ readonly value: string;
431
+ readonly label: string;
432
+ readonly disabled?: boolean;
433
+ };
434
+ type NativeComboboxProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'role' | 'value' | 'defaultValue' | 'size' | 'name' | 'placeholder' | 'required' | 'disabled' | 'children' | 'className' | 'style' | 'onChange'>;
435
+ /**
436
+ * s223-m02 (#2527 ruling 11): pick one value from a list by typing to filter it. Select's field API on an input with role
437
+ * combobox: value (controlled) or defaultValue (uncontrolled) names the chosen option, and picking one calls
438
+ * onValueChange and onUpdate with its value. The input's own text is the filter, so its native onChange is not offered;
439
+ * other native input props reach the input.
440
+ */
441
+ interface ComboboxProps extends NativeComboboxProps {
442
+ readonly id: string;
443
+ readonly label: React.ReactNode;
444
+ readonly options?: readonly ComboboxOption[];
445
+ readonly value?: string;
446
+ readonly defaultValue?: string;
447
+ readonly placeholder?: string;
448
+ readonly name?: string;
449
+ readonly required?: boolean;
450
+ readonly disabled?: boolean;
451
+ readonly help?: React.ReactNode;
452
+ readonly validation?: FieldValidation;
453
+ /** The control height, as Button, Input and Select: xs 24, sm 28, md 32 (default) or lg 40. */
454
+ readonly size?: 'xs' | 'sm' | 'md' | 'lg';
455
+ readonly className?: string;
456
+ readonly style?: React.CSSProperties;
457
+ readonly onValueChange?: (value: string) => void;
458
+ readonly onUpdate?: (value: string) => void;
459
+ }
407
460
  type NativeTextareaProps = Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'id' | 'children' | 'className' | 'style'>;
408
461
  interface TextareaProps extends NativeTextareaProps, CommonFieldProps {
409
462
  readonly textareaClassName?: string;
@@ -572,6 +625,8 @@ interface OwnershipMetaProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
572
625
  readonly owner_type?: string;
573
626
  readonly role?: string;
574
627
  readonly ownershipRole?: string;
628
+ /** s223-m01: the owner's display name; with it the meta reads as one phrase, "Owned by <name> · <type>". */
629
+ readonly ownerLabel?: string;
575
630
  }
576
631
  interface TagSummaryProps extends React.HTMLAttributes<HTMLElement> {
577
632
  readonly label?: string;
@@ -601,11 +656,15 @@ interface ArchiveSummaryProps extends React.HTMLAttributes<HTMLElement> {
601
656
  interface ArchivePillProps extends Omit<ClassificationBadgeProps, 'category' | 'mode' | 'value'> {
602
657
  readonly isArchived?: boolean | string;
603
658
  readonly value?: boolean | string;
659
+ /** s223-m01: render nothing while the record is not archived, so a card shows only a state worth stating. */
660
+ readonly hideWhenFalse?: boolean;
604
661
  }
605
662
  interface CancellationBadgeProps extends Omit<ClassificationBadgeProps, 'category' | 'mode' | 'value'> {
606
663
  readonly cancelAtPeriodEnd?: boolean | string;
607
664
  readonly isCancelled?: boolean | string;
608
665
  readonly value?: boolean | string;
666
+ /** s223-m01: render nothing while no cancellation is scheduled. */
667
+ readonly hideWhenFalse?: boolean;
609
668
  }
610
669
  interface CancellationFormProps extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'title' | 'name'>, FormShellProps {
611
670
  readonly embedded?: boolean;
@@ -626,4 +685,4 @@ interface PriceCardMetaProps extends React.HTMLAttributes<HTMLDivElement> {
626
685
  readonly billingInterval?: string;
627
686
  }
628
687
 
629
- export type { AddressCollectionPanelProps, AddressEditorProps, AddressEditorValue, AddressSummaryBadgeProps, AddressValidationTimelineProps, ArchivePillProps, ArchiveSummaryProps, AuditEventProps, BadgeProps, BannerProps, ButtonIntent, ButtonProps, ButtonSize, CancellationBadgeProps, CancellationFormProps, CardHeaderProps, CardProps, CheckboxProps, ClassificationBadgeProps, ClassificationEditorProps, ClassificationPanelProps, ColorSwatchProps, ColorizedBadgeProps, CommonFieldProps, ComponentEmphasis, ComponentSize, ComponentTone, DatePickerProps, DetailHeaderProps, DialogProps, FieldDensity, FieldValidation, FilterDescriptor, FilterPanelProps, FormLabelGroupProps, GridProps, HeaderElement, HeaderLevel, InlineLabelProps, InputProps, LabelCellProps, LayoutGap, MembershipAuditTimelineProps, MembershipPanelProps, MessageEventTimelineProps, MessageStatusBadgeProps, OwnerBadgeProps, OwnershipMetaProps, OwnershipSummaryProps, PanelSectionProps, PreferenceEditorProps, PreferencePanelProps, PreferenceSummaryBadgeProps, PreferenceTimelineProps, PriceCardMetaProps, PriceSummaryProps, RoleAssignmentFormProps, RoleBadgeListProps, SafeContainerElement, SafeTextElement, SelectOption, SelectProps, StackProps, StatusSelectorProps, SwitchProps, TabItem, TableBodyProps, TableCaptionProps, TableCellProps, TableColumn, TableCompound, TableHeadProps, TableHeaderCellProps, TableProps, TableRowData, TableRowProps, TabsProps, TagInputProps, TagManagerProps, TagPillsProps, TagSummaryProps, TemplatePickerProps, TextProps, TextareaProps, VizAreaPreviewProps };
688
+ export type { AddressCollectionPanelProps, AddressEditorProps, AddressEditorValue, AddressSummaryBadgeProps, AddressValidationTimelineProps, ArchivePillProps, ArchiveSummaryProps, AuditEventProps, BadgeProps, BannerProps, ButtonIntent, ButtonProps, ButtonSize, CancellationBadgeProps, CancellationFormProps, CardHeaderProps, CardProps, CheckboxProps, ClassificationBadgeProps, ClassificationEditorProps, ClassificationPanelProps, ColorSwatchProps, ColorizedBadgeProps, ComboboxOption, ComboboxProps, CommonFieldProps, ComponentEmphasis, ComponentSize, ComponentTone, DatePickerProps, DetailHeaderProps, DialogProps, FieldDensity, FieldValidation, FilterDescriptor, FilterPanelProps, FormLabelGroupProps, GridProps, HeaderElement, HeaderLevel, InlineLabelProps, InputProps, LabelCellProps, LayoutGap, MembershipAuditTimelineProps, MembershipPanelProps, MessageEventTimelineProps, MessageStatusBadgeProps, OwnerBadgeProps, OwnershipMetaProps, OwnershipSummaryProps, PanelSectionProps, PreferenceEditorProps, PreferencePanelProps, PreferenceSummaryBadgeProps, PreferenceTimelineProps, PriceCardMetaProps, PriceSummaryProps, RoleAssignmentFormProps, RoleBadgeListProps, SafeContainerElement, SafeTextElement, SegmentedControlProps, SelectOption, SelectProps, StackProps, StatusSelectorProps, SwitchProps, TabItem, TableBodyProps, TableCaptionProps, TableCellProps, TableColumn, TableCompound, TableHeadProps, TableHeaderCellProps, TableProps, TableRowData, TableRowProps, TabsProps, TagInputProps, TagManagerProps, TagPillsProps, TagSummaryProps, TemplatePickerProps, TextProps, TextareaProps, VizAreaPreviewProps };
package/dist/types.d.ts CHANGED
@@ -390,6 +390,27 @@ interface SwitchProps extends NativeSwitchProps {
390
390
  readonly onCheckedChange?: (checked: boolean) => void;
391
391
  readonly onUpdate?: (checked: boolean) => void;
392
392
  }
393
+ type NativeSegmentedControlProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'id' | 'role' | 'children' | 'className' | 'style' | 'defaultValue' | 'onChange'>;
394
+ /**
395
+ * s223-m02 (#2527 ruling 10): one choice from two to five options, shown as joined segments. Select's value API on native
396
+ * radios: value (controlled) or defaultValue, onChange with the radio's change event, then onValueChange and onUpdate with
397
+ * the chosen value. Native div props reach the radiogroup.
398
+ */
399
+ interface SegmentedControlProps extends NativeSegmentedControlProps {
400
+ readonly id: string;
401
+ readonly label: React.ReactNode;
402
+ readonly options: readonly SelectOption[];
403
+ readonly value?: string;
404
+ readonly defaultValue?: string;
405
+ readonly name?: string;
406
+ readonly size?: 'xs' | 'sm' | 'md' | 'lg';
407
+ readonly disabled?: boolean;
408
+ readonly className?: string;
409
+ readonly style?: React.CSSProperties;
410
+ readonly onChange?: React.ChangeEventHandler<HTMLInputElement>;
411
+ readonly onValueChange?: (value: string) => void;
412
+ readonly onUpdate?: (value: string) => void;
413
+ }
393
414
  type SelectOption = {
394
415
  readonly value: string;
395
416
  readonly label: React.ReactNode;
@@ -404,6 +425,38 @@ interface SelectProps extends NativeSelectProps, CommonFieldProps {
404
425
  readonly onValueChange?: (value: string) => void;
405
426
  readonly onUpdate?: (value: string) => void;
406
427
  }
428
+ /** s223-m02 (#2527 ruling 11): a combobox option. Its label is text, because typing filters the list on it. */
429
+ type ComboboxOption = {
430
+ readonly value: string;
431
+ readonly label: string;
432
+ readonly disabled?: boolean;
433
+ };
434
+ type NativeComboboxProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'role' | 'value' | 'defaultValue' | 'size' | 'name' | 'placeholder' | 'required' | 'disabled' | 'children' | 'className' | 'style' | 'onChange'>;
435
+ /**
436
+ * s223-m02 (#2527 ruling 11): pick one value from a list by typing to filter it. Select's field API on an input with role
437
+ * combobox: value (controlled) or defaultValue (uncontrolled) names the chosen option, and picking one calls
438
+ * onValueChange and onUpdate with its value. The input's own text is the filter, so its native onChange is not offered;
439
+ * other native input props reach the input.
440
+ */
441
+ interface ComboboxProps extends NativeComboboxProps {
442
+ readonly id: string;
443
+ readonly label: React.ReactNode;
444
+ readonly options?: readonly ComboboxOption[];
445
+ readonly value?: string;
446
+ readonly defaultValue?: string;
447
+ readonly placeholder?: string;
448
+ readonly name?: string;
449
+ readonly required?: boolean;
450
+ readonly disabled?: boolean;
451
+ readonly help?: React.ReactNode;
452
+ readonly validation?: FieldValidation;
453
+ /** The control height, as Button, Input and Select: xs 24, sm 28, md 32 (default) or lg 40. */
454
+ readonly size?: 'xs' | 'sm' | 'md' | 'lg';
455
+ readonly className?: string;
456
+ readonly style?: React.CSSProperties;
457
+ readonly onValueChange?: (value: string) => void;
458
+ readonly onUpdate?: (value: string) => void;
459
+ }
407
460
  type NativeTextareaProps = Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'id' | 'children' | 'className' | 'style'>;
408
461
  interface TextareaProps extends NativeTextareaProps, CommonFieldProps {
409
462
  readonly textareaClassName?: string;
@@ -572,6 +625,8 @@ interface OwnershipMetaProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
572
625
  readonly owner_type?: string;
573
626
  readonly role?: string;
574
627
  readonly ownershipRole?: string;
628
+ /** s223-m01: the owner's display name; with it the meta reads as one phrase, "Owned by <name> · <type>". */
629
+ readonly ownerLabel?: string;
575
630
  }
576
631
  interface TagSummaryProps extends React.HTMLAttributes<HTMLElement> {
577
632
  readonly label?: string;
@@ -601,11 +656,15 @@ interface ArchiveSummaryProps extends React.HTMLAttributes<HTMLElement> {
601
656
  interface ArchivePillProps extends Omit<ClassificationBadgeProps, 'category' | 'mode' | 'value'> {
602
657
  readonly isArchived?: boolean | string;
603
658
  readonly value?: boolean | string;
659
+ /** s223-m01: render nothing while the record is not archived, so a card shows only a state worth stating. */
660
+ readonly hideWhenFalse?: boolean;
604
661
  }
605
662
  interface CancellationBadgeProps extends Omit<ClassificationBadgeProps, 'category' | 'mode' | 'value'> {
606
663
  readonly cancelAtPeriodEnd?: boolean | string;
607
664
  readonly isCancelled?: boolean | string;
608
665
  readonly value?: boolean | string;
666
+ /** s223-m01: render nothing while no cancellation is scheduled. */
667
+ readonly hideWhenFalse?: boolean;
609
668
  }
610
669
  interface CancellationFormProps extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'title' | 'name'>, FormShellProps {
611
670
  readonly embedded?: boolean;
@@ -626,4 +685,4 @@ interface PriceCardMetaProps extends React.HTMLAttributes<HTMLDivElement> {
626
685
  readonly billingInterval?: string;
627
686
  }
628
687
 
629
- export type { AddressCollectionPanelProps, AddressEditorProps, AddressEditorValue, AddressSummaryBadgeProps, AddressValidationTimelineProps, ArchivePillProps, ArchiveSummaryProps, AuditEventProps, BadgeProps, BannerProps, ButtonIntent, ButtonProps, ButtonSize, CancellationBadgeProps, CancellationFormProps, CardHeaderProps, CardProps, CheckboxProps, ClassificationBadgeProps, ClassificationEditorProps, ClassificationPanelProps, ColorSwatchProps, ColorizedBadgeProps, CommonFieldProps, ComponentEmphasis, ComponentSize, ComponentTone, DatePickerProps, DetailHeaderProps, DialogProps, FieldDensity, FieldValidation, FilterDescriptor, FilterPanelProps, FormLabelGroupProps, GridProps, HeaderElement, HeaderLevel, InlineLabelProps, InputProps, LabelCellProps, LayoutGap, MembershipAuditTimelineProps, MembershipPanelProps, MessageEventTimelineProps, MessageStatusBadgeProps, OwnerBadgeProps, OwnershipMetaProps, OwnershipSummaryProps, PanelSectionProps, PreferenceEditorProps, PreferencePanelProps, PreferenceSummaryBadgeProps, PreferenceTimelineProps, PriceCardMetaProps, PriceSummaryProps, RoleAssignmentFormProps, RoleBadgeListProps, SafeContainerElement, SafeTextElement, SelectOption, SelectProps, StackProps, StatusSelectorProps, SwitchProps, TabItem, TableBodyProps, TableCaptionProps, TableCellProps, TableColumn, TableCompound, TableHeadProps, TableHeaderCellProps, TableProps, TableRowData, TableRowProps, TabsProps, TagInputProps, TagManagerProps, TagPillsProps, TagSummaryProps, TemplatePickerProps, TextProps, TextareaProps, VizAreaPreviewProps };
688
+ export type { AddressCollectionPanelProps, AddressEditorProps, AddressEditorValue, AddressSummaryBadgeProps, AddressValidationTimelineProps, ArchivePillProps, ArchiveSummaryProps, AuditEventProps, BadgeProps, BannerProps, ButtonIntent, ButtonProps, ButtonSize, CancellationBadgeProps, CancellationFormProps, CardHeaderProps, CardProps, CheckboxProps, ClassificationBadgeProps, ClassificationEditorProps, ClassificationPanelProps, ColorSwatchProps, ColorizedBadgeProps, ComboboxOption, ComboboxProps, CommonFieldProps, ComponentEmphasis, ComponentSize, ComponentTone, DatePickerProps, DetailHeaderProps, DialogProps, FieldDensity, FieldValidation, FilterDescriptor, FilterPanelProps, FormLabelGroupProps, GridProps, HeaderElement, HeaderLevel, InlineLabelProps, InputProps, LabelCellProps, LayoutGap, MembershipAuditTimelineProps, MembershipPanelProps, MessageEventTimelineProps, MessageStatusBadgeProps, OwnerBadgeProps, OwnershipMetaProps, OwnershipSummaryProps, PanelSectionProps, PreferenceEditorProps, PreferencePanelProps, PreferenceSummaryBadgeProps, PreferenceTimelineProps, PriceCardMetaProps, PriceSummaryProps, RoleAssignmentFormProps, RoleBadgeListProps, SafeContainerElement, SafeTextElement, SegmentedControlProps, SelectOption, SelectProps, StackProps, StatusSelectorProps, SwitchProps, TabItem, TableBodyProps, TableCaptionProps, TableCellProps, TableColumn, TableCompound, TableHeadProps, TableHeaderCellProps, TableProps, TableRowData, TableRowProps, TabsProps, TagInputProps, TagManagerProps, TagPillsProps, TagSummaryProps, TemplatePickerProps, TextProps, TextareaProps, VizAreaPreviewProps };
@@ -2259,6 +2259,79 @@
2259
2259
  }
2260
2260
  }
2261
2261
  },
2262
+ {
2263
+ "componentId": "Combobox",
2264
+ "state": "implemented-evidence-complete",
2265
+ "emissionEligible": true,
2266
+ "evidence": {
2267
+ "versionedContract": {
2268
+ "status": "passed",
2269
+ "refs": [
2270
+ "packages/component-contracts/src/contracts.ts#Combobox"
2271
+ ]
2272
+ },
2273
+ "targetImplementation": {
2274
+ "status": "passed",
2275
+ "refs": [
2276
+ "packages/components-react/src/combobox.tsx#Combobox"
2277
+ ]
2278
+ },
2279
+ "packageExport": {
2280
+ "status": "passed",
2281
+ "refs": [
2282
+ "packages/components-react/src/index.ts#Combobox"
2283
+ ]
2284
+ },
2285
+ "publicDeclaration": {
2286
+ "status": "passed",
2287
+ "refs": [
2288
+ "packages/components-react/dist/index.d.ts#Combobox"
2289
+ ]
2290
+ },
2291
+ "dependencyClosure": {
2292
+ "status": "passed",
2293
+ "refs": [
2294
+ "packages/components-react/test/package-contract.spec.ts#dependency-closure"
2295
+ ]
2296
+ },
2297
+ "frameworkScenario": {
2298
+ "status": "passed",
2299
+ "refs": [
2300
+ "packages/components-react/test/scenarios.spec.tsx#combobox-filter-and-pick"
2301
+ ]
2302
+ },
2303
+ "accessibility": {
2304
+ "status": "passed",
2305
+ "classification": "verified",
2306
+ "refs": [
2307
+ "artifacts/product-reality/sprint-223/m02/combobox/react-measured.json#Combobox"
2308
+ ]
2309
+ },
2310
+ "interaction": {
2311
+ "status": "passed",
2312
+ "classification": "verified",
2313
+ "refs": [
2314
+ "artifacts/product-reality/sprint-223/m02/combobox/react-measured.json#Combobox"
2315
+ ]
2316
+ },
2317
+ "visualThemes": {
2318
+ "status": "passed",
2319
+ "classification": "verified",
2320
+ "cells": [
2321
+ "A-light",
2322
+ "A-dark",
2323
+ "A-hc",
2324
+ "B-light",
2325
+ "B-dark",
2326
+ "B-hc"
2327
+ ],
2328
+ "refs": [
2329
+ "artifacts/product-reality/sprint-223/m02/combobox/react-theme/report.json#Combobox"
2330
+ ]
2331
+ }
2332
+ },
2333
+ "measurementRoot": "artifacts/product-reality/sprint-223/m02/combobox"
2334
+ },
2262
2335
  {
2263
2336
  "componentId": "CommunicationDetailPanel",
2264
2337
  "state": "implemented-evidence-complete",
@@ -4806,6 +4879,79 @@
4806
4879
  }
4807
4880
  }
4808
4881
  },
4882
+ {
4883
+ "componentId": "SegmentedControl",
4884
+ "state": "implemented-evidence-complete",
4885
+ "emissionEligible": true,
4886
+ "evidence": {
4887
+ "versionedContract": {
4888
+ "status": "passed",
4889
+ "refs": [
4890
+ "packages/component-contracts/src/contracts.ts#SegmentedControl"
4891
+ ]
4892
+ },
4893
+ "targetImplementation": {
4894
+ "status": "passed",
4895
+ "refs": [
4896
+ "packages/components-react/src/segmented-control.tsx#SegmentedControl"
4897
+ ]
4898
+ },
4899
+ "packageExport": {
4900
+ "status": "passed",
4901
+ "refs": [
4902
+ "packages/components-react/src/index.ts#SegmentedControl"
4903
+ ]
4904
+ },
4905
+ "publicDeclaration": {
4906
+ "status": "passed",
4907
+ "refs": [
4908
+ "packages/components-react/dist/index.d.ts#SegmentedControl"
4909
+ ]
4910
+ },
4911
+ "dependencyClosure": {
4912
+ "status": "passed",
4913
+ "refs": [
4914
+ "packages/components-react/test/package-contract.spec.ts#dependency-closure"
4915
+ ]
4916
+ },
4917
+ "frameworkScenario": {
4918
+ "status": "passed",
4919
+ "refs": [
4920
+ "packages/components-react/test/scenarios.spec.tsx#segmented-control-billing-period"
4921
+ ]
4922
+ },
4923
+ "accessibility": {
4924
+ "status": "passed",
4925
+ "classification": "verified",
4926
+ "refs": [
4927
+ "artifacts/product-reality/sprint-223/m02/segmented-control/react-measured.json#SegmentedControl"
4928
+ ]
4929
+ },
4930
+ "interaction": {
4931
+ "status": "passed",
4932
+ "classification": "verified",
4933
+ "refs": [
4934
+ "artifacts/product-reality/sprint-223/m02/segmented-control/react-measured.json#SegmentedControl"
4935
+ ]
4936
+ },
4937
+ "visualThemes": {
4938
+ "status": "passed",
4939
+ "classification": "verified",
4940
+ "cells": [
4941
+ "A-light",
4942
+ "A-dark",
4943
+ "A-hc",
4944
+ "B-light",
4945
+ "B-dark",
4946
+ "B-hc"
4947
+ ],
4948
+ "refs": [
4949
+ "artifacts/product-reality/sprint-223/m02/segmented-control/react-theme/report.json#SegmentedControl"
4950
+ ]
4951
+ }
4952
+ },
4953
+ "measurementRoot": "artifacts/product-reality/sprint-223/m02/segmented-control"
4954
+ },
4809
4955
  {
4810
4956
  "componentId": "Select",
4811
4957
  "state": "implemented-evidence-complete",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oods/components-react",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "React components for OODS Foundry: the controls, layouts and domain views its generated screens use.",
5
5
  "homepage": "https://oods-foundry.com/",
6
6
  "bugs": {
@@ -64,8 +64,8 @@
64
64
  ],
65
65
  "dependencies": {
66
66
  "@radix-ui/react-slot": "^1.1.2",
67
- "@oods/component-contracts": "0.4.0",
68
- "@oods/component-styles": "0.4.0"
67
+ "@oods/component-contracts": "0.4.1",
68
+ "@oods/component-styles": "0.4.1"
69
69
  },
70
70
  "peerDependencies": {
71
71
  "react": ">=18 <20",