@osdk/react-components 0.35.0 → 0.35.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/build/browser/action-form/fields/NumberInputField.js +1 -1
- package/build/browser/action-form/fields/NumberInputField.js.map +1 -1
- package/build/browser/base-components/action-button/ActionButton.module.css +1 -1
- package/build/browser/filter-list/base/inputs/TextTagsInput.js +1 -1
- package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/browser/shared/calendar/TimePicker.js +1 -1
- package/build/browser/shared/calendar/TimePicker.js.map +1 -1
- package/build/browser/shared/dateUtils.js +1 -1
- package/build/browser/shared/dateUtils.js.map +1 -1
- package/build/browser/styles.css +2 -1
- package/build/browser/tokens/component-tokens/button.css +1 -0
- package/build/browser/util/UserAgent.js +1 -1
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/cjs/DateCalendar-DI2UJ57V.cjs +24 -0
- package/build/cjs/{DateCalendar-FCZXD24P.cjs.map → DateCalendar-DI2UJ57V.cjs.map} +1 -1
- package/build/cjs/{DateCalendar-VBZGPZ5P.css → DateCalendar-FZ4QRCRH.css} +2 -2
- package/build/cjs/DateCalendar-FZ4QRCRH.css.map +1 -0
- package/build/cjs/{DateRangeCalendar-2M2I5Q3Z.css → DateRangeCalendar-2C2XUXUS.css} +2 -2
- package/build/cjs/DateRangeCalendar-2C2XUXUS.css.map +1 -0
- package/build/cjs/DateRangeCalendar-BB5YGWT5.cjs +12 -0
- package/build/cjs/{DateRangeCalendar-XN2ZWAFK.cjs.map → DateRangeCalendar-BB5YGWT5.cjs.map} +1 -1
- package/build/cjs/chunk-44IN42AN.cjs +11 -0
- package/build/cjs/{chunk-PBMJNJLL.cjs.map → chunk-44IN42AN.cjs.map} +1 -1
- package/build/cjs/chunk-4SCRUDJM.cjs +11 -0
- package/build/cjs/{chunk-W6W3Q7BQ.cjs.map → chunk-4SCRUDJM.cjs.map} +1 -1
- package/build/cjs/{chunk-BFRUHBWM.cjs → chunk-5ZFHOY66.cjs} +12 -12
- package/build/cjs/{chunk-BFRUHBWM.cjs.map → chunk-5ZFHOY66.cjs.map} +1 -1
- package/build/cjs/chunk-ASKV6U6G.cjs +11 -0
- package/build/cjs/{chunk-LL5CBNDZ.cjs.map → chunk-ASKV6U6G.cjs.map} +1 -1
- package/build/cjs/{chunk-2UQ7CJCR.cjs → chunk-BOMSBFS4.cjs} +9 -9
- package/build/cjs/{chunk-2UQ7CJCR.cjs.map → chunk-BOMSBFS4.cjs.map} +1 -1
- package/build/cjs/{chunk-EN6IZOML.cjs → chunk-C6SIY4DI.cjs} +21 -21
- package/build/cjs/{chunk-EN6IZOML.cjs.map → chunk-C6SIY4DI.cjs.map} +1 -1
- package/build/cjs/chunk-DORQAXMX.cjs +11 -0
- package/build/cjs/{chunk-IYHK2H55.cjs.map → chunk-DORQAXMX.cjs.map} +1 -1
- package/build/cjs/{chunk-YCWT23HH.cjs → chunk-DS6FUC62.cjs} +4 -4
- package/build/cjs/{chunk-YCWT23HH.cjs.map → chunk-DS6FUC62.cjs.map} +1 -1
- package/build/cjs/{chunk-KQ4B2XDH.cjs → chunk-FVTTRDL6.cjs} +7 -7
- package/build/cjs/chunk-FVTTRDL6.cjs.map +1 -0
- package/build/cjs/{chunk-UJEI6Z4C.cjs → chunk-HOVEXEYI.cjs} +4 -4
- package/build/cjs/{chunk-UJEI6Z4C.cjs.map → chunk-HOVEXEYI.cjs.map} +1 -1
- package/build/cjs/{chunk-INFRT5OY.cjs → chunk-ITIJ6T46.cjs} +20 -20
- package/build/cjs/{chunk-INFRT5OY.cjs.map → chunk-ITIJ6T46.cjs.map} +1 -1
- package/build/cjs/{chunk-N6MCFY34.cjs → chunk-NCTBH7K3.cjs} +4 -4
- package/build/cjs/{chunk-N6MCFY34.cjs.map → chunk-NCTBH7K3.cjs.map} +1 -1
- package/build/cjs/{chunk-ENE2RWIL.cjs → chunk-NME4K4OR.cjs} +17 -17
- package/build/cjs/{chunk-ENE2RWIL.cjs.map → chunk-NME4K4OR.cjs.map} +1 -1
- package/build/cjs/{chunk-MUDJXY6I.cjs → chunk-OUP7DKRM.cjs} +22 -22
- package/build/cjs/{chunk-MUDJXY6I.cjs.map → chunk-OUP7DKRM.cjs.map} +1 -1
- package/build/cjs/{chunk-SMVWJHAQ.cjs → chunk-PQLJ3WBE.cjs} +52 -52
- package/build/cjs/{chunk-SMVWJHAQ.cjs.map → chunk-PQLJ3WBE.cjs.map} +1 -1
- package/build/cjs/{chunk-MD4KDE44.cjs → chunk-QP2LHBCZ.cjs} +2 -2
- package/build/cjs/chunk-QP2LHBCZ.cjs.map +1 -0
- package/build/cjs/{chunk-N3ARFCNR.cjs → chunk-R25LDJLW.cjs} +3 -3
- package/build/cjs/chunk-R25LDJLW.cjs.map +1 -0
- package/build/cjs/{chunk-CW644WDI.cjs → chunk-RKKHWENI.cjs} +4 -4
- package/build/cjs/{chunk-CW644WDI.cjs.map → chunk-RKKHWENI.cjs.map} +1 -1
- package/build/cjs/chunk-VVUA4M4W.cjs +11 -0
- package/build/cjs/{chunk-NZRXL4JP.cjs.map → chunk-VVUA4M4W.cjs.map} +1 -1
- package/build/cjs/public/experimental/action-form.cjs +9 -9
- package/build/cjs/public/experimental/action-form.css +1 -1
- package/build/cjs/public/experimental/action-form.css.map +1 -1
- package/build/cjs/public/experimental/aip-agent-chat.cjs +4 -4
- package/build/cjs/public/experimental/aip-agent-chat.css +1 -1
- package/build/cjs/public/experimental/aip-agent-chat.css.map +1 -1
- package/build/cjs/public/experimental/cbac-picker.cjs +12 -12
- package/build/cjs/public/experimental/cbac-picker.css +1 -1
- package/build/cjs/public/experimental/cbac-picker.css.map +1 -1
- package/build/cjs/public/experimental/document-viewer.cjs +4 -4
- package/build/cjs/public/experimental/email-viewer.cjs +3 -3
- package/build/cjs/public/experimental/excel-viewer.cjs +3 -3
- package/build/cjs/public/experimental/filter-list.cjs +19 -19
- package/build/cjs/public/experimental/filter-list.css +1 -1
- package/build/cjs/public/experimental/filter-list.css.map +1 -1
- package/build/cjs/public/experimental/image-viewer.cjs +3 -3
- package/build/cjs/public/experimental/markdown-renderer.cjs +3 -3
- package/build/cjs/public/experimental/object-table.cjs +13 -13
- package/build/cjs/public/experimental/object-table.css +1 -1
- package/build/cjs/public/experimental/object-table.css.map +1 -1
- package/build/cjs/public/experimental/pdf-viewer.cjs +7 -7
- package/build/cjs/public/experimental/tiff-renderer.cjs +3 -3
- package/build/cjs/public/experimental/video-viewer.cjs +3 -3
- package/build/cjs/public/experimental/xml-viewer.cjs +3 -3
- package/build/cjs/public/experimental.cjs +63 -63
- package/build/cjs/public/experimental.css +1 -1
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/primitives.cjs +2 -2
- package/build/cjs/public/primitives.css +1 -1
- package/build/cjs/public/primitives.css.map +1 -1
- package/build/esm/action-form/fields/NumberInputField.js +1 -1
- package/build/esm/action-form/fields/NumberInputField.js.map +1 -1
- package/build/esm/base-components/action-button/ActionButton.module.css +1 -1
- package/build/esm/filter-list/base/inputs/TextTagsInput.js +1 -1
- package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/esm/shared/calendar/TimePicker.js +1 -1
- package/build/esm/shared/calendar/TimePicker.js.map +1 -1
- package/build/esm/shared/dateUtils.js +1 -1
- package/build/esm/shared/dateUtils.js.map +1 -1
- package/build/esm/tokens/component-tokens/button.css +1 -0
- package/build/esm/util/UserAgent.js +1 -1
- package/build/esm/util/UserAgent.js.map +1 -1
- package/docs/CSSVariables.md +8 -7
- package/package.json +8 -8
- package/build/cjs/DateCalendar-FCZXD24P.cjs +0 -24
- package/build/cjs/DateCalendar-VBZGPZ5P.css.map +0 -1
- package/build/cjs/DateRangeCalendar-2M2I5Q3Z.css.map +0 -1
- package/build/cjs/DateRangeCalendar-XN2ZWAFK.cjs +0 -12
- package/build/cjs/chunk-IYHK2H55.cjs +0 -11
- package/build/cjs/chunk-KQ4B2XDH.cjs.map +0 -1
- package/build/cjs/chunk-LL5CBNDZ.cjs +0 -11
- package/build/cjs/chunk-MD4KDE44.cjs.map +0 -1
- package/build/cjs/chunk-N3ARFCNR.cjs.map +0 -1
- package/build/cjs/chunk-NZRXL4JP.cjs +0 -11
- package/build/cjs/chunk-PBMJNJLL.cjs +0 -11
- package/build/cjs/chunk-W6W3Q7BQ.cjs +0 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @osdk/react-components
|
|
2
2
|
|
|
3
|
+
## 0.35.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 12e5e63: Add `--osdk-button-border-radius` token so a theme can round buttons independently of inputs/cards.
|
|
8
|
+
- 566ecd3: Add the `u` (unicode) flag to regular expressions to satisfy the require-unicode-regexp lint rule
|
|
9
|
+
- Updated dependencies [3c48f5a]
|
|
10
|
+
- Updated dependencies [566ecd3]
|
|
11
|
+
- @osdk/client@2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
12
|
+
- @osdk/aip-core@0.7.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
13
|
+
- @osdk/react@2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
14
|
+
- @osdk/api@2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
15
|
+
|
|
3
16
|
## 0.35.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
|
@@ -32,7 +32,7 @@ import styles from "./NumberInputField.module.css.js";
|
|
|
32
32
|
*
|
|
33
33
|
* Rejects obviously invalid strings like "1.2.3" or "+-5".
|
|
34
34
|
*/
|
|
35
|
-
const VALID_NUMERIC_REGEX = /^[+-.]?(\d+\.?\d*|\d*\.?\d+)?([eE][+-]?\d*)
|
|
35
|
+
const VALID_NUMERIC_REGEX = /^[+-.]?(\d+\.?\d*|\d*\.?\d+)?([eE][+-]?\d*)?$/u;
|
|
36
36
|
const DEFAULT_STEP = 1;
|
|
37
37
|
const CHEVRON_SIZE = 12;
|
|
38
38
|
export function NumberInputField({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberInputField.js","names":["Button","Input","ChevronDown","ChevronUp","React","useCallback","useRef","useState","styles","VALID_NUMERIC_REGEX","DEFAULT_STEP","CHEVRON_SIZE","NumberInputField","id","value","onChange","error","placeholder","min","max","step","disabled","displayValue","setDisplayValue","formatNumberForDisplay","prevValueRef","current","currentParsed","parseNumericValue","handleValueChange","newValue","isValidInput","applyStep","direction","next","clamp","formatted","handleKeyDown","e","key","preventDefault","handleStepUp","handleStepDown","createElement","className","osdkNumberInputWrapper","undefined","osdkNumberInputField","type","inputMode","onValueChange","onKeyDown","osdkNumberInputStepper","osdkNumberInputStepButton","tabIndex","onClick","size","text","test","parsed","Number","isNaN","String"],"sources":["NumberInputField.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 { Input } from \"@base-ui/react/input\";\nimport { ChevronDown, ChevronUp } from \"@blueprintjs/icons\";\nimport React, { useCallback, useRef, useState } from \"react\";\n\nimport type { NumberInputFieldProps } from \"../FormFieldApi.js\";\n\nimport styles from \"./NumberInputField.module.css\";\n\n/**\n * Structural regex for valid numeric input.\n *\n * Allows intermediate typing states that will become valid numbers:\n * \"\" — user cleared the field (all groups are optional)\n * \"-\" — user started typing a negative number\n * \".\" — user started typing a decimal like \".5\"\n * \"+\" — user started typing an explicitly positive number\n * \"1.\", \"1e\", \"1e+\" — partial but structurally valid\n *\n * Rejects obviously invalid strings like \"1.2.3\" or \"+-5\".\n */\nconst VALID_NUMERIC_REGEX = /^[+-.]?(\\d+\\.?\\d*|\\d*\\.?\\d+)?([eE][+-]?\\d*)
|
|
1
|
+
{"version":3,"file":"NumberInputField.js","names":["Button","Input","ChevronDown","ChevronUp","React","useCallback","useRef","useState","styles","VALID_NUMERIC_REGEX","DEFAULT_STEP","CHEVRON_SIZE","NumberInputField","id","value","onChange","error","placeholder","min","max","step","disabled","displayValue","setDisplayValue","formatNumberForDisplay","prevValueRef","current","currentParsed","parseNumericValue","handleValueChange","newValue","isValidInput","applyStep","direction","next","clamp","formatted","handleKeyDown","e","key","preventDefault","handleStepUp","handleStepDown","createElement","className","osdkNumberInputWrapper","undefined","osdkNumberInputField","type","inputMode","onValueChange","onKeyDown","osdkNumberInputStepper","osdkNumberInputStepButton","tabIndex","onClick","size","text","test","parsed","Number","isNaN","String"],"sources":["NumberInputField.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 { Input } from \"@base-ui/react/input\";\nimport { ChevronDown, ChevronUp } from \"@blueprintjs/icons\";\nimport React, { useCallback, useRef, useState } from \"react\";\n\nimport type { NumberInputFieldProps } from \"../FormFieldApi.js\";\n\nimport styles from \"./NumberInputField.module.css\";\n\n/**\n * Structural regex for valid numeric input.\n *\n * Allows intermediate typing states that will become valid numbers:\n * \"\" — user cleared the field (all groups are optional)\n * \"-\" — user started typing a negative number\n * \".\" — user started typing a decimal like \".5\"\n * \"+\" — user started typing an explicitly positive number\n * \"1.\", \"1e\", \"1e+\" — partial but structurally valid\n *\n * Rejects obviously invalid strings like \"1.2.3\" or \"+-5\".\n */\nconst VALID_NUMERIC_REGEX = /^[+-.]?(\\d+\\.?\\d*|\\d*\\.?\\d+)?([eE][+-]?\\d*)?$/u;\n\nconst DEFAULT_STEP = 1;\nconst CHEVRON_SIZE = 12;\n\nexport function NumberInputField({\n id,\n value,\n onChange,\n error,\n placeholder,\n min,\n max,\n step,\n disabled,\n}: NumberInputFieldProps): React.ReactElement {\n const [displayValue, setDisplayValue] = useState<string>(() =>\n formatNumberForDisplay(value)\n );\n\n const prevValueRef = useRef(value);\n\n // Sync external value → internal display string\n if (prevValueRef.current !== value) {\n prevValueRef.current = value;\n const currentParsed = parseNumericValue(displayValue);\n\n if (value !== currentParsed) {\n setDisplayValue(formatNumberForDisplay(value));\n }\n }\n\n const handleValueChange = useCallback(\n (newValue: string) => {\n if (!isValidInput(newValue)) {\n return;\n }\n\n setDisplayValue(newValue);\n onChange?.(parseNumericValue(newValue));\n },\n [onChange]\n );\n\n const applyStep = useCallback(\n (direction: 1 | -1) => {\n const current = parseNumericValue(displayValue) ?? 0;\n const delta = direction * (step ?? DEFAULT_STEP);\n const next = clamp(current + delta, min, max);\n const formatted = formatNumberForDisplay(next);\n setDisplayValue(formatted);\n onChange?.(next);\n },\n [displayValue, onChange, step, min, max]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== \"ArrowUp\" && e.key !== \"ArrowDown\") {\n return;\n }\n e.preventDefault();\n applyStep(e.key === \"ArrowUp\" ? 1 : -1);\n },\n [applyStep]\n );\n\n const handleStepUp = useCallback(() => {\n applyStep(1);\n }, [applyStep]);\n\n const handleStepDown = useCallback(() => {\n applyStep(-1);\n }, [applyStep]);\n\n return (\n <div\n className={styles.osdkNumberInputWrapper}\n aria-invalid={error != null || undefined}\n >\n <Input\n id={id}\n className={styles.osdkNumberInputField}\n type=\"text\"\n inputMode=\"decimal\"\n value={displayValue}\n onValueChange={handleValueChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n />\n <div className={styles.osdkNumberInputStepper}>\n <Button\n className={styles.osdkNumberInputStepButton}\n aria-label=\"Increment\"\n tabIndex={-1}\n disabled={disabled}\n onClick={handleStepUp}\n >\n <ChevronUp size={CHEVRON_SIZE} />\n </Button>\n <Button\n className={styles.osdkNumberInputStepButton}\n aria-label=\"Decrement\"\n tabIndex={-1}\n disabled={disabled}\n onClick={handleStepDown}\n >\n <ChevronDown size={CHEVRON_SIZE} />\n </Button>\n </div>\n </div>\n );\n}\n\nfunction isValidInput(text: string): boolean {\n return VALID_NUMERIC_REGEX.test(text);\n}\n\nfunction parseNumericValue(text: string): number | null {\n if (text === \"\") {\n return null;\n }\n const parsed = Number(text);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\nfunction formatNumberForDisplay(value: number | null): string {\n return value != null ? String(value) : \"\";\n}\n\nfunction clamp(\n value: number,\n min: number | undefined,\n max: number | undefined\n): number {\n if (min != null && value < min) return min;\n if (max != null && value > max) return max;\n return value;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
padding: calc(var(--osdk-surface-spacing) * 1.5)
|
|
20
20
|
calc(var(--osdk-surface-spacing) * 1.75);
|
|
21
21
|
border: var(--osdk-button-border);
|
|
22
|
-
border-radius: var(--osdk-
|
|
22
|
+
border-radius: var(--osdk-button-border-radius);
|
|
23
23
|
box-shadow: var(--osdk-button-shadow);
|
|
24
24
|
font-size: var(--osdk-typography-size-body-medium);
|
|
25
25
|
cursor: pointer;
|
|
@@ -23,7 +23,7 @@ import { getOptionLabelText, OptionLabel } from "./OptionLabel.js";
|
|
|
23
23
|
import { SelectInputSkeleton } from "./SelectInputSkeleton.js";
|
|
24
24
|
import sharedStyles from "./shared.module.css.js";
|
|
25
25
|
import styles from "./TextTagsInput.module.css.js";
|
|
26
|
-
const TAG_SEPARATOR_PATTERN = /[,\n]
|
|
26
|
+
const TAG_SEPARATOR_PATTERN = /[,\n]/u;
|
|
27
27
|
const TagItem = /*#__PURE__*/memo(function ({
|
|
28
28
|
tag,
|
|
29
29
|
onRemove
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextTagsInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Combobox","useFilterListBoundary","getOptionLabelText","OptionLabel","SelectInputSkeleton","sharedStyles","styles","TAG_SEPARATOR_PATTERN","TagItem","tag","onRemove","handleRemove","displayLabel","createElement","className","value","type","tagRemove","onClick","TextTagsInputInner","suggestions","isLoading","error","tags","onChange","style","placeholder","allowCustomTags","suggestionLimit","ariaLabel","collisionBoundary","inputValue","setInputValue","filteredSuggestions","lowerInput","toLowerCase","filter","s","trim","includes","slice","addTag","trimmedTag","removeTag","t","handleValueChange","newTags","handleInputValueChange","handleKeyDown","e","key","length","preventDefault","handlePaste","pastedText","clipboardData","getData","test","split","map","textTags","srOnly","role","errorMessage","message","Root","multiple","onValueChange","onInputValueChange","tagContainer","SearchInput","input","onKeyDown","onPaste","Portal","Positioner","Popup","Empty","count","Item","toLocaleString","TextTagsInput"],"sources":["TextTagsInput.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 { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\n\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { useFilterListBoundary } from \"../FilterListBoundaryContext.js\";\nimport { getOptionLabelText, OptionLabel } from \"./OptionLabel.js\";\nimport { SelectInputSkeleton } from \"./SelectInputSkeleton.js\";\n\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./TextTagsInput.module.css\";\n\nconst TAG_SEPARATOR_PATTERN = /[,\\n]/;\n\ninterface TagItemProps {\n tag: string;\n onRemove: (tag: string) => void;\n}\n\nconst TagItem = memo(function TagItem({ tag, onRemove }: TagItemProps) {\n const handleRemove = useCallback(() => {\n onRemove(tag);\n }, [tag, onRemove]);\n\n const displayLabel = getOptionLabelText(tag);\n\n return (\n <span className={sharedStyles.tag}>\n <OptionLabel value={tag} />\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={handleRemove}\n aria-label={`Remove ${displayLabel}`}\n >\n ×\n </Button>\n </span>\n );\n});\n\ninterface TextTagsInputProps {\n suggestions: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n tags: string[];\n onChange: (tags: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n allowCustomTags?: boolean;\n suggestionLimit?: number;\n ariaLabel?: string;\n}\n\nfunction TextTagsInputInner({\n suggestions,\n isLoading,\n error,\n tags,\n onChange,\n className,\n style,\n placeholder = \"Add a tag...\",\n allowCustomTags = true,\n suggestionLimit = 10,\n ariaLabel = \"Add tag\",\n}: TextTagsInputProps): React.ReactElement {\n const collisionBoundary = useFilterListBoundary();\n const [inputValue, setInputValue] = useState(\"\");\n\n const filteredSuggestions = useMemo(() => {\n if (!suggestionLimit) return [];\n const lowerInput = inputValue.toLowerCase();\n return suggestions\n .filter(\n (s) =>\n (!inputValue.trim() || s.value.toLowerCase().includes(lowerInput)) &&\n !tags.includes(s.value)\n )\n .slice(0, suggestionLimit);\n }, [suggestions, inputValue, tags, suggestionLimit]);\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmedTag = tag.trim();\n if (trimmedTag && !tags.includes(trimmedTag)) {\n onChange([...tags, trimmedTag]);\n }\n setInputValue(\"\");\n },\n [tags, onChange]\n );\n\n const removeTag = useCallback(\n (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n },\n [tags, onChange]\n );\n\n const handleValueChange = useCallback(\n (newTags: string[] | null) => {\n onChange(newTags ?? []);\n },\n [onChange]\n );\n\n const handleInputValueChange = useCallback((value: string) => {\n setInputValue(value);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && inputValue.trim()) {\n if (filteredSuggestions.length > 0) {\n return;\n }\n e.preventDefault();\n if (allowCustomTags) {\n addTag(inputValue);\n }\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n },\n [inputValue, tags, addTag, removeTag, allowCustomTags, filteredSuggestions]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n const pastedText = e.clipboardData.getData(\"text\");\n if (TAG_SEPARATOR_PATTERN.test(pastedText)) {\n e.preventDefault();\n const newTags = pastedText\n .split(TAG_SEPARATOR_PATTERN)\n .map((t) => t.trim())\n .filter((t) => t && !tags.includes(t));\n if (newTags.length > 0) {\n onChange([...tags, ...newTags]);\n }\n }\n },\n [tags, onChange]\n );\n\n return (\n <div\n className={classnames(styles.textTags, className)}\n style={style}\n data-loading={isLoading && suggestions.length > 0}\n >\n <span className={sharedStyles.srOnly} role=\"status\">\n {isLoading ? \"Loading options\" : \"\"}\n </span>\n\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading suggestions: {error.message}\n </div>\n )}\n\n <Combobox.Root<string, true>\n multiple={true}\n value={tags}\n onValueChange={handleValueChange}\n inputValue={inputValue}\n onInputValueChange={handleInputValueChange}\n >\n {tags.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {tags.map((tag) => (\n <TagItem key={tag} tag={tag} onRemove={removeTag} />\n ))}\n </div>\n )}\n\n <Combobox.SearchInput\n className={styles.input}\n placeholder={tags.length > 0 ? \"\" : placeholder}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n aria-label={ariaLabel}\n />\n\n <Combobox.Portal>\n <Combobox.Positioner collisionBoundary={collisionBoundary}>\n <Combobox.Popup>\n {filteredSuggestions.length === 0 ? (\n allowCustomTags && inputValue.trim() ? (\n <Combobox.Empty>\n Press Enter to add \"{inputValue}\"\n </Combobox.Empty>\n ) : (\n <Combobox.Empty>\n {suggestionLimit ? \"No suggestions\" : \"Type to add a tag\"}\n </Combobox.Empty>\n )\n ) : (\n filteredSuggestions.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n <OptionLabel value={value} /> ({count.toLocaleString()})\n </Combobox.Item>\n ))\n )}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n\n {!error && suggestions.length === 0 && isLoading && !!suggestionLimit && (\n <SelectInputSkeleton />\n )}\n </div>\n );\n}\n\nexport const TextTagsInput = memo(\n TextTagsInputInner\n) as typeof TextTagsInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"TextTagsInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Combobox","useFilterListBoundary","getOptionLabelText","OptionLabel","SelectInputSkeleton","sharedStyles","styles","TAG_SEPARATOR_PATTERN","TagItem","tag","onRemove","handleRemove","displayLabel","createElement","className","value","type","tagRemove","onClick","TextTagsInputInner","suggestions","isLoading","error","tags","onChange","style","placeholder","allowCustomTags","suggestionLimit","ariaLabel","collisionBoundary","inputValue","setInputValue","filteredSuggestions","lowerInput","toLowerCase","filter","s","trim","includes","slice","addTag","trimmedTag","removeTag","t","handleValueChange","newTags","handleInputValueChange","handleKeyDown","e","key","length","preventDefault","handlePaste","pastedText","clipboardData","getData","test","split","map","textTags","srOnly","role","errorMessage","message","Root","multiple","onValueChange","onInputValueChange","tagContainer","SearchInput","input","onKeyDown","onPaste","Portal","Positioner","Popup","Empty","count","Item","toLocaleString","TextTagsInput"],"sources":["TextTagsInput.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 { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\n\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { useFilterListBoundary } from \"../FilterListBoundaryContext.js\";\nimport { getOptionLabelText, OptionLabel } from \"./OptionLabel.js\";\nimport { SelectInputSkeleton } from \"./SelectInputSkeleton.js\";\n\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./TextTagsInput.module.css\";\n\nconst TAG_SEPARATOR_PATTERN = /[,\\n]/u;\n\ninterface TagItemProps {\n tag: string;\n onRemove: (tag: string) => void;\n}\n\nconst TagItem = memo(function TagItem({ tag, onRemove }: TagItemProps) {\n const handleRemove = useCallback(() => {\n onRemove(tag);\n }, [tag, onRemove]);\n\n const displayLabel = getOptionLabelText(tag);\n\n return (\n <span className={sharedStyles.tag}>\n <OptionLabel value={tag} />\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={handleRemove}\n aria-label={`Remove ${displayLabel}`}\n >\n ×\n </Button>\n </span>\n );\n});\n\ninterface TextTagsInputProps {\n suggestions: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n tags: string[];\n onChange: (tags: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n allowCustomTags?: boolean;\n suggestionLimit?: number;\n ariaLabel?: string;\n}\n\nfunction TextTagsInputInner({\n suggestions,\n isLoading,\n error,\n tags,\n onChange,\n className,\n style,\n placeholder = \"Add a tag...\",\n allowCustomTags = true,\n suggestionLimit = 10,\n ariaLabel = \"Add tag\",\n}: TextTagsInputProps): React.ReactElement {\n const collisionBoundary = useFilterListBoundary();\n const [inputValue, setInputValue] = useState(\"\");\n\n const filteredSuggestions = useMemo(() => {\n if (!suggestionLimit) return [];\n const lowerInput = inputValue.toLowerCase();\n return suggestions\n .filter(\n (s) =>\n (!inputValue.trim() || s.value.toLowerCase().includes(lowerInput)) &&\n !tags.includes(s.value)\n )\n .slice(0, suggestionLimit);\n }, [suggestions, inputValue, tags, suggestionLimit]);\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmedTag = tag.trim();\n if (trimmedTag && !tags.includes(trimmedTag)) {\n onChange([...tags, trimmedTag]);\n }\n setInputValue(\"\");\n },\n [tags, onChange]\n );\n\n const removeTag = useCallback(\n (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n },\n [tags, onChange]\n );\n\n const handleValueChange = useCallback(\n (newTags: string[] | null) => {\n onChange(newTags ?? []);\n },\n [onChange]\n );\n\n const handleInputValueChange = useCallback((value: string) => {\n setInputValue(value);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && inputValue.trim()) {\n if (filteredSuggestions.length > 0) {\n return;\n }\n e.preventDefault();\n if (allowCustomTags) {\n addTag(inputValue);\n }\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n },\n [inputValue, tags, addTag, removeTag, allowCustomTags, filteredSuggestions]\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n const pastedText = e.clipboardData.getData(\"text\");\n if (TAG_SEPARATOR_PATTERN.test(pastedText)) {\n e.preventDefault();\n const newTags = pastedText\n .split(TAG_SEPARATOR_PATTERN)\n .map((t) => t.trim())\n .filter((t) => t && !tags.includes(t));\n if (newTags.length > 0) {\n onChange([...tags, ...newTags]);\n }\n }\n },\n [tags, onChange]\n );\n\n return (\n <div\n className={classnames(styles.textTags, className)}\n style={style}\n data-loading={isLoading && suggestions.length > 0}\n >\n <span className={sharedStyles.srOnly} role=\"status\">\n {isLoading ? \"Loading options\" : \"\"}\n </span>\n\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading suggestions: {error.message}\n </div>\n )}\n\n <Combobox.Root<string, true>\n multiple={true}\n value={tags}\n onValueChange={handleValueChange}\n inputValue={inputValue}\n onInputValueChange={handleInputValueChange}\n >\n {tags.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {tags.map((tag) => (\n <TagItem key={tag} tag={tag} onRemove={removeTag} />\n ))}\n </div>\n )}\n\n <Combobox.SearchInput\n className={styles.input}\n placeholder={tags.length > 0 ? \"\" : placeholder}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n aria-label={ariaLabel}\n />\n\n <Combobox.Portal>\n <Combobox.Positioner collisionBoundary={collisionBoundary}>\n <Combobox.Popup>\n {filteredSuggestions.length === 0 ? (\n allowCustomTags && inputValue.trim() ? (\n <Combobox.Empty>\n Press Enter to add \"{inputValue}\"\n </Combobox.Empty>\n ) : (\n <Combobox.Empty>\n {suggestionLimit ? \"No suggestions\" : \"Type to add a tag\"}\n </Combobox.Empty>\n )\n ) : (\n filteredSuggestions.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n <OptionLabel value={value} /> ({count.toLocaleString()})\n </Combobox.Item>\n ))\n )}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n\n {!error && suggestions.length === 0 && isLoading && !!suggestionLimit && (\n <SelectInputSkeleton />\n )}\n </div>\n );\n}\n\nexport const TextTagsInput = memo(\n TextTagsInputInner\n) as typeof TextTagsInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -141,7 +141,7 @@ function formatSegment(value, segment) {
|
|
|
141
141
|
return segment === "hours" ? String(value) : String(value).padStart(2, "0");
|
|
142
142
|
}
|
|
143
143
|
function parseNumber(text) {
|
|
144
|
-
if (!/^\d{1,2}
|
|
144
|
+
if (!/^\d{1,2}$/u.test(text)) {
|
|
145
145
|
return undefined;
|
|
146
146
|
}
|
|
147
147
|
const parsed = Number(text);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimePicker.js","names":["Input","React","useCallback","useMemo","useState","styles","NUMERIC_INPUT_PATTERN","SEGMENT_LIMITS","hours","min","max","minutes","TimePicker","memo","value","onChange","label","valueTimestamp","getTime","valueSegments","segmentsFromTimestamp","draftSegments","setDraftSegments","prevSegments","setPrevSegments","hourText","minuteText","hourInvalid","isSegmentInvalid","minuteInvalid","handleSegmentChange","segment","nextText","prev","replaceSegmentText","emitChange","nextDate","Date","setHours","handleSegmentBlur","text","parsedSegment","parseNumber","clampedSegment","clampSegment","formatSegment","currentHours","Number","currentMinutes","nextHours","nextMinutes","handleHourChange","handleMinuteChange","handleHourBlur","handleMinuteBlur","createElement","className","osdkTimePickerRoot","role","type","inputMode","pattern","onValueChange","onBlur","osdkTimePickerInput","undefined","osdkTimePickerSeparator","segments","getHours","getMinutes","String","padStart","test","parsed","isNaN","parseSegment","Math"],"sources":["TimePicker.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 React, { useCallback, useMemo, useState } from \"react\";\n\nimport styles from \"./TimePicker.module.css\";\n\nexport interface TimePickerProps {\n value: Date | null;\n onChange?: (newTime: Date) => void;\n label?: string;\n}\n\ntype TimeSegment = \"hours\" | \"minutes\";\ntype TimeSegments = Record<TimeSegment, string>;\n\nconst NUMERIC_INPUT_PATTERN = \"[0-9]*\";\n\nconst SEGMENT_LIMITS: Record<TimeSegment, { min: number; max: number }> = {\n hours: { min: 0, max: 23 },\n minutes: { min: 0, max: 59 },\n} as const;\n\nexport const TimePicker: React.NamedExoticComponent<TimePickerProps> =\n React.memo(function TimePickerFn({\n value,\n onChange,\n label = \"Time\",\n }: TimePickerProps): React.ReactElement {\n const valueTimestamp = value?.getTime() ?? null;\n const valueSegments = useMemo(\n () => segmentsFromTimestamp(valueTimestamp),\n [valueTimestamp]\n );\n // draftSegments always holds the displayed text. It is reset to\n // valueSegments whenever the controlled value changes, so the parent\n // Date is the source of truth once an edit is committed or discarded.\n const [draftSegments, setDraftSegments] = useState(valueSegments);\n const [prevSegments, setPrevSegments] = useState(valueSegments);\n if (\n prevSegments.hours !== valueSegments.hours ||\n prevSegments.minutes !== valueSegments.minutes\n ) {\n setPrevSegments(valueSegments);\n setDraftSegments(valueSegments);\n }\n\n const hourText = draftSegments.hours;\n const minuteText = draftSegments.minutes;\n const hourInvalid = isSegmentInvalid(hourText, \"hours\");\n const minuteInvalid = isSegmentInvalid(minuteText, \"minutes\");\n\n const handleSegmentChange = useCallback(\n (segment: TimeSegment, nextText: string) => {\n setDraftSegments((prev) =>\n replaceSegmentText(prev, { segment, nextText })\n );\n },\n []\n );\n\n const emitChange = useCallback(\n (hours: number, minutes: number) => {\n const nextDate = value != null ? new Date(value.getTime()) : new Date();\n nextDate.setHours(hours, minutes, 0, 0);\n onChange?.(nextDate);\n },\n [onChange, value]\n );\n\n const handleSegmentBlur = useCallback(\n (segment: TimeSegment, text: string) => {\n const parsedSegment = parseNumber(text);\n if (parsedSegment == null) {\n // Non-numeric text cannot be converted into a valid time segment, so\n // restore the controlled value instead of emitting an arbitrary Date.\n setDraftSegments(valueSegments);\n return;\n }\n\n const clampedSegment = clampSegment(parsedSegment, segment);\n setDraftSegments((prev) =>\n replaceSegmentText(prev, {\n segment,\n nextText: formatSegment(clampedSegment, segment),\n })\n );\n\n const currentHours = Number(valueSegments.hours);\n const currentMinutes = Number(valueSegments.minutes);\n const nextHours = segment === \"hours\" ? clampedSegment : currentHours;\n const nextMinutes =\n segment === \"minutes\" ? clampedSegment : currentMinutes;\n if (nextHours !== currentHours || nextMinutes !== currentMinutes) {\n emitChange(nextHours, nextMinutes);\n }\n },\n [emitChange, valueSegments]\n );\n\n const handleHourChange = useCallback(\n (nextText: string) => handleSegmentChange(\"hours\", nextText),\n [handleSegmentChange]\n );\n const handleMinuteChange = useCallback(\n (nextText: string) => handleSegmentChange(\"minutes\", nextText),\n [handleSegmentChange]\n );\n const handleHourBlur = useCallback(\n () => handleSegmentBlur(\"hours\", hourText),\n [handleSegmentBlur, hourText]\n );\n const handleMinuteBlur = useCallback(\n () => handleSegmentBlur(\"minutes\", minuteText),\n [handleSegmentBlur, minuteText]\n );\n\n return (\n <div\n className={styles.osdkTimePickerRoot}\n role=\"group\"\n aria-label={label}\n >\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n pattern={NUMERIC_INPUT_PATTERN}\n value={hourText}\n onValueChange={handleHourChange}\n onBlur={handleHourBlur}\n className={styles.osdkTimePickerInput}\n aria-label={`${label} hours`}\n aria-invalid={hourInvalid || undefined}\n />\n <span className={styles.osdkTimePickerSeparator} aria-hidden=\"true\">\n :\n </span>\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n pattern={NUMERIC_INPUT_PATTERN}\n value={minuteText}\n onValueChange={handleMinuteChange}\n onBlur={handleMinuteBlur}\n className={styles.osdkTimePickerInput}\n aria-label={`${label} minutes`}\n aria-invalid={minuteInvalid || undefined}\n />\n </div>\n );\n });\n\nfunction replaceSegmentText(\n segments: TimeSegments,\n {\n segment,\n nextText,\n }: {\n segment: TimeSegment;\n nextText: string;\n }\n): TimeSegments {\n return {\n ...segments,\n [segment]: nextText,\n };\n}\n\nfunction segmentsFromTimestamp(valueTimestamp: number | null): TimeSegments {\n if (valueTimestamp == null) {\n return {\n hours: formatSegment(0, \"hours\"),\n minutes: formatSegment(0, \"minutes\"),\n };\n }\n const value = new Date(valueTimestamp);\n return {\n hours: formatSegment(value.getHours(), \"hours\"),\n minutes: formatSegment(value.getMinutes(), \"minutes\"),\n };\n}\n\nfunction formatSegment(value: number, segment: TimeSegment): string {\n // Hours stay compact while minutes stay two digits so the HH:mm control\n // remains easy to scan.\n return segment === \"hours\" ? String(value) : String(value).padStart(2, \"0\");\n}\n\nfunction parseNumber(text: string): number | undefined {\n if (!/^\\d{1,2}$/.test(text)) {\n return undefined;\n }\n const parsed = Number(text);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nfunction parseSegment(text: string, segment: TimeSegment): number | undefined {\n const parsed = parseNumber(text);\n if (parsed == null) {\n return undefined;\n }\n const { min, max } = SEGMENT_LIMITS[segment];\n return parsed >= min && parsed <= max ? parsed : undefined;\n}\n\nfunction isSegmentInvalid(text: string, segment: TimeSegment): boolean {\n return parseSegment(text, segment) == null;\n}\n\nfunction clampSegment(value: number, segment: TimeSegment): number {\n const { min, max } = SEGMENT_LIMITS[segment];\n return Math.min(Math.max(value, min), max);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"TimePicker.js","names":["Input","React","useCallback","useMemo","useState","styles","NUMERIC_INPUT_PATTERN","SEGMENT_LIMITS","hours","min","max","minutes","TimePicker","memo","value","onChange","label","valueTimestamp","getTime","valueSegments","segmentsFromTimestamp","draftSegments","setDraftSegments","prevSegments","setPrevSegments","hourText","minuteText","hourInvalid","isSegmentInvalid","minuteInvalid","handleSegmentChange","segment","nextText","prev","replaceSegmentText","emitChange","nextDate","Date","setHours","handleSegmentBlur","text","parsedSegment","parseNumber","clampedSegment","clampSegment","formatSegment","currentHours","Number","currentMinutes","nextHours","nextMinutes","handleHourChange","handleMinuteChange","handleHourBlur","handleMinuteBlur","createElement","className","osdkTimePickerRoot","role","type","inputMode","pattern","onValueChange","onBlur","osdkTimePickerInput","undefined","osdkTimePickerSeparator","segments","getHours","getMinutes","String","padStart","test","parsed","isNaN","parseSegment","Math"],"sources":["TimePicker.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 React, { useCallback, useMemo, useState } from \"react\";\n\nimport styles from \"./TimePicker.module.css\";\n\nexport interface TimePickerProps {\n value: Date | null;\n onChange?: (newTime: Date) => void;\n label?: string;\n}\n\ntype TimeSegment = \"hours\" | \"minutes\";\ntype TimeSegments = Record<TimeSegment, string>;\n\nconst NUMERIC_INPUT_PATTERN = \"[0-9]*\";\n\nconst SEGMENT_LIMITS: Record<TimeSegment, { min: number; max: number }> = {\n hours: { min: 0, max: 23 },\n minutes: { min: 0, max: 59 },\n} as const;\n\nexport const TimePicker: React.NamedExoticComponent<TimePickerProps> =\n React.memo(function TimePickerFn({\n value,\n onChange,\n label = \"Time\",\n }: TimePickerProps): React.ReactElement {\n const valueTimestamp = value?.getTime() ?? null;\n const valueSegments = useMemo(\n () => segmentsFromTimestamp(valueTimestamp),\n [valueTimestamp]\n );\n // draftSegments always holds the displayed text. It is reset to\n // valueSegments whenever the controlled value changes, so the parent\n // Date is the source of truth once an edit is committed or discarded.\n const [draftSegments, setDraftSegments] = useState(valueSegments);\n const [prevSegments, setPrevSegments] = useState(valueSegments);\n if (\n prevSegments.hours !== valueSegments.hours ||\n prevSegments.minutes !== valueSegments.minutes\n ) {\n setPrevSegments(valueSegments);\n setDraftSegments(valueSegments);\n }\n\n const hourText = draftSegments.hours;\n const minuteText = draftSegments.minutes;\n const hourInvalid = isSegmentInvalid(hourText, \"hours\");\n const minuteInvalid = isSegmentInvalid(minuteText, \"minutes\");\n\n const handleSegmentChange = useCallback(\n (segment: TimeSegment, nextText: string) => {\n setDraftSegments((prev) =>\n replaceSegmentText(prev, { segment, nextText })\n );\n },\n []\n );\n\n const emitChange = useCallback(\n (hours: number, minutes: number) => {\n const nextDate = value != null ? new Date(value.getTime()) : new Date();\n nextDate.setHours(hours, minutes, 0, 0);\n onChange?.(nextDate);\n },\n [onChange, value]\n );\n\n const handleSegmentBlur = useCallback(\n (segment: TimeSegment, text: string) => {\n const parsedSegment = parseNumber(text);\n if (parsedSegment == null) {\n // Non-numeric text cannot be converted into a valid time segment, so\n // restore the controlled value instead of emitting an arbitrary Date.\n setDraftSegments(valueSegments);\n return;\n }\n\n const clampedSegment = clampSegment(parsedSegment, segment);\n setDraftSegments((prev) =>\n replaceSegmentText(prev, {\n segment,\n nextText: formatSegment(clampedSegment, segment),\n })\n );\n\n const currentHours = Number(valueSegments.hours);\n const currentMinutes = Number(valueSegments.minutes);\n const nextHours = segment === \"hours\" ? clampedSegment : currentHours;\n const nextMinutes =\n segment === \"minutes\" ? clampedSegment : currentMinutes;\n if (nextHours !== currentHours || nextMinutes !== currentMinutes) {\n emitChange(nextHours, nextMinutes);\n }\n },\n [emitChange, valueSegments]\n );\n\n const handleHourChange = useCallback(\n (nextText: string) => handleSegmentChange(\"hours\", nextText),\n [handleSegmentChange]\n );\n const handleMinuteChange = useCallback(\n (nextText: string) => handleSegmentChange(\"minutes\", nextText),\n [handleSegmentChange]\n );\n const handleHourBlur = useCallback(\n () => handleSegmentBlur(\"hours\", hourText),\n [handleSegmentBlur, hourText]\n );\n const handleMinuteBlur = useCallback(\n () => handleSegmentBlur(\"minutes\", minuteText),\n [handleSegmentBlur, minuteText]\n );\n\n return (\n <div\n className={styles.osdkTimePickerRoot}\n role=\"group\"\n aria-label={label}\n >\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n pattern={NUMERIC_INPUT_PATTERN}\n value={hourText}\n onValueChange={handleHourChange}\n onBlur={handleHourBlur}\n className={styles.osdkTimePickerInput}\n aria-label={`${label} hours`}\n aria-invalid={hourInvalid || undefined}\n />\n <span className={styles.osdkTimePickerSeparator} aria-hidden=\"true\">\n :\n </span>\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n pattern={NUMERIC_INPUT_PATTERN}\n value={minuteText}\n onValueChange={handleMinuteChange}\n onBlur={handleMinuteBlur}\n className={styles.osdkTimePickerInput}\n aria-label={`${label} minutes`}\n aria-invalid={minuteInvalid || undefined}\n />\n </div>\n );\n });\n\nfunction replaceSegmentText(\n segments: TimeSegments,\n {\n segment,\n nextText,\n }: {\n segment: TimeSegment;\n nextText: string;\n }\n): TimeSegments {\n return {\n ...segments,\n [segment]: nextText,\n };\n}\n\nfunction segmentsFromTimestamp(valueTimestamp: number | null): TimeSegments {\n if (valueTimestamp == null) {\n return {\n hours: formatSegment(0, \"hours\"),\n minutes: formatSegment(0, \"minutes\"),\n };\n }\n const value = new Date(valueTimestamp);\n return {\n hours: formatSegment(value.getHours(), \"hours\"),\n minutes: formatSegment(value.getMinutes(), \"minutes\"),\n };\n}\n\nfunction formatSegment(value: number, segment: TimeSegment): string {\n // Hours stay compact while minutes stay two digits so the HH:mm control\n // remains easy to scan.\n return segment === \"hours\" ? String(value) : String(value).padStart(2, \"0\");\n}\n\nfunction parseNumber(text: string): number | undefined {\n if (!/^\\d{1,2}$/u.test(text)) {\n return undefined;\n }\n const parsed = Number(text);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nfunction parseSegment(text: string, segment: TimeSegment): number | undefined {\n const parsed = parseNumber(text);\n if (parsed == null) {\n return undefined;\n }\n const { min, max } = SEGMENT_LIMITS[segment];\n return parsed >= min && parsed <= max ? parsed : undefined;\n}\n\nfunction isSegmentInvalid(text: string, segment: TimeSegment): boolean {\n return parseSegment(text, segment) == null;\n}\n\nfunction clampSegment(value: number, segment: TimeSegment): number {\n const { min, max } = SEGMENT_LIMITS[segment];\n return Math.min(Math.max(value, min), max);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -70,7 +70,7 @@ export function formatDatetimeForInput(date) {
|
|
|
70
70
|
*/
|
|
71
71
|
export function parseDatetimeFromInput(value) {
|
|
72
72
|
if (!value) return undefined;
|
|
73
|
-
const normalized = value.includes("T") ? value : value.replace(/\s
|
|
73
|
+
const normalized = value.includes("T") ? value : value.replace(/\s/u, "T");
|
|
74
74
|
const date = new Date(normalized);
|
|
75
75
|
return isNaN(date.getTime()) ? undefined : date;
|
|
76
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dateUtils.js","names":["formatDateForInput","date","year","getFullYear","month","String","getMonth","padStart","day","getDate","formatTime","hours","getHours","minutes","getMinutes","parseDateFromInput","value","undefined","Date","isNaN","getTime","formatDateForDisplay","fallback","toLocaleDateString","formatDatetimeForInput","parseDatetimeFromInput","normalized","includes","replace","isDateInRange","min","max","parseDateFromISO","parseTimeString","timeString","hoursStr","minutesStr","split","parseInt","getTimeValue"],"sources":["dateUtils.ts"],"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\n/**\n * Date utilities for HTML date inputs.\n *\n * These functions operate on local time by design. HTML <input type=\"date\">\n * returns and expects values in \"YYYY-MM-DD\" format without timezone info.\n *\n * `parseDateFromInput` appends \"T00:00:00\" (no \"Z\") so the date is parsed as\n * local midnight rather than UTC midnight. Without this, negative-offset\n * timezones (e.g. US timezones) would shift \"2024-01-15\" to Jan 14 locally.\n *\n * Consumers providing dates from an API (typically UTC) should handle\n * UTC-to-local conversion before passing values to these functions.\n */\n\nexport function formatDateForInput(date: Date | undefined | null): string {\n if (date == null) return \"\";\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/** Formats the time portion of a Date as \"HH:mm\". */\nexport function formatTime(date: Date): string {\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n return `${hours}:${minutes}`;\n}\n\nexport function parseDateFromInput(\n value: string | undefined | null\n): Date | undefined {\n if (!value) return undefined;\n const date = new Date(value + \"T00:00:00\");\n return isNaN(date.getTime()) ? undefined : date;\n}\n\nexport function formatDateForDisplay(\n date: Date | undefined | null,\n fallback: string = \"\"\n): string {\n if (date == null) return fallback;\n return date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/** Formats a Date as \"2024-06-15 14:30\" — space-separated, parsable, for text input editing. */\nexport function formatDatetimeForInput(date: Date | undefined | null): string {\n if (date == null) return \"\";\n return `${formatDateForInput(date)} ${formatTime(date)}`;\n}\n\n/**\n * Parses space-separated (\"2024-06-15 14:30\") or T-separated datetime strings.\n * Inverse of `formatDatetimeForInput`, which joins date and time with a space\n * for readability. Here we replace that space with \"T\" so `new Date()` parses\n * it as a local datetime (e.g. \"2024-06-15T14:30\").\n */\nexport function parseDatetimeFromInput(\n value: string | undefined | null\n): Date | undefined {\n if (!value) return undefined;\n const normalized = value.includes(\"T\") ? value : value.replace(/\\s
|
|
1
|
+
{"version":3,"file":"dateUtils.js","names":["formatDateForInput","date","year","getFullYear","month","String","getMonth","padStart","day","getDate","formatTime","hours","getHours","minutes","getMinutes","parseDateFromInput","value","undefined","Date","isNaN","getTime","formatDateForDisplay","fallback","toLocaleDateString","formatDatetimeForInput","parseDatetimeFromInput","normalized","includes","replace","isDateInRange","min","max","parseDateFromISO","parseTimeString","timeString","hoursStr","minutesStr","split","parseInt","getTimeValue"],"sources":["dateUtils.ts"],"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\n/**\n * Date utilities for HTML date inputs.\n *\n * These functions operate on local time by design. HTML <input type=\"date\">\n * returns and expects values in \"YYYY-MM-DD\" format without timezone info.\n *\n * `parseDateFromInput` appends \"T00:00:00\" (no \"Z\") so the date is parsed as\n * local midnight rather than UTC midnight. Without this, negative-offset\n * timezones (e.g. US timezones) would shift \"2024-01-15\" to Jan 14 locally.\n *\n * Consumers providing dates from an API (typically UTC) should handle\n * UTC-to-local conversion before passing values to these functions.\n */\n\nexport function formatDateForInput(date: Date | undefined | null): string {\n if (date == null) return \"\";\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/** Formats the time portion of a Date as \"HH:mm\". */\nexport function formatTime(date: Date): string {\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n return `${hours}:${minutes}`;\n}\n\nexport function parseDateFromInput(\n value: string | undefined | null\n): Date | undefined {\n if (!value) return undefined;\n const date = new Date(value + \"T00:00:00\");\n return isNaN(date.getTime()) ? undefined : date;\n}\n\nexport function formatDateForDisplay(\n date: Date | undefined | null,\n fallback: string = \"\"\n): string {\n if (date == null) return fallback;\n return date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/** Formats a Date as \"2024-06-15 14:30\" — space-separated, parsable, for text input editing. */\nexport function formatDatetimeForInput(date: Date | undefined | null): string {\n if (date == null) return \"\";\n return `${formatDateForInput(date)} ${formatTime(date)}`;\n}\n\n/**\n * Parses space-separated (\"2024-06-15 14:30\") or T-separated datetime strings.\n * Inverse of `formatDatetimeForInput`, which joins date and time with a space\n * for readability. Here we replace that space with \"T\" so `new Date()` parses\n * it as a local datetime (e.g. \"2024-06-15T14:30\").\n */\nexport function parseDatetimeFromInput(\n value: string | undefined | null\n): Date | undefined {\n if (!value) return undefined;\n const normalized = value.includes(\"T\") ? value : value.replace(/\\s/u, \"T\");\n const date = new Date(normalized);\n return isNaN(date.getTime()) ? undefined : date;\n}\n\n/** Returns true if `date` falls within [min, max] (inclusive). */\nexport function isDateInRange(\n date: Date,\n min: Date | undefined,\n max: Date | undefined\n): boolean {\n if (min != null && date.getTime() < min.getTime()) return false;\n if (max != null && date.getTime() > max.getTime()) return false;\n return true;\n}\n\nexport function parseDateFromISO(\n value: string | Date | undefined | null\n): Date | undefined {\n if (value == null) return undefined;\n if (value instanceof Date) return value;\n const date = new Date(value);\n return isNaN(date.getTime()) ? undefined : date;\n}\n\n/** Parses an \"HH:mm\" time string into hours and minutes. */\nexport function parseTimeString(timeString: string): {\n hours: number;\n minutes: number;\n} {\n const [hoursStr, minutesStr] = timeString.split(\":\");\n const hours = parseInt(hoursStr ?? \"0\", 10);\n const minutes = parseInt(minutesStr ?? \"0\", 10);\n return {\n hours: isNaN(hours) ? 0 : hours,\n minutes: isNaN(minutes) ? 0 : minutes,\n };\n}\n\n/** Returns the \"HH:mm\" time value for a date, defaulting to \"00:00\" when null. */\nexport function getTimeValue(date: Date | null): string {\n return date != null ? formatTime(date) : \"00:00\";\n}\n"],"mappings":"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","ignoreList":[]}
|
package/build/browser/styles.css
CHANGED
|
@@ -704,6 +704,7 @@
|
|
|
704
704
|
--osdk-button-min-height: calc(var(--osdk-surface-spacing) * 7.5);
|
|
705
705
|
--osdk-button-border-color: color-mix(in oklch, var(--bp-palette-black) 20%, transparent);
|
|
706
706
|
--osdk-button-border: none;
|
|
707
|
+
--osdk-button-border-radius: var(--osdk-surface-border-radius);
|
|
707
708
|
--osdk-button-drop-shadow-color: color-mix(in oklch, var(--bp-palette-black) 10%, transparent);
|
|
708
709
|
--osdk-button-shadow:
|
|
709
710
|
inset 0 0 0 1px var(--osdk-button-border-color),
|
|
@@ -3448,7 +3449,7 @@
|
|
|
3448
3449
|
padding: calc(var(--osdk-surface-spacing) * 1.5)
|
|
3449
3450
|
calc(var(--osdk-surface-spacing) * 1.75);
|
|
3450
3451
|
border: var(--osdk-button-border);
|
|
3451
|
-
border-radius: var(--osdk-
|
|
3452
|
+
border-radius: var(--osdk-button-border-radius);
|
|
3452
3453
|
box-shadow: var(--osdk-button-shadow);
|
|
3453
3454
|
font-size: var(--osdk-typography-size-body-medium);
|
|
3454
3455
|
cursor: pointer;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
--osdk-button-min-height: calc(var(--osdk-surface-spacing) * 7.5);
|
|
5
5
|
--osdk-button-border-color: color-mix(in oklch, var(--bp-palette-black) 20%, transparent);
|
|
6
6
|
--osdk-button-border: none;
|
|
7
|
+
--osdk-button-border-radius: var(--osdk-surface-border-radius);
|
|
7
8
|
--osdk-button-drop-shadow-color: color-mix(in oklch, var(--bp-palette-black) 10%, transparent);
|
|
8
9
|
--osdk-button-shadow:
|
|
9
10
|
inset 0 0 0 1px var(--osdk-button-border-color),
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
const PACKAGE_USER_AGENT = `osdk-react-components/${"0.35.
|
|
17
|
+
const PACKAGE_USER_AGENT = `osdk-react-components/${"0.35.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07"}`;
|
|
18
18
|
export function componentUserAgent(componentName) {
|
|
19
19
|
return `${PACKAGE_USER_AGENT}/${componentName}`;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserAgent.js","names":["PACKAGE_USER_AGENT","componentUserAgent","componentName"],"sources":["UserAgent.ts"],"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\nconst PACKAGE_USER_AGENT = `osdk-react-components/${process.env.PACKAGE_VERSION}`;\n\nexport function componentUserAgent(componentName: string): string {\n return `${PACKAGE_USER_AGENT}/${componentName}`;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMA,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"UserAgent.js","names":["PACKAGE_USER_AGENT","componentUserAgent","componentName"],"sources":["UserAgent.ts"],"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\nconst PACKAGE_USER_AGENT = `osdk-react-components/${process.env.PACKAGE_VERSION}`;\n\nexport function componentUserAgent(componentName: string): string {\n return `${PACKAGE_USER_AGENT}/${componentName}`;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMA,kBAAkB,GAAG,iFAAsD;AAEjF,OAAO,SAASC,kBAAkBA,CAACC,aAAqB,EAAU;EAChE,OAAO,GAAGF,kBAAkB,IAAIE,aAAa,EAAE;AACjD","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var chunkFVTTRDL6_cjs = require('./chunk-FVTTRDL6.cjs');
|
|
6
|
+
require('./chunk-QP2LHBCZ.cjs');
|
|
7
|
+
require('./chunk-PZPCRXSV.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Object.defineProperty(exports, "CALENDAR_COMPONENTS", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkFVTTRDL6_cjs.CALENDAR_COMPONENTS; }
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "CLASS_NAMES", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunkFVTTRDL6_cjs.CLASS_NAMES; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "default", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunkFVTTRDL6_cjs.DateCalendar; }
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=DateCalendar-DI2UJ57V.cjs.map
|
|
24
|
+
//# sourceMappingURL=DateCalendar-DI2UJ57V.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"DateCalendar-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"DateCalendar-DI2UJ57V.cjs"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
min-height: var(--osdk-button-min-height);
|
|
4
4
|
padding: calc(var(--osdk-surface-spacing) * 1.5) calc(var(--osdk-surface-spacing) * 1.75);
|
|
5
5
|
border: var(--osdk-button-border);
|
|
6
|
-
border-radius: var(--osdk-
|
|
6
|
+
border-radius: var(--osdk-button-border-radius);
|
|
7
7
|
box-shadow: var(--osdk-button-shadow);
|
|
8
8
|
font-size: var(--osdk-typography-size-body-medium);
|
|
9
9
|
cursor: pointer;
|
|
@@ -313,4 +313,4 @@
|
|
|
313
313
|
margin-inline: calc(var(--osdk-datetime-popover-padding) * -1);
|
|
314
314
|
border-block-start: var(--osdk-time-picker-border-top);
|
|
315
315
|
}
|
|
316
|
-
/*# sourceMappingURL=DateCalendar-
|
|
316
|
+
/*# sourceMappingURL=DateCalendar-FZ4QRCRH.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/base-components/action-button/ActionButton.module.css","../../src/shared/calendar/TimePicker.module.css","../../src/shared/calendar/DateCalendar.module.css"],"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\n.button {\n min-height: var(--osdk-button-min-height);\n padding: calc(var(--osdk-surface-spacing) * 1.5)\n calc(var(--osdk-surface-spacing) * 1.75);\n border: var(--osdk-button-border);\n border-radius: var(--osdk-button-border-radius);\n box-shadow: var(--osdk-button-shadow);\n font-size: var(--osdk-typography-size-body-medium);\n cursor: pointer;\n\n &:focus-visible {\n outline: var(--osdk-focus-outline);\n outline-offset: var(--osdk-focus-visible-outline-offset);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.secondaryButton {\n background-color: var(--osdk-button-secondary-bg);\n border-color: var(--osdk-button-secondary-border-color);\n color: var(--osdk-button-secondary-color);\n\n &:hover:not(:disabled) {\n background-color: var(--osdk-button-secondary-bg-hover);\n }\n\n &:active:not(:disabled) {\n background-color: var(--osdk-button-secondary-bg-active);\n }\n}\n\n.primaryButton {\n background-color: var(--osdk-button-primary-bg);\n border-color: var(--osdk-button-primary-border-color);\n color: var(--osdk-button-primary-color);\n\n &:hover:not(:disabled) {\n background-color: var(--osdk-button-primary-bg-hover);\n }\n\n &:active:not(:disabled) {\n background-color: var(--osdk-button-primary-bg-active);\n }\n}\n\n.minimalButton {\n background-color: var(--osdk-button-minimal-bg);\n border: var(--osdk-button-minimal-border);\n box-shadow: var(--osdk-button-minimal-shadow);\n color: var(--osdk-button-secondary-minimal-color);\n\n &:hover:not(:disabled) {\n background-color: var(--osdk-button-minimal-bg-hover);\n }\n\n &:active:not(:disabled) {\n background-color: var(--osdk-button-minimal-bg-active);\n }\n}\n\n.primaryButton.minimalButton {\n color: var(--osdk-button-primary-minimal-color);\n}\n","/* TimePicker — HH:mm control. Outer layout is owned by the parent. */\n\n.osdkTimePickerRoot {\n display: inline-flex;\n align-items: center;\n gap: var(--osdk-surface-spacing);\n}\n\n.osdkTimePickerInput {\n width: calc(var(--osdk-surface-spacing) * 10);\n font-family: var(--osdk-time-picker-input-font-family);\n font-size: var(--osdk-time-picker-input-font-size);\n line-height: var(\n --osdk-input-line-height,\n var(--osdk-typography-line-height-default)\n );\n text-align: center;\n padding: var(--osdk-time-picker-input-padding);\n border: var(--osdk-time-picker-input-border);\n border-radius: var(--osdk-time-picker-input-border-radius);\n background: var(--osdk-time-picker-input-bg);\n color: var(--osdk-time-picker-input-color);\n box-sizing: border-box;\n box-shadow: var(--osdk-time-picker-input-shadow);\n\n &:focus-visible {\n outline: var(--osdk-time-picker-input-focus-outline);\n outline-offset: var(--osdk-input-focus-outline-offset);\n box-shadow: var(--osdk-time-picker-input-focus-shadow);\n }\n\n &[aria-invalid] {\n box-shadow: var(--osdk-time-picker-input-shadow-error);\n }\n\n &[aria-invalid]:focus-visible {\n box-shadow: var(--osdk-time-picker-input-focus-shadow-error);\n }\n}\n\n.osdkTimePickerSeparator {\n color: var(--osdk-typography-color-muted);\n font-family: var(--osdk-time-picker-input-font-family);\n font-size: var(--osdk-time-picker-input-font-size);\n line-height: var(\n --osdk-input-line-height,\n var(--osdk-typography-line-height-default)\n );\n}\n","/* DateCalendar — DayPicker classNames.\n All values reference --osdk-datetime-calendar-* tokens defined in\n react-components-styles/tokens/datetime-picker.css. */\n\n.calendar {\n position: relative;\n width: 100%;\n font-family: var(--osdk-datetime-calendar-font-family);\n font-size: var(--osdk-datetime-calendar-font-size);\n}\n\n.calendarMonths {\n display: flex;\n gap: var(--osdk-datetime-calendar-months-gap);\n}\n\n.calendarMonthGrid {\n width: 100%;\n border-collapse: collapse;\n}\n\n.calendarWeekday {\n padding: var(--osdk-datetime-calendar-gap);\n font-size: var(--osdk-datetime-calendar-weekday-font-size);\n color: var(--osdk-datetime-calendar-weekday-color);\n text-align: center;\n width: var(--osdk-datetime-calendar-cell-size);\n}\n\n.calendarDay {\n position: relative;\n padding: var(--osdk-datetime-calendar-gap);\n text-align: center;\n}\n\n.calendarDayButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--osdk-datetime-calendar-cell-size);\n height: var(--osdk-datetime-calendar-cell-size);\n border: none;\n border-radius: var(--osdk-datetime-calendar-day-border-radius);\n background: transparent;\n cursor: pointer;\n font: inherit;\n color: var(--osdk-datetime-calendar-day-color);\n\n &:hover {\n background: var(--osdk-datetime-calendar-day-hover-bg);\n color: var(--osdk-datetime-calendar-day-hover-color);\n }\n\n &:active {\n background: var(--osdk-datetime-calendar-day-active-bg);\n color: var(--osdk-datetime-calendar-day-hover-color);\n }\n\n &:focus-visible {\n outline: var(--osdk-datetime-calendar-focus-outline);\n outline-offset: -2px;\n }\n}\n\n/* :not([disabled]) bumps specificity to (0,4,0) — matching rdp's default\n .rdp-button:hover:not([disabled]):not(.rdp-day_selected) rule so our\n styles win by source order. Without this, rdp overrides the selected\n background on hover because we remap day_selected and its :not() always matches. */\n.calendarDayButton.calendarSelected {\n background: var(--osdk-datetime-calendar-selected-bg);\n color: var(--osdk-datetime-calendar-selected-color);\n\n &:hover:not([disabled]) {\n background: var(--osdk-datetime-calendar-selected-hover-bg);\n color: var(--osdk-datetime-calendar-selected-color);\n }\n\n &:active:not([disabled]) {\n color: var(--osdk-datetime-calendar-selected-color);\n }\n}\n\n.calendarDayButton.calendarToday {\n border: var(--osdk-datetime-calendar-today-border);\n}\n\n.calendarDayButton.calendarOutside {\n color: var(--osdk-datetime-calendar-outside-color);\n opacity: var(--osdk-datetime-calendar-outside-opacity);\n}\n\n.calendarDayButton.calendarDisabled {\n color: var(--osdk-datetime-calendar-disabled-color);\n cursor: default;\n\n &:hover {\n background: transparent;\n }\n}\n\n/* Range selection styles — shared base for start/end endpoints */\n.calendarRangeEndpoint {\n background: var(--osdk-datetime-calendar-selected-bg);\n color: var(--osdk-datetime-calendar-selected-color);\n\n &:hover:not([disabled]) {\n background: var(--osdk-datetime-calendar-selected-hover-bg);\n color: var(--osdk-datetime-calendar-selected-color);\n }\n\n &:active:not([disabled]) {\n color: var(--osdk-datetime-calendar-selected-color);\n }\n}\n\n/* Day buttons are inset by cell padding; paint the range on the table cell too\n so the range spans horizontal gaps while staying the same height as a day. */\n.calendarDay:has(.calendarRangeStart)::before,\n.calendarDay:has(.calendarRangeMiddle)::before,\n.calendarDay:has(.calendarRangeEnd)::before {\n content: \"\";\n position: absolute;\n inset-block: var(--osdk-datetime-calendar-gap);\n background: var(--osdk-datetime-calendar-range-middle-bg);\n pointer-events: none;\n}\n\n.calendarDay:has(.calendarRangeStart)::before {\n inset-inline-start: 50%;\n inset-inline-end: 0;\n}\n\n.calendarDay:has(.calendarRangeMiddle)::before {\n inset-inline: 0;\n}\n\n.calendarDay:has(.calendarRangeEnd)::before {\n inset-inline-start: 0;\n inset-inline-end: 50%;\n}\n\n.calendarDay:has(.calendarRangeStart.calendarRangeEnd)::before {\n content: none;\n}\n\n/* The table cell owns the translucent range fill. Keeping the middle button\n transparent avoids alpha-stacking the same token over itself. */\n.calendarDayButton.calendarRangeMiddle {\n background: transparent;\n color: var(--osdk-datetime-calendar-day-color);\n border-radius: 0;\n\n &:hover {\n background: transparent;\n color: var(--osdk-datetime-calendar-day-hover-color);\n }\n\n &:active {\n color: var(--osdk-datetime-calendar-day-hover-color);\n }\n}\n\n.calendarRangeFooter {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n column-gap: var(--osdk-datetime-calendar-months-gap);\n justify-items: center;\n padding-block-start: var(--osdk-time-picker-padding-top);\n}\n\n.calendarHidden {\n visibility: hidden;\n}\n\n/* Calendar navigation — dissolve the nav wrapper so buttons become\n direct flex children of the caption row. This lets order: -1 move\n the prev button before the dropdowns while next stays after. */\n.calendarNav {\n display: contents;\n}\n\n/* Shared nav button base — small, matching dropdown caret scale */\n.calendarNavButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--osdk-datetime-calendar-nav-button-size);\n height: var(--osdk-datetime-calendar-nav-button-size);\n border: none;\n background: transparent;\n cursor: pointer;\n border-radius: var(--osdk-datetime-calendar-nav-button-border-radius);\n padding: 0;\n color: inherit;\n\n &:hover {\n background: var(--osdk-datetime-calendar-nav-button-hover-bg);\n }\n\n &:disabled {\n color: var(--osdk-datetime-calendar-nav-disabled-color);\n cursor: default;\n opacity: 1; /* Override browser default disabled opacity */\n\n &:hover {\n background: transparent;\n }\n }\n\n &:focus-visible {\n outline: var(--osdk-datetime-calendar-focus-outline);\n outline-offset: -1px;\n }\n}\n\n/* Hide the default SVG chevron icon — Blueprint icons rendered inline instead */\n.calendarChevron {\n display: none;\n}\n\n.calendarNavPrev {\n order: -1;\n}\n\n.calendarMonthCaption {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: var(--osdk-datetime-calendar-nav-button-size);\n}\n\n/* Visually hidden — used for accessibility-only text (caption label, dropdown labels) */\n.calendarVhidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n\n/* Caption dropdowns container */\n.calendarCaptionDropdowns {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--osdk-datetime-calendar-caption-gap);\n}\n\n/* Month/year selects — borderless, matching caption text weight */\n.calendarDropdown {\n /* Native selects otherwise reserve room for the longest option, which makes\n the month caret drift away from short month names like \"May\". */\n field-sizing: content;\n font-family: var(--osdk-datetime-calendar-font-family);\n font-size: var(--osdk-datetime-calendar-caption-font-size);\n font-weight: var(--osdk-datetime-calendar-caption-font-weight);\n color: inherit;\n background: transparent;\n border: none;\n padding: var(--osdk-datetime-calendar-dropdown-padding);\n cursor: pointer;\n border-radius: var(--osdk-datetime-calendar-dropdown-border-radius);\n\n &:focus-visible {\n outline: var(--osdk-datetime-calendar-focus-outline);\n outline-offset: 1px;\n }\n}\n\n\n.calendarTimeFooter {\n display: flex;\n justify-content: center;\n padding-block-start: var(--osdk-time-picker-padding-top);\n}\n\n.calendarActionBar {\n display: flex;\n justify-content: space-between;\n gap: var(--osdk-surface-spacing);\n padding-block-start: var(--osdk-time-picker-padding-top);\n padding-inline: var(--osdk-datetime-popover-padding);\n margin-block-start: var(--osdk-time-picker-margin-top);\n margin-inline: calc(var(--osdk-datetime-popover-padding) * -1);\n border-block-start: var(--osdk-time-picker-border-top);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
min-height: var(--osdk-button-min-height);
|
|
4
4
|
padding: calc(var(--osdk-surface-spacing) * 1.5) calc(var(--osdk-surface-spacing) * 1.75);
|
|
5
5
|
border: var(--osdk-button-border);
|
|
6
|
-
border-radius: var(--osdk-
|
|
6
|
+
border-radius: var(--osdk-button-border-radius);
|
|
7
7
|
box-shadow: var(--osdk-button-shadow);
|
|
8
8
|
font-size: var(--osdk-typography-size-body-medium);
|
|
9
9
|
cursor: pointer;
|
|
@@ -313,4 +313,4 @@
|
|
|
313
313
|
margin-inline: calc(var(--osdk-datetime-popover-padding) * -1);
|
|
314
314
|
border-block-start: var(--osdk-time-picker-border-top);
|
|
315
315
|
}
|
|
316
|
-
/*# sourceMappingURL=DateRangeCalendar-
|
|
316
|
+
/*# sourceMappingURL=DateRangeCalendar-2C2XUXUS.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/base-components/action-button/ActionButton.module.css","../../src/shared/calendar/TimePicker.module.css","../../src/shared/calendar/DateCalendar.module.css"],"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\n.button {\n min-height: var(--osdk-button-min-height);\n padding: calc(var(--osdk-surface-spacing) * 1.5)\n calc(var(--osdk-surface-spacing) * 1.75);\n border: var(--osdk-button-border);\n border-radius: var(--osdk-button-border-radius);\n box-shadow: var(--osdk-button-shadow);\n font-size: var(--osdk-typography-size-body-medium);\n cursor: pointer;\n\n &:focus-visible {\n outline: var(--osdk-focus-outline);\n outline-offset: var(--osdk-focus-visible-outline-offset);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.secondaryButton {\n background-color: var(--osdk-button-secondary-bg);\n border-color: var(--osdk-button-secondary-border-color);\n color: var(--osdk-button-secondary-color);\n\n &:hover:not(:disabled) {\n background-color: var(--osdk-button-secondary-bg-hover);\n }\n\n &:active:not(:disabled) {\n background-color: var(--osdk-button-secondary-bg-active);\n }\n}\n\n.primaryButton {\n background-color: var(--osdk-button-primary-bg);\n border-color: var(--osdk-button-primary-border-color);\n color: var(--osdk-button-primary-color);\n\n &:hover:not(:disabled) {\n background-color: var(--osdk-button-primary-bg-hover);\n }\n\n &:active:not(:disabled) {\n background-color: var(--osdk-button-primary-bg-active);\n }\n}\n\n.minimalButton {\n background-color: var(--osdk-button-minimal-bg);\n border: var(--osdk-button-minimal-border);\n box-shadow: var(--osdk-button-minimal-shadow);\n color: var(--osdk-button-secondary-minimal-color);\n\n &:hover:not(:disabled) {\n background-color: var(--osdk-button-minimal-bg-hover);\n }\n\n &:active:not(:disabled) {\n background-color: var(--osdk-button-minimal-bg-active);\n }\n}\n\n.primaryButton.minimalButton {\n color: var(--osdk-button-primary-minimal-color);\n}\n","/* TimePicker — HH:mm control. Outer layout is owned by the parent. */\n\n.osdkTimePickerRoot {\n display: inline-flex;\n align-items: center;\n gap: var(--osdk-surface-spacing);\n}\n\n.osdkTimePickerInput {\n width: calc(var(--osdk-surface-spacing) * 10);\n font-family: var(--osdk-time-picker-input-font-family);\n font-size: var(--osdk-time-picker-input-font-size);\n line-height: var(\n --osdk-input-line-height,\n var(--osdk-typography-line-height-default)\n );\n text-align: center;\n padding: var(--osdk-time-picker-input-padding);\n border: var(--osdk-time-picker-input-border);\n border-radius: var(--osdk-time-picker-input-border-radius);\n background: var(--osdk-time-picker-input-bg);\n color: var(--osdk-time-picker-input-color);\n box-sizing: border-box;\n box-shadow: var(--osdk-time-picker-input-shadow);\n\n &:focus-visible {\n outline: var(--osdk-time-picker-input-focus-outline);\n outline-offset: var(--osdk-input-focus-outline-offset);\n box-shadow: var(--osdk-time-picker-input-focus-shadow);\n }\n\n &[aria-invalid] {\n box-shadow: var(--osdk-time-picker-input-shadow-error);\n }\n\n &[aria-invalid]:focus-visible {\n box-shadow: var(--osdk-time-picker-input-focus-shadow-error);\n }\n}\n\n.osdkTimePickerSeparator {\n color: var(--osdk-typography-color-muted);\n font-family: var(--osdk-time-picker-input-font-family);\n font-size: var(--osdk-time-picker-input-font-size);\n line-height: var(\n --osdk-input-line-height,\n var(--osdk-typography-line-height-default)\n );\n}\n","/* DateCalendar — DayPicker classNames.\n All values reference --osdk-datetime-calendar-* tokens defined in\n react-components-styles/tokens/datetime-picker.css. */\n\n.calendar {\n position: relative;\n width: 100%;\n font-family: var(--osdk-datetime-calendar-font-family);\n font-size: var(--osdk-datetime-calendar-font-size);\n}\n\n.calendarMonths {\n display: flex;\n gap: var(--osdk-datetime-calendar-months-gap);\n}\n\n.calendarMonthGrid {\n width: 100%;\n border-collapse: collapse;\n}\n\n.calendarWeekday {\n padding: var(--osdk-datetime-calendar-gap);\n font-size: var(--osdk-datetime-calendar-weekday-font-size);\n color: var(--osdk-datetime-calendar-weekday-color);\n text-align: center;\n width: var(--osdk-datetime-calendar-cell-size);\n}\n\n.calendarDay {\n position: relative;\n padding: var(--osdk-datetime-calendar-gap);\n text-align: center;\n}\n\n.calendarDayButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--osdk-datetime-calendar-cell-size);\n height: var(--osdk-datetime-calendar-cell-size);\n border: none;\n border-radius: var(--osdk-datetime-calendar-day-border-radius);\n background: transparent;\n cursor: pointer;\n font: inherit;\n color: var(--osdk-datetime-calendar-day-color);\n\n &:hover {\n background: var(--osdk-datetime-calendar-day-hover-bg);\n color: var(--osdk-datetime-calendar-day-hover-color);\n }\n\n &:active {\n background: var(--osdk-datetime-calendar-day-active-bg);\n color: var(--osdk-datetime-calendar-day-hover-color);\n }\n\n &:focus-visible {\n outline: var(--osdk-datetime-calendar-focus-outline);\n outline-offset: -2px;\n }\n}\n\n/* :not([disabled]) bumps specificity to (0,4,0) — matching rdp's default\n .rdp-button:hover:not([disabled]):not(.rdp-day_selected) rule so our\n styles win by source order. Without this, rdp overrides the selected\n background on hover because we remap day_selected and its :not() always matches. */\n.calendarDayButton.calendarSelected {\n background: var(--osdk-datetime-calendar-selected-bg);\n color: var(--osdk-datetime-calendar-selected-color);\n\n &:hover:not([disabled]) {\n background: var(--osdk-datetime-calendar-selected-hover-bg);\n color: var(--osdk-datetime-calendar-selected-color);\n }\n\n &:active:not([disabled]) {\n color: var(--osdk-datetime-calendar-selected-color);\n }\n}\n\n.calendarDayButton.calendarToday {\n border: var(--osdk-datetime-calendar-today-border);\n}\n\n.calendarDayButton.calendarOutside {\n color: var(--osdk-datetime-calendar-outside-color);\n opacity: var(--osdk-datetime-calendar-outside-opacity);\n}\n\n.calendarDayButton.calendarDisabled {\n color: var(--osdk-datetime-calendar-disabled-color);\n cursor: default;\n\n &:hover {\n background: transparent;\n }\n}\n\n/* Range selection styles — shared base for start/end endpoints */\n.calendarRangeEndpoint {\n background: var(--osdk-datetime-calendar-selected-bg);\n color: var(--osdk-datetime-calendar-selected-color);\n\n &:hover:not([disabled]) {\n background: var(--osdk-datetime-calendar-selected-hover-bg);\n color: var(--osdk-datetime-calendar-selected-color);\n }\n\n &:active:not([disabled]) {\n color: var(--osdk-datetime-calendar-selected-color);\n }\n}\n\n/* Day buttons are inset by cell padding; paint the range on the table cell too\n so the range spans horizontal gaps while staying the same height as a day. */\n.calendarDay:has(.calendarRangeStart)::before,\n.calendarDay:has(.calendarRangeMiddle)::before,\n.calendarDay:has(.calendarRangeEnd)::before {\n content: \"\";\n position: absolute;\n inset-block: var(--osdk-datetime-calendar-gap);\n background: var(--osdk-datetime-calendar-range-middle-bg);\n pointer-events: none;\n}\n\n.calendarDay:has(.calendarRangeStart)::before {\n inset-inline-start: 50%;\n inset-inline-end: 0;\n}\n\n.calendarDay:has(.calendarRangeMiddle)::before {\n inset-inline: 0;\n}\n\n.calendarDay:has(.calendarRangeEnd)::before {\n inset-inline-start: 0;\n inset-inline-end: 50%;\n}\n\n.calendarDay:has(.calendarRangeStart.calendarRangeEnd)::before {\n content: none;\n}\n\n/* The table cell owns the translucent range fill. Keeping the middle button\n transparent avoids alpha-stacking the same token over itself. */\n.calendarDayButton.calendarRangeMiddle {\n background: transparent;\n color: var(--osdk-datetime-calendar-day-color);\n border-radius: 0;\n\n &:hover {\n background: transparent;\n color: var(--osdk-datetime-calendar-day-hover-color);\n }\n\n &:active {\n color: var(--osdk-datetime-calendar-day-hover-color);\n }\n}\n\n.calendarRangeFooter {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n column-gap: var(--osdk-datetime-calendar-months-gap);\n justify-items: center;\n padding-block-start: var(--osdk-time-picker-padding-top);\n}\n\n.calendarHidden {\n visibility: hidden;\n}\n\n/* Calendar navigation — dissolve the nav wrapper so buttons become\n direct flex children of the caption row. This lets order: -1 move\n the prev button before the dropdowns while next stays after. */\n.calendarNav {\n display: contents;\n}\n\n/* Shared nav button base — small, matching dropdown caret scale */\n.calendarNavButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--osdk-datetime-calendar-nav-button-size);\n height: var(--osdk-datetime-calendar-nav-button-size);\n border: none;\n background: transparent;\n cursor: pointer;\n border-radius: var(--osdk-datetime-calendar-nav-button-border-radius);\n padding: 0;\n color: inherit;\n\n &:hover {\n background: var(--osdk-datetime-calendar-nav-button-hover-bg);\n }\n\n &:disabled {\n color: var(--osdk-datetime-calendar-nav-disabled-color);\n cursor: default;\n opacity: 1; /* Override browser default disabled opacity */\n\n &:hover {\n background: transparent;\n }\n }\n\n &:focus-visible {\n outline: var(--osdk-datetime-calendar-focus-outline);\n outline-offset: -1px;\n }\n}\n\n/* Hide the default SVG chevron icon — Blueprint icons rendered inline instead */\n.calendarChevron {\n display: none;\n}\n\n.calendarNavPrev {\n order: -1;\n}\n\n.calendarMonthCaption {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: var(--osdk-datetime-calendar-nav-button-size);\n}\n\n/* Visually hidden — used for accessibility-only text (caption label, dropdown labels) */\n.calendarVhidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n\n/* Caption dropdowns container */\n.calendarCaptionDropdowns {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--osdk-datetime-calendar-caption-gap);\n}\n\n/* Month/year selects — borderless, matching caption text weight */\n.calendarDropdown {\n /* Native selects otherwise reserve room for the longest option, which makes\n the month caret drift away from short month names like \"May\". */\n field-sizing: content;\n font-family: var(--osdk-datetime-calendar-font-family);\n font-size: var(--osdk-datetime-calendar-caption-font-size);\n font-weight: var(--osdk-datetime-calendar-caption-font-weight);\n color: inherit;\n background: transparent;\n border: none;\n padding: var(--osdk-datetime-calendar-dropdown-padding);\n cursor: pointer;\n border-radius: var(--osdk-datetime-calendar-dropdown-border-radius);\n\n &:focus-visible {\n outline: var(--osdk-datetime-calendar-focus-outline);\n outline-offset: 1px;\n }\n}\n\n\n.calendarTimeFooter {\n display: flex;\n justify-content: center;\n padding-block-start: var(--osdk-time-picker-padding-top);\n}\n\n.calendarActionBar {\n display: flex;\n justify-content: space-between;\n gap: var(--osdk-surface-spacing);\n padding-block-start: var(--osdk-time-picker-padding-top);\n padding-inline: var(--osdk-datetime-popover-padding);\n margin-block-start: var(--osdk-time-picker-margin-top);\n margin-inline: calc(var(--osdk-datetime-popover-padding) * -1);\n border-block-start: var(--osdk-time-picker-border-top);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk5ZFHOY66_cjs = require('./chunk-5ZFHOY66.cjs');
|
|
4
|
+
require('./chunk-FVTTRDL6.cjs');
|
|
5
|
+
require('./chunk-QP2LHBCZ.cjs');
|
|
6
|
+
require('./chunk-PZPCRXSV.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
module.exports = chunk5ZFHOY66_cjs.DateRangeCalendar;
|
|
11
|
+
//# sourceMappingURL=DateRangeCalendar-BB5YGWT5.cjs.map
|
|
12
|
+
//# sourceMappingURL=DateRangeCalendar-BB5YGWT5.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"DateRangeCalendar-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"DateRangeCalendar-BB5YGWT5.cjs"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkVOROB7KJ_cjs = require('./chunk-VOROB7KJ.cjs');
|
|
4
|
+
var chunkR25LDJLW_cjs = require('./chunk-R25LDJLW.cjs');
|
|
5
|
+
|
|
6
|
+
// src/public/experimental/image-viewer.ts
|
|
7
|
+
var ImageViewer2 = chunkR25LDJLW_cjs.withOsdkMetrics(chunkVOROB7KJ_cjs.ImageViewer, "ImageViewer");
|
|
8
|
+
|
|
9
|
+
exports.ImageViewer = ImageViewer2;
|
|
10
|
+
//# sourceMappingURL=chunk-44IN42AN.cjs.map
|
|
11
|
+
//# sourceMappingURL=chunk-44IN42AN.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/public/experimental/image-viewer.ts"],"names":["ImageViewer","withOsdkMetrics"],"mappings":";;;;;;AAqBO,IAAMA,YAAAA,GAAcC,iCAAA,CAAgBD,6BAAA,EAAc,aAAa","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../../src/public/experimental/image-viewer.ts"],"names":["ImageViewer","withOsdkMetrics"],"mappings":";;;;;;AAqBO,IAAMA,YAAAA,GAAcC,iCAAA,CAAgBD,6BAAA,EAAc,aAAa","file":"chunk-44IN42AN.cjs","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\n// BaseImageViewer\nexport { BaseImageViewer } from \"../../images/image-viewer/BaseImageViewer.js\";\n// ImageViewer (Media wrapper)\nimport { ImageViewer as _ImageViewer } from \"../../images/image-viewer/ImageViewer.js\";\nimport { withOsdkMetrics } from \"../../util/withOsdkMetrics.js\";\nexport const ImageViewer = withOsdkMetrics(_ImageViewer, \"ImageViewer\");"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkOUJQJQ7N_cjs = require('./chunk-OUJQJQ7N.cjs');
|
|
4
|
+
var chunkR25LDJLW_cjs = require('./chunk-R25LDJLW.cjs');
|
|
5
|
+
|
|
6
|
+
// src/public/experimental/xml-viewer.ts
|
|
7
|
+
var XmlViewer2 = chunkR25LDJLW_cjs.withOsdkMetrics(chunkOUJQJQ7N_cjs.XmlViewer, "XmlViewer");
|
|
8
|
+
|
|
9
|
+
exports.XmlViewer = XmlViewer2;
|
|
10
|
+
//# sourceMappingURL=chunk-4SCRUDJM.cjs.map
|
|
11
|
+
//# sourceMappingURL=chunk-4SCRUDJM.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/public/experimental/xml-viewer.ts"],"names":["XmlViewer","withOsdkMetrics"],"mappings":";;;;;;AAqBO,IAAMA,UAAAA,GAAYC,iCAAA,CAAgBD,2BAAA,EAAY,WAAW","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../../src/public/experimental/xml-viewer.ts"],"names":["XmlViewer","withOsdkMetrics"],"mappings":";;;;;;AAqBO,IAAMA,UAAAA,GAAYC,iCAAA,CAAgBD,2BAAA,EAAY,WAAW","file":"chunk-4SCRUDJM.cjs","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\n// BaseXmlViewer\nexport { BaseXmlViewer } from \"../../xml-viewer/BaseXmlViewer.js\";\n// XmlViewer (Media wrapper)\nimport { withOsdkMetrics } from \"../../util/withOsdkMetrics.js\";\nimport { XmlViewer as _XmlViewer } from \"../../xml-viewer/XmlViewer.js\";\nexport const XmlViewer = withOsdkMetrics(_XmlViewer, \"XmlViewer\");"]}
|