@osdk/react-components 0.12.0 → 0.13.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/AGENTS.md +4 -0
- package/CHANGELOG.md +11 -0
- package/build/browser/action-form/ActionForm.js +19 -11
- package/build/browser/action-form/ActionForm.js.map +1 -1
- package/build/browser/action-form/ActionFormApi.js.map +1 -1
- package/build/browser/action-form/BaseForm.js +19 -13
- package/build/browser/action-form/BaseForm.js.map +1 -1
- package/build/browser/action-form/BaseForm.module.css +7 -7
- package/build/browser/action-form/FormField.js +5 -2
- package/build/browser/action-form/FormField.js.map +1 -1
- package/build/browser/action-form/FormField.module.css +6 -1
- package/build/browser/action-form/FormField.module.css.js +1 -0
- package/build/browser/action-form/FormFieldApi.js +7 -1
- package/build/browser/action-form/FormFieldApi.js.map +1 -1
- package/build/browser/action-form/FormHeader.module.css +2 -2
- package/build/browser/action-form/fields/DateCalendar.js +41 -3
- package/build/browser/action-form/fields/DateCalendar.js.map +1 -1
- package/build/browser/action-form/fields/DateCalendar.module.css +59 -10
- package/build/browser/action-form/fields/DateCalendar.module.css.js +5 -1
- package/build/browser/action-form/fields/DateRangeCalendar.js +8 -5
- package/build/browser/action-form/fields/DateRangeCalendar.js.map +1 -1
- package/build/browser/action-form/fields/DateRangeInputField.js +76 -61
- package/build/browser/action-form/fields/DateRangeInputField.js.map +1 -1
- package/build/browser/action-form/fields/DateRangeInputField.module.css +0 -15
- package/build/browser/action-form/fields/DateRangeInputField.module.css.js +1 -2
- package/build/browser/action-form/fields/DatetimePickerField.js +74 -40
- package/build/browser/action-form/fields/DatetimePickerField.js.map +1 -1
- package/build/browser/action-form/fields/DatetimePickerField.module.css +2 -9
- package/build/browser/action-form/fields/FieldBridge.js +1 -1
- package/build/browser/action-form/fields/FieldBridge.js.map +1 -1
- package/build/browser/action-form/fields/FilePickerField.js +47 -39
- package/build/browser/action-form/fields/FilePickerField.js.map +1 -1
- package/build/browser/action-form/fields/FilePickerField.module.css +43 -31
- package/build/browser/action-form/fields/FilePickerField.module.css.js +2 -2
- package/build/browser/action-form/fields/FormFieldRenderer.js +9 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/browser/action-form/fields/RadioButtonsField.module.css +3 -3
- package/build/browser/action-form/fields/SwitchField.js +34 -0
- package/build/browser/action-form/fields/SwitchField.js.map +1 -0
- package/build/browser/action-form/fields/TimePicker.js +165 -26
- package/build/browser/action-form/fields/TimePicker.js.map +1 -1
- package/build/browser/action-form/fields/TimePicker.module.css +27 -2
- package/build/browser/action-form/fields/TimePicker.module.css.js +3 -1
- package/build/browser/action-form/fields/calendarShared.js +5 -0
- package/build/browser/action-form/fields/calendarShared.js.map +1 -1
- package/build/browser/action-form/fields/useDateEditState.js +3 -4
- package/build/browser/action-form/fields/useDateEditState.js.map +1 -1
- package/build/browser/base-components/action-button/ActionButton.js +2 -1
- package/build/browser/base-components/action-button/ActionButton.js.map +1 -1
- package/build/browser/base-components/action-button/ActionButton.module.css +19 -0
- package/build/browser/base-components/action-button/ActionButton.module.css.js +2 -1
- package/build/browser/base-components/combobox/Combobox.module.css +31 -3
- package/build/browser/base-components/select/Select.module.css +18 -0
- package/build/browser/base-components/switch/Switch.module.css +18 -6
- package/build/browser/filter-list/base/inputs/ListogramInput.js +34 -6
- package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css +11 -5
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css.js +1 -1
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js +20 -12
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/NoValueLabel.js +36 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.js.map +1 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.module.css +20 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.module.css.js +6 -0
- package/build/browser/filter-list/base/inputs/NullValueWrapper.js +4 -3
- package/build/browser/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
- package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css +10 -7
- package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css.js +1 -1
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js +13 -8
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/TextTagsInput.js +6 -2
- package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/browser/filter-list/hooks/useFilterListState.js +7 -6
- package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/browser/filter-list/hooks/useStableMapEntries.js +35 -0
- package/build/browser/filter-list/hooks/useStableMapEntries.js.map +1 -0
- package/build/browser/filter-list/utils/filterValues.js +13 -0
- package/build/browser/filter-list/utils/filterValues.js.map +1 -1
- package/build/browser/object-table/DefaultCellRenderer.js +12 -2
- package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/browser/object-table/EditableCell.js +14 -4
- package/build/browser/object-table/EditableCell.js.map +1 -1
- package/build/browser/object-table/EditableCell.module.css +4 -0
- package/build/browser/object-table/EditableCell.module.css.js +1 -0
- package/build/browser/object-table/ObjectTable.js +3 -1
- package/build/browser/object-table/ObjectTable.js.map +1 -1
- package/build/browser/object-table/ObjectTableApi.js.map +1 -1
- package/build/browser/object-table/Table.js +8 -4
- package/build/browser/object-table/Table.js.map +1 -1
- package/build/browser/object-table/TableBody.js +4 -2
- package/build/browser/object-table/TableBody.js.map +1 -1
- package/build/browser/object-table/TableRow.js +12 -4
- package/build/browser/object-table/TableRow.js.map +1 -1
- package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/browser/object-table/utils/editableUtils.js +39 -0
- package/build/browser/object-table/utils/editableUtils.js.map +1 -0
- package/build/browser/object-table/utils/shouldShowEditableCell.js +1 -1
- package/build/browser/object-table/utils/shouldShowEditableCell.js.map +1 -1
- package/build/browser/object-table/utils/types.js.map +1 -1
- package/build/browser/styles.css +331 -130
- package/build/browser/tokens/component-tokens/button.css +15 -0
- package/build/browser/tokens/component-tokens/combobox.css +9 -0
- package/build/browser/tokens/component-tokens/datetime-picker.css +2 -2
- package/build/browser/tokens/component-tokens/file-picker.css +0 -10
- package/build/browser/tokens/component-tokens/filter-list.css +9 -6
- package/build/browser/tokens/component-tokens/form-section.css +1 -1
- package/build/browser/tokens/component-tokens/form.css +9 -5
- package/build/browser/tokens/component-tokens/table.css +3 -5
- package/build/browser/tokens.css +1 -0
- package/build/browser/util/UserAgent.js +1 -1
- package/build/cjs/{DateCalendar-2W4QHEEI.css → DateCalendar-G7RC2FCG.css} +105 -8
- package/build/cjs/DateCalendar-G7RC2FCG.css.map +1 -0
- package/build/cjs/DateCalendar-RX7HP2XP.cjs +26 -0
- package/build/cjs/{DateCalendar-QGSYBWJB.cjs.map → DateCalendar-RX7HP2XP.cjs.map} +1 -1
- package/build/cjs/{DateRangeCalendar-M63S2LLG.css → DateRangeCalendar-JBVYJDBJ.css} +105 -8
- package/build/cjs/DateRangeCalendar-JBVYJDBJ.css.map +1 -0
- package/build/cjs/DateRangeCalendar-OHT4IUWQ.cjs +54 -0
- package/build/cjs/DateRangeCalendar-OHT4IUWQ.cjs.map +1 -0
- package/build/cjs/{chunk-T7I6O43T.cjs → chunk-6SPXSFPI.cjs} +237 -85
- package/build/cjs/chunk-6SPXSFPI.cjs.map +1 -0
- package/build/cjs/{chunk-SZXVBDSA.cjs → chunk-6UDBHYSO.cjs} +3 -3
- package/build/cjs/{chunk-SZXVBDSA.cjs.map → chunk-6UDBHYSO.cjs.map} +1 -1
- package/build/cjs/{chunk-YBDS5WQP.cjs → chunk-7H6WXQ35.cjs} +4 -4
- package/build/cjs/{chunk-YBDS5WQP.cjs.map → chunk-7H6WXQ35.cjs.map} +1 -1
- package/build/cjs/{chunk-VVJFMOZI.cjs → chunk-I3OSD6CF.cjs} +19 -45
- package/build/cjs/chunk-I3OSD6CF.cjs.map +1 -0
- package/build/cjs/chunk-MD4KDE44.cjs +41 -0
- package/build/cjs/chunk-MD4KDE44.cjs.map +1 -0
- package/build/cjs/{chunk-YPXTSEE7.cjs → chunk-MLFMSZJQ.cjs} +85 -38
- package/build/cjs/chunk-MLFMSZJQ.cjs.map +1 -0
- package/build/cjs/chunk-MQYOHGPY.cjs +52 -0
- package/build/cjs/chunk-MQYOHGPY.cjs.map +1 -0
- package/build/cjs/{chunk-BJDCC446.cjs → chunk-PTTCWNZZ.cjs} +417 -364
- package/build/cjs/chunk-PTTCWNZZ.cjs.map +1 -0
- package/build/cjs/{chunk-B2GRQRWU.cjs → chunk-TOJSJN3L.cjs} +44 -8
- package/build/cjs/chunk-TOJSJN3L.cjs.map +1 -0
- package/build/cjs/{chunk-JLESWL47.cjs → chunk-V7XWTJV7.cjs} +4 -2
- package/build/cjs/chunk-V7XWTJV7.cjs.map +1 -0
- package/build/cjs/{chunk-L5LPFCXT.cjs → chunk-W2IASYE4.cjs} +163 -125
- package/build/cjs/chunk-W2IASYE4.cjs.map +1 -0
- package/build/cjs/chunk-X337DNCW.cjs +45 -0
- package/build/cjs/chunk-X337DNCW.cjs.map +1 -0
- package/build/cjs/{chunk-SB2VTP67.cjs → chunk-Z7VHLTKD.cjs} +2 -64
- package/build/cjs/chunk-Z7VHLTKD.cjs.map +1 -0
- package/build/cjs/public/experimental/action-form.cjs +11 -9
- package/build/cjs/public/experimental/action-form.css +223 -68
- package/build/cjs/public/experimental/action-form.css.map +1 -1
- package/build/cjs/public/experimental/action-form.d.cts +83 -74
- package/build/cjs/public/experimental/filter-list.cjs +9 -8
- package/build/cjs/public/experimental/filter-list.css +38 -19
- package/build/cjs/public/experimental/filter-list.css.map +1 -1
- package/build/cjs/public/experimental/object-table.cjs +14 -12
- package/build/cjs/public/experimental/object-table.css +152 -59
- package/build/cjs/public/experimental/object-table.css.map +1 -1
- package/build/cjs/public/experimental/object-table.d.cts +39 -20
- package/build/cjs/public/experimental/pdf-viewer.cjs +24 -24
- package/build/cjs/public/experimental.cjs +46 -44
- package/build/cjs/public/experimental.css +242 -139
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/primitives.cjs +8 -7
- package/build/cjs/public/primitives.css +15 -0
- package/build/cjs/public/primitives.css.map +1 -1
- package/build/cjs/public/primitives.d.cts +1 -0
- package/build/esm/action-form/ActionForm.js +19 -11
- package/build/esm/action-form/ActionForm.js.map +1 -1
- package/build/esm/action-form/ActionFormApi.js.map +1 -1
- package/build/esm/action-form/BaseForm.js +19 -13
- package/build/esm/action-form/BaseForm.js.map +1 -1
- package/build/esm/action-form/BaseForm.module.css +7 -7
- package/build/esm/action-form/FormField.js +5 -2
- package/build/esm/action-form/FormField.js.map +1 -1
- package/build/esm/action-form/FormField.module.css +6 -1
- package/build/esm/action-form/FormFieldApi.js +7 -1
- package/build/esm/action-form/FormFieldApi.js.map +1 -1
- package/build/esm/action-form/FormHeader.module.css +2 -2
- package/build/esm/action-form/fields/DateCalendar.js +41 -3
- package/build/esm/action-form/fields/DateCalendar.js.map +1 -1
- package/build/esm/action-form/fields/DateCalendar.module.css +59 -10
- package/build/esm/action-form/fields/DateRangeCalendar.js +8 -5
- package/build/esm/action-form/fields/DateRangeCalendar.js.map +1 -1
- package/build/esm/action-form/fields/DateRangeInputField.js +76 -61
- package/build/esm/action-form/fields/DateRangeInputField.js.map +1 -1
- package/build/esm/action-form/fields/DateRangeInputField.module.css +0 -15
- package/build/esm/action-form/fields/DatetimePickerField.js +74 -40
- package/build/esm/action-form/fields/DatetimePickerField.js.map +1 -1
- package/build/esm/action-form/fields/DatetimePickerField.module.css +2 -9
- package/build/esm/action-form/fields/FieldBridge.js +1 -1
- package/build/esm/action-form/fields/FieldBridge.js.map +1 -1
- package/build/esm/action-form/fields/FilePickerField.js +47 -39
- package/build/esm/action-form/fields/FilePickerField.js.map +1 -1
- package/build/esm/action-form/fields/FilePickerField.module.css +43 -31
- package/build/esm/action-form/fields/FormFieldRenderer.js +9 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/esm/action-form/fields/RadioButtonsField.module.css +3 -3
- package/build/esm/action-form/fields/SwitchField.js +34 -0
- package/build/esm/action-form/fields/SwitchField.js.map +1 -0
- package/build/esm/action-form/fields/TimePicker.js +165 -26
- package/build/esm/action-form/fields/TimePicker.js.map +1 -1
- package/build/esm/action-form/fields/TimePicker.module.css +27 -2
- package/build/esm/action-form/fields/calendarShared.js +5 -0
- package/build/esm/action-form/fields/calendarShared.js.map +1 -1
- package/build/esm/action-form/fields/useDateEditState.js +3 -4
- package/build/esm/action-form/fields/useDateEditState.js.map +1 -1
- package/build/esm/base-components/action-button/ActionButton.js +2 -1
- package/build/esm/base-components/action-button/ActionButton.js.map +1 -1
- package/build/esm/base-components/action-button/ActionButton.module.css +19 -0
- package/build/esm/base-components/combobox/Combobox.module.css +31 -3
- package/build/esm/base-components/select/Select.module.css +18 -0
- package/build/esm/base-components/switch/Switch.module.css +18 -6
- package/build/esm/filter-list/base/inputs/ListogramInput.js +34 -6
- package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.module.css +11 -5
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js +20 -12
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/NoValueLabel.js +36 -0
- package/build/esm/filter-list/base/inputs/NoValueLabel.js.map +1 -0
- package/build/esm/filter-list/base/inputs/NoValueLabel.module.css +20 -0
- package/build/esm/filter-list/base/inputs/NullValueWrapper.js +4 -3
- package/build/esm/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
- package/build/esm/filter-list/base/inputs/NullValueWrapper.module.css +10 -7
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js +13 -8
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/TextTagsInput.js +6 -2
- package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/esm/filter-list/hooks/useFilterListState.js +7 -6
- package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/esm/filter-list/hooks/useStableMapEntries.js +35 -0
- package/build/esm/filter-list/hooks/useStableMapEntries.js.map +1 -0
- package/build/esm/filter-list/utils/filterValues.js +13 -0
- package/build/esm/filter-list/utils/filterValues.js.map +1 -1
- package/build/esm/object-table/DefaultCellRenderer.js +12 -2
- package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/esm/object-table/EditableCell.js +14 -4
- package/build/esm/object-table/EditableCell.js.map +1 -1
- package/build/esm/object-table/EditableCell.module.css +4 -0
- package/build/esm/object-table/ObjectTable.js +3 -1
- package/build/esm/object-table/ObjectTable.js.map +1 -1
- package/build/esm/object-table/ObjectTableApi.js.map +1 -1
- package/build/esm/object-table/Table.js +8 -4
- package/build/esm/object-table/Table.js.map +1 -1
- package/build/esm/object-table/TableBody.js +4 -2
- package/build/esm/object-table/TableBody.js.map +1 -1
- package/build/esm/object-table/TableRow.js +12 -4
- package/build/esm/object-table/TableRow.js.map +1 -1
- package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/esm/object-table/utils/editableUtils.js +39 -0
- package/build/esm/object-table/utils/editableUtils.js.map +1 -0
- package/build/esm/object-table/utils/shouldShowEditableCell.js +1 -1
- package/build/esm/object-table/utils/shouldShowEditableCell.js.map +1 -1
- package/build/esm/object-table/utils/types.js.map +1 -1
- package/build/esm/tokens/component-tokens/button.css +15 -0
- package/build/esm/tokens/component-tokens/combobox.css +9 -0
- package/build/esm/tokens/component-tokens/datetime-picker.css +2 -2
- package/build/esm/tokens/component-tokens/file-picker.css +0 -10
- package/build/esm/tokens/component-tokens/filter-list.css +9 -6
- package/build/esm/tokens/component-tokens/form-section.css +1 -1
- package/build/esm/tokens/component-tokens/form.css +9 -5
- package/build/esm/tokens/component-tokens/table.css +3 -5
- package/build/esm/tokens.css +1 -0
- package/build/esm/util/UserAgent.js +1 -1
- package/build/types/action-form/ActionFormApi.d.ts +8 -8
- package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
- package/build/types/action-form/BaseForm.d.ts.map +1 -1
- package/build/types/action-form/FormFieldApi.d.ts +29 -22
- package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
- package/build/types/action-form/fields/DateCalendar.d.ts +6 -1
- package/build/types/action-form/fields/DateCalendar.d.ts.map +1 -1
- package/build/types/action-form/fields/DateRangeCalendar.d.ts.map +1 -1
- package/build/types/action-form/fields/DateRangeInputField.d.ts.map +1 -1
- package/build/types/action-form/fields/DatetimePickerField.d.ts.map +1 -1
- package/build/types/action-form/fields/FieldBridge.d.ts.map +1 -1
- package/build/types/action-form/fields/FilePickerField.d.ts.map +1 -1
- package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
- package/build/types/action-form/fields/SwitchField.d.ts +7 -0
- package/build/types/action-form/fields/SwitchField.d.ts.map +1 -0
- package/build/types/action-form/fields/TimePicker.d.ts +4 -5
- package/build/types/action-form/fields/TimePicker.d.ts.map +1 -1
- package/build/types/action-form/fields/useDateEditState.d.ts +2 -2
- package/build/types/base-components/action-button/ActionButton.d.ts +1 -0
- package/build/types/base-components/action-button/ActionButton.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/NoValueLabel.d.ts +15 -0
- package/build/types/filter-list/base/inputs/NoValueLabel.d.ts.map +1 -0
- package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/TextTagsInput.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useStableMapEntries.d.ts +9 -0
- package/build/types/filter-list/hooks/useStableMapEntries.d.ts.map +1 -0
- package/build/types/filter-list/utils/filterValues.d.ts +7 -0
- package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
- package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
- package/build/types/object-table/EditableCell.d.ts +1 -1
- package/build/types/object-table/EditableCell.d.ts.map +1 -1
- package/build/types/object-table/ObjectTableApi.d.ts +26 -7
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/Table.d.ts +9 -2
- package/build/types/object-table/Table.d.ts.map +1 -1
- package/build/types/object-table/TableBody.d.ts +2 -1
- package/build/types/object-table/TableBody.d.ts.map +1 -1
- package/build/types/object-table/TableRow.d.ts +2 -1
- package/build/types/object-table/TableRow.d.ts.map +1 -1
- package/build/types/object-table/utils/editableUtils.d.ts +16 -0
- package/build/types/object-table/utils/editableUtils.d.ts.map +1 -0
- package/build/types/object-table/utils/shouldShowEditableCell.d.ts +2 -1
- package/build/types/object-table/utils/shouldShowEditableCell.d.ts.map +1 -1
- package/build/types/object-table/utils/types.d.ts +4 -11
- package/build/types/object-table/utils/types.d.ts.map +1 -1
- package/docs/ActionForm.md +176 -0
- package/docs/CSSVariables.md +31 -30
- package/docs/ObjectTable.md +141 -16
- package/package.json +6 -5
- package/build/cjs/DateCalendar-2W4QHEEI.css.map +0 -1
- package/build/cjs/DateCalendar-QGSYBWJB.cjs +0 -24
- package/build/cjs/DateRangeCalendar-JHO2BF3Z.cjs +0 -48
- package/build/cjs/DateRangeCalendar-JHO2BF3Z.cjs.map +0 -1
- package/build/cjs/DateRangeCalendar-M63S2LLG.css.map +0 -1
- package/build/cjs/chunk-B2GRQRWU.cjs.map +0 -1
- package/build/cjs/chunk-BJDCC446.cjs.map +0 -1
- package/build/cjs/chunk-JLESWL47.cjs.map +0 -1
- package/build/cjs/chunk-L5LPFCXT.cjs.map +0 -1
- package/build/cjs/chunk-SB2VTP67.cjs.map +0 -1
- package/build/cjs/chunk-T7I6O43T.cjs.map +0 -1
- package/build/cjs/chunk-UCTQICPR.cjs +0 -10
- package/build/cjs/chunk-UCTQICPR.cjs.map +0 -1
- package/build/cjs/chunk-VVJFMOZI.cjs.map +0 -1
- package/build/cjs/chunk-YPXTSEE7.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatetimePickerField.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForDisplay","formatDateForInput","formatDatetimeForInput","getTimeValue","parseDateFromInput","parseDatetimeFromInput","parseTimeString","stopPropagation","commonStyles","styles","LazyDateCalendar","PortalDismissLayer","TimePicker","useDateEditState","DatetimePickerField","memo","id","value","onChange","error","min","max","placeholder","formatDate","parseDate","showTime","closeOnSelection","portalRef","portalContainer","shouldCloseOnSelection","popoverId","inputRef","popoverRef","isOpen","setIsOpen","skipReopenRef","editFormatFn","displayFormatFn","parseFn","displayedValue","inputError","startEditing","stopEditing","commitAndStopEditing","setInputValue","setDateValue","handleFocus","current","handleBlur","e","relatedTarget","document","activeElement","contains","closePopover","blur","handleKeyDown","key","preventDefault","shiftKey","firstFocusable","querySelector","focus","handleOpenChange","nextOpen","handleCalendarSelect","selected","date","Date","getTime","setHours","getHours","getMinutes","handleTimeChange","timeString","hours","minutes","base","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","timeFooter","createElement","className","osdkDatetimeTimeFooter","undefined","wrapperClassName","osdkDatePickerInputWrapper","osdkDatetimeInputWrapper","osdkDatePickerInputWrapperError","Root","open","onOpenChange","modal","Trigger","nativeButton","render","tabIndex","ref","osdkDatePickerInput","type","onValueChange","onFocus","onBlur","onClick","onKeyDown","autoComplete","role","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","osdkDatePickerPositioner","sideOffset","Popup","osdkDatePickerPopover","finalFocus","osdkDatePickerFocusBoundary","dateSelected","onSelect"],"sources":["DatetimePickerField.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport {\n formatDateForDisplay,\n formatDateForInput,\n formatDatetimeForInput,\n getTimeValue,\n parseDateFromInput,\n parseDatetimeFromInput,\n parseTimeString,\n} from \"../../shared/dateUtils.js\";\nimport type { DatetimePickerFieldProps } from \"../FormFieldApi.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DatetimePickerField.module.css\";\nimport { LazyDateCalendar } from \"./LazyDateCalendar.js\";\nimport { PortalDismissLayer } from \"./PortalDismissLayer.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\nexport const DatetimePickerField: React.NamedExoticComponent<\n DatetimePickerFieldProps\n> = React.memo(function DatetimePickerField({\n id,\n value,\n onChange,\n error,\n min,\n max,\n placeholder,\n formatDate,\n parseDate,\n showTime = false,\n closeOnSelection,\n portalRef,\n portalContainer,\n}: DatetimePickerFieldProps) {\n const shouldCloseOnSelection = closeOnSelection ?? !showTime;\n const popoverId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // When true, the next handleFocus call skips reopening the popover.\n // Set before focusing the input from a popover boundary exit so that\n // Tab/Shift-Tab proceeds to the adjacent form field naturally.\n const skipReopenRef = useRef(false);\n\n // Format/parse: pick between date-only and datetime variants.\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces a human-readable string for idle state (e.g. \"Jan 15, 2024\").\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForDisplay);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n const {\n displayedValue,\n inputError,\n startEditing,\n stopEditing,\n commitAndStopEditing,\n setInputValue,\n setDateValue,\n } = useDateEditState({\n value,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange,\n });\n\n // --- Input event handlers ---\n\n const handleFocus = useCallback(() => {\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n startEditing();\n return;\n }\n startEditing();\n setIsOpen(true);\n }, [startEditing]);\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Focus moved into the popover portal (e.g. clicking a calendar day).\n // The field is still logically active, so suppress the blur from\n // bubbling — parent containers should not treat this as a field exit.\n e.stopPropagation();\n return;\n }\n commitAndStopEditing();\n },\n [commitAndStopEditing],\n );\n\n // Shared close sequence: dismiss the popover, reset editing state, and\n // blur the input so focus doesn't linger after the calendar disappears.\n // Uses stopEditing (not commitAndStopEditing) to avoid double-firing\n // onChange when called from calendar-select or after Enter already committed.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopEditing();\n inputRef.current?.blur();\n }, [stopEditing]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAndStopEditing();\n setIsOpen(false);\n inputRef.current?.blur();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Move focus from the text input into the calendar popover.\n // The popover doesn't auto-focus on open (to keep the cursor in the input),\n // so Tab manually bridges focus to the first interactive calendar element.\n const firstFocusable = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstFocusable != null) {\n e.preventDefault();\n firstFocusable.focus();\n }\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitAndStopEditing, closePopover, isOpen],\n );\n\n // --- Popover handlers ---\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleCalendarSelect = useCallback(\n (selected: Date | undefined) => {\n if (selected == null) {\n onChange?.(null);\n setInputValue(\"\");\n return;\n }\n\n const date = new Date(selected.getTime());\n if (showTime && value != null) {\n date.setHours(value.getHours(), value.getMinutes());\n }\n\n onChange?.(date);\n setDateValue(date);\n\n if (shouldCloseOnSelection) {\n closePopover();\n }\n },\n [\n onChange,\n showTime,\n value,\n shouldCloseOnSelection,\n setDateValue,\n setInputValue,\n closePopover,\n ],\n );\n\n const handleTimeChange = useCallback(\n (timeString: string) => {\n const { hours, minutes } = parseTimeString(timeString);\n const base = value != null ? new Date(value.getTime()) : new Date();\n base.setHours(hours, minutes, 0, 0);\n onChange?.(base);\n setDateValue(base);\n },\n [value, onChange, setDateValue],\n );\n\n // --- Focus boundary handlers ---\n // Visually-hidden elements at the start/end of the popover that trap Tab\n // cycling between the text input and calendar. Without these, Tab would\n // escape the popover into the page behind it.\n\n const handleStartFocusBoundary = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Tab reached the end of the popover. Close the popover and\n // return focus to the input without reopening it, so the next\n // Tab advances to the next form field.\n skipReopenRef.current = true;\n setIsOpen(false);\n stopEditing();\n inputRef.current?.focus();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [stopEditing],\n );\n\n // --- Time picker (rendered as a popover sibling, not a DayPicker footer,\n // so the border-top can span the full popover width via negative margins) ---\n\n const timeFooter = showTime\n ? (\n <div className={styles.osdkDatetimeTimeFooter}>\n <TimePicker value={getTimeValue(value)} onChange={handleTimeChange} />\n </div>\n )\n : undefined;\n\n const wrapperClassName = classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDatetimeInputWrapper,\n inputError != null && commonStyles.osdkDatePickerInputWrapperError,\n );\n\n return (\n <Popover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n // Uses pointer-down outside dismissal so the click that opens the picker\n // is not reinterpreted after the portal dismiss layer appears.\n modal=\"trap-focus\"\n >\n <Popover.Trigger\n nativeButton={false}\n render={<div className={wrapperClassName} tabIndex={-1} />}\n >\n <Input\n ref={inputRef}\n id={id}\n className={commonStyles.osdkDatePickerInput}\n type=\"text\"\n value={displayedValue}\n onValueChange={setInputValue}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onClick={stopPropagation}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={popoverId}\n aria-haspopup=\"dialog\"\n />\n </Popover.Trigger>\n <Popover.Portal ref={portalRef} container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the input.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateCalendar\n dateSelected={value ?? undefined}\n onSelect={handleCalendarSelect}\n min={min}\n max={max}\n />\n {timeFooter}\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DatetimePickerField.js","names":["Input","Popover","classnames","React","useCallback","useId","useRef","useState","formatDateForInput","formatDatetimeForInput","isDateInRange","parseDateFromInput","parseDatetimeFromInput","stopPropagation","commonStyles","styles","LazyDateCalendar","PortalDismissLayer","TimePicker","useDateEditState","DatetimePickerField","memo","id","value","onChange","error","min","max","placeholder","formatDate","parseDate","showTime","closeOnSelection","portalRef","portalContainer","shouldCloseOnSelection","popoverId","wrapperRef","inputRef","popoverRef","isOpen","setIsOpen","visibleCalendarMonth","setVisibleCalendarMonth","Date","skipReopenRef","editFormatFn","displayFormatFn","parseFn","isEditing","displayedValue","inputError","dateValue","startEditing","stopEditing","commitAndStopEditing","setInputValue","setDateValue","handleFocus","current","undefined","handlePointerDown","focus","handleInputValueChange","nextValue","parsedDate","handleBlur","e","relatedTarget","document","activeElement","contains","closePopover","blur","handleKeyDown","key","preventDefault","shiftKey","firstFocusable","querySelector","handleOpenChange","nextOpen","handleCalendarSelect","selected","date","getTime","setHours","getHours","getMinutes","handleTimeChange","time","handleCalendarClear","handleStartFocusBoundary","handleEndFocusBoundary","buttons","querySelectorAll","lastButton","length","activeDateValue","timeFooter","createElement","className","osdkDatetimeTimeFooter","wrapperClassName","osdkDatePickerInputWrapper","osdkDatetimeInputWrapper","osdkDatePickerInputWrapperError","Root","open","onOpenChange","modal","ref","Trigger","nativeButton","render","osdkDatePickerInput","type","onValueChange","onFocus","onPointerDown","onBlur","onClick","onKeyDown","autoComplete","role","Portal","container","osdkDatePickerDismissLayer","onDismiss","Positioner","anchor","osdkDatePickerPositioner","sideOffset","Popup","osdkDatePickerPopover","finalFocus","tabIndex","osdkDatePickerFocusBoundary","dateSelected","onSelect","onClear","month","onMonthChange","footer"],"sources":["DatetimePickerField.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Input } from \"@base-ui/react/input\";\nimport { Popover } from \"@base-ui/react/popover\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useId, useRef, useState } from \"react\";\nimport {\n formatDateForInput,\n formatDatetimeForInput,\n isDateInRange,\n parseDateFromInput,\n parseDatetimeFromInput,\n} from \"../../shared/dateUtils.js\";\nimport type { DatetimePickerFieldProps } from \"../FormFieldApi.js\";\nimport { stopPropagation } from \"./calendarShared.js\";\nimport commonStyles from \"./DatePickerCommon.module.css\";\nimport styles from \"./DatetimePickerField.module.css\";\nimport { LazyDateCalendar } from \"./LazyDateCalendar.js\";\nimport { PortalDismissLayer } from \"./PortalDismissLayer.js\";\nimport { TimePicker } from \"./TimePicker.js\";\nimport { useDateEditState } from \"./useDateEditState.js\";\n\nexport const DatetimePickerField: React.NamedExoticComponent<\n DatetimePickerFieldProps\n> = React.memo(function DatetimePickerField({\n id,\n value,\n onChange,\n error,\n min,\n max,\n placeholder,\n formatDate,\n parseDate,\n showTime = false,\n closeOnSelection,\n portalRef,\n portalContainer,\n}: DatetimePickerFieldProps) {\n const shouldCloseOnSelection = closeOnSelection ?? !showTime;\n const popoverId = useId();\n // The wrapper is only a visual/positioning anchor. The input itself remains\n // the Popover.Trigger so axe does not see an interactive wrapper around an\n // interactive combobox.\n const wrapperRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n // activeDateValue is the selected/typed date; visibleCalendarMonth is only\n // the calendar viewport. Keeping the viewport separate lets typed dates jump\n // the calendar while next/previous month navigation still works.\n const [visibleCalendarMonth, setVisibleCalendarMonth] = useState<\n Date | undefined\n >(value ?? new Date());\n // When true, the next handleFocus call skips reopening the popover.\n // Set before focusing the input from a popover boundary exit so that\n // Tab/Shift-Tab proceeds to the adjacent form field naturally.\n const skipReopenRef = useRef(false);\n\n // Format/parse: pick between date-only and datetime variants.\n // editFormatFn produces a parsable string for typing (e.g. \"2024-01-15\" or \"2024-01-15 14:30\").\n // displayFormatFn produces the idle string. Defaults stay deterministic so\n // users in different browser locales see the same date in form inputs.\n const editFormatFn = showTime ? formatDatetimeForInput : formatDateForInput;\n const displayFormatFn = formatDate\n ?? (showTime ? formatDatetimeForInput : formatDateForInput);\n const parseFn = parseDate\n ?? (showTime ? parseDatetimeFromInput : parseDateFromInput);\n\n const {\n isEditing,\n displayedValue,\n inputError,\n dateValue,\n startEditing,\n stopEditing,\n commitAndStopEditing,\n setInputValue,\n setDateValue,\n } = useDateEditState({\n value,\n displayFormatFn,\n editFormatFn,\n parseFn,\n min,\n max,\n onChange,\n });\n\n // --- Input event handlers ---\n\n const handleFocus = useCallback(() => {\n if (skipReopenRef.current) {\n skipReopenRef.current = false;\n startEditing();\n return;\n }\n startEditing();\n setVisibleCalendarMonth(value ?? undefined);\n setIsOpen(true);\n }, [startEditing, value]);\n\n const handlePointerDown = useCallback(() => {\n // Opening from pointer-down keeps mouse interactions in sync with focus\n // editing before Base UI's later click trigger handler runs.\n inputRef.current?.focus();\n handleFocus();\n }, [handleFocus]);\n\n const handleInputValueChange = useCallback(\n (nextValue: string) => {\n setInputValue(nextValue);\n const parsedDate = nextValue !== \"\" ? parseFn(nextValue) : undefined;\n if (parsedDate != null && isDateInRange(parsedDate, min, max)) {\n setVisibleCalendarMonth(parsedDate);\n }\n },\n [max, min, parseFn, setInputValue],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Focus moved into the popover portal (e.g. clicking a calendar day).\n // The field is still logically active, so suppress the blur from\n // bubbling — parent containers should not treat this as a field exit.\n e.stopPropagation();\n return;\n }\n commitAndStopEditing();\n },\n [commitAndStopEditing],\n );\n\n // Shared close sequence: dismiss the popover, reset editing state, and\n // blur the input so focus doesn't linger after the calendar disappears.\n // Uses stopEditing (not commitAndStopEditing) to avoid double-firing\n // onChange when called from calendar-select or after Enter already committed.\n const closePopover = useCallback(() => {\n setIsOpen(false);\n stopEditing();\n inputRef.current?.blur();\n }, [stopEditing]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAndStopEditing();\n setIsOpen(false);\n inputRef.current?.blur();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n closePopover();\n } else if (e.key === \"Tab\" && !e.shiftKey && isOpen) {\n // Move focus from the text input into the calendar popover.\n // The popover doesn't auto-focus on open (to keep the cursor in the input),\n // so Tab manually bridges focus to the first interactive calendar element.\n const firstFocusable = popoverRef.current?.querySelector<HTMLElement>(\n \"button, select\",\n );\n if (firstFocusable != null) {\n e.preventDefault();\n firstFocusable.focus();\n }\n } else if (e.key === \"Tab\" && e.shiftKey) {\n setIsOpen(false);\n }\n },\n [commitAndStopEditing, closePopover, isOpen],\n );\n\n // --- Popover handlers ---\n\n // Called by base-ui when the popover opens or closes (e.g. click outside, Escape).\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n if (nextOpen) {\n setIsOpen(true);\n } else {\n closePopover();\n }\n },\n [closePopover],\n );\n\n // --- Calendar handlers ---\n\n const handleCalendarSelect = useCallback(\n (selected: Date | undefined) => {\n if (selected == null) {\n onChange?.(null);\n setInputValue(\"\");\n return;\n }\n\n const date = new Date(selected.getTime());\n if (showTime && value != null) {\n date.setHours(value.getHours(), value.getMinutes());\n }\n\n onChange?.(date);\n setDateValue(date);\n setVisibleCalendarMonth(date);\n\n if (shouldCloseOnSelection) {\n closePopover();\n }\n },\n [\n onChange,\n showTime,\n value,\n shouldCloseOnSelection,\n setDateValue,\n setInputValue,\n closePopover,\n ],\n );\n\n const handleTimeChange = useCallback(\n (time: Date) => {\n onChange?.(time);\n setDateValue(time);\n },\n [onChange, setDateValue],\n );\n\n const handleCalendarClear = useCallback(() => {\n onChange?.(null);\n setDateValue(null);\n }, [onChange, setDateValue]);\n\n // --- Focus boundary handlers ---\n // Visually-hidden elements at the start/end of the popover that trap Tab\n // cycling between the text input and calendar. Without these, Tab would\n // escape the popover into the page behind it.\n\n const handleStartFocusBoundary = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n const handleEndFocusBoundary = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n const relatedTarget = e.relatedTarget ?? document.activeElement;\n if (popoverRef.current?.contains(relatedTarget as Node)) {\n // Tab reached the end of the popover. Close the popover and\n // return focus to the input without reopening it, so the next\n // Tab advances to the next form field.\n skipReopenRef.current = true;\n setIsOpen(false);\n stopEditing();\n inputRef.current?.focus();\n } else {\n const buttons = popoverRef.current?.querySelectorAll<HTMLElement>(\n \"button, select\",\n );\n const lastButton = buttons?.[buttons.length - 1];\n lastButton?.focus();\n }\n },\n [stopEditing],\n );\n\n // --- Time picker ---\n\n const activeDateValue = isEditing && inputError == null\n ? dateValue\n : (value ?? undefined);\n\n const timeFooter = showTime\n ? (\n <div className={styles.osdkDatetimeTimeFooter}>\n <TimePicker\n value={activeDateValue ?? null}\n onChange={handleTimeChange}\n />\n </div>\n )\n : undefined;\n\n const wrapperClassName = classnames(\n commonStyles.osdkDatePickerInputWrapper,\n styles.osdkDatetimeInputWrapper,\n inputError != null && commonStyles.osdkDatePickerInputWrapperError,\n );\n\n // Keep Popover.Trigger on the input itself. Moving it to the wrapper would\n // make click handling simpler, but it would also nest an interactive combobox\n // inside an interactive trigger and reintroduce the axe violation.\n return (\n <Popover.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n // Uses pointer-down outside dismissal so the click that opens the picker\n // is not reinterpreted after the portal dismiss layer appears.\n modal=\"trap-focus\"\n >\n <div ref={wrapperRef} className={wrapperClassName}>\n <Popover.Trigger\n nativeButton={false}\n render={\n <Input\n ref={inputRef}\n id={id}\n className={commonStyles.osdkDatePickerInput}\n type=\"text\"\n value={displayedValue}\n onValueChange={handleInputValueChange}\n onFocus={handleFocus}\n onPointerDown={handlePointerDown}\n onBlur={handleBlur}\n onClick={stopPropagation}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={popoverId}\n aria-haspopup=\"dialog\"\n />\n }\n />\n </div>\n <Popover.Portal ref={portalRef} container={portalContainer}>\n <PortalDismissLayer\n className={commonStyles.osdkDatePickerDismissLayer}\n onDismiss={closePopover}\n />\n <Popover.Positioner\n anchor={wrapperRef}\n className={commonStyles.osdkDatePickerPositioner}\n sideOffset={4}\n >\n <Popover.Popup\n ref={popoverRef}\n className={commonStyles.osdkDatePickerPopover}\n id={popoverId}\n role=\"dialog\"\n aria-label=\"date picker\"\n // Disable base-ui's automatic focus restoration to the trigger on close.\n // We manage focus ourselves via closePopover() which blurs the input.\n finalFocus={false}\n >\n <div\n onFocus={handleStartFocusBoundary}\n tabIndex={0}\n aria-label=\"Start of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n <LazyDateCalendar\n dateSelected={activeDateValue}\n onSelect={handleCalendarSelect}\n onClear={handleCalendarClear}\n month={visibleCalendarMonth}\n onMonthChange={setVisibleCalendarMonth}\n min={min}\n max={max}\n footer={timeFooter}\n />\n <div\n onFocus={handleEndFocusBoundary}\n tabIndex={0}\n aria-label=\"End of date picker dialog\"\n className={commonStyles.osdkDatePickerFocusBoundary}\n />\n </Popover.Popup>\n </Popover.Positioner>\n </Popover.Portal>\n </Popover.Root>\n );\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,QAAQ,sBAAsB;AAC5C,SAASC,OAAO,QAAQ,wBAAwB;AAChD,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,KAAK,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACnE,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,aAAa,EACbC,kBAAkB,EAClBC,sBAAsB,QACjB,2BAA2B;AAElC,SAASC,eAAe,QAAQ,qBAAqB;AACrD,OAAOC,YAAY,MAAM,+BAA+B;AACxD,OAAOC,MAAM,MAAM,kCAAkC;AACrD,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,kBAAkB,QAAQ,yBAAyB;AAC5D,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,OAAO,MAAMC,mBAEZ,gBAAGjB,KAAK,CAACkB,IAAI,CAAC,UAA6B;EAC1CC,EAAE;EACFC,KAAK;EACLC,QAAQ;EACRC,KAAK;EACLC,GAAG;EACHC,GAAG;EACHC,WAAW;EACXC,UAAU;EACVC,SAAS;EACTC,QAAQ,GAAG,KAAK;EAChBC,gBAAgB;EAChBC,SAAS;EACTC;AACwB,CAAC,EAAE;EAC3B,MAAMC,sBAAsB,GAAGH,gBAAgB,IAAI,CAACD,QAAQ;EAC5D,MAAMK,SAAS,GAAG/B,KAAK,CAAC,CAAC;EACzB;EACA;EACA;EACA,MAAMgC,UAAU,GAAG/B,MAAM,CAAiB,IAAI,CAAC;EAC/C,MAAMgC,QAAQ,GAAGhC,MAAM,CAAmB,IAAI,CAAC;EAC/C,MAAMiC,UAAU,GAAGjC,MAAM,CAAiB,IAAI,CAAC;EAE/C,MAAM,CAACkC,MAAM,EAAEC,SAAS,CAAC,GAAGlC,QAAQ,CAAC,KAAK,CAAC;EAC3C;EACA;EACA;EACA,MAAM,CAACmC,oBAAoB,EAAEC,uBAAuB,CAAC,GAAGpC,QAAQ,CAE9DgB,KAAK,IAAI,IAAIqB,IAAI,CAAC,CAAC,CAAC;EACtB;EACA;EACA;EACA,MAAMC,aAAa,GAAGvC,MAAM,CAAC,KAAK,CAAC;;EAEnC;EACA;EACA;EACA;EACA,MAAMwC,YAAY,GAAGf,QAAQ,GAAGtB,sBAAsB,GAAGD,kBAAkB;EAC3E,MAAMuC,eAAe,GAAGlB,UAAU,KAC5BE,QAAQ,GAAGtB,sBAAsB,GAAGD,kBAAkB,CAAC;EAC7D,MAAMwC,OAAO,GAAGlB,SAAS,KACnBC,QAAQ,GAAGnB,sBAAsB,GAAGD,kBAAkB,CAAC;EAE7D,MAAM;IACJsC,SAAS;IACTC,cAAc;IACdC,UAAU;IACVC,SAAS;IACTC,YAAY;IACZC,WAAW;IACXC,oBAAoB;IACpBC,aAAa;IACbC;EACF,CAAC,GAAGtC,gBAAgB,CAAC;IACnBI,KAAK;IACLwB,eAAe;IACfD,YAAY;IACZE,OAAO;IACPtB,GAAG;IACHC,GAAG;IACHH;EACF,CAAC,CAAC;;EAEF;;EAEA,MAAMkC,WAAW,GAAGtD,WAAW,CAAC,MAAM;IACpC,IAAIyC,aAAa,CAACc,OAAO,EAAE;MACzBd,aAAa,CAACc,OAAO,GAAG,KAAK;MAC7BN,YAAY,CAAC,CAAC;MACd;IACF;IACAA,YAAY,CAAC,CAAC;IACdV,uBAAuB,CAACpB,KAAK,IAAIqC,SAAS,CAAC;IAC3CnB,SAAS,CAAC,IAAI,CAAC;EACjB,CAAC,EAAE,CAACY,YAAY,EAAE9B,KAAK,CAAC,CAAC;EAEzB,MAAMsC,iBAAiB,GAAGzD,WAAW,CAAC,MAAM;IAC1C;IACA;IACAkC,QAAQ,CAACqB,OAAO,EAAEG,KAAK,CAAC,CAAC;IACzBJ,WAAW,CAAC,CAAC;EACf,CAAC,EAAE,CAACA,WAAW,CAAC,CAAC;EAEjB,MAAMK,sBAAsB,GAAG3D,WAAW,CACvC4D,SAAiB,IAAK;IACrBR,aAAa,CAACQ,SAAS,CAAC;IACxB,MAAMC,UAAU,GAAGD,SAAS,KAAK,EAAE,GAAGhB,OAAO,CAACgB,SAAS,CAAC,GAAGJ,SAAS;IACpE,IAAIK,UAAU,IAAI,IAAI,IAAIvD,aAAa,CAACuD,UAAU,EAAEvC,GAAG,EAAEC,GAAG,CAAC,EAAE;MAC7DgB,uBAAuB,CAACsB,UAAU,CAAC;IACrC;EACF,CAAC,EACD,CAACtC,GAAG,EAAED,GAAG,EAAEsB,OAAO,EAAEQ,aAAa,CACnC,CAAC;EAED,MAAMU,UAAU,GAAG9D,WAAW,CAC3B+D,CAAqC,IAAK;IACzC,MAAMC,aAAa,GAAGD,CAAC,CAACC,aAAa,IAAIC,QAAQ,CAACC,aAAa;IAC/D,IAAI/B,UAAU,CAACoB,OAAO,EAAEY,QAAQ,CAACH,aAAqB,CAAC,EAAE;MACvD;MACA;MACA;MACAD,CAAC,CAACtD,eAAe,CAAC,CAAC;MACnB;IACF;IACA0C,oBAAoB,CAAC,CAAC;EACxB,CAAC,EACD,CAACA,oBAAoB,CACvB,CAAC;;EAED;EACA;EACA;EACA;EACA,MAAMiB,YAAY,GAAGpE,WAAW,CAAC,MAAM;IACrCqC,SAAS,CAAC,KAAK,CAAC;IAChBa,WAAW,CAAC,CAAC;IACbhB,QAAQ,CAACqB,OAAO,EAAEc,IAAI,CAAC,CAAC;EAC1B,CAAC,EAAE,CAACnB,WAAW,CAAC,CAAC;EAEjB,MAAMoB,aAAa,GAAGtE,WAAW,CAC9B+D,CAAwC,IAAK;IAC5C,IAAIA,CAAC,CAACQ,GAAG,KAAK,OAAO,EAAE;MACrBR,CAAC,CAACS,cAAc,CAAC,CAAC;MAClBrB,oBAAoB,CAAC,CAAC;MACtBd,SAAS,CAAC,KAAK,CAAC;MAChBH,QAAQ,CAACqB,OAAO,EAAEc,IAAI,CAAC,CAAC;IAC1B,CAAC,MAAM,IAAIN,CAAC,CAACQ,GAAG,KAAK,QAAQ,EAAE;MAC7BR,CAAC,CAACS,cAAc,CAAC,CAAC;MAClBJ,YAAY,CAAC,CAAC;IAChB,CAAC,MAAM,IAAIL,CAAC,CAACQ,GAAG,KAAK,KAAK,IAAI,CAACR,CAAC,CAACU,QAAQ,IAAIrC,MAAM,EAAE;MACnD;MACA;MACA;MACA,MAAMsC,cAAc,GAAGvC,UAAU,CAACoB,OAAO,EAAEoB,aAAa,CACtD,gBACF,CAAC;MACD,IAAID,cAAc,IAAI,IAAI,EAAE;QAC1BX,CAAC,CAACS,cAAc,CAAC,CAAC;QAClBE,cAAc,CAAChB,KAAK,CAAC,CAAC;MACxB;IACF,CAAC,MAAM,IAAIK,CAAC,CAACQ,GAAG,KAAK,KAAK,IAAIR,CAAC,CAACU,QAAQ,EAAE;MACxCpC,SAAS,CAAC,KAAK,CAAC;IAClB;EACF,CAAC,EACD,CAACc,oBAAoB,EAAEiB,YAAY,EAAEhC,MAAM,CAC7C,CAAC;;EAED;;EAEA;EACA,MAAMwC,gBAAgB,GAAG5E,WAAW,CACjC6E,QAAiB,IAAK;IACrB,IAAIA,QAAQ,EAAE;MACZxC,SAAS,CAAC,IAAI,CAAC;IACjB,CAAC,MAAM;MACL+B,YAAY,CAAC,CAAC;IAChB;EACF,CAAC,EACD,CAACA,YAAY,CACf,CAAC;;EAED;;EAEA,MAAMU,oBAAoB,GAAG9E,WAAW,CACrC+E,QAA0B,IAAK;IAC9B,IAAIA,QAAQ,IAAI,IAAI,EAAE;MACpB3D,QAAQ,GAAG,IAAI,CAAC;MAChBgC,aAAa,CAAC,EAAE,CAAC;MACjB;IACF;IAEA,MAAM4B,IAAI,GAAG,IAAIxC,IAAI,CAACuC,QAAQ,CAACE,OAAO,CAAC,CAAC,CAAC;IACzC,IAAItD,QAAQ,IAAIR,KAAK,IAAI,IAAI,EAAE;MAC7B6D,IAAI,CAACE,QAAQ,CAAC/D,KAAK,CAACgE,QAAQ,CAAC,CAAC,EAAEhE,KAAK,CAACiE,UAAU,CAAC,CAAC,CAAC;IACrD;IAEAhE,QAAQ,GAAG4D,IAAI,CAAC;IAChB3B,YAAY,CAAC2B,IAAI,CAAC;IAClBzC,uBAAuB,CAACyC,IAAI,CAAC;IAE7B,IAAIjD,sBAAsB,EAAE;MAC1BqC,YAAY,CAAC,CAAC;IAChB;EACF,CAAC,EACD,CACEhD,QAAQ,EACRO,QAAQ,EACRR,KAAK,EACLY,sBAAsB,EACtBsB,YAAY,EACZD,aAAa,EACbgB,YAAY,CAEhB,CAAC;EAED,MAAMiB,gBAAgB,GAAGrF,WAAW,CACjCsF,IAAU,IAAK;IACdlE,QAAQ,GAAGkE,IAAI,CAAC;IAChBjC,YAAY,CAACiC,IAAI,CAAC;EACpB,CAAC,EACD,CAAClE,QAAQ,EAAEiC,YAAY,CACzB,CAAC;EAED,MAAMkC,mBAAmB,GAAGvF,WAAW,CAAC,MAAM;IAC5CoB,QAAQ,GAAG,IAAI,CAAC;IAChBiC,YAAY,CAAC,IAAI,CAAC;EACpB,CAAC,EAAE,CAACjC,QAAQ,EAAEiC,YAAY,CAAC,CAAC;;EAE5B;EACA;EACA;EACA;;EAEA,MAAMmC,wBAAwB,GAAGxF,WAAW,CAAC,MAAM;IACjDkC,QAAQ,CAACqB,OAAO,EAAEG,KAAK,CAAC,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM+B,sBAAsB,GAAGzF,WAAW,CACvC+D,CAAmC,IAAK;IACvC,MAAMC,aAAa,GAAGD,CAAC,CAACC,aAAa,IAAIC,QAAQ,CAACC,aAAa;IAC/D,IAAI/B,UAAU,CAACoB,OAAO,EAAEY,QAAQ,CAACH,aAAqB,CAAC,EAAE;MACvD;MACA;MACA;MACAvB,aAAa,CAACc,OAAO,GAAG,IAAI;MAC5BlB,SAAS,CAAC,KAAK,CAAC;MAChBa,WAAW,CAAC,CAAC;MACbhB,QAAQ,CAACqB,OAAO,EAAEG,KAAK,CAAC,CAAC;IAC3B,CAAC,MAAM;MACL,MAAMgC,OAAO,GAAGvD,UAAU,CAACoB,OAAO,EAAEoC,gBAAgB,CAClD,gBACF,CAAC;MACD,MAAMC,UAAU,GAAGF,OAAO,GAAGA,OAAO,CAACG,MAAM,GAAG,CAAC,CAAC;MAChDD,UAAU,EAAElC,KAAK,CAAC,CAAC;IACrB;EACF,CAAC,EACD,CAACR,WAAW,CACd,CAAC;;EAED;;EAEA,MAAM4C,eAAe,GAAGjD,SAAS,IAAIE,UAAU,IAAI,IAAI,GACnDC,SAAS,GACR7B,KAAK,IAAIqC,SAAU;EAExB,MAAMuC,UAAU,GAAGpE,QAAQ,gBAEvB5B,KAAA,CAAAiG,aAAA;IAAKC,SAAS,EAAEtF,MAAM,CAACuF;EAAuB,gBAC5CnG,KAAA,CAAAiG,aAAA,CAAClF,UAAU;IACTK,KAAK,EAAE2E,eAAe,IAAI,IAAK;IAC/B1E,QAAQ,EAAEiE;EAAiB,CAC5B,CACE,CAAC,GAEN7B,SAAS;EAEb,MAAM2C,gBAAgB,GAAGrG,UAAU,CACjCY,YAAY,CAAC0F,0BAA0B,EACvCzF,MAAM,CAAC0F,wBAAwB,EAC/BtD,UAAU,IAAI,IAAI,IAAIrC,YAAY,CAAC4F,+BACrC,CAAC;;EAED;EACA;EACA;EACA,oBACEvG,KAAA,CAAAiG,aAAA,CAACnG,OAAO,CAAC0G,IAAI;IACXC,IAAI,EAAEpE,MAAO;IACbqE,YAAY,EAAE7B;IACd;IACA;IAAA;IACA8B,KAAK,EAAC;EAAY,gBAElB3G,KAAA,CAAAiG,aAAA;IAAKW,GAAG,EAAE1E,UAAW;IAACgE,SAAS,EAAEE;EAAiB,gBAChDpG,KAAA,CAAAiG,aAAA,CAACnG,OAAO,CAAC+G,OAAO;IACdC,YAAY,EAAE,KAAM;IACpBC,MAAM,eACJ/G,KAAA,CAAAiG,aAAA,CAACpG,KAAK;MACJ+G,GAAG,EAAEzE,QAAS;MACdhB,EAAE,EAAEA,EAAG;MACP+E,SAAS,EAAEvF,YAAY,CAACqG,mBAAoB;MAC5CC,IAAI,EAAC,MAAM;MACX7F,KAAK,EAAE2B,cAAe;MACtBmE,aAAa,EAAEtD,sBAAuB;MACtCuD,OAAO,EAAE5D,WAAY;MACrB6D,aAAa,EAAE1D,iBAAkB;MACjC2D,MAAM,EAAEtD,UAAW;MACnBuD,OAAO,EAAE5G,eAAgB;MACzB6G,SAAS,EAAEhD,aAAc;MACzB9C,WAAW,EAAEA,WAAY;MACzB+F,YAAY,EAAC,KAAK;MAClBC,IAAI,EAAC,UAAU;MACf,iBAAepF,MAAO;MACtB,iBAAeJ,SAAU;MACzB,iBAAc;IAAQ,CACvB;EACF,CACF,CACE,CAAC,eACNjC,KAAA,CAAAiG,aAAA,CAACnG,OAAO,CAAC4H,MAAM;IAACd,GAAG,EAAE9E,SAAU;IAAC6F,SAAS,EAAE5F;EAAgB,gBACzD/B,KAAA,CAAAiG,aAAA,CAACnF,kBAAkB;IACjBoF,SAAS,EAAEvF,YAAY,CAACiH,0BAA2B;IACnDC,SAAS,EAAExD;EAAa,CACzB,CAAC,eACFrE,KAAA,CAAAiG,aAAA,CAACnG,OAAO,CAACgI,UAAU;IACjBC,MAAM,EAAE7F,UAAW;IACnBgE,SAAS,EAAEvF,YAAY,CAACqH,wBAAyB;IACjDC,UAAU,EAAE;EAAE,gBAEdjI,KAAA,CAAAiG,aAAA,CAACnG,OAAO,CAACoI,KAAK;IACZtB,GAAG,EAAExE,UAAW;IAChB8D,SAAS,EAAEvF,YAAY,CAACwH,qBAAsB;IAC9ChH,EAAE,EAAEc,SAAU;IACdwF,IAAI,EAAC,QAAQ;IACb,cAAW;IACX;IACA;IAAA;IACAW,UAAU,EAAE;EAAM,gBAElBpI,KAAA,CAAAiG,aAAA;IACEkB,OAAO,EAAE1B,wBAAyB;IAClC4C,QAAQ,EAAE,CAAE;IACZ,cAAW,6BAA6B;IACxCnC,SAAS,EAAEvF,YAAY,CAAC2H;EAA4B,CACrD,CAAC,eACFtI,KAAA,CAAAiG,aAAA,CAACpF,gBAAgB;IACf0H,YAAY,EAAExC,eAAgB;IAC9ByC,QAAQ,EAAEzD,oBAAqB;IAC/B0D,OAAO,EAAEjD,mBAAoB;IAC7BkD,KAAK,EAAEnG,oBAAqB;IAC5BoG,aAAa,EAAEnG,uBAAwB;IACvCjB,GAAG,EAAEA,GAAI;IACTC,GAAG,EAAEA,GAAI;IACToH,MAAM,EAAE5C;EAAW,CACpB,CAAC,eACFhG,KAAA,CAAAiG,aAAA;IACEkB,OAAO,EAAEzB,sBAAuB;IAChC2C,QAAQ,EAAE,CAAE;IACZ,cAAW,2BAA2B;IACtCnC,SAAS,EAAEvF,YAAY,CAAC2H;EAA4B,CACrD,CACY,CACG,CACN,CACJ,CAAC;AAEnB,CAAC,CAAC","ignoreList":[]}
|
|
@@ -5,14 +5,7 @@
|
|
|
5
5
|
outline: none;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
/* Time footer — rendered as a popover sibling (not a DayPicker tfoot) so the
|
|
9
|
-
border-top can span the full popover width via negative margins. */
|
|
10
8
|
.osdkDatetimeTimeFooter {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
padding-right: var(--osdk-datetime-popover-padding);
|
|
14
|
-
margin-top: var(--osdk-time-picker-margin-top);
|
|
15
|
-
margin-left: calc(var(--osdk-datetime-popover-padding) * -1);
|
|
16
|
-
margin-right: calc(var(--osdk-datetime-popover-padding) * -1);
|
|
17
|
-
border-top: var(--osdk-time-picker-border-top);
|
|
9
|
+
display: flex;
|
|
10
|
+
justify-content: center;
|
|
18
11
|
}
|
|
@@ -18,7 +18,7 @@ import React, { memo, useCallback, useMemo } from "react";
|
|
|
18
18
|
import { useController } from "react-hook-form";
|
|
19
19
|
import { extractValidationRules } from "../utils/extractValidationRules.js";
|
|
20
20
|
import { FormFieldRenderer } from "./FormFieldRenderer.js";
|
|
21
|
-
const SELECT_LIKE_FIELDS = new Set(["RADIO_BUTTONS", "DROPDOWN"]);
|
|
21
|
+
const SELECT_LIKE_FIELDS = new Set(["RADIO_BUTTONS", "DROPDOWN", "SWITCH"]);
|
|
22
22
|
export const FieldBridge = /*#__PURE__*/memo(function ({
|
|
23
23
|
fieldDef,
|
|
24
24
|
control,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldBridge.js","names":["React","memo","useCallback","useMemo","useController","extractValidationRules","FormFieldRenderer","SELECT_LIKE_FIELDS","Set","FieldBridge","fieldDef","control","onExternalChange","portalContainer","rules","field","onChange","onBlur","value","fieldState","error","fieldError","name","fieldKey","isSelectLike","has","fieldComponent","handleChange","newValue","handleBlur","e","currentTarget","contains","relatedTarget","createElement","fieldDefinition","onFieldValueChange","message"],"sources":["FieldBridge.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport { useController } from \"react-hook-form\";\nimport type {\n FieldComponent,\n PortalContainer,\n RendererFieldDefinition,\n} from \"../FormFieldApi.js\";\nimport { extractValidationRules } from \"../utils/extractValidationRules.js\";\nimport { FormFieldRenderer } from \"./FormFieldRenderer.js\";\n\nexport interface FieldBridgeProps {\n fieldDef: RendererFieldDefinition;\n control: Control<Record<string, unknown>>;\n onExternalChange?: (fieldKey: string, value: unknown) => void;\n portalContainer?: PortalContainer;\n}\nconst SELECT_LIKE_FIELDS: ReadonlySet<FieldComponent> = new Set<FieldComponent>(\n [\n \"RADIO_BUTTONS\",\n \"DROPDOWN\",\n ],\n);\n\nexport const FieldBridge: React.FC<FieldBridgeProps> = memo(\n function FieldBridgeFn({\n fieldDef,\n control,\n onExternalChange,\n portalContainer,\n }: FieldBridgeProps): React.ReactElement {\n const rules = useMemo(\n () => extractValidationRules(fieldDef),\n [fieldDef],\n );\n\n const {\n field: { onChange, onBlur, value },\n fieldState: { error: fieldError },\n } = useController({\n name: fieldDef.fieldKey,\n control,\n rules,\n });\n\n const isSelectLike = SELECT_LIKE_FIELDS.has(fieldDef.fieldComponent);\n\n const handleChange = useCallback(\n (newValue: unknown) => {\n onChange(newValue);\n onExternalChange?.(fieldDef.fieldKey, newValue);\n // Select-like fields are \"pick once\" interactions — mark as touched\n // immediately so RHF revalidates (clears errors) on selection rather\n // than waiting for focus to leave the container.\n if (isSelectLike) {\n onBlur();\n }\n },\n [onChange, onBlur, onExternalChange, fieldDef.fieldKey, isSelectLike],\n );\n\n // Ignore blur events where focus stays within the field container\n // (e.g. moving between radio buttons in a group). Only fire RHF's\n // onBlur when focus truly leaves the field.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n if (e.currentTarget.contains(e.relatedTarget)) {\n return;\n }\n onBlur();\n },\n [onBlur],\n );\n\n return (\n <FormFieldRenderer\n value={value}\n fieldDefinition={fieldDef}\n onFieldValueChange={handleChange}\n onBlur={handleBlur}\n error={fieldError?.message}\n portalContainer={portalContainer}\n />\n );\n },\n);\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,IAAIC,IAAI,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAEzD,SAASC,aAAa,QAAQ,iBAAiB;AAM/C,SAASC,sBAAsB,QAAQ,oCAAoC;AAC3E,SAASC,iBAAiB,QAAQ,wBAAwB;AAQ1D,MAAMC,kBAA+C,GAAG,IAAIC,GAAG,CAC7D,CACE,eAAe,EACf,UAAU,
|
|
1
|
+
{"version":3,"file":"FieldBridge.js","names":["React","memo","useCallback","useMemo","useController","extractValidationRules","FormFieldRenderer","SELECT_LIKE_FIELDS","Set","FieldBridge","fieldDef","control","onExternalChange","portalContainer","rules","field","onChange","onBlur","value","fieldState","error","fieldError","name","fieldKey","isSelectLike","has","fieldComponent","handleChange","newValue","handleBlur","e","currentTarget","contains","relatedTarget","createElement","fieldDefinition","onFieldValueChange","message"],"sources":["FieldBridge.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport { useController } from \"react-hook-form\";\nimport type {\n FieldComponent,\n PortalContainer,\n RendererFieldDefinition,\n} from \"../FormFieldApi.js\";\nimport { extractValidationRules } from \"../utils/extractValidationRules.js\";\nimport { FormFieldRenderer } from \"./FormFieldRenderer.js\";\n\nexport interface FieldBridgeProps {\n fieldDef: RendererFieldDefinition;\n control: Control<Record<string, unknown>>;\n onExternalChange?: (fieldKey: string, value: unknown) => void;\n portalContainer?: PortalContainer;\n}\nconst SELECT_LIKE_FIELDS: ReadonlySet<FieldComponent> = new Set<FieldComponent>(\n [\n \"RADIO_BUTTONS\",\n \"DROPDOWN\",\n \"SWITCH\",\n ],\n);\n\nexport const FieldBridge: React.FC<FieldBridgeProps> = memo(\n function FieldBridgeFn({\n fieldDef,\n control,\n onExternalChange,\n portalContainer,\n }: FieldBridgeProps): React.ReactElement {\n const rules = useMemo(\n () => extractValidationRules(fieldDef),\n [fieldDef],\n );\n\n const {\n field: { onChange, onBlur, value },\n fieldState: { error: fieldError },\n } = useController({\n name: fieldDef.fieldKey,\n control,\n rules,\n });\n\n const isSelectLike = SELECT_LIKE_FIELDS.has(fieldDef.fieldComponent);\n\n const handleChange = useCallback(\n (newValue: unknown) => {\n onChange(newValue);\n onExternalChange?.(fieldDef.fieldKey, newValue);\n // Select-like fields are \"pick once\" interactions — mark as touched\n // immediately so RHF revalidates (clears errors) on selection rather\n // than waiting for focus to leave the container.\n if (isSelectLike) {\n onBlur();\n }\n },\n [onChange, onBlur, onExternalChange, fieldDef.fieldKey, isSelectLike],\n );\n\n // Ignore blur events where focus stays within the field container\n // (e.g. moving between radio buttons in a group). Only fire RHF's\n // onBlur when focus truly leaves the field.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLDivElement>) => {\n if (e.currentTarget.contains(e.relatedTarget)) {\n return;\n }\n onBlur();\n },\n [onBlur],\n );\n\n return (\n <FormFieldRenderer\n value={value}\n fieldDefinition={fieldDef}\n onFieldValueChange={handleChange}\n onBlur={handleBlur}\n error={fieldError?.message}\n portalContainer={portalContainer}\n />\n );\n },\n);\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,IAAIC,IAAI,EAAEC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAEzD,SAASC,aAAa,QAAQ,iBAAiB;AAM/C,SAASC,sBAAsB,QAAQ,oCAAoC;AAC3E,SAASC,iBAAiB,QAAQ,wBAAwB;AAQ1D,MAAMC,kBAA+C,GAAG,IAAIC,GAAG,CAC7D,CACE,eAAe,EACf,UAAU,EACV,QAAQ,CAEZ,CAAC;AAED,OAAO,MAAMC,WAAuC,gBAAGR,IAAI,CACzD,UAAuB;EACrBS,QAAQ;EACRC,OAAO;EACPC,gBAAgB;EAChBC;AACgB,CAAC,EAAsB;EACvC,MAAMC,KAAK,GAAGX,OAAO,CACnB,MAAME,sBAAsB,CAACK,QAAQ,CAAC,EACtC,CAACA,QAAQ,CACX,CAAC;EAED,MAAM;IACJK,KAAK,EAAE;MAAEC,QAAQ;MAAEC,MAAM;MAAEC;IAAM,CAAC;IAClCC,UAAU,EAAE;MAAEC,KAAK,EAAEC;IAAW;EAClC,CAAC,GAAGjB,aAAa,CAAC;IAChBkB,IAAI,EAAEZ,QAAQ,CAACa,QAAQ;IACvBZ,OAAO;IACPG;EACF,CAAC,CAAC;EAEF,MAAMU,YAAY,GAAGjB,kBAAkB,CAACkB,GAAG,CAACf,QAAQ,CAACgB,cAAc,CAAC;EAEpE,MAAMC,YAAY,GAAGzB,WAAW,CAC7B0B,QAAiB,IAAK;IACrBZ,QAAQ,CAACY,QAAQ,CAAC;IAClBhB,gBAAgB,GAAGF,QAAQ,CAACa,QAAQ,EAAEK,QAAQ,CAAC;IAC/C;IACA;IACA;IACA,IAAIJ,YAAY,EAAE;MAChBP,MAAM,CAAC,CAAC;IACV;EACF,CAAC,EACD,CAACD,QAAQ,EAAEC,MAAM,EAAEL,gBAAgB,EAAEF,QAAQ,CAACa,QAAQ,EAAEC,YAAY,CACtE,CAAC;;EAED;EACA;EACA;EACA,MAAMK,UAAU,GAAG3B,WAAW,CAC3B4B,CAAmC,IAAK;IACvC,IAAIA,CAAC,CAACC,aAAa,CAACC,QAAQ,CAACF,CAAC,CAACG,aAAa,CAAC,EAAE;MAC7C;IACF;IACAhB,MAAM,CAAC,CAAC;EACV,CAAC,EACD,CAACA,MAAM,CACT,CAAC;EAED,oBACEjB,KAAA,CAAAkC,aAAA,CAAC5B,iBAAiB;IAChBY,KAAK,EAAEA,KAAM;IACbiB,eAAe,EAAEzB,QAAS;IAC1B0B,kBAAkB,EAAET,YAAa;IACjCV,MAAM,EAAEY,UAAW;IACnBT,KAAK,EAAEC,UAAU,EAAEgB,OAAQ;IAC3BxB,eAAe,EAAEA;EAAgB,CAClC,CAAC;AAEN,CACF,CAAC","ignoreList":[]}
|
|
@@ -18,6 +18,7 @@ import { Button } from "@base-ui/react/button";
|
|
|
18
18
|
import { Cross } from "@blueprintjs/icons";
|
|
19
19
|
import classnames from "classnames";
|
|
20
20
|
import React, { memo, useCallback, useMemo, useRef } from "react";
|
|
21
|
+
import { ActionButton } from "../../base-components/action-button/ActionButton.js";
|
|
21
22
|
import styles from "./FilePickerField.module.css";
|
|
22
23
|
export const FilePickerField = /*#__PURE__*/memo(function ({
|
|
23
24
|
id,
|
|
@@ -34,9 +35,23 @@ export const FilePickerField = /*#__PURE__*/memo(function ({
|
|
|
34
35
|
buttonText = "Browse"
|
|
35
36
|
}) {
|
|
36
37
|
const inputRef = useRef(null);
|
|
38
|
+
const fileTriggerRef = useRef(null);
|
|
37
39
|
const openFileDialog = useCallback(() => {
|
|
38
40
|
inputRef.current?.click();
|
|
39
41
|
}, []);
|
|
42
|
+
const focusFileTrigger = useCallback(() => {
|
|
43
|
+
fileTriggerRef.current?.focus();
|
|
44
|
+
}, []);
|
|
45
|
+
const handleBrowsePointerDown = useCallback(event => {
|
|
46
|
+
// Browse is a visual affordance inside the field, not a separate tab
|
|
47
|
+
// stop; keep the field trigger as the focused element and focus ring.
|
|
48
|
+
event.preventDefault();
|
|
49
|
+
focusFileTrigger();
|
|
50
|
+
}, [focusFileTrigger]);
|
|
51
|
+
const handleBrowseClick = useCallback(() => {
|
|
52
|
+
focusFileTrigger();
|
|
53
|
+
openFileDialog();
|
|
54
|
+
}, [focusFileTrigger, openFileDialog]);
|
|
40
55
|
const handleInputChange = useCallback(event => {
|
|
41
56
|
const files = event.target.files;
|
|
42
57
|
if (files == null || files.length === 0) {
|
|
@@ -50,7 +65,6 @@ export const FilePickerField = /*#__PURE__*/memo(function ({
|
|
|
50
65
|
}
|
|
51
66
|
}, [onChange, isMulti]);
|
|
52
67
|
const handleClear = useCallback(event => {
|
|
53
|
-
event.stopPropagation();
|
|
54
68
|
event.preventDefault();
|
|
55
69
|
onChange?.(null);
|
|
56
70
|
if (inputRef.current != null) {
|
|
@@ -66,44 +80,38 @@ export const FilePickerField = /*#__PURE__*/memo(function ({
|
|
|
66
80
|
const displayText = useMemo(() => getDisplayText(value), [value]);
|
|
67
81
|
const hasValue = displayText != null;
|
|
68
82
|
const acceptString = useMemo(() => normalizeAccept(accept), [accept]);
|
|
69
|
-
return (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
onClick: handleClear,
|
|
102
|
-
"aria-label": "Clear selection"
|
|
103
|
-
}, /*#__PURE__*/React.createElement(Cross, null)), /*#__PURE__*/React.createElement("span", {
|
|
104
|
-
className: styles.osdkFilePickerBrowse
|
|
105
|
-
}, buttonText))
|
|
106
|
-
);
|
|
83
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
84
|
+
className: styles.osdkFilePickerTrigger,
|
|
85
|
+
"aria-invalid": error != null || undefined
|
|
86
|
+
}, /*#__PURE__*/React.createElement("input", {
|
|
87
|
+
ref: inputRef,
|
|
88
|
+
type: "file",
|
|
89
|
+
className: styles.osdkFilePickerHiddenInput,
|
|
90
|
+
multiple: isMulti,
|
|
91
|
+
accept: acceptString,
|
|
92
|
+
onChange: handleInputChange,
|
|
93
|
+
tabIndex: -1
|
|
94
|
+
}), /*#__PURE__*/React.createElement(Button, {
|
|
95
|
+
ref: fileTriggerRef,
|
|
96
|
+
id: id,
|
|
97
|
+
type: "button",
|
|
98
|
+
className: classnames(styles.osdkFilePickerText, !hasValue && styles.osdkFilePickerPlaceholder),
|
|
99
|
+
onClick: openFileDialog,
|
|
100
|
+
onKeyDown: handleKeyDown,
|
|
101
|
+
"aria-label": "Choose file",
|
|
102
|
+
"aria-invalid": error != null || undefined
|
|
103
|
+
}, displayText ?? text), hasValue && /*#__PURE__*/React.createElement(Button, {
|
|
104
|
+
type: "button",
|
|
105
|
+
className: styles.osdkFilePickerClear,
|
|
106
|
+
onClick: handleClear,
|
|
107
|
+
"aria-label": "Clear selection"
|
|
108
|
+
}, /*#__PURE__*/React.createElement(Cross, null)), /*#__PURE__*/React.createElement(ActionButton, {
|
|
109
|
+
type: "button",
|
|
110
|
+
tabIndex: -1,
|
|
111
|
+
className: styles.osdkFilePickerBrowse,
|
|
112
|
+
onPointerDown: handleBrowsePointerDown,
|
|
113
|
+
onClick: handleBrowseClick
|
|
114
|
+
}, buttonText));
|
|
107
115
|
});
|
|
108
116
|
function normalizeAccept(accept) {
|
|
109
117
|
if (accept == null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilePickerField.js","names":["Button","Cross","classnames","React","memo","useCallback","useMemo","useRef","styles","FilePickerField","id","value","onChange","error","isMulti","accept","maxSize","_maxSize","text","buttonText","inputRef","openFileDialog","current","click","handleInputChange","event","files","target","length","Array","from","handleClear","stopPropagation","preventDefault","handleKeyDown","key","displayText","getDisplayText","hasValue","acceptString","normalizeAccept","createElement","className","osdkFilePickerTrigger","tabIndex","role","onClick","onKeyDown","undefined","ref","type","osdkFilePickerHiddenInput","multiple","osdkFilePickerText","osdkFilePickerPlaceholder","osdkFilePickerClear","osdkFilePickerBrowse","isArray","join","map","f","name"],"sources":["FilePickerField.tsx"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport { Cross } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useRef } from \"react\";\nimport type { FilePickerProps } from \"../FormFieldApi.js\";\nimport styles from \"./FilePickerField.module.css\";\n\nexport const FilePickerField: React.FC<FilePickerProps> = memo(\n function FilePickerFieldFn({\n id,\n value,\n onChange,\n error,\n isMulti,\n accept,\n // maxSize is enforced by form-level validation (extractValidationRules),\n // not here. Silently dropping oversized files would leave the user with\n // no indication of why their selection disappeared.\n maxSize: _maxSize,\n text = \"No file chosen\",\n buttonText = \"Browse\",\n }): React.ReactElement {\n const inputRef = useRef<HTMLInputElement>(null);\n\n const openFileDialog = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (files == null || files.length === 0) {\n onChange?.(null);\n return;\n }\n\n if (isMulti) {\n onChange?.(Array.from(files));\n } else {\n onChange?.(files[0] ?? null);\n }\n },\n [onChange, isMulti],\n );\n\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n onChange?.(null);\n if (inputRef.current != null) {\n inputRef.current.value = \"\";\n }\n },\n [onChange],\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openFileDialog();\n }\n },\n [openFileDialog],\n );\n\n const displayText = useMemo(() => getDisplayText(value), [value]);\n const hasValue = displayText != null;\n const acceptString = useMemo(\n () => normalizeAccept(accept),\n [accept],\n );\n return (\n // The entire component is a single tab stop (tabIndex={0}).\n // Text and Browse are <span>s (not buttons) so they don't create\n // extra tab stops — clicks on them bubble up to the container's onClick.\n // The clear button is the only inner interactive element and gets its\n // own tab stop so keyboard users can clear the selection.\n <div\n id={id}\n className={styles.osdkFilePickerTrigger}\n tabIndex={0}\n role=\"button\"\n aria-label=\"Choose file\"\n onClick={openFileDialog}\n onKeyDown={handleKeyDown}\n aria-invalid={error != null || undefined}\n >\n {\n /* display: none removes the input from the a11y tree entirely,\n avoiding nested-interactive. Programmatic .click() still works. */\n }\n <input\n ref={inputRef}\n type=\"file\"\n className={styles.osdkFilePickerHiddenInput}\n multiple={isMulti}\n accept={acceptString}\n onChange={handleInputChange}\n tabIndex={-1}\n />\n <span\n className={classnames(\n styles.osdkFilePickerText,\n !hasValue && styles.osdkFilePickerPlaceholder,\n )}\n >\n {displayText ?? text}\n </span>\n {hasValue && (\n // stopPropagation + preventDefault prevent the click from\n // bubbling to the container's onClick which opens the file dialog.\n <Button\n className={styles.osdkFilePickerClear}\n onClick={handleClear}\n aria-label=\"Clear selection\"\n >\n <Cross />\n </Button>\n )}\n <span className={styles.osdkFilePickerBrowse}>{buttonText}</span>\n </div>\n );\n },\n);\n\nfunction normalizeAccept(\n accept: string | string[] | undefined,\n): string | undefined {\n if (accept == null) {\n return undefined;\n }\n return Array.isArray(accept) ? accept.join(\",\") : accept;\n}\n\nfunction getDisplayText(value: File | File[] | null): string | undefined {\n if (value == null) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map((f) => f.name).join(\", \");\n }\n return value.name;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,uBAAuB;AAC9C,SAASC,KAAK,QAAQ,oBAAoB;AAC1C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,EAAEC,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAEjE,OAAOC,MAAM,MAAM,8BAA8B;AAEjD,OAAO,MAAMC,eAA0C,gBAAGL,IAAI,CAC5D,UAA2B;EACzBM,EAAE;EACFC,KAAK;EACLC,QAAQ;EACRC,KAAK;EACLC,OAAO;EACPC,MAAM;EACN;EACA;EACA;EACAC,OAAO,EAAEC,QAAQ;EACjBC,IAAI,GAAG,gBAAgB;EACvBC,UAAU,GAAG;AACf,CAAC,EAAsB;EACrB,MAAMC,QAAQ,GAAGb,MAAM,CAAmB,IAAI,CAAC;EAE/C,MAAMc,cAAc,GAAGhB,WAAW,CAAC,MAAM;IACvCe,QAAQ,CAACE,OAAO,EAAEC,KAAK,CAAC,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,iBAAiB,GAAGnB,WAAW,CAClCoB,KAA0C,IAAK;IAC9C,MAAMC,KAAK,GAAGD,KAAK,CAACE,MAAM,CAACD,KAAK;IAChC,IAAIA,KAAK,IAAI,IAAI,IAAIA,KAAK,CAACE,MAAM,KAAK,CAAC,EAAE;MACvChB,QAAQ,GAAG,IAAI,CAAC;MAChB;IACF;IAEA,IAAIE,OAAO,EAAE;MACXF,QAAQ,GAAGiB,KAAK,CAACC,IAAI,CAACJ,KAAK,CAAC,CAAC;IAC/B,CAAC,MAAM;MACLd,QAAQ,GAAGc,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC9B;EACF,CAAC,EACD,CAACd,QAAQ,EAAEE,OAAO,CACpB,CAAC;EAED,MAAMiB,WAAW,GAAG1B,WAAW,CAC5BoB,KAAuB,IAAK;IAC3BA,KAAK,CAACO,eAAe,CAAC,CAAC;IACvBP,KAAK,CAACQ,cAAc,CAAC,CAAC;IACtBrB,QAAQ,GAAG,IAAI,CAAC;IAChB,IAAIQ,QAAQ,CAACE,OAAO,IAAI,IAAI,EAAE;MAC5BF,QAAQ,CAACE,OAAO,CAACX,KAAK,GAAG,EAAE;IAC7B;EACF,CAAC,EACD,CAACC,QAAQ,CACX,CAAC;EAED,MAAMsB,aAAa,GAAG7B,WAAW,CAC9BoB,KAA0B,IAAK;IAC9B,IAAIA,KAAK,CAACU,GAAG,KAAK,OAAO,IAAIV,KAAK,CAACU,GAAG,KAAK,GAAG,EAAE;MAC9CV,KAAK,CAACQ,cAAc,CAAC,CAAC;MACtBZ,cAAc,CAAC,CAAC;IAClB;EACF,CAAC,EACD,CAACA,cAAc,CACjB,CAAC;EAED,MAAMe,WAAW,GAAG9B,OAAO,CAAC,MAAM+B,cAAc,CAAC1B,KAAK,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EACjE,MAAM2B,QAAQ,GAAGF,WAAW,IAAI,IAAI;EACpC,MAAMG,YAAY,GAAGjC,OAAO,CAC1B,MAAMkC,eAAe,CAACzB,MAAM,CAAC,EAC7B,CAACA,MAAM,CACT,CAAC;EACD;IAAA;IACE;IACA;IACA;IACA;IACA;IACAZ,KAAA,CAAAsC,aAAA;MACE/B,EAAE,EAAEA,EAAG;MACPgC,SAAS,EAAElC,MAAM,CAACmC,qBAAsB;MACxCC,QAAQ,EAAE,CAAE;MACZC,IAAI,EAAC,QAAQ;MACb,cAAW,aAAa;MACxBC,OAAO,EAAEzB,cAAe;MACxB0B,SAAS,EAAEb,aAAc;MACzB,gBAAcrB,KAAK,IAAI,IAAI,IAAImC;IAAU,gBAMzC7C,KAAA,CAAAsC,aAAA;MACEQ,GAAG,EAAE7B,QAAS;MACd8B,IAAI,EAAC,MAAM;MACXR,SAAS,EAAElC,MAAM,CAAC2C,yBAA0B;MAC5CC,QAAQ,EAAEtC,OAAQ;MAClBC,MAAM,EAAEwB,YAAa;MACrB3B,QAAQ,EAAEY,iBAAkB;MAC5BoB,QAAQ,EAAE,CAAC;IAAE,CACd,CAAC,eACFzC,KAAA,CAAAsC,aAAA;MACEC,SAAS,EAAExC,UAAU,CACnBM,MAAM,CAAC6C,kBAAkB,EACzB,CAACf,QAAQ,IAAI9B,MAAM,CAAC8C,yBACtB;IAAE,GAEDlB,WAAW,IAAIlB,IACZ,CAAC,EACNoB,QAAQ;IAAA;IACP;IACA;IACAnC,KAAA,CAAAsC,aAAA,CAACzC,MAAM;MACL0C,SAAS,EAAElC,MAAM,CAAC+C,mBAAoB;MACtCT,OAAO,EAAEf,WAAY;MACrB,cAAW;IAAiB,gBAE5B5B,KAAA,CAAAsC,aAAA,CAACxC,KAAK,MAAE,CACF,CACT,eACDE,KAAA,CAAAsC,aAAA;MAAMC,SAAS,EAAElC,MAAM,CAACgD;IAAqB,GAAErC,UAAiB,CAC7D;EAAC;AAEV,CACF,CAAC;AAED,SAASqB,eAAeA,CACtBzB,MAAqC,EACjB;EACpB,IAAIA,MAAM,IAAI,IAAI,EAAE;IAClB,OAAOiC,SAAS;EAClB;EACA,OAAOnB,KAAK,CAAC4B,OAAO,CAAC1C,MAAM,CAAC,GAAGA,MAAM,CAAC2C,IAAI,CAAC,GAAG,CAAC,GAAG3C,MAAM;AAC1D;AAEA,SAASsB,cAAcA,CAAC1B,KAA2B,EAAsB;EACvE,IAAIA,KAAK,IAAI,IAAI,EAAE;IACjB,OAAOqC,SAAS;EAClB;EACA,IAAInB,KAAK,CAAC4B,OAAO,CAAC9C,KAAK,CAAC,EAAE;IACxB,OAAOA,KAAK,CAACgD,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,CAAC,CAACH,IAAI,CAAC,IAAI,CAAC;EAC5C;EACA,OAAO/C,KAAK,CAACkD,IAAI;AACnB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FilePickerField.js","names":["Button","Cross","classnames","React","memo","useCallback","useMemo","useRef","ActionButton","styles","FilePickerField","id","value","onChange","error","isMulti","accept","maxSize","_maxSize","text","buttonText","inputRef","fileTriggerRef","openFileDialog","current","click","focusFileTrigger","focus","handleBrowsePointerDown","event","preventDefault","handleBrowseClick","handleInputChange","files","target","length","Array","from","handleClear","handleKeyDown","key","displayText","getDisplayText","hasValue","acceptString","normalizeAccept","createElement","className","osdkFilePickerTrigger","undefined","ref","type","osdkFilePickerHiddenInput","multiple","tabIndex","osdkFilePickerText","osdkFilePickerPlaceholder","onClick","onKeyDown","osdkFilePickerClear","osdkFilePickerBrowse","onPointerDown","isArray","join","map","f","name"],"sources":["FilePickerField.tsx"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport { Cross } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useRef } from \"react\";\nimport { ActionButton } from \"../../base-components/action-button/ActionButton.js\";\nimport type { FilePickerProps } from \"../FormFieldApi.js\";\nimport styles from \"./FilePickerField.module.css\";\n\nexport const FilePickerField: React.FC<FilePickerProps> = memo(\n function FilePickerFieldFn({\n id,\n value,\n onChange,\n error,\n isMulti,\n accept,\n // maxSize is enforced by form-level validation (extractValidationRules),\n // not here. Silently dropping oversized files would leave the user with\n // no indication of why their selection disappeared.\n maxSize: _maxSize,\n text = \"No file chosen\",\n buttonText = \"Browse\",\n }): React.ReactElement {\n const inputRef = useRef<HTMLInputElement>(null);\n const fileTriggerRef = useRef<HTMLButtonElement>(null);\n\n const openFileDialog = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const focusFileTrigger = useCallback(() => {\n fileTriggerRef.current?.focus();\n }, []);\n\n const handleBrowsePointerDown = useCallback(\n (event: React.PointerEvent<HTMLButtonElement>) => {\n // Browse is a visual affordance inside the field, not a separate tab\n // stop; keep the field trigger as the focused element and focus ring.\n event.preventDefault();\n focusFileTrigger();\n },\n [focusFileTrigger],\n );\n\n const handleBrowseClick = useCallback(() => {\n focusFileTrigger();\n openFileDialog();\n }, [focusFileTrigger, openFileDialog]);\n\n const handleInputChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (files == null || files.length === 0) {\n onChange?.(null);\n return;\n }\n\n if (isMulti) {\n onChange?.(Array.from(files));\n } else {\n onChange?.(files[0] ?? null);\n }\n },\n [onChange, isMulti],\n );\n\n const handleClear = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n onChange?.(null);\n if (inputRef.current != null) {\n inputRef.current.value = \"\";\n }\n },\n [onChange],\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openFileDialog();\n }\n },\n [openFileDialog],\n );\n\n const displayText = useMemo(() => getDisplayText(value), [value]);\n const hasValue = displayText != null;\n const acceptString = useMemo(\n () => normalizeAccept(accept),\n [accept],\n );\n return (\n <div\n className={styles.osdkFilePickerTrigger}\n aria-invalid={error != null || undefined}\n >\n {\n /* display: none removes the input from the a11y tree entirely,\n avoiding nested-interactive. Programmatic .click() still works. */\n }\n <input\n ref={inputRef}\n type=\"file\"\n className={styles.osdkFilePickerHiddenInput}\n multiple={isMulti}\n accept={acceptString}\n onChange={handleInputChange}\n tabIndex={-1}\n />\n <Button\n ref={fileTriggerRef}\n id={id}\n type=\"button\"\n className={classnames(\n styles.osdkFilePickerText,\n !hasValue && styles.osdkFilePickerPlaceholder,\n )}\n onClick={openFileDialog}\n onKeyDown={handleKeyDown}\n aria-label=\"Choose file\"\n aria-invalid={error != null || undefined}\n >\n {displayText ?? text}\n </Button>\n {hasValue && (\n <Button\n type=\"button\"\n className={styles.osdkFilePickerClear}\n onClick={handleClear}\n aria-label=\"Clear selection\"\n >\n <Cross />\n </Button>\n )}\n <ActionButton\n type=\"button\"\n tabIndex={-1}\n className={styles.osdkFilePickerBrowse}\n onPointerDown={handleBrowsePointerDown}\n onClick={handleBrowseClick}\n >\n {buttonText}\n </ActionButton>\n </div>\n );\n },\n);\n\nfunction normalizeAccept(\n accept: string | string[] | undefined,\n): string | undefined {\n if (accept == null) {\n return undefined;\n }\n return Array.isArray(accept) ? accept.join(\",\") : accept;\n}\n\nfunction getDisplayText(value: File | File[] | null): string | undefined {\n if (value == null) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map((f) => f.name).join(\", \");\n }\n return value.name;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
border: var(--osdk-file-picker-trigger-border);
|
|
24
24
|
border-radius: var(--osdk-file-picker-trigger-border-radius);
|
|
25
25
|
box-shadow: var(--osdk-input-shadow);
|
|
26
|
-
background: var(--osdk-file-picker-trigger-bg);
|
|
26
|
+
background-color: var(--osdk-file-picker-trigger-bg);
|
|
27
27
|
font-family: var(--osdk-file-picker-trigger-font-family);
|
|
28
28
|
font-size: var(--osdk-file-picker-trigger-font-size);
|
|
29
29
|
box-sizing: border-box;
|
|
@@ -33,21 +33,18 @@
|
|
|
33
33
|
var(--osdk-file-picker-transition-ease),
|
|
34
34
|
border-color var(--osdk-file-picker-transition-duration)
|
|
35
35
|
var(--osdk-file-picker-transition-ease);
|
|
36
|
+
}
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
var(--osdk-file-picker-trigger-focus-color);
|
|
45
|
-
outline-offset: var(--osdk-file-picker-trigger-focus-offset);
|
|
46
|
-
}
|
|
38
|
+
.osdkFilePickerTrigger:has(.osdkFilePickerText:focus-visible),
|
|
39
|
+
.osdkFilePickerTrigger:has(.osdkFilePickerClear:focus-visible) {
|
|
40
|
+
border-color: var(--osdk-file-picker-trigger-border-color-focus);
|
|
41
|
+
outline: var(--osdk-file-picker-trigger-focus-width) solid
|
|
42
|
+
var(--osdk-file-picker-trigger-focus-color);
|
|
43
|
+
outline-offset: var(--osdk-file-picker-trigger-focus-offset);
|
|
44
|
+
}
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
46
|
+
.osdkFilePickerTrigger[aria-invalid] {
|
|
47
|
+
border-color: var(--osdk-file-picker-trigger-border-color-error);
|
|
51
48
|
}
|
|
52
49
|
|
|
53
50
|
/* display: none fully removes the input from the a11y tree, avoiding
|
|
@@ -60,6 +57,8 @@
|
|
|
60
57
|
/* File name text (left section) */
|
|
61
58
|
.osdkFilePickerText {
|
|
62
59
|
flex: 1;
|
|
60
|
+
align-self: stretch;
|
|
61
|
+
min-width: 0;
|
|
63
62
|
padding: var(--osdk-file-picker-trigger-padding);
|
|
64
63
|
overflow: hidden;
|
|
65
64
|
text-overflow: ellipsis;
|
|
@@ -67,10 +66,23 @@
|
|
|
67
66
|
text-align: left;
|
|
68
67
|
color: var(--osdk-file-picker-trigger-color);
|
|
69
68
|
cursor: pointer;
|
|
70
|
-
background:
|
|
69
|
+
background-color: transparent;
|
|
71
70
|
border: none;
|
|
72
71
|
font-family: inherit;
|
|
73
72
|
font-size: inherit;
|
|
73
|
+
line-height: inherit;
|
|
74
|
+
|
|
75
|
+
&:hover {
|
|
76
|
+
background-color: var(--osdk-file-picker-trigger-bg-hover);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
&:active {
|
|
80
|
+
background-color: var(--osdk-surface-background-color-default-active);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&:focus-visible {
|
|
84
|
+
outline: none;
|
|
85
|
+
}
|
|
74
86
|
}
|
|
75
87
|
|
|
76
88
|
.osdkFilePickerPlaceholder {
|
|
@@ -105,28 +117,28 @@
|
|
|
105
117
|
}
|
|
106
118
|
}
|
|
107
119
|
|
|
108
|
-
/* Browse
|
|
120
|
+
/* Browse button (right section) */
|
|
109
121
|
.osdkFilePickerBrowse {
|
|
110
|
-
|
|
111
|
-
|
|
122
|
+
--osdk-button-min-height: 0;
|
|
123
|
+
|
|
112
124
|
display: flex;
|
|
113
125
|
align-items: center;
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
126
|
+
justify-content: center;
|
|
127
|
+
flex-shrink: 0;
|
|
128
|
+
min-height: 0;
|
|
129
|
+
margin-block-start: calc(var(--osdk-surface-spacing) * 0.5);
|
|
130
|
+
margin-block-end: calc(var(--osdk-surface-spacing) * 0.5);
|
|
131
|
+
margin-inline-start: calc(var(--osdk-surface-spacing) * 0.5);
|
|
132
|
+
margin-inline-end: calc(var(--osdk-surface-spacing) * 0.5);
|
|
119
133
|
font-family: var(--osdk-file-picker-trigger-font-family);
|
|
120
134
|
font-size: var(--osdk-file-picker-trigger-font-size);
|
|
121
|
-
pointer-events: none;
|
|
122
|
-
transition: background-color var(--osdk-file-picker-transition-duration)
|
|
123
|
-
var(--osdk-file-picker-transition-ease);
|
|
124
|
-
}
|
|
125
135
|
|
|
126
|
-
|
|
127
|
-
|
|
136
|
+
&:focus {
|
|
137
|
+
outline: none;
|
|
138
|
+
}
|
|
128
139
|
}
|
|
129
140
|
|
|
130
|
-
.
|
|
131
|
-
|
|
141
|
+
.osdkFilePickerBrowse.osdkFilePickerBrowse {
|
|
142
|
+
padding-block: calc(var(--osdk-surface-spacing) * 0.5);
|
|
143
|
+
padding-inline: calc(var(--osdk-surface-spacing) * 3);
|
|
132
144
|
}
|
|
@@ -27,6 +27,7 @@ import { NumberInputField } from "./NumberInputField.js";
|
|
|
27
27
|
import { ObjectSelectField } from "./ObjectSelectField.js";
|
|
28
28
|
import { ObjectSetField } from "./ObjectSetField.js";
|
|
29
29
|
import { RadioButtonsField } from "./RadioButtonsField.js";
|
|
30
|
+
import { SwitchField } from "./SwitchField.js";
|
|
30
31
|
import { TextAreaField } from "./TextAreaField.js";
|
|
31
32
|
import { TextInputField } from "./TextInputField.js";
|
|
32
33
|
export const FormFieldRenderer = /*#__PURE__*/memo(function ({
|
|
@@ -111,6 +112,14 @@ function renderFieldComponent(fieldDefinition, value, onChange, error, portalCon
|
|
|
111
112
|
onChange: onChange,
|
|
112
113
|
error: error
|
|
113
114
|
}, fieldDefinition.fieldComponentProps));
|
|
115
|
+
case "SWITCH":
|
|
116
|
+
return /*#__PURE__*/React.createElement(SwitchField, _extends({
|
|
117
|
+
id: fieldDefinition.fieldKey,
|
|
118
|
+
label: fieldDefinition.label,
|
|
119
|
+
value: !!value,
|
|
120
|
+
onChange: onChange,
|
|
121
|
+
error: error
|
|
122
|
+
}, fieldDefinition.fieldComponentProps));
|
|
114
123
|
case "CUSTOM":
|
|
115
124
|
return /*#__PURE__*/React.createElement(CustomField, _extends({
|
|
116
125
|
id: fieldDefinition.fieldKey,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormFieldRenderer.js","names":["React","memo","FormField","EMPTY_RANGE","CustomField","DateRangeInputField","DatetimePickerField","DropdownField","FilePickerField","NumberInputField","ObjectSelectField","ObjectSetField","RadioButtonsField","TextAreaField","TextInputField","FormFieldRenderer","fieldDefinition","value","onFieldValueChange","onBlur","error","portalContainer","label","isRequired","helperText","helperTextPlacement","createElement","fieldKey","renderFieldComponent","onChange","fieldComponent","_extends","id","coerceToDateRange","placeholderStart","placeholder","fieldComponentProps","resolvePortalContainer","String","Date","coerceToFileValue","narrowToOsdkObject","assertUnreachableFieldComponent","formPortalContainer","Object","hasOwn","Array","isArray","length","start","end","isFileArray","every","v","File","Error"],"sources":["FormFieldRenderer.tsx"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport React, { memo } from \"react\";\nimport { FormField } from \"../FormField.js\";\nimport {\n type DateRange,\n EMPTY_RANGE,\n type PortalContainer,\n type RendererFieldDefinition,\n} from \"../FormFieldApi.js\";\nimport { CustomField } from \"./CustomField.js\";\nimport { DateRangeInputField } from \"./DateRangeInputField.js\";\nimport { DatetimePickerField } from \"./DatetimePickerField.js\";\nimport { DropdownField } from \"./DropdownField.js\";\nimport { FilePickerField } from \"./FilePickerField.js\";\nimport { NumberInputField } from \"./NumberInputField.js\";\nimport { ObjectSelectField } from \"./ObjectSelectField.js\";\nimport { ObjectSetField } from \"./ObjectSetField.js\";\nimport { RadioButtonsField } from \"./RadioButtonsField.js\";\nimport { TextAreaField } from \"./TextAreaField.js\";\nimport { TextInputField } from \"./TextInputField.js\";\n\nexport interface FormFieldRendererProps {\n fieldDefinition: RendererFieldDefinition;\n value: unknown;\n onFieldValueChange: (value: unknown) => void;\n onBlur: (e: React.FocusEvent<HTMLDivElement>) => void;\n error: string | undefined;\n portalContainer?: PortalContainer;\n}\n\nexport const FormFieldRenderer: React.FC<FormFieldRendererProps> = memo(\n function FormFieldRendererFn({\n fieldDefinition,\n value,\n onFieldValueChange,\n onBlur,\n error,\n portalContainer,\n }: FormFieldRendererProps): React.ReactElement {\n const { label, isRequired, helperText, helperTextPlacement } =\n fieldDefinition;\n\n return (\n <FormField\n label={label}\n isRequired={isRequired}\n fieldKey={fieldDefinition.fieldKey}\n helperText={helperText}\n helperTextPlacement={helperTextPlacement}\n error={error}\n onBlur={onBlur}\n >\n {renderFieldComponent(\n fieldDefinition,\n value,\n onFieldValueChange,\n error,\n portalContainer,\n )}\n </FormField>\n );\n },\n);\n\nfunction renderFieldComponent(\n fieldDefinition: RendererFieldDefinition,\n value: unknown,\n onChange: (value: unknown) => void,\n error: string | undefined,\n portalContainer: PortalContainer | undefined,\n): React.ReactElement {\n switch (fieldDefinition.fieldComponent) {\n case \"DATE_RANGE_INPUT\":\n return (\n <DateRangeInputField\n id={fieldDefinition.fieldKey}\n value={coerceToDateRange(value)}\n onChange={onChange}\n placeholderStart={fieldDefinition.placeholder}\n {...fieldDefinition.fieldComponentProps}\n portalContainer={resolvePortalContainer(\n fieldDefinition.fieldComponentProps,\n portalContainer,\n )}\n />\n );\n case \"TEXT_INPUT\":\n return (\n <TextInputField\n id={fieldDefinition.fieldKey}\n value={value != null ? String(value) : \"\"}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"TEXT_AREA\":\n return (\n <TextAreaField\n id={fieldDefinition.fieldKey}\n value={value != null ? String(value) : \"\"}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"DROPDOWN\": {\n return (\n <DropdownField\n id={fieldDefinition.fieldKey}\n value={value}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n portalContainer={resolvePortalContainer(\n fieldDefinition.fieldComponentProps,\n portalContainer,\n )}\n />\n );\n }\n case \"DATETIME_PICKER\":\n return (\n <DatetimePickerField\n id={fieldDefinition.fieldKey}\n placeholder={fieldDefinition.placeholder}\n // TODO: Use coerceFieldValue\n value={value instanceof Date ? value : null}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n portalContainer={resolvePortalContainer(\n fieldDefinition.fieldComponentProps,\n portalContainer,\n )}\n />\n );\n case \"RADIO_BUTTONS\":\n return (\n <RadioButtonsField\n id={fieldDefinition.fieldKey}\n value={value}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"CUSTOM\":\n return (\n <CustomField\n id={fieldDefinition.fieldKey}\n value={value}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"NUMBER_INPUT\":\n // TODO: Use coerceFieldValue\n return (\n <NumberInputField\n id={fieldDefinition.fieldKey}\n value={typeof value === \"number\" ? value : null}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"FILE_PICKER\":\n return (\n <FilePickerField\n id={fieldDefinition.fieldKey}\n value={coerceToFileValue(value)}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"OBJECT_SELECT\":\n return (\n <ObjectSelectField\n id={fieldDefinition.fieldKey}\n value={narrowToOsdkObject(value)}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n portalContainer={resolvePortalContainer(\n fieldDefinition.fieldComponentProps,\n portalContainer,\n )}\n />\n );\n case \"OBJECT_SET\":\n return (\n <ObjectSetField\n id={fieldDefinition.fieldKey}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n default:\n return assertUnreachableFieldComponent(fieldDefinition);\n }\n}\n\nfunction resolvePortalContainer(\n fieldComponentProps: { portalContainer?: PortalContainer },\n formPortalContainer: PortalContainer | undefined,\n): PortalContainer | undefined {\n // A field-level value, including null, is an explicit override. That lets a\n // single field opt out of a form-level dialog portal when needed.\n return Object.hasOwn(fieldComponentProps, \"portalContainer\")\n ? fieldComponentProps.portalContainer\n : formPortalContainer;\n}\n\nfunction coerceToDateRange(value: unknown): DateRange {\n if (!Array.isArray(value) || value.length !== 2) return EMPTY_RANGE;\n const start = value[0] instanceof Date ? value[0] : null;\n const end = value[1] instanceof Date ? value[1] : null;\n if (start == null && end == null) return EMPTY_RANGE;\n return [start, end];\n}\n\n// TODO: Move and share with `coerceFieldValue`\nfunction isFileArray(value: unknown[]): value is File[] {\n return value.every((v) => v instanceof File);\n}\n\nfunction coerceToFileValue(value: unknown): File | File[] | null {\n if (value instanceof File) {\n return value;\n }\n if (Array.isArray(value) && isFileArray(value)) {\n return value;\n }\n return null;\n}\n\n/** Narrows the untyped form value to an OsdkObject by checking for $primaryKey. */\nfunction narrowToOsdkObject(\n value: unknown,\n): Osdk.Instance<ObjectTypeDefinition> | null {\n if (value != null && typeof value === \"object\" && \"$primaryKey\" in value) {\n return value as Osdk.Instance<ObjectTypeDefinition>;\n }\n return null;\n}\n\nfunction assertUnreachableFieldComponent(value: never): never {\n throw new Error(`Unhandled field component: ${String(value)}`);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FormFieldRenderer.js","names":["React","memo","FormField","EMPTY_RANGE","CustomField","DateRangeInputField","DatetimePickerField","DropdownField","FilePickerField","NumberInputField","ObjectSelectField","ObjectSetField","RadioButtonsField","SwitchField","TextAreaField","TextInputField","FormFieldRenderer","fieldDefinition","value","onFieldValueChange","onBlur","error","portalContainer","label","isRequired","helperText","helperTextPlacement","createElement","fieldKey","renderFieldComponent","onChange","fieldComponent","_extends","id","coerceToDateRange","placeholderStart","placeholder","fieldComponentProps","resolvePortalContainer","String","Date","coerceToFileValue","narrowToOsdkObject","assertUnreachableFieldComponent","formPortalContainer","Object","hasOwn","Array","isArray","length","start","end","isFileArray","every","v","File","Error"],"sources":["FormFieldRenderer.tsx"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport React, { memo } from \"react\";\nimport { FormField } from \"../FormField.js\";\nimport {\n type DateRange,\n EMPTY_RANGE,\n type PortalContainer,\n type RendererFieldDefinition,\n} from \"../FormFieldApi.js\";\nimport { CustomField } from \"./CustomField.js\";\nimport { DateRangeInputField } from \"./DateRangeInputField.js\";\nimport { DatetimePickerField } from \"./DatetimePickerField.js\";\nimport { DropdownField } from \"./DropdownField.js\";\nimport { FilePickerField } from \"./FilePickerField.js\";\nimport { NumberInputField } from \"./NumberInputField.js\";\nimport { ObjectSelectField } from \"./ObjectSelectField.js\";\nimport { ObjectSetField } from \"./ObjectSetField.js\";\nimport { RadioButtonsField } from \"./RadioButtonsField.js\";\nimport { SwitchField } from \"./SwitchField.js\";\nimport { TextAreaField } from \"./TextAreaField.js\";\nimport { TextInputField } from \"./TextInputField.js\";\n\nexport interface FormFieldRendererProps {\n fieldDefinition: RendererFieldDefinition;\n value: unknown;\n onFieldValueChange: (value: unknown) => void;\n onBlur: (e: React.FocusEvent<HTMLDivElement>) => void;\n error: string | undefined;\n portalContainer?: PortalContainer;\n}\n\nexport const FormFieldRenderer: React.FC<FormFieldRendererProps> = memo(\n function FormFieldRendererFn({\n fieldDefinition,\n value,\n onFieldValueChange,\n onBlur,\n error,\n portalContainer,\n }: FormFieldRendererProps): React.ReactElement {\n const { label, isRequired, helperText, helperTextPlacement } =\n fieldDefinition;\n\n return (\n <FormField\n label={label}\n isRequired={isRequired}\n fieldKey={fieldDefinition.fieldKey}\n helperText={helperText}\n helperTextPlacement={helperTextPlacement}\n error={error}\n onBlur={onBlur}\n >\n {renderFieldComponent(\n fieldDefinition,\n value,\n onFieldValueChange,\n error,\n portalContainer,\n )}\n </FormField>\n );\n },\n);\n\nfunction renderFieldComponent(\n fieldDefinition: RendererFieldDefinition,\n value: unknown,\n onChange: (value: unknown) => void,\n error: string | undefined,\n portalContainer: PortalContainer | undefined,\n): React.ReactElement {\n switch (fieldDefinition.fieldComponent) {\n case \"DATE_RANGE_INPUT\":\n return (\n <DateRangeInputField\n id={fieldDefinition.fieldKey}\n value={coerceToDateRange(value)}\n onChange={onChange}\n placeholderStart={fieldDefinition.placeholder}\n {...fieldDefinition.fieldComponentProps}\n portalContainer={resolvePortalContainer(\n fieldDefinition.fieldComponentProps,\n portalContainer,\n )}\n />\n );\n case \"TEXT_INPUT\":\n return (\n <TextInputField\n id={fieldDefinition.fieldKey}\n value={value != null ? String(value) : \"\"}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"TEXT_AREA\":\n return (\n <TextAreaField\n id={fieldDefinition.fieldKey}\n value={value != null ? String(value) : \"\"}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"DROPDOWN\": {\n return (\n <DropdownField\n id={fieldDefinition.fieldKey}\n value={value}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n portalContainer={resolvePortalContainer(\n fieldDefinition.fieldComponentProps,\n portalContainer,\n )}\n />\n );\n }\n case \"DATETIME_PICKER\":\n return (\n <DatetimePickerField\n id={fieldDefinition.fieldKey}\n placeholder={fieldDefinition.placeholder}\n // TODO: Use coerceFieldValue\n value={value instanceof Date ? value : null}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n portalContainer={resolvePortalContainer(\n fieldDefinition.fieldComponentProps,\n portalContainer,\n )}\n />\n );\n case \"RADIO_BUTTONS\":\n return (\n <RadioButtonsField\n id={fieldDefinition.fieldKey}\n value={value}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"SWITCH\":\n return (\n <SwitchField\n id={fieldDefinition.fieldKey}\n label={fieldDefinition.label}\n value={!!value}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"CUSTOM\":\n return (\n <CustomField\n id={fieldDefinition.fieldKey}\n value={value}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"NUMBER_INPUT\":\n // TODO: Use coerceFieldValue\n return (\n <NumberInputField\n id={fieldDefinition.fieldKey}\n value={typeof value === \"number\" ? value : null}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"FILE_PICKER\":\n return (\n <FilePickerField\n id={fieldDefinition.fieldKey}\n value={coerceToFileValue(value)}\n onChange={onChange}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n case \"OBJECT_SELECT\":\n return (\n <ObjectSelectField\n id={fieldDefinition.fieldKey}\n value={narrowToOsdkObject(value)}\n onChange={onChange}\n placeholder={fieldDefinition.placeholder}\n error={error}\n {...fieldDefinition.fieldComponentProps}\n portalContainer={resolvePortalContainer(\n fieldDefinition.fieldComponentProps,\n portalContainer,\n )}\n />\n );\n case \"OBJECT_SET\":\n return (\n <ObjectSetField\n id={fieldDefinition.fieldKey}\n {...fieldDefinition.fieldComponentProps}\n />\n );\n default:\n return assertUnreachableFieldComponent(fieldDefinition);\n }\n}\n\nfunction resolvePortalContainer(\n fieldComponentProps: { portalContainer?: PortalContainer },\n formPortalContainer: PortalContainer | undefined,\n): PortalContainer | undefined {\n // A field-level value, including null, is an explicit override. That lets a\n // single field opt out of a form-level dialog portal when needed.\n return Object.hasOwn(fieldComponentProps, \"portalContainer\")\n ? fieldComponentProps.portalContainer\n : formPortalContainer;\n}\n\nfunction coerceToDateRange(value: unknown): DateRange {\n if (!Array.isArray(value) || value.length !== 2) return EMPTY_RANGE;\n const start = value[0] instanceof Date ? value[0] : null;\n const end = value[1] instanceof Date ? value[1] : null;\n if (start == null && end == null) return EMPTY_RANGE;\n return [start, end];\n}\n\n// TODO: Move and share with `coerceFieldValue`\nfunction isFileArray(value: unknown[]): value is File[] {\n return value.every((v) => v instanceof File);\n}\n\nfunction coerceToFileValue(value: unknown): File | File[] | null {\n if (value instanceof File) {\n return value;\n }\n if (Array.isArray(value) && isFileArray(value)) {\n return value;\n }\n return null;\n}\n\n/** Narrows the untyped form value to an OsdkObject by checking for $primaryKey. */\nfunction narrowToOsdkObject(\n value: unknown,\n): Osdk.Instance<ObjectTypeDefinition> | null {\n if (value != null && typeof value === \"object\" && \"$primaryKey\" in value) {\n return value as Osdk.Instance<ObjectTypeDefinition>;\n }\n return null;\n}\n\nfunction assertUnreachableFieldComponent(value: never): never {\n throw new Error(`Unhandled field component: ${String(value)}`);\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,KAAK,IAAIC,IAAI,QAAQ,OAAO;AACnC,SAASC,SAAS,QAAQ,iBAAiB;AAC3C,SAEEC,WAAW,QAGN,oBAAoB;AAC3B,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,mBAAmB,QAAQ,0BAA0B;AAC9D,SAASC,mBAAmB,QAAQ,0BAA0B;AAC9D,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,eAAe,QAAQ,sBAAsB;AACtD,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,aAAa,QAAQ,oBAAoB;AAClD,SAASC,cAAc,QAAQ,qBAAqB;AAWpD,OAAO,MAAMC,iBAAmD,gBAAGf,IAAI,CACrE,UAA6B;EAC3BgB,eAAe;EACfC,KAAK;EACLC,kBAAkB;EAClBC,MAAM;EACNC,KAAK;EACLC;AACsB,CAAC,EAAsB;EAC7C,MAAM;IAAEC,KAAK;IAAEC,UAAU;IAAEC,UAAU;IAAEC;EAAoB,CAAC,GAC1DT,eAAe;EAEjB,oBACEjB,KAAA,CAAA2B,aAAA,CAACzB,SAAS;IACRqB,KAAK,EAAEA,KAAM;IACbC,UAAU,EAAEA,UAAW;IACvBI,QAAQ,EAAEX,eAAe,CAACW,QAAS;IACnCH,UAAU,EAAEA,UAAW;IACvBC,mBAAmB,EAAEA,mBAAoB;IACzCL,KAAK,EAAEA,KAAM;IACbD,MAAM,EAAEA;EAAO,GAEdS,oBAAoB,CACnBZ,eAAe,EACfC,KAAK,EACLC,kBAAkB,EAClBE,KAAK,EACLC,eACF,CACS,CAAC;AAEhB,CACF,CAAC;AAED,SAASO,oBAAoBA,CAC3BZ,eAAwC,EACxCC,KAAc,EACdY,QAAkC,EAClCT,KAAyB,EACzBC,eAA4C,EACxB;EACpB,QAAQL,eAAe,CAACc,cAAc;IACpC,KAAK,kBAAkB;MACrB,oBACE/B,KAAA,CAAA2B,aAAA,CAACtB,mBAAmB,EAAA2B,QAAA;QAClBC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BV,KAAK,EAAEgB,iBAAiB,CAAChB,KAAK,CAAE;QAChCY,QAAQ,EAAEA,QAAS;QACnBK,gBAAgB,EAAElB,eAAe,CAACmB;MAAY,GAC1CnB,eAAe,CAACoB,mBAAmB;QACvCf,eAAe,EAAEgB,sBAAsB,CACrCrB,eAAe,CAACoB,mBAAmB,EACnCf,eACF;MAAE,EACH,CAAC;IAEN,KAAK,YAAY;MACf,oBACEtB,KAAA,CAAA2B,aAAA,CAACZ,cAAc,EAAAiB,QAAA;QACbC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BV,KAAK,EAAEA,KAAK,IAAI,IAAI,GAAGqB,MAAM,CAACrB,KAAK,CAAC,GAAG,EAAG;QAC1CY,QAAQ,EAAEA,QAAS;QACnBM,WAAW,EAAEnB,eAAe,CAACmB,WAAY;QACzCf,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB,CACxC,CAAC;IAEN,KAAK,WAAW;MACd,oBACErC,KAAA,CAAA2B,aAAA,CAACb,aAAa,EAAAkB,QAAA;QACZC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BV,KAAK,EAAEA,KAAK,IAAI,IAAI,GAAGqB,MAAM,CAACrB,KAAK,CAAC,GAAG,EAAG;QAC1CY,QAAQ,EAAEA,QAAS;QACnBM,WAAW,EAAEnB,eAAe,CAACmB,WAAY;QACzCf,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB,CACxC,CAAC;IAEN,KAAK,UAAU;MAAE;QACf,oBACErC,KAAA,CAAA2B,aAAA,CAACpB,aAAa,EAAAyB,QAAA;UACZC,EAAE,EAAEhB,eAAe,CAACW,QAAS;UAC7BV,KAAK,EAAEA,KAAM;UACbY,QAAQ,EAAEA,QAAS;UACnBM,WAAW,EAAEnB,eAAe,CAACmB,WAAY;UACzCf,KAAK,EAAEA;QAAM,GACTJ,eAAe,CAACoB,mBAAmB;UACvCf,eAAe,EAAEgB,sBAAsB,CACrCrB,eAAe,CAACoB,mBAAmB,EACnCf,eACF;QAAE,EACH,CAAC;MAEN;IACA,KAAK,iBAAiB;MACpB,oBACEtB,KAAA,CAAA2B,aAAA,CAACrB,mBAAmB,EAAA0B,QAAA;QAClBC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BQ,WAAW,EAAEnB,eAAe,CAACmB;QAC7B;QAAA;QACAlB,KAAK,EAAEA,KAAK,YAAYsB,IAAI,GAAGtB,KAAK,GAAG,IAAK;QAC5CY,QAAQ,EAAEA,QAAS;QACnBT,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB;QACvCf,eAAe,EAAEgB,sBAAsB,CACrCrB,eAAe,CAACoB,mBAAmB,EACnCf,eACF;MAAE,EACH,CAAC;IAEN,KAAK,eAAe;MAClB,oBACEtB,KAAA,CAAA2B,aAAA,CAACf,iBAAiB,EAAAoB,QAAA;QAChBC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BV,KAAK,EAAEA,KAAM;QACbY,QAAQ,EAAEA,QAAS;QACnBT,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB,CACxC,CAAC;IAEN,KAAK,QAAQ;MACX,oBACErC,KAAA,CAAA2B,aAAA,CAACd,WAAW,EAAAmB,QAAA;QACVC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BL,KAAK,EAAEN,eAAe,CAACM,KAAM;QAC7BL,KAAK,EAAE,CAAC,CAACA,KAAM;QACfY,QAAQ,EAAEA,QAAS;QACnBT,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB,CACxC,CAAC;IAEN,KAAK,QAAQ;MACX,oBACErC,KAAA,CAAA2B,aAAA,CAACvB,WAAW,EAAA4B,QAAA;QACVC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BV,KAAK,EAAEA,KAAM;QACbY,QAAQ,EAAEA,QAAS;QACnBT,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB,CACxC,CAAC;IAEN,KAAK,cAAc;MACjB;MACA,oBACErC,KAAA,CAAA2B,aAAA,CAAClB,gBAAgB,EAAAuB,QAAA;QACfC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BV,KAAK,EAAE,OAAOA,KAAK,KAAK,QAAQ,GAAGA,KAAK,GAAG,IAAK;QAChDY,QAAQ,EAAEA,QAAS;QACnBM,WAAW,EAAEnB,eAAe,CAACmB,WAAY;QACzCf,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB,CACxC,CAAC;IAEN,KAAK,aAAa;MAChB,oBACErC,KAAA,CAAA2B,aAAA,CAACnB,eAAe,EAAAwB,QAAA;QACdC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BV,KAAK,EAAEuB,iBAAiB,CAACvB,KAAK,CAAE;QAChCY,QAAQ,EAAEA,QAAS;QACnBT,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB,CACxC,CAAC;IAEN,KAAK,eAAe;MAClB,oBACErC,KAAA,CAAA2B,aAAA,CAACjB,iBAAiB,EAAAsB,QAAA;QAChBC,EAAE,EAAEhB,eAAe,CAACW,QAAS;QAC7BV,KAAK,EAAEwB,kBAAkB,CAACxB,KAAK,CAAE;QACjCY,QAAQ,EAAEA,QAAS;QACnBM,WAAW,EAAEnB,eAAe,CAACmB,WAAY;QACzCf,KAAK,EAAEA;MAAM,GACTJ,eAAe,CAACoB,mBAAmB;QACvCf,eAAe,EAAEgB,sBAAsB,CACrCrB,eAAe,CAACoB,mBAAmB,EACnCf,eACF;MAAE,EACH,CAAC;IAEN,KAAK,YAAY;MACf,oBACEtB,KAAA,CAAA2B,aAAA,CAAChB,cAAc,EAAAqB,QAAA;QACbC,EAAE,EAAEhB,eAAe,CAACW;MAAS,GACzBX,eAAe,CAACoB,mBAAmB,CACxC,CAAC;IAEN;MACE,OAAOM,+BAA+B,CAAC1B,eAAe,CAAC;EAC3D;AACF;AAEA,SAASqB,sBAAsBA,CAC7BD,mBAA0D,EAC1DO,mBAAgD,EACnB;EAC7B;EACA;EACA,OAAOC,MAAM,CAACC,MAAM,CAACT,mBAAmB,EAAE,iBAAiB,CAAC,GACxDA,mBAAmB,CAACf,eAAe,GACnCsB,mBAAmB;AACzB;AAEA,SAASV,iBAAiBA,CAAChB,KAAc,EAAa;EACpD,IAAI,CAAC6B,KAAK,CAACC,OAAO,CAAC9B,KAAK,CAAC,IAAIA,KAAK,CAAC+B,MAAM,KAAK,CAAC,EAAE,OAAO9C,WAAW;EACnE,MAAM+C,KAAK,GAAGhC,KAAK,CAAC,CAAC,CAAC,YAAYsB,IAAI,GAAGtB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;EACxD,MAAMiC,GAAG,GAAGjC,KAAK,CAAC,CAAC,CAAC,YAAYsB,IAAI,GAAGtB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;EACtD,IAAIgC,KAAK,IAAI,IAAI,IAAIC,GAAG,IAAI,IAAI,EAAE,OAAOhD,WAAW;EACpD,OAAO,CAAC+C,KAAK,EAAEC,GAAG,CAAC;AACrB;;AAEA;AACA,SAASC,WAAWA,CAAClC,KAAgB,EAAmB;EACtD,OAAOA,KAAK,CAACmC,KAAK,CAAEC,CAAC,IAAKA,CAAC,YAAYC,IAAI,CAAC;AAC9C;AAEA,SAASd,iBAAiBA,CAACvB,KAAc,EAAwB;EAC/D,IAAIA,KAAK,YAAYqC,IAAI,EAAE;IACzB,OAAOrC,KAAK;EACd;EACA,IAAI6B,KAAK,CAACC,OAAO,CAAC9B,KAAK,CAAC,IAAIkC,WAAW,CAAClC,KAAK,CAAC,EAAE;IAC9C,OAAOA,KAAK;EACd;EACA,OAAO,IAAI;AACb;;AAEA;AACA,SAASwB,kBAAkBA,CACzBxB,KAAc,EAC8B;EAC5C,IAAIA,KAAK,IAAI,IAAI,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,aAAa,IAAIA,KAAK,EAAE;IACxE,OAAOA,KAAK;EACd;EACA,OAAO,IAAI;AACb;AAEA,SAASyB,+BAA+BA,CAACzB,KAAY,EAAS;EAC5D,MAAM,IAAIsC,KAAK,CAAC,8BAA8BjB,MAAM,CAACrB,KAAK,CAAC,EAAE,CAAC;AAChE","ignoreList":[]}
|
|
@@ -80,9 +80,9 @@
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
.osdkRadioLabel {
|
|
83
|
-
font-family: var(--osdk-typography-
|
|
84
|
-
font-size: var(--osdk-typography-
|
|
83
|
+
font-family: var(--osdk-typography-family-default);
|
|
84
|
+
font-size: var(--osdk-typography-size-body-medium);
|
|
85
85
|
line-height: var(--osdk-typography-line-height-default);
|
|
86
|
-
color: var(--osdk-typography-color-default);
|
|
86
|
+
color: var(--osdk-typography-color-default-rest);
|
|
87
87
|
cursor: pointer;
|
|
88
88
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import React from "react";
|
|
18
|
+
import { Switch } from "../../base-components/switch/Switch.js";
|
|
19
|
+
export const SwitchField = /*#__PURE__*/React.memo(function ({
|
|
20
|
+
id,
|
|
21
|
+
label,
|
|
22
|
+
value,
|
|
23
|
+
onChange,
|
|
24
|
+
error
|
|
25
|
+
}) {
|
|
26
|
+
return /*#__PURE__*/React.createElement(Switch, {
|
|
27
|
+
id: id,
|
|
28
|
+
checked: value ?? false,
|
|
29
|
+
onCheckedChange: onChange,
|
|
30
|
+
"aria-invalid": error != null || undefined,
|
|
31
|
+
"aria-label": label
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=SwitchField.js.map
|