@astryxdesign/core 0.6.2-canary.bfee8a4 → 0.6.2-canary.d4cc232
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/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +12 -2
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +6 -1
- package/dist/Kbd/Kbd.d.ts +5 -3
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +36 -42
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +6 -2
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +63 -59
- package/dist/Markdown/ast.d.ts +124 -0
- package/dist/Markdown/ast.d.ts.map +1 -0
- package/dist/Markdown/ast.js +38 -0
- package/dist/Markdown/parser.d.ts +14 -8
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +352 -97
- package/dist/Outline/parseOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/parseOutlineFromMarkdown.js +7 -7
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +46 -30
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +13 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -5
- package/dist/SideNav/SideNav.d.ts +2 -1
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +9 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +14 -8
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +11 -0
- package/dist/TabList/Tab.d.ts +1 -1
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +20 -7
- package/dist/ToggleButton/ToggleButton.d.ts +2 -1
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +7 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +15 -6
- package/dist/astryx.css +8 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +8 -0
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +9 -0
- package/package.json +3 -3
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +17 -1
- package/src/Button/__tests__/Button.a11y.known-failures.ts +0 -29
- package/src/Button/__tests__/Button.a11y.renders.tsx +9 -2
- package/src/Button/__tests__/Button.a11y.states.ts +9 -0
- package/src/CheckboxInput/CheckboxInput.doc.mjs +11 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +34 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -1
- package/src/ClickableCard/ClickableCard.test.tsx +102 -5
- package/src/Collapsible/Collapsible.doc.mjs +11 -0
- package/src/Collapsible/Collapsible.test.tsx +21 -0
- package/src/Collapsible/Collapsible.tsx +5 -0
- package/src/Kbd/Kbd.doc.mjs +3 -3
- package/src/Kbd/Kbd.test.tsx +57 -1
- package/src/Kbd/Kbd.tsx +57 -37
- package/src/Link/Link.doc.mjs +11 -0
- package/src/Link/Link.test.tsx +24 -0
- package/src/Link/Link.tsx +5 -0
- package/src/Markdown/Markdown.spec.md +159 -43
- package/src/Markdown/Markdown.test.tsx +11 -0
- package/src/Markdown/Markdown.tsx +106 -96
- package/src/Markdown/ast.test.ts +169 -0
- package/src/Markdown/ast.ts +231 -0
- package/src/Markdown/incremental.test.ts +12 -0
- package/src/Markdown/parser.ts +427 -118
- package/src/Outline/Outline.spec.md +1 -1
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +142 -0
- package/src/Outline/parseOutlineFromMarkdown.ts +8 -13
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +150 -1
- package/src/PowerSearch/PowerSearchEditPopover.tsx +51 -28
- package/src/RadioList/RadioList.doc.mjs +11 -0
- package/src/RadioList/RadioList.test.tsx +32 -0
- package/src/RadioList/RadioListItem.tsx +25 -1
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +31 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +6 -9
- package/src/SideNav/SideNav.doc.mjs +1 -1
- package/src/SideNav/SideNav.test.tsx +10 -0
- package/src/SideNav/SideNav.tsx +14 -2
- package/src/Slider/Slider.doc.mjs +11 -0
- package/src/Slider/Slider.test.tsx +128 -0
- package/src/Slider/Slider.tsx +25 -7
- package/src/Switch/Switch.doc.mjs +11 -0
- package/src/Switch/Switch.test.tsx +16 -0
- package/src/Switch/Switch.tsx +28 -0
- package/src/TabList/Tab.tsx +35 -7
- package/src/TabList/TabList.doc.mjs +11 -0
- package/src/TabList/TabList.test.tsx +66 -0
- package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +1 -34
- package/src/ToggleButton/ToggleButton.test.tsx +133 -0
- package/src/ToggleButton/ToggleButton.tsx +9 -2
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +209 -0
- package/src/Tokenizer/Tokenizer.spec.md +142 -75
- package/src/Typeahead/BaseTypeahead.spec.md +4 -3
- package/src/Typeahead/BaseTypeahead.tsx +15 -6
- package/src/Typeahead/Typeahead.test.tsx +53 -0
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +813 -0
- package/src/__tests__/pressState.ts +93 -0
- package/src/utils/interactionOverlay.stylex.ts +20 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckboxInput.d.ts","sourceRoot":"","sources":["../../src/CheckboxInput/CheckboxInput.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAS3C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAG9C,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"CheckboxInput.d.ts","sourceRoot":"","sources":["../../src/CheckboxInput/CheckboxInput.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAS3C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAG9C,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAqFhD,QAAA,MAAM,iBAAiB;;;;;;;;;EASrB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAE/D,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IACrE,wDAAwD;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACxE;;OAEG;IACH,YAAY,CAAC,EAAE,CACb,OAAO,EAAE,OAAO,EAChB,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAC7B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,KAAK,EAAE,OAAO,GAAG,eAAe,CAAC;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACjC;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAOD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,SAAiB,EACjB,KAAK,EACL,UAAkB,EAClB,QAAQ,EACR,eAAe,EACf,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,IAAW,EACX,OAAO,EACP,MAAM,EACN,SAAS,EACT,MAAM,EACN,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,kBAAkB,EAAE,mBAAmB,EACvC,GAAG,IAAI,EACR,EAAE,kBAAkB,+BAyNpB;yBAnPe,aAAa"}
|
|
@@ -18,12 +18,13 @@
|
|
|
18
18
|
import { useId, useCallback, use, useOptimistic, useRef, useTransition } from 'react';
|
|
19
19
|
import * as stylex from '@stylexjs/stylex';
|
|
20
20
|
import "../theme/tokens.stylex.js";
|
|
21
|
-
import { colorVars, spacingVars, typographyVars, typeScaleVars, fontWeightVars } from "../theme/tokens.stylex.js";
|
|
21
|
+
import { colorVars, spacingVars, radiusVars, typographyVars, typeScaleVars, fontWeightVars } from "../theme/tokens.stylex.js";
|
|
22
22
|
import { FieldLabel } from "../Field/FieldLabel.js";
|
|
23
23
|
import { FieldStatus } from "../FieldStatus/FieldStatus.js";
|
|
24
24
|
import { Spinner } from "../Spinner/index.js";
|
|
25
25
|
import { useTooltip } from "../Tooltip/index.js";
|
|
26
26
|
import { mergeProps, rtlStyles } from "../utils/index.js";
|
|
27
|
+
import "../Indicator/indicator.markers.stylex.js";
|
|
27
28
|
import { indicatorScope } from "../Indicator/indicator.markers.stylex.js";
|
|
28
29
|
import { useIndicatorFocusRing } from "../hooks/useIndicatorFocusRing.js";
|
|
29
30
|
import { useResolvedRequired } from "../hooks/useResolvedRequired.js";
|
|
@@ -52,6 +53,15 @@ const styles = {
|
|
|
52
53
|
kHBbk8: "xc8icb0",
|
|
53
54
|
$$css: true
|
|
54
55
|
},
|
|
56
|
+
indicatorPressOverlay: {
|
|
57
|
+
k5JduY: "x1s928wv",
|
|
58
|
+
kwXMNM: "x1j6awrg",
|
|
59
|
+
kv0HGH: "xarstr8",
|
|
60
|
+
kUfP38: "xtb6wbx",
|
|
61
|
+
kloYau: "x2q1x1w",
|
|
62
|
+
ks3ayO: "xyhc2n1 xzywxsk",
|
|
63
|
+
$$css: true
|
|
64
|
+
},
|
|
55
65
|
input: {
|
|
56
66
|
kVAEAm: "x10l6tqk",
|
|
57
67
|
k87sOh: "xwa60dl",
|
|
@@ -236,7 +246,7 @@ export function CheckboxInput({
|
|
|
236
246
|
// marker rather than props, so the whole row drives it.
|
|
237
247
|
!isDisabled && indicatorScope),
|
|
238
248
|
children: [/*#__PURE__*/_jsxs("div", {
|
|
239
|
-
...stylex.props(styles.checkboxWrapper, wrapperSizeStyles[size]),
|
|
249
|
+
...stylex.props(styles.checkboxWrapper, wrapperSizeStyles[size], !isDisabled && styles.indicatorPressOverlay),
|
|
240
250
|
...focusProps,
|
|
241
251
|
children: [/*#__PURE__*/_jsx("input", {
|
|
242
252
|
...rest,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collapsible.d.ts","sourceRoot":"","sources":["../../src/Collapsible/Collapsible.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAa,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAejD,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,2BAA2B,CAAC;AAG1E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Collapsible.d.ts","sourceRoot":"","sources":["../../src/Collapsible/Collapsible.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAa,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAejD,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,2BAA2B,CAAC;AAG1E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA2J5C,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC;;;OAGG;IACH,OAAO,EAAE,SAAS,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EAAE,0BAA0B,CAAC;IAE7C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,QAAQ,EACR,aAAa,EACb,MAAM,EAAE,gBAAgB,EACxB,UAAkB,EAClB,YAAY,EACZ,eAAe,EACf,KAAK,EACL,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,gBAAgB,+BA8HlB;yBA5Ie,WAAW"}
|
|
@@ -36,6 +36,7 @@ import { Icon } from "../Icon/index.js";
|
|
|
36
36
|
import { mergeProps } from "../utils/index.js";
|
|
37
37
|
import { themeProps } from "../utils/themeProps.js";
|
|
38
38
|
import { focusOutlineProps } from "../utils/focusOutline.stylex.js";
|
|
39
|
+
import { interactionOverlayStyles } from "../utils/interactionOverlay.stylex.js";
|
|
39
40
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
40
41
|
const styles = {
|
|
41
42
|
root: {
|
|
@@ -282,7 +283,11 @@ export function Collapsible({
|
|
|
282
283
|
tabIndex: isDisabled ? -1 : undefined,
|
|
283
284
|
...mergeProps(themeProps('collapsible-trigger', {
|
|
284
285
|
density: density ?? undefined
|
|
285
|
-
}), focusOutlineProps.focusVisible(styles.trigger, density != null && triggerDensity[density],
|
|
286
|
+
}), focusOutlineProps.focusVisible(styles.trigger, density != null && triggerDensity[density],
|
|
287
|
+
// The system's pressed overlay on the disclosure row. The trigger
|
|
288
|
+
// has no hover surface of its own, so this is the one background
|
|
289
|
+
// it paints, and only while it is pressed.
|
|
290
|
+
!isDisabled && interactionOverlayStyles.pressedBackgroundColor, isDisabled && styles.triggerDisabled)),
|
|
286
291
|
children: [isChevronAtStart && chevron, /*#__PURE__*/_jsx("span", {
|
|
287
292
|
...{
|
|
288
293
|
className: "x1b2iylo xwgcxoh x1iyjqo2"
|
package/dist/Kbd/Kbd.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file Kbd.tsx
|
|
3
|
-
* @input Uses React, StyleX, theme tokens
|
|
4
|
-
* @output Exports Kbd component and KbdProps
|
|
3
|
+
* @input Uses React, StyleX, theme tokens, shortcut key names and aliases
|
|
4
|
+
* @output Exports Kbd component and KbdProps with canonical shortcut labels
|
|
5
5
|
* @position Core implementation; renders styled keyboard shortcut indicators
|
|
6
6
|
*
|
|
7
7
|
* SYNC: When modified, update:
|
|
@@ -14,7 +14,9 @@ export interface KbdProps extends BaseProps<HTMLSpanElement> {
|
|
|
14
14
|
ref?: React.Ref<HTMLSpanElement>;
|
|
15
15
|
/**
|
|
16
16
|
* Keyboard shortcut string. Use "+" to separate keys.
|
|
17
|
-
* Special keys: mod (Cmd on Mac), ctrl, alt, shift, enter, backspace, escape
|
|
17
|
+
* Special keys: mod (Cmd on Mac), ctrl, alt, shift, enter, backspace, escape,
|
|
18
|
+
* tab, up, down, left, and right.
|
|
19
|
+
* Aliases: "esc" for "escape" and "return" for "enter".
|
|
18
20
|
* Use "plus" to render a literal "+" key (e.g. "shift+plus").
|
|
19
21
|
*
|
|
20
22
|
* @example
|
package/dist/Kbd/Kbd.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.d.ts","sourceRoot":"","sources":["../../src/Kbd/Kbd.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAA6B,MAAM,OAAO,CAAC;AAIlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Kbd.d.ts","sourceRoot":"","sources":["../../src/Kbd/Kbd.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAA6B,MAAM,OAAO,CAAC;AAIlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA+G5C,MAAM,WAAW,QAAS,SAAQ,SAAS,CAAC,eAAe,CAAC;IAC1D,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC;;;;;;;;;;;;;;OAcG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,GAAG,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAC,EAAE,QAAQ,qBA6C3E;yBA7Ce,GAAG"}
|
package/dist/Kbd/Kbd.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Kbd.tsx
|
|
7
|
-
* @input Uses React, StyleX, theme tokens
|
|
8
|
-
* @output Exports Kbd component and KbdProps
|
|
7
|
+
* @input Uses React, StyleX, theme tokens, shortcut key names and aliases
|
|
8
|
+
* @output Exports Kbd component and KbdProps with canonical shortcut labels
|
|
9
9
|
* @position Core implementation; renders styled keyboard shortcut indicators
|
|
10
10
|
*
|
|
11
11
|
* SYNC: When modified, update:
|
|
@@ -35,26 +35,20 @@ const styles = {
|
|
|
35
35
|
* Note: `mod` is not in this map — it resolves dynamically via platform
|
|
36
36
|
* detection inside the component.
|
|
37
37
|
*/
|
|
38
|
-
const KEY_DISPLAY =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
up: '\u2191',
|
|
53
|
-
down: '\u2193',
|
|
54
|
-
left: '\u2190',
|
|
55
|
-
right: '\u2192',
|
|
56
|
-
plus: '+'
|
|
57
|
-
};
|
|
38
|
+
const KEY_DISPLAY = new Map([['ctrl', '\u2303'],
|
|
39
|
+
// ⌃
|
|
40
|
+
['alt', '\u2325'],
|
|
41
|
+
// ⌥
|
|
42
|
+
['shift', '\u21E7'],
|
|
43
|
+
// ⇧
|
|
44
|
+
['enter', '\u21B5'],
|
|
45
|
+
// ↵
|
|
46
|
+
['backspace', '\u232B'],
|
|
47
|
+
// ⌫
|
|
48
|
+
['escape', 'Esc'], ['tab', '\u21E5'],
|
|
49
|
+
// ⇥
|
|
50
|
+
['up', '\u2191'], ['down', '\u2193'], ['left', '\u2190'], ['right', '\u2192'], ['plus', '+']]);
|
|
51
|
+
const KBD_KEY_ALIASES = new Map([['esc', 'escape'], ['return', 'enter']]);
|
|
58
52
|
|
|
59
53
|
/**
|
|
60
54
|
* Resolves a key name to its display string. Handles the platform-aware
|
|
@@ -65,7 +59,7 @@ function getKeyDisplay(key, isMac) {
|
|
|
65
59
|
if (key === 'mod') {
|
|
66
60
|
return isMac ? '\u2318' : 'Ctrl';
|
|
67
61
|
}
|
|
68
|
-
return KEY_DISPLAY
|
|
62
|
+
return KEY_DISPLAY.get(key) ?? key.toUpperCase();
|
|
69
63
|
}
|
|
70
64
|
|
|
71
65
|
/**
|
|
@@ -73,25 +67,12 @@ function getKeyDisplay(key, isMac) {
|
|
|
73
67
|
* (⌘, ⇧, ↵, …) that assistive tech cannot announce meaningfully, so the
|
|
74
68
|
* accessible name for the shortcut is built from these words instead.
|
|
75
69
|
*/
|
|
76
|
-
const KEY_LABEL =
|
|
77
|
-
ctrl: 'Control',
|
|
78
|
-
alt: 'Alt',
|
|
79
|
-
shift: 'Shift',
|
|
80
|
-
enter: 'Enter',
|
|
81
|
-
backspace: 'Backspace',
|
|
82
|
-
escape: 'Escape',
|
|
83
|
-
tab: 'Tab',
|
|
84
|
-
up: 'Up arrow',
|
|
85
|
-
down: 'Down arrow',
|
|
86
|
-
left: 'Left arrow',
|
|
87
|
-
right: 'Right arrow',
|
|
88
|
-
plus: 'Plus'
|
|
89
|
-
};
|
|
70
|
+
const KEY_LABEL = new Map([['ctrl', 'Control'], ['alt', 'Alt'], ['shift', 'Shift'], ['enter', 'Enter'], ['backspace', 'Backspace'], ['escape', 'Escape'], ['tab', 'Tab'], ['up', 'Up arrow'], ['down', 'Down arrow'], ['left', 'Left arrow'], ['right', 'Right arrow'], ['plus', 'Plus']]);
|
|
90
71
|
function getKeyLabel(key, isMac) {
|
|
91
72
|
if (key === 'mod') {
|
|
92
73
|
return isMac ? 'Command' : 'Control';
|
|
93
74
|
}
|
|
94
|
-
return KEY_LABEL
|
|
75
|
+
return KEY_LABEL.get(key) ?? key.toUpperCase();
|
|
95
76
|
}
|
|
96
77
|
function subscribeToPlatformChanges() {
|
|
97
78
|
return () => {};
|
|
@@ -123,24 +104,37 @@ export function Kbd({
|
|
|
123
104
|
...rest
|
|
124
105
|
}) {
|
|
125
106
|
const isMac = useSyncExternalStore(subscribeToPlatformChanges, isApplePlatform, getServerPlatformSnapshot);
|
|
126
|
-
const
|
|
107
|
+
const keyOccurrences = new Map();
|
|
108
|
+
const parts = keys.split('+').map(key => key.trim().toLowerCase()).map(sourceKey => {
|
|
109
|
+
const occurrence = keyOccurrences.get(sourceKey) ?? 0;
|
|
110
|
+
keyOccurrences.set(sourceKey, occurrence + 1);
|
|
111
|
+
return {
|
|
112
|
+
key: KBD_KEY_ALIASES.get(sourceKey) ?? sourceKey,
|
|
113
|
+
reactKey: `${sourceKey}:${occurrence}`
|
|
114
|
+
};
|
|
115
|
+
});
|
|
127
116
|
|
|
128
117
|
// Screen-reader name: the joined spoken labels (e.g. "Command + K"), since
|
|
129
118
|
// the visual glyphs below are announced meaninglessly by assistive tech.
|
|
130
|
-
const accessibleName = parts.map(
|
|
119
|
+
const accessibleName = parts.map(({
|
|
120
|
+
key
|
|
121
|
+
}) => getKeyLabel(key, isMac)).join(' + ');
|
|
131
122
|
return /*#__PURE__*/_jsx("span", {
|
|
132
123
|
...rest,
|
|
133
124
|
ref: ref,
|
|
134
125
|
role: "img",
|
|
135
126
|
"aria-label": accessibleName,
|
|
136
127
|
...mergeProps(themeProps('kbd'), stylex.props(styles.wrapper, xstyle), className, style),
|
|
137
|
-
children: parts.map(
|
|
128
|
+
children: parts.map(({
|
|
129
|
+
key,
|
|
130
|
+
reactKey
|
|
131
|
+
}) => /*#__PURE__*/_jsx("kbd", {
|
|
138
132
|
"aria-hidden": "true",
|
|
139
133
|
...{
|
|
140
134
|
className: "x3nfvp2 x6s0dn4 xl56j7k x16asifk x1grt7ep x7a5moj xx3sua9 x17x4s8c xlxy82 x1q0q8m5 xib2hle xv1l7n4 x9ynric x141an7d x1e4wzip x1ltkj2j x87ps6o"
|
|
141
135
|
},
|
|
142
136
|
children: getKeyDisplay(key, isMac)
|
|
143
|
-
},
|
|
137
|
+
}, reactKey))
|
|
144
138
|
});
|
|
145
139
|
}
|
|
146
140
|
Kbd.displayName = 'Kbd';
|
package/dist/Link/Link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/Link/Link.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAc5C,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,UAAU,EACV,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/Link/Link.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAc5C,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,UAAU,EACV,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAoG/C,MAAM,WAAW,SAAU,SAAQ,SAAS,CAC1C,iBAAiB,GAAG,iBAAiB,CACtC;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,CAAC;IACvD;;;;;OAKG;IACH,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,2BAA2B,CAAC;IACnD;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,CAAC;IACzE;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;CACrB;AAWD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,IAAI,CAAC,EACnB,EAAE,EACF,KAAK,EACL,IAAI,EACJ,YAAoB,EACpB,UAAkB,EAClB,cAAsB,EACtB,WAAW,EAAE,oBAAoB,EACjC,MAAM,EAAE,eAAe,EACvB,OAAO,EACP,OAAO,EACP,YAAoB,EACpB,IAAa,EACb,IAAI,EACJ,MAAM,EACN,KAAgB,EAChB,OAAkB,EAClB,QAAY,EACZ,QAAQ,EACR,GAAG,EAAE,YAAY,EACjB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,SAAS,+BA6IX;yBAtKe,IAAI"}
|
package/dist/Link/Link.js
CHANGED
|
@@ -28,6 +28,7 @@ import { computeTargetAndRel } from "./computeTargetAndRel.js";
|
|
|
28
28
|
import { useInteractiveRole } from "../hooks/useInteractiveRole.js";
|
|
29
29
|
import { themeProps } from "../utils/themeProps.js";
|
|
30
30
|
import { focusOutlineProps } from "../utils/focusOutline.stylex.js";
|
|
31
|
+
import { interactionOverlayStyles } from "../utils/interactionOverlay.stylex.js";
|
|
31
32
|
import { useTranslator } from "../i18n/index.js";
|
|
32
33
|
|
|
33
34
|
/**
|
|
@@ -206,7 +207,10 @@ export function Link({
|
|
|
206
207
|
disabled: isDisabled,
|
|
207
208
|
...mergeProps(themeProps('link', {
|
|
208
209
|
color
|
|
209
|
-
}), focusOutlineProps.focusVisible(styles.base, styles.buttonReset, linkColorStyles[color],
|
|
210
|
+
}), focusOutlineProps.focusVisible(styles.base, styles.buttonReset, linkColorStyles[color],
|
|
211
|
+
// The system's pressed overlay behind the text; the hover stays the
|
|
212
|
+
// colour change above, so a press is the one background it paints.
|
|
213
|
+
!isDisabled && interactionOverlayStyles.pressedBackgroundColor, hasUnderline && styles.hasUnderline, isStandalone && styles.standalone, isDisabled && styles.disabled, xstyle), className, style),
|
|
210
214
|
...props,
|
|
211
215
|
children: sharedContent
|
|
212
216
|
});
|
|
@@ -241,7 +245,7 @@ export function Link({
|
|
|
241
245
|
tabIndex: isDisabled ? -1 : undefined,
|
|
242
246
|
...mergeProps(themeProps('link', {
|
|
243
247
|
color
|
|
244
|
-
}), focusOutlineProps.focusVisible(styles.base, linkColorStyles[color], hasUnderline && styles.hasUnderline, isStandalone && styles.standalone, isDisabled && styles.disabled, xstyle), className, style),
|
|
248
|
+
}), focusOutlineProps.focusVisible(styles.base, linkColorStyles[color], !isDisabled && interactionOverlayStyles.pressedBackgroundColor, hasUnderline && styles.hasUnderline, isStandalone && styles.standalone, isDisabled && styles.disabled, xstyle), className, style),
|
|
245
249
|
...props,
|
|
246
250
|
children: sharedContent
|
|
247
251
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../src/Markdown/Markdown.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAgBhD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAG5C,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../src/Markdown/Markdown.tsx"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,8 @@ import { computeBoundaries, computeSegments } from "./streaming.js";
|
|
|
31
31
|
import { useTheme } from "../theme/useTheme.js";
|
|
32
32
|
import { Citation } from "../Citation/Citation.js";
|
|
33
33
|
import { useLinkComponent } from "../Link/useLinkComponent.js";
|
|
34
|
-
import {
|
|
34
|
+
import { parseInlineAst, parseMarkdownAst, parseMarkdownAstIncremental, createIncrementalState, trimStreamingArtifacts, slugify, uniqueSlug } from "./parser.js";
|
|
35
|
+
import { markdownAstText } from "./ast.js";
|
|
35
36
|
import { themeProps } from "../utils/themeProps.js";
|
|
36
37
|
import { useTranslator } from "../i18n/index.js";
|
|
37
38
|
|
|
@@ -331,20 +332,20 @@ function countInlineTextLength(nodes) {
|
|
|
331
332
|
for (const node of nodes) {
|
|
332
333
|
switch (node.type) {
|
|
333
334
|
case 'text':
|
|
334
|
-
len += node.
|
|
335
|
+
len += node.value.length;
|
|
335
336
|
break;
|
|
336
|
-
case '
|
|
337
|
-
len += node.
|
|
337
|
+
case 'inlineCode':
|
|
338
|
+
len += node.value.length;
|
|
338
339
|
break;
|
|
339
|
-
case '
|
|
340
|
+
case 'inlineMath':
|
|
340
341
|
len += node.value.length;
|
|
341
342
|
break;
|
|
342
343
|
case 'image':
|
|
343
344
|
len += node.alt.length;
|
|
344
345
|
break;
|
|
345
|
-
case '
|
|
346
|
-
case '
|
|
347
|
-
case '
|
|
346
|
+
case 'strong':
|
|
347
|
+
case 'emphasis':
|
|
348
|
+
case 'delete':
|
|
348
349
|
case 'link':
|
|
349
350
|
len += countInlineTextLength(node.children);
|
|
350
351
|
break;
|
|
@@ -370,8 +371,8 @@ function countBlockTextLength(nodes) {
|
|
|
370
371
|
case 'paragraph':
|
|
371
372
|
len += countInlineTextLength(node.children);
|
|
372
373
|
break;
|
|
373
|
-
case '
|
|
374
|
-
len += node.
|
|
374
|
+
case 'code':
|
|
375
|
+
len += node.value.length;
|
|
375
376
|
break;
|
|
376
377
|
case 'math':
|
|
377
378
|
len += node.value.length;
|
|
@@ -380,21 +381,18 @@ function countBlockTextLength(nodes) {
|
|
|
380
381
|
len += countBlockTextLength(node.children);
|
|
381
382
|
break;
|
|
382
383
|
case 'list':
|
|
383
|
-
for (const item of node.
|
|
384
|
+
for (const item of node.children) {
|
|
384
385
|
len += countBlockTextLength(item.children);
|
|
385
386
|
}
|
|
386
387
|
break;
|
|
387
388
|
case 'table':
|
|
388
|
-
for (const
|
|
389
|
-
|
|
390
|
-
}
|
|
391
|
-
for (const row of node.rows) {
|
|
392
|
-
for (const cell of row) {
|
|
389
|
+
for (const row of node.children) {
|
|
390
|
+
for (const cell of row.children) {
|
|
393
391
|
len += countInlineTextLength(cell.children);
|
|
394
392
|
}
|
|
395
393
|
}
|
|
396
394
|
break;
|
|
397
|
-
case '
|
|
395
|
+
case 'thematicBreak':
|
|
398
396
|
break;
|
|
399
397
|
case 'image':
|
|
400
398
|
len += node.alt.length;
|
|
@@ -576,7 +574,7 @@ function renderInline(node, index, onLinkClick, cursor, citationCtx, linkCompone
|
|
|
576
574
|
case 'text':
|
|
577
575
|
{
|
|
578
576
|
if (inlinePlugins && inlinePlugins.length > 0) {
|
|
579
|
-
const segments = applyInlinePlugins(node.
|
|
577
|
+
const segments = applyInlinePlugins(node.value, inlinePlugins);
|
|
580
578
|
// If no plugin matched, fall through to the normal path
|
|
581
579
|
// O(1) guard: applyInlinePlugins returns a single text segment when
|
|
582
580
|
// nothing matched — skip the plugin path entirely in that case.
|
|
@@ -599,39 +597,39 @@ function renderInline(node, index, onLinkClick, cursor, citationCtx, linkCompone
|
|
|
599
597
|
}, index);
|
|
600
598
|
}
|
|
601
599
|
}
|
|
602
|
-
return wrapTextWithFade(node.
|
|
600
|
+
return wrapTextWithFade(node.value, cursor, index);
|
|
603
601
|
}
|
|
604
|
-
case '
|
|
602
|
+
case 'strong':
|
|
605
603
|
return /*#__PURE__*/_jsx("strong", {
|
|
606
604
|
...{
|
|
607
605
|
className: "x2mo6ok"
|
|
608
606
|
},
|
|
609
607
|
children: node.children.map((c, i) => renderInline(c, i, onLinkClick, cursor, citationCtx, linkComponent, inlinePlugins, components))
|
|
610
608
|
}, index);
|
|
611
|
-
case '
|
|
609
|
+
case 'emphasis':
|
|
612
610
|
return /*#__PURE__*/_jsx("em", {
|
|
613
611
|
children: node.children.map((c, i) => renderInline(c, i, onLinkClick, cursor, citationCtx, linkComponent, inlinePlugins, components))
|
|
614
612
|
}, index);
|
|
615
|
-
case '
|
|
613
|
+
case 'delete':
|
|
616
614
|
return /*#__PURE__*/_jsx("del", {
|
|
617
615
|
...{
|
|
618
616
|
className: "xv1l7n4"
|
|
619
617
|
},
|
|
620
618
|
children: node.children.map((c, i) => renderInline(c, i, onLinkClick, cursor, citationCtx, linkComponent, inlinePlugins, components))
|
|
621
619
|
}, index);
|
|
622
|
-
case '
|
|
620
|
+
case 'inlineCode':
|
|
623
621
|
{
|
|
624
622
|
// Track code content length for cursor but don't split inside code
|
|
625
|
-
cursor.offset += node.
|
|
623
|
+
cursor.offset += node.value.length;
|
|
626
624
|
const InlineCodeComp = components?.inlineCode;
|
|
627
625
|
const codeEl = InlineCodeComp ? /*#__PURE__*/_jsx(InlineCodeComp, {
|
|
628
|
-
children: node.
|
|
626
|
+
children: node.value
|
|
629
627
|
}, index) : /*#__PURE__*/_jsx(Code, {
|
|
630
|
-
children: node.
|
|
628
|
+
children: node.value
|
|
631
629
|
}, index);
|
|
632
630
|
return codeEl;
|
|
633
631
|
}
|
|
634
|
-
case '
|
|
632
|
+
case 'inlineMath':
|
|
635
633
|
{
|
|
636
634
|
const MathComp = components?.math;
|
|
637
635
|
if (MathComp == null) {
|
|
@@ -645,7 +643,7 @@ function renderInline(node, index, onLinkClick, cursor, citationCtx, linkCompone
|
|
|
645
643
|
}
|
|
646
644
|
case 'link':
|
|
647
645
|
{
|
|
648
|
-
const safeHref = sanitizeUrl(node.
|
|
646
|
+
const safeHref = sanitizeUrl(node.url);
|
|
649
647
|
if (safeHref == null) {
|
|
650
648
|
// Unsafe URL — render as plain text
|
|
651
649
|
return /*#__PURE__*/_jsx("span", {
|
|
@@ -685,7 +683,7 @@ function renderInline(node, index, onLinkClick, cursor, citationCtx, linkCompone
|
|
|
685
683
|
}
|
|
686
684
|
case 'image':
|
|
687
685
|
{
|
|
688
|
-
const safeSrc = sanitizeUrl(node.
|
|
686
|
+
const safeSrc = sanitizeUrl(node.url);
|
|
689
687
|
if (safeSrc == null) {
|
|
690
688
|
return /*#__PURE__*/_jsxs("span", {
|
|
691
689
|
children: ["[", node.alt, "]"]
|
|
@@ -746,10 +744,10 @@ function getElementSpacing(node, density) {
|
|
|
746
744
|
const compact = density === 'compact';
|
|
747
745
|
switch (node.type) {
|
|
748
746
|
case 'heading':
|
|
749
|
-
return node.
|
|
747
|
+
return node.depth <= 3 ? compact ? styles.spacingHeadingMajorCompact : styles.spacingHeadingMajorDefault : compact ? styles.spacingHeadingMinorCompact : styles.spacingHeadingMinorDefault;
|
|
750
748
|
case 'paragraph':
|
|
751
749
|
return compact ? styles.spacingParagraphCompact : styles.spacingParagraphDefault;
|
|
752
|
-
case '
|
|
750
|
+
case 'code':
|
|
753
751
|
case 'math':
|
|
754
752
|
return compact ? styles.spacingCodeblockCompact : styles.spacingCodeblockDefault;
|
|
755
753
|
case 'blockquote':
|
|
@@ -758,7 +756,7 @@ function getElementSpacing(node, density) {
|
|
|
758
756
|
return compact ? styles.spacingListCompact : styles.spacingListDefault;
|
|
759
757
|
case 'table':
|
|
760
758
|
return compact ? styles.spacingTableCompact : styles.spacingTableDefault;
|
|
761
|
-
case '
|
|
759
|
+
case 'thematicBreak':
|
|
762
760
|
return compact ? styles.spacingHrCompact : styles.spacingHrDefault;
|
|
763
761
|
case 'image':
|
|
764
762
|
return compact ? styles.spacingImageCompact : styles.spacingImageDefault;
|
|
@@ -774,11 +772,16 @@ function getElementSpacing(node, density) {
|
|
|
774
772
|
* Buckets: ≤6 chars → 60px, 7–15 → 80px, >15 → 120px.
|
|
775
773
|
*/
|
|
776
774
|
function computeTableColumnMinWidths(node) {
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
775
|
+
const [header, ...rows] = node.children;
|
|
776
|
+
if (header == null) {
|
|
777
|
+
return [];
|
|
778
|
+
}
|
|
779
|
+
return header.children.map((cell, colIdx) => {
|
|
780
|
+
let maxLen = countInlineTextLength(cell.children);
|
|
781
|
+
for (const row of rows) {
|
|
782
|
+
const rowCell = row.children[colIdx];
|
|
783
|
+
if (rowCell != null) {
|
|
784
|
+
const len = countInlineTextLength(rowCell.children);
|
|
782
785
|
if (len > maxLen) {
|
|
783
786
|
maxLen = len;
|
|
784
787
|
}
|
|
@@ -796,7 +799,7 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
796
799
|
switch (node.type) {
|
|
797
800
|
case 'heading':
|
|
798
801
|
{
|
|
799
|
-
const level = Math.min(node.
|
|
802
|
+
const level = Math.min(node.depth + headingLevelStart - 1, 6);
|
|
800
803
|
const headingChildren = node.children.map((c, i) => renderInline(c, i, onLinkClick, cursor, citationCtx, linkComponent, inlinePlugins, components));
|
|
801
804
|
// Only top-level headings get an id: the map is built from the same
|
|
802
805
|
// traversal parseOutlineFromMarkdown uses (which skips headings nested
|
|
@@ -847,15 +850,15 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
847
850
|
children: paraChildren
|
|
848
851
|
}, index);
|
|
849
852
|
}
|
|
850
|
-
case '
|
|
853
|
+
case 'code':
|
|
851
854
|
{
|
|
852
855
|
// Track codeblock content in cursor for accurate character counting
|
|
853
|
-
cursor.offset += node.
|
|
856
|
+
cursor.offset += node.value.length;
|
|
854
857
|
const CodeBlockComp = components?.code;
|
|
855
858
|
if (CodeBlockComp) {
|
|
856
859
|
return /*#__PURE__*/_jsx(CodeBlockComp, {
|
|
857
|
-
code: node.
|
|
858
|
-
language: node.
|
|
860
|
+
code: node.value,
|
|
861
|
+
language: node.lang ?? 'plaintext'
|
|
859
862
|
}, index);
|
|
860
863
|
}
|
|
861
864
|
return /*#__PURE__*/_jsx("div", {
|
|
@@ -863,8 +866,8 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
863
866
|
density
|
|
864
867
|
}), stylex.props(spacing, styles.codeBlockWrapper, isFirst && styles.noMarginBlockStart, isLast && styles.noMarginBlockEnd)),
|
|
865
868
|
children: /*#__PURE__*/_jsx(CodeBlock, {
|
|
866
|
-
code: node.
|
|
867
|
-
language: node.
|
|
869
|
+
code: node.value,
|
|
870
|
+
language: node.lang ?? 'plaintext',
|
|
868
871
|
isCollapsible: true,
|
|
869
872
|
xstyle: [contentWidthValue != null ? dynamicStyles.blockWidth(contentWidthValue) : undefined, blockAlignStyle]
|
|
870
873
|
})
|
|
@@ -905,10 +908,10 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
905
908
|
case 'list':
|
|
906
909
|
{
|
|
907
910
|
// Detect task lists: all items have a checked state
|
|
908
|
-
const isTaskList = node.
|
|
911
|
+
const isTaskList = node.children.length > 0 && node.children.every(item => item.checked != null);
|
|
909
912
|
if (isTaskList) {
|
|
910
913
|
// Extract labels from task items — render as rich inline content
|
|
911
|
-
const checkedValues = node.
|
|
914
|
+
const checkedValues = node.children.map((item, i) => ({
|
|
912
915
|
item,
|
|
913
916
|
key: `task-${i}`
|
|
914
917
|
})).filter(({
|
|
@@ -927,7 +930,7 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
927
930
|
xstyle: styles.blockIndent,
|
|
928
931
|
isReadOnly: true,
|
|
929
932
|
density: "compact",
|
|
930
|
-
children: node.
|
|
933
|
+
children: node.children.map((item, i) => {
|
|
931
934
|
const firstChild = item.children[0];
|
|
932
935
|
const isInline = item.children.length === 1 && firstChild?.type === 'paragraph';
|
|
933
936
|
const label = isInline ? /*#__PURE__*/_jsx(_Fragment, {
|
|
@@ -954,7 +957,7 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
954
957
|
density: "compact",
|
|
955
958
|
start: node.ordered ? node.start : undefined,
|
|
956
959
|
xstyle: styles.blockIndent,
|
|
957
|
-
children: node.
|
|
960
|
+
children: node.children.map((item, i) => {
|
|
958
961
|
const firstChild = item.children[0];
|
|
959
962
|
const isInline = item.children.length === 1 && firstChild?.type === 'paragraph';
|
|
960
963
|
|
|
@@ -978,6 +981,7 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
978
981
|
case 'table':
|
|
979
982
|
{
|
|
980
983
|
const colMinWidths = computeTableColumnMinWidths(node);
|
|
984
|
+
const [header, ...rows] = node.children;
|
|
981
985
|
return /*#__PURE__*/_jsx("div", {
|
|
982
986
|
// Keyboard-focusable so keyboard users can scroll a horizontally
|
|
983
987
|
// overflowing GFM table. Uses role="group" (not "region") so
|
|
@@ -994,19 +998,19 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
994
998
|
textOverflow: "wrap",
|
|
995
999
|
children: [/*#__PURE__*/_jsx(TableHeader, {
|
|
996
1000
|
children: /*#__PURE__*/_jsx(TableRow, {
|
|
997
|
-
children:
|
|
1001
|
+
children: header?.children.map((h, i) => /*#__PURE__*/_jsx(TableHeaderCell
|
|
998
1002
|
// eslint-disable-next-line @eslint-react/no-array-index-key -- markdown table columns are positional by definition
|
|
999
1003
|
, {
|
|
1000
|
-
xstyle: [dynamicStyles.cellMinWidth(`${colMinWidths[i]}px`), node.
|
|
1004
|
+
xstyle: [dynamicStyles.cellMinWidth(`${colMinWidths[i]}px`), node.align[i] === 'center' && cellAlignStyles.center, node.align[i] === 'right' && cellAlignStyles.end],
|
|
1001
1005
|
children: h.children.map((c, j) => renderInline(c, j, onLinkClick, cursor, citationCtx, linkComponent, inlinePlugins, components))
|
|
1002
1006
|
}, i))
|
|
1003
1007
|
})
|
|
1004
1008
|
}), /*#__PURE__*/_jsx(TableBody, {
|
|
1005
|
-
children:
|
|
1006
|
-
const cells = row.map((cell, j) => /*#__PURE__*/_jsx(TableCell
|
|
1009
|
+
children: rows.map((row, i) => {
|
|
1010
|
+
const cells = row.children.map((cell, j) => /*#__PURE__*/_jsx(TableCell
|
|
1007
1011
|
// eslint-disable-next-line @eslint-react/no-array-index-key -- markdown table cells are positional by row and column
|
|
1008
1012
|
, {
|
|
1009
|
-
xstyle: [node.
|
|
1013
|
+
xstyle: [node.align[j] === 'center' && cellAlignStyles.center, node.align[j] === 'right' && cellAlignStyles.end],
|
|
1010
1014
|
children: cell.children.map((c, k) => renderInline(c, k, onLinkClick, cursor, citationCtx, linkComponent, inlinePlugins, components))
|
|
1011
1015
|
}, j));
|
|
1012
1016
|
return /*#__PURE__*/_jsx(TableRow
|
|
@@ -1019,7 +1023,7 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
1019
1023
|
})
|
|
1020
1024
|
}, index);
|
|
1021
1025
|
}
|
|
1022
|
-
case '
|
|
1026
|
+
case 'thematicBreak':
|
|
1023
1027
|
{
|
|
1024
1028
|
const HrComp = components?.hr;
|
|
1025
1029
|
if (HrComp) {
|
|
@@ -1033,7 +1037,7 @@ function renderBlock(node, index, blockCount, density, headingLevelStart, onLink
|
|
|
1033
1037
|
}
|
|
1034
1038
|
case 'image':
|
|
1035
1039
|
{
|
|
1036
|
-
const safeSrc = sanitizeUrl(node.
|
|
1040
|
+
const safeSrc = sanitizeUrl(node.url);
|
|
1037
1041
|
if (safeSrc == null) {
|
|
1038
1042
|
return /*#__PURE__*/_jsxs("div", {
|
|
1039
1043
|
...mergeProps(themeProps('markdown-image', {
|
|
@@ -1140,9 +1144,9 @@ export function Markdown({
|
|
|
1140
1144
|
}
|
|
1141
1145
|
const options = hasMathRenderer ? mathParseOptions : legacyParseOptions;
|
|
1142
1146
|
const input = trimStreamingArtifacts(smoothedText, options);
|
|
1143
|
-
return hasMathRenderer ?
|
|
1147
|
+
return (hasMathRenderer ? parseMarkdownAstIncremental(input, incrementalStateRef.current, mathParseOptions) : parseMarkdownAstIncremental(input, incrementalStateRef.current, legacyParseOptions)).children;
|
|
1144
1148
|
}
|
|
1145
|
-
return hasMathRenderer ?
|
|
1149
|
+
return (hasMathRenderer ? parseMarkdownAst(children, mathParseOptions) : parseMarkdownAst(children, legacyParseOptions)).children;
|
|
1146
1150
|
}, [display, smoothedText, children, isStreaming, hasMathRenderer, mathParseOptions, legacyParseOptions]);
|
|
1147
1151
|
|
|
1148
1152
|
// Assign each top-level heading the slug that parseOutlineFromMarkdown
|
|
@@ -1159,7 +1163,7 @@ export function Markdown({
|
|
|
1159
1163
|
const counts = new Map();
|
|
1160
1164
|
for (const block of blocks) {
|
|
1161
1165
|
if (block.type === 'heading') {
|
|
1162
|
-
const label =
|
|
1166
|
+
const label = markdownAstText(block.children).trim();
|
|
1163
1167
|
map.set(block, uniqueSlug(slugify(label), counts));
|
|
1164
1168
|
}
|
|
1165
1169
|
}
|
|
@@ -1171,7 +1175,7 @@ export function Markdown({
|
|
|
1171
1175
|
}
|
|
1172
1176
|
const options = hasMathRenderer ? mathParseOptions : legacyParseOptions;
|
|
1173
1177
|
const input = isStreaming ? trimStreamingArtifacts(smoothedText, options) : children;
|
|
1174
|
-
return hasMathRenderer ?
|
|
1178
|
+
return hasMathRenderer ? parseInlineAst(input, mathParseOptions) : parseInlineAst(input, legacyParseOptions);
|
|
1175
1179
|
}, [display, smoothedText, children, isStreaming, hasMathRenderer, mathParseOptions, legacyParseOptions]);
|
|
1176
1180
|
|
|
1177
1181
|
// Track recent boundaries for stacked fade-in animation.
|