@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
|
@@ -15,9 +15,10 @@ import "../theme/tokens.stylex.js";
|
|
|
15
15
|
import { colorVars, spacingVars, radiusVars, typographyVars, fontWeightVars, typeScaleVars, borderVars, durationVars, easeVars } from "../theme/tokens.stylex.js";
|
|
16
16
|
import { mergeProps } from "../utils/index.js";
|
|
17
17
|
import { useClipboard } from "../hooks/useClipboard.js";
|
|
18
|
+
import { useScrollableArea } from "../hooks/useScrollableArea.js";
|
|
18
19
|
import { Icon } from "../Icon/index.js";
|
|
19
20
|
import { IconButton } from "../IconButton/index.js";
|
|
20
|
-
import { tokenize, tokenizeAsync, flatTokensToLines, SYNC_TOKENIZE_THRESHOLD } from "./tokenizer.js";
|
|
21
|
+
import { tokenize, tokenizeAsync, splitDiffLines, flatTokensToLines, SYNC_TOKENIZE_THRESHOLD } from "./tokenizer.js";
|
|
21
22
|
import { ensureHighlightStyles } from "./highlightStyles.js";
|
|
22
23
|
import { applyHighlightRangesChunked } from "./highlightRanges.js";
|
|
23
24
|
import { themeProps } from "../utils/themeProps.js";
|
|
@@ -114,6 +115,7 @@ const styles = {
|
|
|
114
115
|
code: {
|
|
115
116
|
k1xSpc: "x1lliihq",
|
|
116
117
|
kUk6DE: "x98rzlu",
|
|
118
|
+
k7Eaqz: "xk8lq53",
|
|
117
119
|
k8WAf4: "x8o8v82",
|
|
118
120
|
kg3NbH: "x1pzlopt",
|
|
119
121
|
kogj98: "x1ghz6dp",
|
|
@@ -126,6 +128,7 @@ const styles = {
|
|
|
126
128
|
$$css: true
|
|
127
129
|
},
|
|
128
130
|
codeWrapped: {
|
|
131
|
+
k7Eaqz: "x15x72sd",
|
|
129
132
|
khDVqt: "x126k92a",
|
|
130
133
|
kTgw9: "x1yn0g08",
|
|
131
134
|
kHjlTd: "x1mzt3pk",
|
|
@@ -144,6 +147,61 @@ const styles = {
|
|
|
144
147
|
kloYau: "x2q1x1w",
|
|
145
148
|
$$css: true
|
|
146
149
|
},
|
|
150
|
+
line: {
|
|
151
|
+
kLWn49: "x17iicif",
|
|
152
|
+
$$css: true
|
|
153
|
+
},
|
|
154
|
+
lineNumbered: {
|
|
155
|
+
k1xSpc: "xrvj5dj",
|
|
156
|
+
kumcoG: "x1xx4m37",
|
|
157
|
+
k1C7PZ: "xf5zn4v",
|
|
158
|
+
kgeoSG: "x46gnpd",
|
|
159
|
+
krRUto: "x17gn2l9",
|
|
160
|
+
kOrBnS: "x19ds33d",
|
|
161
|
+
kKZZS1: "x1wnbjh8",
|
|
162
|
+
kxBb7d: "xtkarl4",
|
|
163
|
+
kUY6Iu: "x1rbqspl",
|
|
164
|
+
kQcDng: "x3nzp0f",
|
|
165
|
+
$$css: true
|
|
166
|
+
},
|
|
167
|
+
lineHighlighted: {
|
|
168
|
+
kWkggS: "xgcxg3y",
|
|
169
|
+
kUOVxO: "x1ng9b9t",
|
|
170
|
+
kg3NbH: "x1pzlopt",
|
|
171
|
+
$$css: true
|
|
172
|
+
},
|
|
173
|
+
lineAdded: {
|
|
174
|
+
kWkggS: "xjqijk9",
|
|
175
|
+
kUOVxO: "x1ng9b9t",
|
|
176
|
+
kg3NbH: "x1pzlopt",
|
|
177
|
+
kxBb7d: "x147exv5",
|
|
178
|
+
$$css: true
|
|
179
|
+
},
|
|
180
|
+
lineRemoved: {
|
|
181
|
+
kWkggS: "xv48ua2",
|
|
182
|
+
kUOVxO: "x1ng9b9t",
|
|
183
|
+
kg3NbH: "x1pzlopt",
|
|
184
|
+
kxBb7d: "x16hy5kr",
|
|
185
|
+
$$css: true
|
|
186
|
+
},
|
|
187
|
+
lineDiffHeader: {
|
|
188
|
+
kWkggS: "x11ds9ch",
|
|
189
|
+
kMwMTN: "xt5rlkq",
|
|
190
|
+
kUOVxO: "x1ng9b9t",
|
|
191
|
+
kg3NbH: "x1pzlopt",
|
|
192
|
+
$$css: true
|
|
193
|
+
},
|
|
194
|
+
lineDiff: {
|
|
195
|
+
k1xSpc: "xrvj5dj",
|
|
196
|
+
kumcoG: "xrnahuw",
|
|
197
|
+
k1C7PZ: "xak3so",
|
|
198
|
+
$$css: true
|
|
199
|
+
},
|
|
200
|
+
lineDiffNumbered: {
|
|
201
|
+
kumcoG: "x1v9b7p9",
|
|
202
|
+
k1C7PZ: "x1o1pmfc",
|
|
203
|
+
$$css: true
|
|
204
|
+
},
|
|
147
205
|
sizeSm: {
|
|
148
206
|
kGuDYH: "x141an7d",
|
|
149
207
|
$$css: true
|
|
@@ -178,40 +236,34 @@ const CodeChunk = /*#__PURE__*/React.memo(function CodeChunk({
|
|
|
178
236
|
lines,
|
|
179
237
|
startIndex,
|
|
180
238
|
highlightSet,
|
|
239
|
+
diffKinds,
|
|
181
240
|
renderLineContent,
|
|
182
241
|
lineNumbers
|
|
183
242
|
}) {
|
|
184
243
|
return /*#__PURE__*/_jsx(_Fragment, {
|
|
185
244
|
children: lines.map((line, j) => {
|
|
186
245
|
const i = startIndex + j;
|
|
246
|
+
const diffKind = diffKinds?.[i];
|
|
187
247
|
return /*#__PURE__*/_jsx("div", {
|
|
188
248
|
"data-line": i + 1,
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
className: "x17iicif xrvj5dj x1xx4m37 xf5zn4v x46gnpd x17gn2l9 x19ds33d x1wnbjh8 xtkarl4 x1rbqspl x3nzp0f"
|
|
195
|
-
},
|
|
196
|
-
1: {
|
|
197
|
-
className: "x17iicif xgcxg3y x1ng9b9t x1pzlopt"
|
|
198
|
-
},
|
|
199
|
-
3: {
|
|
200
|
-
className: "x17iicif xrvj5dj x1xx4m37 xf5zn4v x46gnpd x17gn2l9 x19ds33d x1wnbjh8 xtkarl4 x1rbqspl x3nzp0f xgcxg3y x1ng9b9t x1pzlopt"
|
|
201
|
-
}
|
|
202
|
-
}[!!lineNumbers << 1 | !!(highlightSet?.has(i + 1) ?? false) << 0],
|
|
249
|
+
"data-diff": diffKind === 'context' ? undefined : diffKind,
|
|
250
|
+
...stylex.props(styles.line, lineNumbers && styles.lineNumbered, diffKinds != null && styles.lineDiff, diffKinds != null && lineNumbers && styles.lineDiffNumbered, diffKind === 'added' && styles.lineAdded, diffKind === 'removed' && styles.lineRemoved, diffKind === 'header' && styles.lineDiffHeader,
|
|
251
|
+
// Last on purpose: a highlight replaces a diff tint rather than
|
|
252
|
+
// stacking on it, so tokens keep their single-paint contrast.
|
|
253
|
+
(highlightSet?.has(i + 1) ?? false) && styles.lineHighlighted),
|
|
203
254
|
children: renderLineContent(line, i)
|
|
204
255
|
}, i);
|
|
205
256
|
})
|
|
206
257
|
});
|
|
207
258
|
});
|
|
208
|
-
function renderLines(lines, highlightSet, renderLineContent, lineNumbers, chunkSize = LINE_CHUNK_SIZE) {
|
|
259
|
+
function renderLines(lines, highlightSet, diffKinds, renderLineContent, lineNumbers, chunkSize = LINE_CHUNK_SIZE) {
|
|
209
260
|
chunkSize = Math.max(1, Math.floor(chunkSize));
|
|
210
261
|
if (lines.length < LINE_CHUNK_THRESHOLD) {
|
|
211
262
|
return /*#__PURE__*/_jsx(CodeChunk, {
|
|
212
263
|
lines: lines,
|
|
213
264
|
startIndex: 0,
|
|
214
265
|
highlightSet: highlightSet,
|
|
266
|
+
diffKinds: diffKinds,
|
|
215
267
|
renderLineContent: renderLineContent,
|
|
216
268
|
lineNumbers: lineNumbers
|
|
217
269
|
});
|
|
@@ -233,6 +285,7 @@ function renderLines(lines, highlightSet, renderLineContent, lineNumbers, chunkS
|
|
|
233
285
|
lines: chunkLines,
|
|
234
286
|
startIndex: start,
|
|
235
287
|
highlightSet: highlightSet,
|
|
288
|
+
diffKinds: diffKinds,
|
|
236
289
|
renderLineContent: renderLineContent,
|
|
237
290
|
lineNumbers: lineNumbers
|
|
238
291
|
})
|
|
@@ -349,6 +402,8 @@ function SpanCodeContent({
|
|
|
349
402
|
lines,
|
|
350
403
|
tokenLines,
|
|
351
404
|
highlightSet,
|
|
405
|
+
diffKinds,
|
|
406
|
+
diff,
|
|
352
407
|
isWrapped,
|
|
353
408
|
sizeStyle,
|
|
354
409
|
hasLineNumbers,
|
|
@@ -359,6 +414,49 @@ function SpanCodeContent({
|
|
|
359
414
|
}, []);
|
|
360
415
|
const renderLineContent = useCallback((line, lineIndex) => {
|
|
361
416
|
const tokens = tokenLines[lineIndex] ?? [];
|
|
417
|
+
if (diff) {
|
|
418
|
+
// Header rows show their raw text; every other row shows its glyph in
|
|
419
|
+
// the marker column and the base-language tokens of the rest.
|
|
420
|
+
const kind = diff.kinds[lineIndex];
|
|
421
|
+
const content = kind === 'header' ? line : diff.content[lineIndex];
|
|
422
|
+
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
423
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
424
|
+
"data-diff-marker": "",
|
|
425
|
+
...{
|
|
426
|
+
0: {
|
|
427
|
+
className: "xv1l7n4 x87ps6o x1sdyfia"
|
|
428
|
+
},
|
|
429
|
+
4: {
|
|
430
|
+
className: "xv1l7n4 x87ps6o x1sdyfia x6w1cxl x1pezmd8"
|
|
431
|
+
},
|
|
432
|
+
2: {
|
|
433
|
+
className: "x87ps6o x1sdyfia x1wxerb0"
|
|
434
|
+
},
|
|
435
|
+
6: {
|
|
436
|
+
className: "x87ps6o x1sdyfia x6w1cxl x1pezmd8 x1wxerb0"
|
|
437
|
+
},
|
|
438
|
+
1: {
|
|
439
|
+
className: "x87ps6o x1sdyfia x103bwea"
|
|
440
|
+
},
|
|
441
|
+
5: {
|
|
442
|
+
className: "x87ps6o x1sdyfia x6w1cxl x1pezmd8 x103bwea"
|
|
443
|
+
},
|
|
444
|
+
3: {
|
|
445
|
+
className: "x87ps6o x1sdyfia x103bwea"
|
|
446
|
+
},
|
|
447
|
+
7: {
|
|
448
|
+
className: "x87ps6o x1sdyfia x6w1cxl x1pezmd8 x103bwea"
|
|
449
|
+
}
|
|
450
|
+
}[!!hasLineNumbers << 2 | !!(kind === 'added') << 1 | !!(kind === 'removed') << 0],
|
|
451
|
+
children: diff.glyphs[lineIndex] || ' '
|
|
452
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
453
|
+
...{
|
|
454
|
+
className: "xeuugli"
|
|
455
|
+
},
|
|
456
|
+
children: kind === 'header' ? content || '\u200b' : buildSpanLine(content, tokens)
|
|
457
|
+
})]
|
|
458
|
+
});
|
|
459
|
+
}
|
|
362
460
|
// Wrap tokens in a single element so they occupy one grid cell when line
|
|
363
461
|
// numbers are on (see `lineNumbered`); an inline span is a no-op when off.
|
|
364
462
|
return /*#__PURE__*/_jsx("span", {
|
|
@@ -367,10 +465,10 @@ function SpanCodeContent({
|
|
|
367
465
|
},
|
|
368
466
|
children: buildSpanLine(line, tokens)
|
|
369
467
|
});
|
|
370
|
-
}, [tokenLines]);
|
|
468
|
+
}, [tokenLines, diff, hasLineNumbers]);
|
|
371
469
|
return /*#__PURE__*/_jsx("code", {
|
|
372
470
|
...stylex.props(styles.code, sizeStyle, isWrapped && styles.codeWrapped, hasLineNumbers && styles.codeNumbered, hasLineNumbers && dynamicStyles.gutterWidth(maxDigits)),
|
|
373
|
-
children: renderLines(lines, highlightSet, renderLineContent, hasLineNumbers)
|
|
471
|
+
children: renderLines(lines, highlightSet, diffKinds, renderLineContent, hasLineNumbers)
|
|
374
472
|
});
|
|
375
473
|
}
|
|
376
474
|
|
|
@@ -382,6 +480,7 @@ function RangeCodeContent({
|
|
|
382
480
|
lines,
|
|
383
481
|
tokenLines,
|
|
384
482
|
highlightSet,
|
|
483
|
+
diffKinds,
|
|
385
484
|
isWrapped,
|
|
386
485
|
sizeStyle,
|
|
387
486
|
hasLineNumbers,
|
|
@@ -407,7 +506,7 @@ function RangeCodeContent({
|
|
|
407
506
|
return /*#__PURE__*/_jsx("code", {
|
|
408
507
|
ref: codeRef,
|
|
409
508
|
...stylex.props(styles.code, sizeStyle, isWrapped && styles.codeWrapped, hasLineNumbers && styles.codeNumbered, hasLineNumbers && dynamicStyles.gutterWidth(maxDigits)),
|
|
410
|
-
children: renderLines(lines, highlightSet, renderLineContent, hasLineNumbers)
|
|
509
|
+
children: renderLines(lines, highlightSet, diffKinds, renderLineContent, hasLineNumbers)
|
|
411
510
|
});
|
|
412
511
|
}
|
|
413
512
|
|
|
@@ -431,6 +530,7 @@ export function CodeBlock({
|
|
|
431
530
|
hasLanguageLabel = true,
|
|
432
531
|
hasLineNumbers = false,
|
|
433
532
|
highlightLines,
|
|
533
|
+
isDiff = false,
|
|
434
534
|
hasCopyButton = true,
|
|
435
535
|
onCopy,
|
|
436
536
|
isWrapped = false,
|
|
@@ -459,7 +559,7 @@ export function CodeBlock({
|
|
|
459
559
|
} = useClipboard({
|
|
460
560
|
announce: t('@astryx.codeBlock.copied')
|
|
461
561
|
});
|
|
462
|
-
const useSpans = highlightMode === 'spans' || highlightMode === 'auto' && !hasHighlightAPI() || highlightMode === 'auto' && isSafari();
|
|
562
|
+
const useSpans = isDiff || highlightMode === 'spans' || highlightMode === 'auto' && !hasHighlightAPI() || highlightMode === 'auto' && isSafari();
|
|
463
563
|
const lines = useMemo(() => {
|
|
464
564
|
const l = code.split('\n');
|
|
465
565
|
if (l.length > 1 && l[l.length - 1] === '') {
|
|
@@ -467,7 +567,13 @@ export function CodeBlock({
|
|
|
467
567
|
}
|
|
468
568
|
return l;
|
|
469
569
|
}, [code]);
|
|
470
|
-
|
|
570
|
+
|
|
571
|
+
// In diff mode the base language sees the code with the glyph column set
|
|
572
|
+
// aside, so a `tsx` diff still highlights as `tsx` on every line; headers
|
|
573
|
+
// contribute an empty line and are rendered as their raw text.
|
|
574
|
+
const diff = useMemo(() => isDiff ? splitDiffLines(lines) : null, [isDiff, lines]);
|
|
575
|
+
const tokenLines = useTokenLines(diff ? diff.content.join('\n') : code, language, customTokenizer);
|
|
576
|
+
const diffKinds = diff?.kinds ?? null;
|
|
471
577
|
const highlightSet = useMemo(() => highlightLines ? new Set(highlightLines) : null, [highlightLines]);
|
|
472
578
|
const handleCopy = useCallback(async () => {
|
|
473
579
|
const didCopy = await copy(code);
|
|
@@ -478,7 +584,10 @@ export function CodeBlock({
|
|
|
478
584
|
const sizeStyle = size === 'sm' ? styles.sizeSm : styles.sizeMd;
|
|
479
585
|
// Digits in the largest line number — sizes the gutter column width.
|
|
480
586
|
const maxLineDigits = String(lines.length).length;
|
|
481
|
-
|
|
587
|
+
// With the diff layer on, the label and viewport name say so: `diff` over
|
|
588
|
+
// plaintext, `tsx diff` over a language — so a diff keeps its header,
|
|
589
|
+
// collapse control, and a name that still matches a `diff` fence.
|
|
590
|
+
const languageLabel = !hasLanguageLabel ? null : isDiff ? language === 'plaintext' ? 'diff' : `${language} diff` : language !== 'plaintext' ? language : null;
|
|
482
591
|
const showHeader = title != null || languageLabel != null;
|
|
483
592
|
|
|
484
593
|
// A collapsed body must never outlive the visible header that controls it.
|
|
@@ -494,7 +603,23 @@ export function CodeBlock({
|
|
|
494
603
|
// pattern). The region stays mounted when collapsed (CSS grid animation), so
|
|
495
604
|
// this is always a resolvable reference — aria-controls can be unconditional.
|
|
496
605
|
const regionId = useId();
|
|
497
|
-
|
|
606
|
+
|
|
607
|
+
// The code viewport enters the Tab order only while its content actually
|
|
608
|
+
// overflows (AST-025 FR12–FR13): the shared scroll capability measures
|
|
609
|
+
// both axes, keeps focus where it is when overflow goes away, and owns the
|
|
610
|
+
// overflow declarations. role="group" (not "region") so several code
|
|
611
|
+
// blocks on a page don't create duplicate same-named landmarks.
|
|
612
|
+
const {
|
|
613
|
+
getViewportProps,
|
|
614
|
+
getContentProps
|
|
615
|
+
} = useScrollableArea({
|
|
616
|
+
axis: 'both',
|
|
617
|
+
keyboardAccess: {
|
|
618
|
+
owner: 'viewport',
|
|
619
|
+
role: 'group',
|
|
620
|
+
label: languageLabel ?? t('@astryx.codeBlock.code')
|
|
621
|
+
}
|
|
622
|
+
});
|
|
498
623
|
const scrollStyle = maxHeight != null ? {
|
|
499
624
|
maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight
|
|
500
625
|
} : undefined;
|
|
@@ -570,33 +695,27 @@ export function CodeBlock({
|
|
|
570
695
|
}), copyButtonEl]
|
|
571
696
|
}) : null;
|
|
572
697
|
const codeBody = /*#__PURE__*/_jsx("div", {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
// create duplicate same-named landmarks (axe: landmark-unique).
|
|
578
|
-
,
|
|
579
|
-
tabIndex: 0,
|
|
580
|
-
role: "group",
|
|
581
|
-
"aria-label": languageLabel ?? t('@astryx.codeBlock.code'),
|
|
582
|
-
...mergeProps({
|
|
583
|
-
className: "xw2csxc x1odjw0f"
|
|
584
|
-
}, {
|
|
698
|
+
...getViewportProps({
|
|
699
|
+
...{
|
|
700
|
+
className: "x2lwn1j"
|
|
701
|
+
},
|
|
585
702
|
style: scrollStyle
|
|
586
703
|
}),
|
|
587
704
|
children: /*#__PURE__*/_jsx("div", {
|
|
588
|
-
...{
|
|
705
|
+
...getContentProps({
|
|
589
706
|
0: {
|
|
590
707
|
className: "x78zum5 x1pshirs"
|
|
591
708
|
},
|
|
592
709
|
1: {
|
|
593
710
|
className: "x78zum5 x1pshirs x1ajqlyv"
|
|
594
711
|
}
|
|
595
|
-
}[!!(showHeader && !hasLineNumbers) << 0],
|
|
712
|
+
}[!!(showHeader && !hasLineNumbers) << 0]),
|
|
596
713
|
children: useSpans ? /*#__PURE__*/_jsx(SpanCodeContent, {
|
|
597
714
|
lines: lines,
|
|
598
715
|
tokenLines: tokenLines,
|
|
599
716
|
highlightSet: highlightSet,
|
|
717
|
+
diffKinds: diffKinds,
|
|
718
|
+
diff: diff,
|
|
600
719
|
isWrapped: isWrapped,
|
|
601
720
|
sizeStyle: sizeStyle,
|
|
602
721
|
hasLineNumbers: hasLineNumbers,
|
|
@@ -605,6 +724,7 @@ export function CodeBlock({
|
|
|
605
724
|
lines: lines,
|
|
606
725
|
tokenLines: tokenLines,
|
|
607
726
|
highlightSet: highlightSet,
|
|
727
|
+
diffKinds: diffKinds,
|
|
608
728
|
isWrapped: isWrapped,
|
|
609
729
|
sizeStyle: sizeStyle,
|
|
610
730
|
hasLineNumbers: hasLineNumbers,
|
|
@@ -625,7 +745,7 @@ export function CodeBlock({
|
|
|
625
745
|
// While collapsed, the region is only hidden visually (0fr grid
|
|
626
746
|
// row); inert also removes it from the tab order and accessibility
|
|
627
747
|
// tree so keyboard users cannot Tab into the invisible scroll
|
|
628
|
-
// container (
|
|
748
|
+
// container (a tab stop while it overflows). aria-controls pointing at an inert
|
|
629
749
|
// element remains a valid, resolvable reference.
|
|
630
750
|
,
|
|
631
751
|
inert: isCollapsed ? true : undefined,
|
|
@@ -8,6 +8,45 @@ export type SyntaxToken = {
|
|
|
8
8
|
* line-relative start/end offsets (0 = start of line).
|
|
9
9
|
*/
|
|
10
10
|
export type TokenLine = SyntaxToken[];
|
|
11
|
+
/** How a unified-diff line reads: what it adds, removes, frames, or keeps. */
|
|
12
|
+
export type DiffLineKind = 'added' | 'removed' | 'header' | 'context';
|
|
13
|
+
/**
|
|
14
|
+
* Read a Markdown fence info string the way CodeBlock renders it: `diff` is
|
|
15
|
+
* the diff layer over plaintext, `diff-<lang>` (the common convention) is the
|
|
16
|
+
* diff layer over `<lang>`, anything else is a language.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseFenceLanguage(info: string | undefined): {
|
|
19
|
+
language: string;
|
|
20
|
+
isDiff: boolean;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Split a diff into the glyph column and the code the base language sees:
|
|
24
|
+
* every added, removed, or space-led context line loses its first character
|
|
25
|
+
* (the `+`, `-`, or space); a context line with no leading space keeps all
|
|
26
|
+
* of it; header lines contribute an empty line so offsets stay per line.
|
|
27
|
+
*/
|
|
28
|
+
export declare function splitDiffLines(lines: ReadonlyArray<string>): {
|
|
29
|
+
kinds: DiffLineKind[];
|
|
30
|
+
glyphs: string[];
|
|
31
|
+
content: string[];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Classify one line of a unified diff by its first character: `+` added,
|
|
35
|
+
* `-` removed, `@@` header, anything else context. A `--- ` line (with its
|
|
36
|
+
* space) directly followed by a `+++ ` line and then an `@@` line is a file
|
|
37
|
+
* header (both lines), wherever it occurs; every other `---`/`+++` line is
|
|
38
|
+
* removed or added, so a removed line that starts with `--` — `---i;`
|
|
39
|
+
* included — is never misread. The glyph is part of the text and is never
|
|
40
|
+
* removed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function diffLineKind(line: string, { isFileHeader }?: {
|
|
43
|
+
isFileHeader?: boolean;
|
|
44
|
+
}): DiffLineKind;
|
|
45
|
+
/**
|
|
46
|
+
* The indexes of the `--- `/`+++ ` lines (unified-diff form, with the space)
|
|
47
|
+
* that form a file header directly before an `@@`; `---i;` is a change.
|
|
48
|
+
*/
|
|
49
|
+
export declare function fileHeaderLines(lines: ReadonlyArray<string>): Set<number>;
|
|
11
50
|
/** Threshold below which we tokenize synchronously (characters). */
|
|
12
51
|
export declare const SYNC_TOKENIZE_THRESHOLD = 2000;
|
|
13
52
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/CodeBlock/tokenizer.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AAsStC,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,OAAO,CAAC;AA+D5C;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAiBpE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,EAAE,CAAC,CA2BtB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,EACxD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,EAAE,EACpD,IAAI,EAAE,MAAM,GACX,SAAS,EAAE,CA4Bb"}
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/CodeBlock/tokenizer.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,WAAW,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AAsStC,8EAA8E;AAC9E,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,CAUA;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG;IAC5D,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAuBA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,EAAC,YAAoB,EAAC,GAAE;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAM,GACpD,YAAY,CAWd;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAazE;AAMD,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,OAAO,CAAC;AA+D5C;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAiBpE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,EAAE,CAAC,CA2BtB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,EACxD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,EAAE,EACpD,IAAI,EAAE,MAAM,GACX,SAAS,EAAE,CA4Bb"}
|
|
@@ -524,6 +524,114 @@ function buildLanguagePatterns(lang) {
|
|
|
524
524
|
}
|
|
525
525
|
}
|
|
526
526
|
|
|
527
|
+
// ---------------------------------------------------------------------------
|
|
528
|
+
// Diff lines
|
|
529
|
+
// ---------------------------------------------------------------------------
|
|
530
|
+
|
|
531
|
+
/** How a unified-diff line reads: what it adds, removes, frames, or keeps. */
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Read a Markdown fence info string the way CodeBlock renders it: `diff` is
|
|
535
|
+
* the diff layer over plaintext, `diff-<lang>` (the common convention) is the
|
|
536
|
+
* diff layer over `<lang>`, anything else is a language.
|
|
537
|
+
*/
|
|
538
|
+
export function parseFenceLanguage(info) {
|
|
539
|
+
const value = (info ?? '').trim();
|
|
540
|
+
if (value === 'diff') {
|
|
541
|
+
return {
|
|
542
|
+
language: 'plaintext',
|
|
543
|
+
isDiff: true
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
const layered = /^diff-(.+)$/.exec(value);
|
|
547
|
+
if (layered) {
|
|
548
|
+
return {
|
|
549
|
+
language: layered[1],
|
|
550
|
+
isDiff: true
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
return {
|
|
554
|
+
language: value || 'plaintext',
|
|
555
|
+
isDiff: false
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Split a diff into the glyph column and the code the base language sees:
|
|
561
|
+
* every added, removed, or space-led context line loses its first character
|
|
562
|
+
* (the `+`, `-`, or space); a context line with no leading space keeps all
|
|
563
|
+
* of it; header lines contribute an empty line so offsets stay per line.
|
|
564
|
+
*/
|
|
565
|
+
export function splitDiffLines(lines) {
|
|
566
|
+
const kinds = [];
|
|
567
|
+
const glyphs = [];
|
|
568
|
+
const content = [];
|
|
569
|
+
const fileHeaders = fileHeaderLines(lines);
|
|
570
|
+
lines.forEach((line, index) => {
|
|
571
|
+
const kind = diffLineKind(line, {
|
|
572
|
+
isFileHeader: fileHeaders.has(index)
|
|
573
|
+
});
|
|
574
|
+
kinds.push(kind);
|
|
575
|
+
if (kind === 'header') {
|
|
576
|
+
glyphs.push('');
|
|
577
|
+
content.push('');
|
|
578
|
+
} else if (kind === 'context' && !line.startsWith(' ')) {
|
|
579
|
+
// A context line without its leading space (an unindented diff, or
|
|
580
|
+
// an empty line) has no glyph: the marker column is empty and the
|
|
581
|
+
// whole line is code.
|
|
582
|
+
glyphs.push('');
|
|
583
|
+
content.push(line);
|
|
584
|
+
} else {
|
|
585
|
+
glyphs.push(line.slice(0, 1));
|
|
586
|
+
content.push(line.slice(1));
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
return {
|
|
590
|
+
kinds,
|
|
591
|
+
glyphs,
|
|
592
|
+
content
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Classify one line of a unified diff by its first character: `+` added,
|
|
598
|
+
* `-` removed, `@@` header, anything else context. A `--- ` line (with its
|
|
599
|
+
* space) directly followed by a `+++ ` line and then an `@@` line is a file
|
|
600
|
+
* header (both lines), wherever it occurs; every other `---`/`+++` line is
|
|
601
|
+
* removed or added, so a removed line that starts with `--` — `---i;`
|
|
602
|
+
* included — is never misread. The glyph is part of the text and is never
|
|
603
|
+
* removed.
|
|
604
|
+
*/
|
|
605
|
+
export function diffLineKind(line, {
|
|
606
|
+
isFileHeader = false
|
|
607
|
+
} = {}) {
|
|
608
|
+
if (line.startsWith('@@') || isFileHeader) {
|
|
609
|
+
return 'header';
|
|
610
|
+
}
|
|
611
|
+
if (line.startsWith('+')) {
|
|
612
|
+
return 'added';
|
|
613
|
+
}
|
|
614
|
+
if (line.startsWith('-')) {
|
|
615
|
+
return 'removed';
|
|
616
|
+
}
|
|
617
|
+
return 'context';
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/**
|
|
621
|
+
* The indexes of the `--- `/`+++ ` lines (unified-diff form, with the space)
|
|
622
|
+
* that form a file header directly before an `@@`; `---i;` is a change.
|
|
623
|
+
*/
|
|
624
|
+
export function fileHeaderLines(lines) {
|
|
625
|
+
const headers = new Set();
|
|
626
|
+
for (let i = 0; i + 2 < lines.length; i++) {
|
|
627
|
+
if (lines[i].startsWith('--- ') && lines[i + 1].startsWith('+++ ') && lines[i + 2].startsWith('@@')) {
|
|
628
|
+
headers.add(i);
|
|
629
|
+
headers.add(i + 1);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return headers;
|
|
633
|
+
}
|
|
634
|
+
|
|
527
635
|
// ---------------------------------------------------------------------------
|
|
528
636
|
// Core tokenizer
|
|
529
637
|
// ---------------------------------------------------------------------------
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file CommandPalette.tsx
|
|
3
|
-
* @input Uses React, Dialog, Layout, CommandPaletteContext, SearchSource,
|
|
3
|
+
* @input Uses React, Dialog, Layout, CommandPaletteContext, SearchSource,
|
|
4
|
+
* useCombobox, useAnnounce, useAnnounceRenderedText
|
|
4
5
|
* @output Exports CommandPalette root component and props
|
|
5
6
|
* @position Core root component; dialog shell with searchSource-driven items
|
|
6
7
|
*
|
|
@@ -42,7 +43,9 @@ export interface CommandPaletteProps<T extends SearchableItem = SearchableItem>
|
|
|
42
43
|
footer?: ReactNode;
|
|
43
44
|
/**
|
|
44
45
|
* Per-item render function. Receives the item and whether it is currently selected.
|
|
45
|
-
*
|
|
46
|
+
* Return non-interactive presentation content; buttons and links cannot be
|
|
47
|
+
* nested inside the rendered option. Auto-grouping by `auxiliaryData.group`
|
|
48
|
+
* is preserved.
|
|
46
49
|
* When omitted, renders each item's `label` text.
|
|
47
50
|
*/
|
|
48
51
|
renderItem?: (item: T, isSelected: boolean) => ReactNode;
|
|
@@ -82,9 +85,10 @@ export interface CommandPaletteProps<T extends SearchableItem = SearchableItem>
|
|
|
82
85
|
* Uses `searchSource` for all search logic — same interface as Typeahead.
|
|
83
86
|
* For static lists, use `createStaticSource` from `@astryxdesign/core/Typeahead`.
|
|
84
87
|
*
|
|
85
|
-
* Keyboard navigation is handled by `useCombobox` from Selector,
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
+
* Keyboard navigation is handled by `useCombobox` from Selector for arrows,
|
|
89
|
+
* PageUp/PageDown, and Enter. Home/End remain native caret keys. Modal Escape
|
|
90
|
+
* dismissal delegates to Dialog's shared layer stack so nested surfaces handle
|
|
91
|
+
* the first press.
|
|
88
92
|
*
|
|
89
93
|
* Input and footer are rendered by default — only pass them to replace the defaults.
|
|
90
94
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../src/CommandPalette/CommandPalette.tsx"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../src/CommandPalette/CommandPalette.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AAEH,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,YAAY,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAU/D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAK5C,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,cAAc,GAAG,cAAc,CACzC,SAAQ,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACtD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC,2CAA2C;IAC3C,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,0DAA0D;IAC1D,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAExC;;;;OAIG;IACH,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAE9B;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,SAAS,CAAC;IAEzD;;;OAGG;IACH,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAE/B,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8CAA8C;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAiID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EACxE,GAAG,EACH,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,MAAM,EACN,UAAU,EACV,eAAe,EAAE,wBAAwB,EACzC,kBAAkB,EAAE,2BAA2B,EAC/C,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,KAAK,EAAE,cAAc,EACrB,KAAW,EACX,SAAe,EACf,GAAG,IAAI,EACR,EAAE,mBAAmB,CAAC,CAAC,CAAC,+BA2YxB;yBA5Ze,cAAc"}
|