@astryxdesign/core 0.7.1-canary.ff40b78 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +116 -0
- package/dist/Button/Button.d.ts +1 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +5 -2
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +191 -32
- package/dist/Chat/ChatComposerInput.d.ts +9 -0
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +5 -0
- package/dist/Chat/ChatMessage.d.ts +11 -0
- package/dist/Chat/ChatMessage.d.ts.map +1 -1
- package/dist/Chat/ChatMessage.js +18 -9
- package/dist/Chat/useTriggerMenu.d.ts +9 -2
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +222 -50
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +158 -38
- package/dist/CodeBlock/tokenizer.d.ts +39 -0
- package/dist/CodeBlock/tokenizer.d.ts.map +1 -1
- package/dist/CodeBlock/tokenizer.js +108 -0
- package/dist/CommandPalette/CommandPalette.d.ts +9 -5
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +38 -20
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts +4 -3
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +4 -3
- package/dist/CommandPalette/CommandPaletteInput.d.ts +5 -4
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +35 -18
- package/dist/CommandPalette/CommandPaletteItem.d.ts +11 -6
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +8 -9
- package/dist/CommandPalette/CommandPaletteList.d.ts +4 -2
- package/dist/CommandPalette/CommandPaletteList.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteList.js +10 -5
- package/dist/ComplexSelector/ComplexSelector.d.ts +8 -5
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +12 -3
- package/dist/ContextMenu/ContextMenu.d.ts +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +62 -48
- package/dist/DateInput/DateInput.js +1 -1
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +12 -4
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +12 -2
- package/dist/Dialog/Dialog.d.ts +1 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +16 -5
- package/dist/Dialog/DialogHeader.d.ts +1 -1
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +7 -7
- package/dist/Divider/Divider.d.ts +1 -0
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +5 -4
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +161 -65
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +7 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +12 -5
- package/dist/Field/InputClearButton.d.ts +8 -4
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +23 -7
- package/dist/FormLayout/FormLayout.d.ts.map +1 -1
- package/dist/FormLayout/FormLayout.js +1 -0
- package/dist/Grid/Grid.d.ts +13 -4
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +7 -1
- package/dist/HoverCard/useHoverCard.d.ts +1 -1
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +67 -49
- package/dist/InputGroup/InputGroup.d.ts +2 -4
- package/dist/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/InputGroup/InputGroup.js +2 -4
- package/dist/InputGroup/groupStyles.d.ts +10 -2
- package/dist/InputGroup/groupStyles.d.ts.map +1 -1
- package/dist/InputGroup/groupStyles.js +19 -2
- package/dist/Layer/useLayerDismissal.d.ts +9 -9
- package/dist/Layer/useLayerDismissal.js +9 -9
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +25 -4
- package/dist/MobileNav/MobileNav.d.ts +7 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +45 -2
- package/dist/MultiSelector/MultiSelector.d.ts +7 -4
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +24 -3
- package/dist/NumberInput/NumberInput.js +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +6 -0
- package/dist/Resizable/ResizeHandle.d.ts +1 -1
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +83 -15
- package/dist/Resizable/useResizable.d.ts +23 -0
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +78 -0
- package/dist/Selector/Selector.d.ts +6 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +28 -6
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +10 -2
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +18 -7
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +16 -4
- package/dist/Toolbar/Toolbar.d.ts +2 -1
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +3 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +6 -3
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +7 -1
- package/dist/astryx.css +22 -0
- package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
- package/dist/hooks/useScrollOverflow.js +55 -12
- package/dist/hooks/useTreeFocus.d.ts +21 -0
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +40 -2
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +3 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +3 -0
- package/dist/reset.a11y.chromium.spec.js +6 -1
- package/dist/reset.until-found.a11y.browser.spec.d.ts +2 -0
- package/dist/reset.until-found.a11y.browser.spec.d.ts.map +1 -0
- package/dist/reset.until-found.a11y.browser.spec.js +71 -0
- package/dist/theme/syntax/SyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/SyntaxTheme.js +43 -2
- package/dist/theme/syntax/defineSyntaxTheme.d.ts +18 -5
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +38 -9
- package/dist/theme/syntax/index.d.ts +1 -1
- package/dist/theme/syntax/index.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.d.ts +12 -2
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +25 -4
- package/dist/utils/plainDate.d.ts +12 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +63 -10
- package/locales/en.json +13 -1
- package/locales/pseudo.json +9 -0
- package/package.json +4 -4
- package/src/AlertDialog/AlertDialog.doc.mjs +6 -0
- package/src/AlertDialog/AlertDialog.spec.md +205 -0
- package/src/AlertDialog/AlertDialog.test.tsx +3 -14
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +115 -0
- package/src/AlertDialog/__tests__/AlertDialog.a11y.renders.tsx +52 -0
- package/src/AlertDialog/__tests__/AlertDialog.a11y.states.ts +68 -0
- package/src/AlertDialog/__tests__/AlertDialog.a11y.test.tsx +144 -0
- package/src/Button/Button.test.tsx +37 -0
- package/src/Button/Button.tsx +5 -1
- package/src/Calendar/Calendar.doc.mjs +234 -60
- package/src/Calendar/Calendar.spec.md +209 -0
- package/src/Calendar/Calendar.test.tsx +559 -20
- package/src/Calendar/Calendar.tsx +258 -41
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +126 -0
- package/src/Calendar/__tests__/Calendar.a11y.known-failures.ts +12 -0
- package/src/Calendar/__tests__/Calendar.a11y.renders.tsx +57 -0
- package/src/Calendar/__tests__/Calendar.a11y.states.ts +139 -0
- package/src/Calendar/__tests__/Calendar.a11y.test.tsx +137 -0
- package/src/Carousel/Carousel.test.tsx +54 -71
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +192 -0
- package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +27 -0
- package/src/Carousel/__tests__/Carousel.a11y.renders.tsx +39 -0
- package/src/Carousel/__tests__/Carousel.a11y.states.ts +139 -0
- package/src/Carousel/__tests__/Carousel.a11y.test.tsx +127 -0
- package/src/Chat/ChatComposerInput.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.spec.md +94 -55
- package/src/Chat/ChatComposerInput.test.tsx +202 -1
- package/src/Chat/ChatComposerInput.tsx +13 -0
- package/src/Chat/ChatMessage.doc.mjs +31 -16
- package/src/Chat/ChatMessage.spec.md +265 -0
- package/src/Chat/ChatMessage.test.tsx +246 -0
- package/src/Chat/ChatMessage.tsx +30 -7
- package/src/Chat/ChatSystemMessage.spec.md +36 -37
- package/src/Chat/ChatSystemMessage.test.tsx +4 -4
- package/src/Chat/useTriggerMenu.test.tsx +994 -0
- package/src/Chat/useTriggerMenu.tsx +278 -46
- package/src/CodeBlock/CodeBlock.doc.mjs +7 -0
- package/src/CodeBlock/CodeBlock.spec.md +40 -41
- package/src/CodeBlock/CodeBlock.test.tsx +89 -9
- package/src/CodeBlock/CodeBlock.tsx +205 -25
- package/src/CodeBlock/__tests__/CodeBlockOverflowStop.a11y.chromium.spec.ts +125 -0
- package/src/CodeBlock/__tests__/DiffRowPaint.a11y.chromium.spec.ts +93 -0
- package/src/CodeBlock/tokenizer.test.ts +112 -0
- package/src/CodeBlock/tokenizer.ts +106 -0
- package/src/Collapsible/CollapsibleGroup.spec.md +17 -8
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.renders.tsx +45 -0
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.states.ts +139 -0
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.test.tsx +135 -0
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +128 -0
- package/src/CommandPalette/CommandPalette.doc.mjs +126 -23
- package/src/CommandPalette/CommandPalette.spec.md +100 -49
- package/src/CommandPalette/CommandPalette.test.tsx +241 -2
- package/src/CommandPalette/CommandPalette.tsx +47 -21
- package/src/CommandPalette/CommandPaletteEmpty.tsx +4 -3
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +61 -4
- package/src/CommandPalette/CommandPaletteInput.spec.md +215 -0
- package/src/CommandPalette/CommandPaletteInput.test.tsx +375 -51
- package/src/CommandPalette/CommandPaletteInput.tsx +74 -21
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +73 -22
- package/src/CommandPalette/CommandPaletteItem.spec.md +223 -0
- package/src/CommandPalette/CommandPaletteItem.test.tsx +200 -5
- package/src/CommandPalette/CommandPaletteItem.tsx +16 -11
- package/src/CommandPalette/CommandPaletteList.doc.mjs +3 -3
- package/src/CommandPalette/CommandPaletteList.spec.md +41 -36
- package/src/CommandPalette/CommandPaletteList.test.tsx +80 -0
- package/src/CommandPalette/CommandPaletteList.tsx +10 -5
- package/src/CommandPalette/__tests__/CommandPalette.a11y.chromium.spec.ts +599 -0
- package/src/ComplexSelector/ComplexSelector.doc.mjs +10 -8
- package/src/ComplexSelector/ComplexSelector.spec.md +14 -9
- package/src/ComplexSelector/ComplexSelector.test.tsx +64 -16
- package/src/ComplexSelector/ComplexSelector.tsx +37 -8
- package/src/ContextMenu/ContextMenu.doc.mjs +6 -0
- package/src/ContextMenu/ContextMenu.spec.md +51 -53
- package/src/ContextMenu/ContextMenu.test.tsx +132 -1
- package/src/ContextMenu/ContextMenu.tsx +78 -48
- package/src/DateInput/DateInput.doc.mjs +52 -0
- package/src/DateInput/DateInput.spec.md +27 -15
- package/src/DateInput/DateInput.test.tsx +38 -0
- package/src/DateInput/DateInput.tsx +1 -1
- package/src/DateInput/DateInputTouch.test.tsx +22 -0
- package/src/DateInput/MonthScroller.tsx +12 -4
- package/src/DateRangeInput/DateRangeInput.test.tsx +49 -0
- package/src/DateRangeInput/DateRangeInput.tsx +20 -2
- package/src/Dialog/Dialog.test.tsx +27 -1
- package/src/Dialog/Dialog.tsx +16 -5
- package/src/Dialog/DialogHeader.test.tsx +27 -2
- package/src/Dialog/DialogHeader.tsx +7 -8
- package/src/Dialog/__tests__/Dialog.a11y.chromium.spec.ts +21 -14
- package/src/Divider/Divider.doc.mjs +5 -3
- package/src/Divider/Divider.spec.md +140 -54
- package/src/Divider/Divider.test.tsx +15 -0
- package/src/Divider/Divider.tsx +6 -4
- package/src/DropdownMenu/DropdownMenu.doc.mjs +2 -2
- package/src/DropdownMenu/DropdownMenu.spec.md +121 -45
- package/src/DropdownMenu/DropdownMenu.test.tsx +288 -23
- package/src/DropdownMenu/DropdownMenu.tsx +212 -81
- package/src/DropdownMenu/DropdownMenuCheckboxItem.doc.mjs +38 -2
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +32 -18
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +146 -1
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +136 -0
- package/src/DropdownMenu/__tests__/MenuButton.a11y.known-failures.ts +12 -0
- package/src/DropdownMenu/__tests__/MenuButton.a11y.renders.tsx +67 -0
- package/src/DropdownMenu/__tests__/MenuButton.a11y.states.ts +141 -0
- package/src/DropdownMenu/__tests__/MenuButton.a11y.test.tsx +138 -0
- package/src/DropdownMenu/__tests__/MenuHeaderFooter.a11y.chromium.spec.ts +40 -5
- package/src/Field/InputClearButton.test.tsx +29 -4
- package/src/Field/InputClearButton.tsx +26 -8
- package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +21 -14
- package/src/FormLayout/FormLayout.tsx +1 -0
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +1 -1
- package/src/Grid/Grid.doc.mjs +14 -11
- package/src/Grid/Grid.spec.md +50 -32
- package/src/Grid/Grid.tsx +13 -4
- package/src/HoverCard/HoverCard.test.tsx +46 -1
- package/src/HoverCard/useHoverCard.tsx +68 -48
- package/src/InputGroup/InputGroup.doc.mjs +11 -1
- package/src/InputGroup/InputGroup.tsx +2 -4
- package/src/InputGroup/groupStyles.ts +40 -2
- package/src/Layer/useLayerDismissal.ts +9 -9
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +142 -0
- package/src/Link/__tests__/Link.a11y.renders.tsx +97 -0
- package/src/Link/__tests__/Link.a11y.states.ts +104 -0
- package/src/Link/__tests__/Link.a11y.test.tsx +127 -0
- package/src/Markdown/Markdown.doc.mjs +1 -1
- package/src/Markdown/Markdown.fr23.perf.test.ts +161 -40
- package/src/Markdown/Markdown.spec.md +45 -23
- package/src/Markdown/Markdown.test.tsx +38 -0
- package/src/Markdown/Markdown.tsx +24 -2
- package/src/Markdown/plugins/semanticFence.test.tsx +3 -2
- package/src/MobileNav/MobileNav.tsx +50 -2
- package/src/MobileNav/MobileNavFocus.test.tsx +553 -0
- package/src/MoreMenu/MoreMenu.spec.md +18 -7
- package/src/MoreMenu/MoreMenu.test.tsx +38 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +8 -8
- package/src/MultiSelector/MultiSelector.spec.md +1 -1
- package/src/MultiSelector/MultiSelector.test.tsx +188 -21
- package/src/MultiSelector/MultiSelector.tsx +50 -11
- package/src/NumberInput/NumberInput.test.tsx +24 -0
- package/src/NumberInput/NumberInput.tsx +1 -1
- package/src/NumberInput/__tests__/NumberInput.a11y.chromium.spec.ts +22 -15
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +78 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +6 -0
- package/src/Resizable/Resizable.spec.md +41 -9
- package/src/Resizable/ResizeHandle.test.tsx +565 -2
- package/src/Resizable/ResizeHandle.tsx +126 -21
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +119 -0
- package/src/Resizable/__tests__/ResizeHandle.a11y.known-failures.ts +39 -0
- package/src/Resizable/__tests__/ResizeHandle.a11y.renders.tsx +80 -0
- package/src/Resizable/__tests__/ResizeHandle.a11y.states.ts +197 -0
- package/src/Resizable/__tests__/ResizeHandle.a11y.test.tsx +123 -0
- package/src/Resizable/useResizable.ts +95 -0
- package/src/Selector/Selector.doc.mjs +7 -6
- package/src/Selector/Selector.spec.md +37 -24
- package/src/Selector/Selector.test.tsx +176 -10
- package/src/Selector/Selector.tsx +59 -14
- package/src/Selector/__tests__/Combobox.a11y.known-failures.ts +27 -0
- package/src/Selector/__tests__/Combobox.a11y.states.ts +145 -0
- package/src/Selector/__tests__/Selector.combobox.a11y.chromium.spec.ts +108 -0
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +126 -0
- package/src/SideNav/SideNav.test.tsx +35 -0
- package/src/SideNav/SideNav.tsx +16 -2
- package/src/Slider/Slider.spec.md +43 -17
- package/src/Slider/Slider.test.tsx +134 -0
- package/src/Slider/Slider.tsx +29 -6
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +112 -0
- package/src/Slider/__tests__/Slider.a11y.known-failures.ts +12 -0
- package/src/Slider/__tests__/Slider.a11y.renders.tsx +42 -0
- package/src/Slider/__tests__/Slider.a11y.states.ts +106 -0
- package/src/Slider/__tests__/Slider.a11y.test.tsx +105 -0
- package/src/Switch/__tests__/Switch.a11y.chromium.spec.ts +25 -18
- package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +19 -12
- package/src/TextInput/__tests__/TextInput.a11y.chromium.spec.ts +21 -14
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +18 -11
- package/src/Tokenizer/Tokenizer.test.tsx +87 -0
- package/src/Tokenizer/Tokenizer.tsx +31 -3
- package/src/Toolbar/Toolbar.test.tsx +131 -4
- package/src/Toolbar/Toolbar.tsx +3 -1
- package/src/TreeList/TreeList.spec.md +33 -8
- package/src/TreeList/TreeList.test.tsx +72 -0
- package/src/TreeList/TreeList.tsx +10 -6
- package/src/TreeList/TreeListItem.tsx +5 -0
- package/src/TreeList/__tests__/TreeList.a11y.chromium.spec.ts +125 -0
- package/src/TreeList/__tests__/TreeList.a11y.renders.tsx +44 -0
- package/src/TreeList/__tests__/TreeList.a11y.states.ts +164 -0
- package/src/TreeList/__tests__/TreeList.a11y.test.tsx +138 -0
- package/src/TreeList/__tests__/TreeListRowNames.a11y.chromium.spec.ts +82 -0
- package/src/hooks/useScrollOverflow.test.tsx +222 -0
- package/src/hooks/useScrollOverflow.ts +55 -13
- package/src/hooks/useTreeFocus.test.tsx +37 -0
- package/src/hooks/useTreeFocus.ts +55 -2
- package/src/i18n/generated-locales/en.generated.ts +3 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +3 -0
- package/src/reset.a11y.chromium.spec.ts +9 -1
- package/src/reset.css +8 -3
- package/src/reset.until-found.a11y.browser.spec.ts +75 -0
- package/src/reset.until-found.test.ts +32 -0
- package/src/stylexValidation.source-build.test.mjs +42 -0
- package/src/theme/syntax/SyntaxTheme.tsx +46 -5
- package/src/theme/syntax/defineSyntaxTheme.diff.test.ts +91 -0
- package/src/theme/syntax/defineSyntaxTheme.ts +75 -15
- package/src/theme/syntax/index.ts +5 -1
- package/src/theme/syntax/tokens.ts +32 -2
- package/src/theme/syntax/useSyntaxTheme.diff.test.tsx +40 -0
- package/src/utils/plainDate.test.ts +147 -0
- package/src/utils/plainDate.ts +75 -10
|
@@ -326,6 +326,44 @@ describe('Markdown', () => {
|
|
|
326
326
|
expect(pre).toBeInTheDocument();
|
|
327
327
|
});
|
|
328
328
|
|
|
329
|
+
it('renders a diff-<lang> fence as a diff over that language, and diff over plaintext', () => {
|
|
330
|
+
const {container, rerender} = render(
|
|
331
|
+
<Markdown>{'```diff-js\n-const x = 1;\n+const x = 2;\n```'}</Markdown>,
|
|
332
|
+
);
|
|
333
|
+
expect(container.querySelector('[data-diff="removed"]')).not.toBeNull();
|
|
334
|
+
expect(container.querySelector('[data-diff="added"]')).not.toBeNull();
|
|
335
|
+
// `const` keeps its js highlighting past the glyph.
|
|
336
|
+
expect(
|
|
337
|
+
container.querySelector('[data-diff="added"] .astryx-token-keyword'),
|
|
338
|
+
).not.toBeNull();
|
|
339
|
+
rerender(<Markdown>{'```diff\n-old\n+new\n```'}</Markdown>);
|
|
340
|
+
expect(container.querySelectorAll('[data-diff]')).toHaveLength(2);
|
|
341
|
+
expect(container.querySelector('.astryx-token-keyword')).toBeNull();
|
|
342
|
+
rerender(<Markdown>{'```js\n-const x = 1;\n```'}</Markdown>);
|
|
343
|
+
expect(container.querySelector('[data-diff]')).toBeNull();
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
it('hands a custom code renderer the leading word as today and nothing new', () => {
|
|
347
|
+
type CodeProps = {code: string; language?: string};
|
|
348
|
+
const seen: CodeProps[] = [];
|
|
349
|
+
const Code = (props: CodeProps) => {
|
|
350
|
+
seen.push(props);
|
|
351
|
+
return <pre data-testid="custom">{props.code}</pre>;
|
|
352
|
+
};
|
|
353
|
+
render(
|
|
354
|
+
<Markdown components={{code: Code}}>
|
|
355
|
+
{
|
|
356
|
+
'```diff-tsx\n-a\n+b\n```\n\n```diff\n-a\n```\n\n```tsx\nconst x = 1;\n```'
|
|
357
|
+
}
|
|
358
|
+
</Markdown>,
|
|
359
|
+
);
|
|
360
|
+
// The leading word characters, as today: a diff-tsx fence is `diff`.
|
|
361
|
+
expect(seen.map(p => p.language)).toEqual(['diff', 'diff', 'tsx']);
|
|
362
|
+
for (const props of seen) {
|
|
363
|
+
expect(Object.keys(props).sort()).toEqual(['code', 'language']);
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
|
|
329
367
|
it('renders links with correct href', () => {
|
|
330
368
|
render(<Markdown>{'[click](https://example.com)'}</Markdown>);
|
|
331
369
|
const link = screen.getByText('click');
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
} from '../theme/tokens.stylex';
|
|
28
28
|
import type {TextDisplay} from '../theme/types';
|
|
29
29
|
import {CodeBlock, Code} from '../CodeBlock';
|
|
30
|
+
import {parseFenceLanguage} from '../CodeBlock/tokenizer';
|
|
30
31
|
import {CheckboxList} from '../CheckboxList/CheckboxList';
|
|
31
32
|
import {CheckboxListItem} from '../CheckboxList/CheckboxListItem';
|
|
32
33
|
import {Blockquote} from '../Blockquote/Blockquote';
|
|
@@ -1475,7 +1476,20 @@ function renderBlock(
|
|
|
1475
1476
|
case 'code': {
|
|
1476
1477
|
// Track codeblock content in cursor for accurate character counting
|
|
1477
1478
|
cursor.offset += node.value.length;
|
|
1478
|
-
|
|
1479
|
+
// `diff-<lang>` fences are the diff layer over <lang>; `diff` is the
|
|
1480
|
+
// layer over plaintext. The legacy language is the info
|
|
1481
|
+
// string's leading word characters, which stops at the hyphen, so the
|
|
1482
|
+
// diff mapping reads the whole first word and then applies the same
|
|
1483
|
+
// word rule to the language it names.
|
|
1484
|
+
const legacyLanguage =
|
|
1485
|
+
getMarkdownAstLegacyCodeLanguage(node) ?? 'plaintext';
|
|
1486
|
+
const fence = parseFenceLanguage(node.lang ?? legacyLanguage);
|
|
1487
|
+
const isDiff = fence.isDiff;
|
|
1488
|
+
// The language under the diff layer; the default CodeBlock renders it.
|
|
1489
|
+
const diffLanguage = isDiff
|
|
1490
|
+
? fence.language.match(/^\w*/)?.[0] || 'plaintext'
|
|
1491
|
+
: undefined;
|
|
1492
|
+
const language = diffLanguage ?? legacyLanguage;
|
|
1479
1493
|
// A semantic-fence proposal claims its fence before the host's code
|
|
1480
1494
|
// renderer (spec:AST-036 FR17). The host renderer, or the default Code
|
|
1481
1495
|
// block without one, draws every unclaimed fence and is the fallback
|
|
@@ -1485,7 +1499,10 @@ function renderBlock(
|
|
|
1485
1499
|
<CodeBlockComp
|
|
1486
1500
|
key={index}
|
|
1487
1501
|
code={node.value}
|
|
1488
|
-
|
|
1502
|
+
// A supplied renderer's contract is unchanged: it keeps receiving
|
|
1503
|
+
// the leading word characters (`diff` for a `diff-tsx` fence, as
|
|
1504
|
+
// today) and nothing new; only the default path maps the layer.
|
|
1505
|
+
language={legacyLanguage}
|
|
1489
1506
|
{...lineProp}
|
|
1490
1507
|
/>
|
|
1491
1508
|
) : (
|
|
@@ -1504,7 +1521,12 @@ function renderBlock(
|
|
|
1504
1521
|
<CodeBlock
|
|
1505
1522
|
code={node.value}
|
|
1506
1523
|
language={language}
|
|
1524
|
+
isDiff={isDiff}
|
|
1507
1525
|
isCollapsible
|
|
1526
|
+
// Long lines wrap rather than scroll sideways, as they do in
|
|
1527
|
+
// RichText, so a reader sees whole lines and the read/edit switch
|
|
1528
|
+
// moves no block (spec:AST-061 FR5, DEC-9).
|
|
1529
|
+
isWrapped
|
|
1508
1530
|
xstyle={[
|
|
1509
1531
|
contentWidthValue != null
|
|
1510
1532
|
? dynamicStyles.blockWidth(contentWidthValue)
|
|
@@ -412,9 +412,10 @@ describe('createMarkdownFenceTransform', () => {
|
|
|
412
412
|
expect(createNode).not.toHaveBeenCalled();
|
|
413
413
|
expect(document.querySelector('pre')).toHaveTextContent('plain source');
|
|
414
414
|
expect(screen.getByRole('button', {name: 'Copy code'})).toBeInTheDocument();
|
|
415
|
+
// CodeBlock's named viewport; its tab stop follows overflow (none in jsdom).
|
|
415
416
|
expect(screen.getByRole('group', {name: 'text'})).toHaveAttribute(
|
|
416
|
-
'
|
|
417
|
-
'
|
|
417
|
+
'data-scroll-axis',
|
|
418
|
+
'both',
|
|
418
419
|
);
|
|
419
420
|
|
|
420
421
|
rerender(
|
|
@@ -25,6 +25,13 @@
|
|
|
25
25
|
* closes. The native `cancel` event still handles the dismissals the browser
|
|
26
26
|
* starts itself, such as the Android back gesture.
|
|
27
27
|
*
|
|
28
|
+
* Focus RESTORATION is not delegated to the browser. The drawer captures the
|
|
29
|
+
* element that opened it and refocuses it once the native dialog has closed,
|
|
30
|
+
* mirroring Dialog: the implicit `<dialog>` restore has been observed dropping
|
|
31
|
+
* focus to `<body>`. The close itself is deferred past the slide-out, and the
|
|
32
|
+
* restore has to follow it. Until close() runs the rest of the document is
|
|
33
|
+
* inert and focus() on the opener is silently dropped.
|
|
34
|
+
*
|
|
28
35
|
* SYNC: When modified, update these files to stay in sync:
|
|
29
36
|
* - /packages/core/src/MobileNav/index.ts (exports if types change)
|
|
30
37
|
* - /packages/core/src/Layer/useLayerDismissal.ts (dismissal stack)
|
|
@@ -40,6 +47,7 @@ import {
|
|
|
40
47
|
useRef,
|
|
41
48
|
useState,
|
|
42
49
|
type ReactNode,
|
|
50
|
+
type RefObject,
|
|
43
51
|
} from 'react';
|
|
44
52
|
import * as stylex from '@stylexjs/stylex';
|
|
45
53
|
import {
|
|
@@ -317,6 +325,34 @@ function resolveCloseDelay(dialog: HTMLDialogElement): number {
|
|
|
317
325
|
return hold <= 0 ? 0 : Math.min(cap, hold * CLOSE_WITHIN_HOLD);
|
|
318
326
|
}
|
|
319
327
|
|
|
328
|
+
/**
|
|
329
|
+
* Close the native dialog, then return focus to the element that opened it.
|
|
330
|
+
*
|
|
331
|
+
* Browsers are supposed to restore focus themselves when a modal <dialog>
|
|
332
|
+
* closes, but that has been observed to fail (focus lands on <body>), so the
|
|
333
|
+
* drawer does it explicitly, as Dialog does. The order is load-bearing: while
|
|
334
|
+
* the modal dialog holds the top layer the rest of the document is inert and
|
|
335
|
+
* focus() on the opener is silently dropped. So the restore rides on the close
|
|
336
|
+
* itself, wherever that happens (the delayed timer, or the unmount teardown),
|
|
337
|
+
* not on the `isOpen` flip that only schedules it.
|
|
338
|
+
*
|
|
339
|
+
* Focus is left alone when there was no real opener (activeElement was <body>)
|
|
340
|
+
* or the opener has since left the DOM: focusing <body> would blur whatever a
|
|
341
|
+
* router moved focus to, and a detached node cannot take focus.
|
|
342
|
+
*/
|
|
343
|
+
function closeAndRestoreFocus(
|
|
344
|
+
dialog: HTMLDialogElement,
|
|
345
|
+
openerRef: RefObject<HTMLElement | null>,
|
|
346
|
+
): void {
|
|
347
|
+
dialog.close();
|
|
348
|
+
const opener = openerRef.current;
|
|
349
|
+
openerRef.current = null;
|
|
350
|
+
if (!opener || opener === document.body || !opener.isConnected) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
opener.focus();
|
|
354
|
+
}
|
|
355
|
+
|
|
320
356
|
// =============================================================================
|
|
321
357
|
// Types
|
|
322
358
|
// =============================================================================
|
|
@@ -449,6 +485,9 @@ export function MobileNav({
|
|
|
449
485
|
|
|
450
486
|
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
451
487
|
const closeTimeoutRef = useRef<ReturnType<typeof setTimeout>>(null);
|
|
488
|
+
// Element that was focused when the drawer opened; focus goes back to it
|
|
489
|
+
// once the native dialog has closed (see closeAndRestoreFocus).
|
|
490
|
+
const triggerElementRef = useRef<HTMLElement | null>(null);
|
|
452
491
|
const gutterRef = useRef<ScrollbarGutterHold | null>(null);
|
|
453
492
|
|
|
454
493
|
// Gives back the gutter held open in place of the hidden scrollbar.
|
|
@@ -505,6 +544,12 @@ export function MobileNav({
|
|
|
505
544
|
gutterRef.current ??= holdScrollbarGutter(document.documentElement);
|
|
506
545
|
|
|
507
546
|
if (!dialog.open) {
|
|
547
|
+
// Capture the opener before showModal() pulls focus into the top
|
|
548
|
+
// layer. Only on the transition into open: a reopen while the delayed
|
|
549
|
+
// close is still pending finds the dialog open, and must keep the
|
|
550
|
+
// original opener rather than whatever is focused inside the drawer.
|
|
551
|
+
triggerElementRef.current =
|
|
552
|
+
document.activeElement as HTMLElement | null;
|
|
508
553
|
dialog.showModal();
|
|
509
554
|
}
|
|
510
555
|
// Prevent background scrolling and iOS pull-to-refresh.
|
|
@@ -517,7 +562,7 @@ export function MobileNav({
|
|
|
517
562
|
releaseGutter();
|
|
518
563
|
|
|
519
564
|
closeTimeoutRef.current = setTimeout(() => {
|
|
520
|
-
dialog
|
|
565
|
+
closeAndRestoreFocus(dialog, triggerElementRef);
|
|
521
566
|
}, resolveCloseDelay(dialog));
|
|
522
567
|
}
|
|
523
568
|
|
|
@@ -541,11 +586,14 @@ export function MobileNav({
|
|
|
541
586
|
// This must be a separate unmount-only effect: putting it in the open/close
|
|
542
587
|
// effect above would close the dialog on every isOpen flip and cut off the
|
|
543
588
|
// delayed slide-out close.
|
|
589
|
+
//
|
|
590
|
+
// Inside AppShell this teardown is the only close the drawer ever gets, so
|
|
591
|
+
// it is also where focus goes back to the toggle.
|
|
544
592
|
useEffect(() => {
|
|
545
593
|
const dialog = dialogRef.current;
|
|
546
594
|
return () => {
|
|
547
595
|
if (dialog?.open) {
|
|
548
|
-
dialog
|
|
596
|
+
closeAndRestoreFocus(dialog, triggerElementRef);
|
|
549
597
|
}
|
|
550
598
|
};
|
|
551
599
|
}, []);
|