@astryxdesign/cli 0.1.2-canary.2532766 → 0.1.2-canary.3063e75
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/package.json +7 -7
- package/src/codemods/transforms/v0.0.15/index.mjs +0 -13
- package/src/codemods/transforms/v0.1.0/__tests__/v0.1.0-ordering.test.mjs +81 -0
- package/src/codemods/transforms/{v0.0.15 → v0.1.0}/drop-xds-prefix-imports.mjs +15 -4
- package/src/codemods/transforms/v0.1.0/index.mjs +18 -0
- package/templates/blocks/components/DateRangeInput/DateRangeInputWithPresets.doc.mjs +14 -0
- package/templates/blocks/components/DateRangeInput/DateRangeInputWithPresets.tsx +46 -0
- package/templates/blocks/components/DateRangeInput/DateRangeInputWithValidation.doc.mjs +14 -0
- package/templates/blocks/components/DateRangeInput/DateRangeInputWithValidation.tsx +52 -0
- package/templates/blocks/components/DateTimeInput/DateTimeInputWithValidation.doc.mjs +14 -0
- package/templates/blocks/components/DateTimeInput/DateTimeInputWithValidation.tsx +43 -0
- /package/src/codemods/transforms/{v0.0.15 → v0.1.0}/__tests__/drop-xds-prefix-imports.test.mjs +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astryxdesign/cli",
|
|
3
|
-
"version": "0.1.2-canary.
|
|
3
|
+
"version": "0.1.2-canary.3063e75",
|
|
4
4
|
"displayName": "CLI",
|
|
5
5
|
"description": "Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.",
|
|
6
6
|
"author": "Meta Open Source",
|
|
@@ -75,9 +75,9 @@
|
|
|
75
75
|
"zod": "^4.4.3"
|
|
76
76
|
},
|
|
77
77
|
"peerDependencies": {
|
|
78
|
-
"@astryxdesign/core": "0.1.2-canary.
|
|
79
|
-
"@astryxdesign/lab": "0.1.2-canary.
|
|
80
|
-
"@astryxdesign/theme-neutral": "0.1.2-canary.
|
|
78
|
+
"@astryxdesign/core": "0.1.2-canary.3063e75",
|
|
79
|
+
"@astryxdesign/lab": "0.1.2-canary.3063e75",
|
|
80
|
+
"@astryxdesign/theme-neutral": "0.1.2-canary.3063e75",
|
|
81
81
|
"gpt-tokenizer": "^2.0.0"
|
|
82
82
|
},
|
|
83
83
|
"peerDependenciesMeta": {
|
|
@@ -92,9 +92,9 @@
|
|
|
92
92
|
}
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
|
-
"@astryxdesign/core": "0.1.2-canary.
|
|
96
|
-
"@astryxdesign/lab": "0.1.2-canary.
|
|
97
|
-
"@astryxdesign/theme-neutral": "0.1.2-canary.
|
|
95
|
+
"@astryxdesign/core": "0.1.2-canary.3063e75",
|
|
96
|
+
"@astryxdesign/lab": "0.1.2-canary.3063e75",
|
|
97
|
+
"@astryxdesign/theme-neutral": "0.1.2-canary.3063e75",
|
|
98
98
|
"gpt-tokenizer": "^2.0.0"
|
|
99
99
|
},
|
|
100
100
|
"scripts": {
|
|
@@ -34,10 +34,6 @@ import migrateSelectorChildrenToRenderOption, {
|
|
|
34
34
|
meta as migrateSelectorChildrenToRenderOptionMeta,
|
|
35
35
|
} from './migrate-selector-children-to-render-option.mjs';
|
|
36
36
|
|
|
37
|
-
import dropXdsPrefixImports, {
|
|
38
|
-
meta as dropXdsPrefixImportsMeta,
|
|
39
|
-
} from './drop-xds-prefix-imports.mjs';
|
|
40
|
-
|
|
41
37
|
export default [
|
|
42
38
|
{
|
|
43
39
|
name: 'rename-date-picker-to-input',
|
|
@@ -75,13 +71,4 @@ export default [
|
|
|
75
71
|
transform: migrateSelectorChildrenToRenderOption,
|
|
76
72
|
meta: migrateSelectorChildrenToRenderOptionMeta,
|
|
77
73
|
},
|
|
78
|
-
{
|
|
79
|
-
// XDS-prefix migration (P2380608025). Optional + not tied to a version
|
|
80
|
-
// bump: consumers run it explicitly during their migration, e.g.
|
|
81
|
-
// astryx upgrade --codemod drop-xds-prefix-imports --codemod-only --apply
|
|
82
|
-
name: 'drop-xds-prefix-imports',
|
|
83
|
-
transform: dropXdsPrefixImports,
|
|
84
|
-
meta: dropXdsPrefixImportsMeta,
|
|
85
|
-
optional: true,
|
|
86
|
-
},
|
|
87
74
|
];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect} from 'vitest';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* End-to-end test proving the v0.1.0 manifest ordering: the prefix-drop
|
|
7
|
+
* codemod runs BEFORE migrate-xds-module-specifiers, so a prefixed identifier
|
|
8
|
+
* imported from `@xds/core` is un-prefixed AND the module path is rewritten to
|
|
9
|
+
* `@astryxdesign/core` in a single upgrade pass.
|
|
10
|
+
*/
|
|
11
|
+
async function applyManifestInOrder(source, filePath = 'test.tsx') {
|
|
12
|
+
const {default: manifest} = await import('../index.mjs');
|
|
13
|
+
const jscodeshift = (await import('jscodeshift')).default;
|
|
14
|
+
const j = jscodeshift.withParser('tsx');
|
|
15
|
+
const api = {jscodeshift: j, stats: () => {}, report: () => {}};
|
|
16
|
+
|
|
17
|
+
let current = source;
|
|
18
|
+
for (const {transform} of manifest) {
|
|
19
|
+
const file = {source: current, path: filePath};
|
|
20
|
+
const result = transform(file, api);
|
|
21
|
+
current = result ?? current;
|
|
22
|
+
}
|
|
23
|
+
return current;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe('v0.1.0 codemod manifest ordering', () => {
|
|
27
|
+
it('runs drop-xds-prefix-imports before migrate-xds-module-specifiers', async () => {
|
|
28
|
+
const {default: manifest} = await import('../index.mjs');
|
|
29
|
+
const names = manifest.map(entry => entry.name);
|
|
30
|
+
const prefixDropIdx = names.indexOf('drop-xds-prefix-imports');
|
|
31
|
+
const specifierIdx = names.indexOf('migrate-xds-module-specifiers');
|
|
32
|
+
expect(prefixDropIdx).toBeGreaterThanOrEqual(0);
|
|
33
|
+
expect(specifierIdx).toBeGreaterThanOrEqual(0);
|
|
34
|
+
expect(prefixDropIdx).toBeLessThan(specifierIdx);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('drop-xds-prefix-imports is mandatory (not optional) in v0.1.0', async () => {
|
|
38
|
+
const {default: manifest} = await import('../index.mjs');
|
|
39
|
+
const entry = manifest.find(e => e.name === 'drop-xds-prefix-imports');
|
|
40
|
+
expect(entry).toBeDefined();
|
|
41
|
+
expect(entry.optional).toBeFalsy();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('un-prefixes useXDSTheme from @xds/core/theme AND renames the scope to @astryxdesign', async () => {
|
|
45
|
+
const input = [
|
|
46
|
+
"import {useXDSTheme} from '@xds/core/theme';",
|
|
47
|
+
'',
|
|
48
|
+
'function App() {',
|
|
49
|
+
' const theme = useXDSTheme();',
|
|
50
|
+
' return theme;',
|
|
51
|
+
'}',
|
|
52
|
+
].join('\n');
|
|
53
|
+
|
|
54
|
+
const output = await applyManifestInOrder(input);
|
|
55
|
+
|
|
56
|
+
expect(output).toMatch(/import\s*\{useTheme\}\s*from\s*['"]@astryxdesign\/core\/theme['"]/);
|
|
57
|
+
expect(output).toContain('const theme = useTheme();');
|
|
58
|
+
// The prefixed name and old scope must be fully gone.
|
|
59
|
+
expect(output).not.toContain('useXDSTheme');
|
|
60
|
+
expect(output).not.toContain('@xds/core');
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('un-prefixes XDSButton and XDSIconRegistry alongside the scope rename', async () => {
|
|
64
|
+
const input = [
|
|
65
|
+
"import {XDSButton, XDSIconRegistry} from '@xds/core';",
|
|
66
|
+
'',
|
|
67
|
+
'const registry = new XDSIconRegistry();',
|
|
68
|
+
'const el = <XDSButton />;',
|
|
69
|
+
].join('\n');
|
|
70
|
+
|
|
71
|
+
const output = await applyManifestInOrder(input);
|
|
72
|
+
|
|
73
|
+
expect(output).toMatch(/from\s*['"]@astryxdesign\/core['"]/);
|
|
74
|
+
expect(output).toContain('Button');
|
|
75
|
+
expect(output).toContain('IconRegistry');
|
|
76
|
+
expect(output).toContain('new IconRegistry()');
|
|
77
|
+
expect(output).not.toContain('XDSButton');
|
|
78
|
+
expect(output).not.toContain('XDSIconRegistry');
|
|
79
|
+
expect(output).not.toContain('@xds/core');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -4,12 +4,23 @@
|
|
|
4
4
|
* @file Codemod: Drop the `XDS` prefix from @xds/core imports and their usages
|
|
5
5
|
*
|
|
6
6
|
* Part of the XDS-prefix migration (P2380608025). Rewrites consumer code from
|
|
7
|
-
* the prefixed names to
|
|
7
|
+
* the prefixed names to their bare equivalents:
|
|
8
8
|
*
|
|
9
9
|
* XDSButton -> Button
|
|
10
10
|
* XDSButtonProps -> ButtonProps
|
|
11
11
|
* useXDSTheme -> useTheme
|
|
12
12
|
* useXDSToast -> useToast
|
|
13
|
+
* XDSIconRegistry-> IconRegistry
|
|
14
|
+
*
|
|
15
|
+
* Mandatory in v0.1.0: the prefixed compatibility aliases (which made both
|
|
16
|
+
* prefixed and bare names valid during the 0.0.x compat window) were dropped
|
|
17
|
+
* in v0.1.0, so the un-prefixing is now required for code to keep type-
|
|
18
|
+
* checking against @astryxdesign/core.
|
|
19
|
+
*
|
|
20
|
+
* Ordering: within the v0.1.0 manifest this runs BEFORE
|
|
21
|
+
* migrate-xds-module-specifiers so it still matches `@xds/core` imports (its
|
|
22
|
+
* source matcher) and un-prefixes the identifiers first; the specifier codemod
|
|
23
|
+
* then rewrites the module paths `@xds/*` -> `@astryxdesign/*`.
|
|
13
24
|
*
|
|
14
25
|
* Safety: this codemod ONLY renames identifiers that are imported from
|
|
15
26
|
* `@xds/core` (bare or subpath, e.g. `@xds/core/Button`). It tracks the local
|
|
@@ -36,9 +47,9 @@ export const meta = {
|
|
|
36
47
|
title: 'Drop XDS prefix from @xds/core imports (XDSButton -> Button)',
|
|
37
48
|
description:
|
|
38
49
|
'Rewrites @xds/core imports and their usages from the prefixed names ' +
|
|
39
|
-
'(XDSButton, useXDSTheme, XDSButtonProps) to
|
|
40
|
-
'
|
|
41
|
-
'from @xds/core, leaving unrelated identifiers untouched.',
|
|
50
|
+
'(XDSButton, useXDSTheme, XDSIconRegistry, XDSButtonProps) to their bare ' +
|
|
51
|
+
'names (Button, useTheme, IconRegistry, ButtonProps). Only renames ' +
|
|
52
|
+
'bindings imported from @xds/core, leaving unrelated identifiers untouched.',
|
|
42
53
|
pr: '#2880',
|
|
43
54
|
};
|
|
44
55
|
|
|
@@ -6,11 +6,29 @@
|
|
|
6
6
|
* Lists all codemods for the v0.1.0 release in the order they should run.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import dropXdsPrefixImports, {
|
|
10
|
+
meta as dropXdsPrefixImportsMeta,
|
|
11
|
+
} from './drop-xds-prefix-imports.mjs';
|
|
12
|
+
|
|
9
13
|
import migrateXdsModuleSpecifiers, {
|
|
10
14
|
meta as migrateXdsModuleSpecifiersMeta,
|
|
11
15
|
} from './migrate-xds-module-specifiers.mjs';
|
|
12
16
|
|
|
13
17
|
export default [
|
|
18
|
+
{
|
|
19
|
+
// XDS-prefix migration (P2380608025). Mandatory in v0.1.0: the release
|
|
20
|
+
// dropped the prefixed compatibility aliases (useXDSTheme, XDSButton,
|
|
21
|
+
// XDSIconRegistry, ...), so consumers upgrading from 0.0.x MUST rewrite
|
|
22
|
+
// prefixed imports to their bare names.
|
|
23
|
+
//
|
|
24
|
+
// Ordered BEFORE migrate-xds-module-specifiers so it sees `@xds/core`
|
|
25
|
+
// imports (its source matcher) and un-prefixes the identifiers first;
|
|
26
|
+
// the specifier codemod then rewrites the paths to `@astryxdesign/core`.
|
|
27
|
+
// The runner preserves this array order (see runner.mjs).
|
|
28
|
+
name: 'drop-xds-prefix-imports',
|
|
29
|
+
transform: dropXdsPrefixImports,
|
|
30
|
+
meta: dropXdsPrefixImportsMeta,
|
|
31
|
+
},
|
|
14
32
|
{
|
|
15
33
|
name: 'migrate-xds-module-specifiers',
|
|
16
34
|
transform: migrateXdsModuleSpecifiers,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../../../../../core/src/docs-types').TemplateDoc} */
|
|
4
|
+
export const doc = {
|
|
5
|
+
type: 'block',
|
|
6
|
+
exampleFor: 'DateRangeInput',
|
|
7
|
+
name: 'DateRangeInput — With Presets',
|
|
8
|
+
displayName: 'DateRangeInput — With Presets',
|
|
9
|
+
description:
|
|
10
|
+
'Date range picker with quick-select presets for common periods. Use for analytics dashboards, report filters, or any context where users frequently select standard time windows.',
|
|
11
|
+
isReady: true,
|
|
12
|
+
aspectRatio: 4 / 3,
|
|
13
|
+
componentsUsed: ['DateRangeInput', 'Layout', 'Text'],
|
|
14
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
import {useState} from 'react';
|
|
6
|
+
import {DateRangeInput} from '@astryxdesign/core/DateRangeInput';
|
|
7
|
+
import type {DateRange} from '@astryxdesign/core/DateRangeInput';
|
|
8
|
+
import type {ISODateString} from '@astryxdesign/core/Calendar';
|
|
9
|
+
import {Stack} from '@astryxdesign/core/Layout';
|
|
10
|
+
import {Text} from '@astryxdesign/core/Text';
|
|
11
|
+
|
|
12
|
+
function daysAgo(n: number): ISODateString {
|
|
13
|
+
const d = new Date();
|
|
14
|
+
d.setDate(d.getDate() - n);
|
|
15
|
+
return d.toISOString().slice(0, 10) as ISODateString;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function today(): ISODateString {
|
|
19
|
+
return new Date().toISOString().slice(0, 10) as ISODateString;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const presets = [
|
|
23
|
+
{label: 'Last 7 days', getRange: () => ({start: daysAgo(7), end: today()})},
|
|
24
|
+
{label: 'Last 14 days', getRange: () => ({start: daysAgo(14), end: today()})},
|
|
25
|
+
{label: 'Last 30 days', getRange: () => ({start: daysAgo(30), end: today()})},
|
|
26
|
+
{label: 'Last 90 days', getRange: () => ({start: daysAgo(90), end: today()})},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
export default function DateRangeInputWithPresets() {
|
|
30
|
+
const [range, setRange] = useState<DateRange | null>(null);
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<Stack direction="vertical" gap={4} width="100%" style={{maxWidth: 400}}>
|
|
34
|
+
<Text type="supporting" color="secondary">
|
|
35
|
+
{range ? `${range.start} → ${range.end}` : 'No range selected'}
|
|
36
|
+
</Text>
|
|
37
|
+
<DateRangeInput
|
|
38
|
+
label="Report period"
|
|
39
|
+
description="Use a preset or pick a custom range"
|
|
40
|
+
value={range}
|
|
41
|
+
onChange={setRange}
|
|
42
|
+
presets={presets}
|
|
43
|
+
/>
|
|
44
|
+
</Stack>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../../../../../core/src/docs-types').TemplateDoc} */
|
|
4
|
+
export const doc = {
|
|
5
|
+
type: 'block',
|
|
6
|
+
exampleFor: 'DateRangeInput',
|
|
7
|
+
name: 'DateRangeInput — Validation',
|
|
8
|
+
displayName: 'DateRangeInput — Validation',
|
|
9
|
+
description:
|
|
10
|
+
'Date range input in all three status states: error, warning, and success. Use to surface booking conflicts, flag high-demand periods, or confirm an available range.',
|
|
11
|
+
isReady: true,
|
|
12
|
+
aspectRatio: 4 / 3,
|
|
13
|
+
componentsUsed: ['DateRangeInput', 'Layout'],
|
|
14
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
import {useState} from 'react';
|
|
6
|
+
import {DateRangeInput} from '@astryxdesign/core/DateRangeInput';
|
|
7
|
+
import type {DateRange} from '@astryxdesign/core/DateRangeInput';
|
|
8
|
+
import {Stack} from '@astryxdesign/core/Layout';
|
|
9
|
+
|
|
10
|
+
export default function DateRangeInputWithValidation() {
|
|
11
|
+
const [errorRange, setErrorRange] = useState<DateRange | null>({
|
|
12
|
+
start: '2026-01-01',
|
|
13
|
+
end: '2026-01-31',
|
|
14
|
+
});
|
|
15
|
+
const [warningRange, setWarningRange] = useState<DateRange | null>({
|
|
16
|
+
start: '2026-06-01',
|
|
17
|
+
end: '2026-06-30',
|
|
18
|
+
});
|
|
19
|
+
const [successRange, setSuccessRange] = useState<DateRange | null>({
|
|
20
|
+
start: '2026-03-01',
|
|
21
|
+
end: '2026-03-31',
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<Stack direction="vertical" gap={4} width="100%" style={{maxWidth: 400}}>
|
|
26
|
+
<DateRangeInput
|
|
27
|
+
label="Booking period"
|
|
28
|
+
value={errorRange}
|
|
29
|
+
onChange={setErrorRange}
|
|
30
|
+
status={{
|
|
31
|
+
type: 'error',
|
|
32
|
+
message: 'Selected dates are no longer available',
|
|
33
|
+
}}
|
|
34
|
+
/>
|
|
35
|
+
<DateRangeInput
|
|
36
|
+
label="Preferred period"
|
|
37
|
+
value={warningRange}
|
|
38
|
+
onChange={setWarningRange}
|
|
39
|
+
status={{
|
|
40
|
+
type: 'warning',
|
|
41
|
+
message: 'High demand — limited availability',
|
|
42
|
+
}}
|
|
43
|
+
/>
|
|
44
|
+
<DateRangeInput
|
|
45
|
+
label="Confirmed period"
|
|
46
|
+
value={successRange}
|
|
47
|
+
onChange={setSuccessRange}
|
|
48
|
+
status={{type: 'success', message: 'Dates confirmed and available'}}
|
|
49
|
+
/>
|
|
50
|
+
</Stack>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('../../../../../core/src/docs-types').TemplateDoc} */
|
|
4
|
+
export const doc = {
|
|
5
|
+
type: 'block',
|
|
6
|
+
exampleFor: 'DateTimeInput',
|
|
7
|
+
name: 'DateTimeInput — Validation',
|
|
8
|
+
displayName: 'DateTimeInput — Validation',
|
|
9
|
+
description:
|
|
10
|
+
'DateTimeInput in all three status states: error, warning, and success. Use to surface scheduling conflicts, caution the user about edge cases, or confirm a valid datetime.',
|
|
11
|
+
isReady: true,
|
|
12
|
+
aspectRatio: 4 / 3,
|
|
13
|
+
componentsUsed: ['DateTimeInput', 'Layout'],
|
|
14
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
import {useState} from 'react';
|
|
6
|
+
import {DateTimeInput} from '@astryxdesign/core/DateTimeInput';
|
|
7
|
+
import type {ISODateTimeString} from '@astryxdesign/core/DateTimeInput';
|
|
8
|
+
import {Stack} from '@astryxdesign/core/Layout';
|
|
9
|
+
|
|
10
|
+
export default function DateTimeInputWithValidation() {
|
|
11
|
+
const [errorVal, setErrorVal] = useState<ISODateTimeString | undefined>(
|
|
12
|
+
'2026-01-25T09:00' as ISODateTimeString,
|
|
13
|
+
);
|
|
14
|
+
const [warningVal, setWarningVal] = useState<ISODateTimeString | undefined>(
|
|
15
|
+
'2026-12-25T14:00' as ISODateTimeString,
|
|
16
|
+
);
|
|
17
|
+
const [successVal, setSuccessVal] = useState<ISODateTimeString | undefined>(
|
|
18
|
+
'2026-03-10T10:30' as ISODateTimeString,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<Stack direction="vertical" gap={4} width="100%" style={{maxWidth: 400}}>
|
|
23
|
+
<DateTimeInput
|
|
24
|
+
label="Meeting time"
|
|
25
|
+
value={errorVal}
|
|
26
|
+
onChange={setErrorVal}
|
|
27
|
+
status={{type: 'error', message: 'This time slot is already booked'}}
|
|
28
|
+
/>
|
|
29
|
+
<DateTimeInput
|
|
30
|
+
label="Preferred time"
|
|
31
|
+
value={warningVal}
|
|
32
|
+
onChange={setWarningVal}
|
|
33
|
+
status={{type: 'warning', message: 'This falls outside business hours'}}
|
|
34
|
+
/>
|
|
35
|
+
<DateTimeInput
|
|
36
|
+
label="Start time"
|
|
37
|
+
value={successVal}
|
|
38
|
+
onChange={setSuccessVal}
|
|
39
|
+
status={{type: 'success', message: 'Time confirmed'}}
|
|
40
|
+
/>
|
|
41
|
+
</Stack>
|
|
42
|
+
);
|
|
43
|
+
}
|
/package/src/codemods/transforms/{v0.0.15 → v0.1.0}/__tests__/drop-xds-prefix-imports.test.mjs
RENAMED
|
File without changes
|