bestax-mcp 1.14.4 → 1.14.5

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/data/catalog.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 2,
3
3
  "generatedFrom": {
4
4
  "package": "@allxsmith/bestax-bulma",
5
- "version": "5.27.8"
5
+ "version": "5.28.0"
6
6
  },
7
7
  "docsBase": "https://bestax.io/docs",
8
8
  "categories": [
@@ -57,6 +57,7 @@
57
57
  "Collapses",
58
58
  "Dialog",
59
59
  "Dropdown",
60
+ "HoverCard",
60
61
  "Loading",
61
62
  "Menu",
62
63
  "Message",
@@ -545,6 +546,17 @@
545
546
  "propCount": 21,
546
547
  "exampleCount": 6
547
548
  },
549
+ {
550
+ "name": "HoverCard",
551
+ "kind": "component",
552
+ "category": "components",
553
+ "purpose": "The `HoverCard` component shows a card previewing what's behind a link or a button while the pointer rests on it or keyboard focus is on it.",
554
+ "slug": "components/hovercard",
555
+ "import": "import { HoverCard } from '@allxsmith/bestax-bulma';",
556
+ "compound": false,
557
+ "propCount": 11,
558
+ "exampleCount": 6
559
+ },
548
560
  {
549
561
  "name": "Icon",
550
562
  "kind": "component",
@@ -1545,6 +1557,17 @@
1545
1557
  "--bulma-hero-gradient-h-offset": ["Hero"],
1546
1558
  "--bulma-hero-gradient-l-offset": ["Hero"],
1547
1559
  "--bulma-hero-gradient-s-offset": ["Hero"],
1560
+ "--bulma-hover-card-animation-duration": ["HoverCard"],
1561
+ "--bulma-hover-card-background": ["HoverCard"],
1562
+ "--bulma-hover-card-border-color": ["HoverCard"],
1563
+ "--bulma-hover-card-color": ["HoverCard"],
1564
+ "--bulma-hover-card-max-width": ["HoverCard"],
1565
+ "--bulma-hover-card-min-width": ["HoverCard"],
1566
+ "--bulma-hover-card-offset": ["HoverCard"],
1567
+ "--bulma-hover-card-padding": ["HoverCard"],
1568
+ "--bulma-hover-card-radius": ["HoverCard"],
1569
+ "--bulma-hover-card-shadow": ["HoverCard"],
1570
+ "--bulma-hover-card-z-index": ["HoverCard"],
1548
1571
  "--bulma-icon-dimensions": ["Icon", "IconText"],
1549
1572
  "--bulma-icon-dimensions-large": ["Icon", "IconText"],
1550
1573
  "--bulma-icon-dimensions-medium": ["Icon", "IconText"],
@@ -0,0 +1,229 @@
1
+ {
2
+ "name": "HoverCard",
3
+ "kind": "component",
4
+ "category": "components",
5
+ "slug": "components/hovercard",
6
+ "docsUrl": "https://bestax.io/docs/api/components/hovercard",
7
+ "examples": [
8
+ {
9
+ "title": "Basic HoverCard",
10
+ "code": "<HoverCard trigger={<Link href=\"#ada\">Ada Lovelace</Link>}>\n <Media>\n <Media.Left>\n <Avatar name=\"Ada Lovelace\" size=\"48x48\" />\n </Media.Left>\n <Media.Content>\n <Title as=\"p\" size=\"6\">\n Ada Lovelace\n </Title>\n <SubTitle as=\"p\" size=\"6\">\n Analytical Engine team\n </SubTitle>\n <Link href=\"#profile\">View profile</Link>\n </Media.Content>\n </Media>\n</HoverCard>"
11
+ },
12
+ {
13
+ "title": "In Running Text",
14
+ "code": "<Paragraph>\n Reviewed by{' '}\n <HoverCard appendToBody trigger={<Link href=\"#ada\">Ada Lovelace</Link>}>\n <Title as=\"p\" size=\"6\">\n Ada Lovelace\n </Title>\n <SubTitle as=\"p\" size=\"6\">\n Analytical Engine team\n </SubTitle>\n <Link href=\"#profile\">View profile</Link>\n </HoverCard>{' '}\n and merged the same day.\n</Paragraph>"
15
+ },
16
+ {
17
+ "title": "Placement",
18
+ "code": "<Buttons>\n <HoverCard\n openOnTap\n position=\"bottom-left\"\n trigger={<Button>bottom-left</Button>}\n >\n <Paragraph>Opens below, on the left edge.</Paragraph>\n </HoverCard>\n <HoverCard\n openOnTap\n position=\"bottom-right\"\n trigger={<Button>bottom-right</Button>}\n >\n <Paragraph>Opens below, on the right edge.</Paragraph>\n </HoverCard>\n <HoverCard\n openOnTap\n position=\"auto\"\n trigger={<Button color=\"info\">auto</Button>}\n >\n <Paragraph>Opens wherever it fits.</Paragraph>\n </HoverCard>\n</Buttons>"
19
+ },
20
+ {
21
+ "title": "Delays",
22
+ "code": "<Buttons>\n <HoverCard openOnTap openDelay={0} trigger={<Button>Opens at once</Button>}>\n <Paragraph>No wait before this one.</Paragraph>\n </HoverCard>\n <HoverCard\n openOnTap\n openDelay={1000}\n closeDelay={600}\n trigger={<Button>Takes its time</Button>}\n >\n <Paragraph>A slower card, with longer to reach it.</Paragraph>\n </HoverCard>\n</Buttons>"
23
+ },
24
+ {
25
+ "title": "On Touch Screens",
26
+ "code": "<HoverCard openOnTap trigger={<Button>Engine team</Button>}>\n <Title as=\"p\" size=\"6\">\n Analytical Engine team\n </Title>\n <Paragraph mb=\"2\">Ada Lovelace and Charles Babbage</Paragraph>\n <Link href=\"#team\">View the team</Link>\n</HoverCard>"
27
+ },
28
+ {
29
+ "title": "Controlled",
30
+ "code": "function example() {\n const [open, setOpen] = useState(false);\n const [following, setFollowing] = useState(false);\n\n return (\n <>\n <Paragraph mb=\"3\">\n The card is {open ? 'open' : 'closed'}\n {following ? ', and you follow Ada' : ''}.\n </Paragraph>\n <HoverCard\n open={open}\n onOpenChange={setOpen}\n trigger={<Link href=\"#ada\">Ada Lovelace</Link>}\n >\n <Paragraph mb=\"3\">Analytical Engine team</Paragraph>\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={() => {\n setFollowing(true);\n setOpen(false);\n }}\n >\n Follow\n </Button>\n </HoverCard>\n </>\n );\n}"
31
+ }
32
+ ],
33
+ "accessibility": "`HoverCard` is built to\n[WCAG's Content on Hover or Focus](https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html)\ncriterion, condition by condition:\n\n- **Dismissible:** <kbd>Escape</kbd> closes the card wherever focus is, without moving the pointer\n or focus. The keypress belongs to whatever has focus. When that's the card, its trigger or\n nothing, the card takes it, so a `Popover` or `Modal` around it stays open. When it's something\n else, such as a field elsewhere on the page or a `Modal` opened from the card, the card still\n closes and the key goes on to it. With one card inside another, the inner one closes first.\n Focus that was in the card goes back to the trigger, and the card stays closed until the pointer\n or focus leaves and comes back.\n- **Hoverable:** the pointer can move from the trigger onto the card. `closeDelay` covers the gap\n between them, and the card takes pointer events, unlike a tooltip.\n- **Persistent:** no timer closes a card that's hovered or focused. Focus inside the card holds it\n however it got there. Whether a click focuses what it lands on is up to the browser, though:\n Safari and Firefox on macOS don't focus a button on click, so there a clicked button doesn't keep\n the card open once the pointer moves away.\n\nAnd around it:\n\n- Keyboard focus on the trigger opens the card, as hover does. Focus that a press brings doesn't,\n and neither does a touch pointer, so tapping the trigger on a phone just does what the trigger\n does. Clicking the trigger never toggles the card.\n- By default, then, a phone or tablet never opens the card, so whatever it shows has to be\n reachable from the trigger as well. `openOnTap` opens it with a tap, for a trigger with no tap\n action of its own. While a tap holds it open, a tap outside the trigger and the card closes it.\n- The trigger gets `aria-expanded` and `aria-controls`, which say it's expanded and name the card\n only while the card is on the page. It gets no role, no tab stop and no `aria-haspopup`, so the trigger element itself has to\n take focus, such as a link or a button. A link inside a `<span>` doesn't do, since focus comes\n back to the trigger and its ARIA is on it. A development build warns when the trigger can't take\n focus.\n- The card is a plain element with an `id` and no role. It isn't a dialog, since focus doesn't move\n into it, and it isn't a tooltip, since it can hold links. In place, a screen reader meets it\n right after the trigger, Tab goes from the trigger into its links and buttons, and tabbing past\n them closes it.\n- With `appendToBody` the card renders at the end of `<body>`, so it sits last in the Tab order.\n Tab reaches it only after the rest of the page, and focus leaving the trigger on the way closes\n it. Keyboard users can open it, read it and close it, so whatever it links to should be\n reachable from the page as well.\n- Opening the card moves no focus, and nothing traps it. Links and buttons belong in a card; a form\n belongs in a `Popover`, which opens on purpose and holds focus.\n- The fade-in is turned off under `prefers-reduced-motion: reduce`.",
34
+ "related": ["Media", "Popover", "Portal", "Tooltip", "useBulmaClasses"],
35
+ "storybook": "https://bestax.io/storybook/?path=/story/components-hovercard--default",
36
+ "summary": "The `HoverCard` component shows a card previewing what's behind a link or a button while the pointer rests on it or keyboard focus is on it. Nothing moves focus when the card opens, and nothing traps it. In place, the card comes right after the trigger, so Tab goes from the trigger into its links and tabbing past them closes it. The pointer can move onto the card, Escape closes it from anywhere, and by default touch doesn't open it, so tapping the trigger just does what the trigger does. `openOnTap` opens it with a tap, for a trigger with no tap action of its own. For hints with nothing to click use `Tooltip`, and for content opened on purpose, such as a form, use `Popover`.",
37
+ "import": "import { HoverCard } from '@allxsmith/bestax-bulma';",
38
+ "sourceFile": "bulma-ui/src/components/HoverCard.tsx",
39
+ "rootClass": "hover-card",
40
+ "parts": [
41
+ {
42
+ "path": "HoverCard",
43
+ "summary": "The `HoverCard` component shows a card previewing what's behind a link or a button while the pointer rests on it or keyboard focus is on it. Nothing moves focus when the card opens, and nothing traps it. In place, the card comes right after the trigger, so Tab goes from the trigger into its links and tabbing past them closes it. The pointer can move onto the card, Escape closes it from anywhere, and by default touch doesn't open it, so tapping the trigger just does what the trigger does. `openOnTap` opens it with a tap, for a trigger with no tap action of its own. For hints with nothing to click use `Tooltip`, and for content opened on purpose, such as a form, use `Popover`.",
44
+ "component": null,
45
+ "props": [
46
+ {
47
+ "name": "trigger",
48
+ "type": "React.ReactElement",
49
+ "default": null,
50
+ "description": "The element the card previews, such as a link or a `Button`. The element itself has to take focus, so keyboard users can open the card too: a link inside a `<span>` doesn't do, since focus comes back to the trigger and its ARIA is on it. HoverCard gives it no role and no tab stop, since it can't know what the element is, and a development build warns when it can't take focus: use a link or a button, or give the element `tabIndex={0}`. A disabled button can't take focus either. HoverCard adds `aria-expanded` and `aria-controls`, both naming the card only while it is on the page, so it has to be a single element that passes those to its DOM node. Its own click and keys stay its own, and the card doesn't toggle on them, except Escape while the card is open, which closes the card before the trigger sees it.",
51
+ "required": false,
52
+ "inherited": false,
53
+ "deprecated": false
54
+ },
55
+ {
56
+ "name": "children",
57
+ "type": "React.ReactNode",
58
+ "default": null,
59
+ "description": "The card's content: a preview whose links and buttons are fine, but not a form, which belongs in a `Popover`. The card pads itself, so content goes straight in.",
60
+ "required": false,
61
+ "inherited": false,
62
+ "deprecated": false
63
+ },
64
+ {
65
+ "name": "open",
66
+ "type": "boolean",
67
+ "default": null,
68
+ "description": "Controlled open state. When set, hover, focus and Escape only report through `onOpenChange`, so an action inside the card can close it. While the card is open, Escape is reported, and when focus is in the card, on its trigger or nowhere, the key stops there even if you keep the card open, so a `Modal` around it doesn't close from the keyboard until the card does.",
69
+ "required": false,
70
+ "inherited": false,
71
+ "deprecated": false
72
+ },
73
+ {
74
+ "name": "defaultOpen",
75
+ "type": "boolean",
76
+ "default": "false",
77
+ "description": "Initial open state when uncontrolled. A card that starts open stays open until the pointer or focus has been and gone, or Escape closes it.",
78
+ "required": false,
79
+ "inherited": false,
80
+ "deprecated": false
81
+ },
82
+ {
83
+ "name": "onOpenChange",
84
+ "type": "(open: boolean) => void",
85
+ "default": null,
86
+ "description": "Called with the state asked for: when `openDelay` or `closeDelay` runs out, and right away on Escape. Fires in both controlled and uncontrolled use. An Escape it reports stops at the card when focus is in the card, on its trigger or nowhere, so nothing around it sees that key. With focus anywhere else, the card still closes and the key goes on to whatever has focus.",
87
+ "required": false,
88
+ "inherited": false,
89
+ "deprecated": false
90
+ },
91
+ {
92
+ "name": "openDelay",
93
+ "type": "number",
94
+ "default": "600",
95
+ "description": "How long the pointer or keyboard focus waits on the trigger before the card opens, in milliseconds.",
96
+ "required": false,
97
+ "inherited": false,
98
+ "deprecated": false
99
+ },
100
+ {
101
+ "name": "closeDelay",
102
+ "type": "number",
103
+ "default": "300",
104
+ "description": "How long the card stays after the pointer and focus have left the trigger and the card, in milliseconds. It is the time the pointer has to cross the gap between the trigger and the card: with `0` the card closes as the pointer leaves the trigger, before the pointer can reach it.",
105
+ "required": false,
106
+ "inherited": false,
107
+ "deprecated": false
108
+ },
109
+ {
110
+ "name": "position",
111
+ "type": "'bottom-left' | 'bottom-right' | 'top-left' | 'top-right' | 'auto'",
112
+ "default": "'bottom-left'",
113
+ "description": "Where the card opens against the trigger.",
114
+ "required": false,
115
+ "inherited": false,
116
+ "deprecated": false
117
+ },
118
+ {
119
+ "name": "appendToBody",
120
+ "type": "boolean",
121
+ "default": "false",
122
+ "description": "Render the card at the end of `document.body` through `Portal`, fixed to the viewport, so an ancestor's `overflow`, `transform` or stacking context can't clip it. A trigger in running text needs it too, since the card's block content can't sit inside a `<p>`. The card then shows from the commit after hydration, never in server markup, and it sits last in the Tab order, at the end of `<body>`. Tab reaches it only after the rest of the page, and focus leaving the trigger on the way closes it, so keyboard users can open it, read it and close it with Escape, and whatever it links to has to be reachable from the page as well. It is measured against the trigger when it opens and on resize and scroll, so it doesn't follow content that changes size while it is open. Theming variables set on an ancestor of the trigger don't reach it there.",
123
+ "required": false,
124
+ "inherited": false,
125
+ "deprecated": false
126
+ },
127
+ {
128
+ "name": "openOnTap",
129
+ "type": "boolean",
130
+ "default": "false",
131
+ "description": "Open the card with a tap on a touch screen. Touch has no hover, so without this a phone or tablet never opens the card. With it, a tap on the trigger opens the card at once, and it stays until a second tap on the trigger, a tap outside the trigger and the card, or Escape. The tap still does whatever the trigger does, so turn this on only for a trigger with no tap action of its own, such as a `Button` with no `onClick`: on a link, the first tap would follow the link rather than show the card. Mouse and pen work the same either way.",
132
+ "required": false,
133
+ "inherited": false,
134
+ "deprecated": false
135
+ },
136
+ {
137
+ "name": "contentClassName",
138
+ "type": "string",
139
+ "default": null,
140
+ "description": "Additional classes for the card (`.hover-card-content`).",
141
+ "required": false,
142
+ "inherited": false,
143
+ "deprecated": false
144
+ }
145
+ ],
146
+ "extraProps": [
147
+ {
148
+ "name": "className",
149
+ "type": "string",
150
+ "default": null,
151
+ "description": "Additional classes for the `span` around the trigger. The card takes `contentClassName`.",
152
+ "required": false,
153
+ "inherited": false,
154
+ "deprecated": false
155
+ }
156
+ ],
157
+ "catchAll": "All standard <span> attributes and Bulma helper props",
158
+ "types": []
159
+ }
160
+ ],
161
+ "cssVars": [
162
+ {
163
+ "css": "--bulma-hover-card-z-index",
164
+ "sass": "$hover-card-z-index",
165
+ "default": "$extras-z-index-tooltip",
166
+ "scope": "element"
167
+ },
168
+ {
169
+ "css": "--bulma-hover-card-background",
170
+ "sass": "$hover-card-background",
171
+ "default": "var(--bulma-scheme-main)",
172
+ "scope": "element"
173
+ },
174
+ {
175
+ "css": "--bulma-hover-card-color",
176
+ "sass": "$hover-card-color",
177
+ "default": "var(--bulma-text)",
178
+ "scope": "element"
179
+ },
180
+ {
181
+ "css": "--bulma-hover-card-border-color",
182
+ "sass": "$hover-card-border-color",
183
+ "default": "var(--bulma-border-weak)",
184
+ "scope": "element"
185
+ },
186
+ {
187
+ "css": "--bulma-hover-card-radius",
188
+ "sass": "$hover-card-radius",
189
+ "default": "var(--bulma-radius-large)",
190
+ "scope": "element"
191
+ },
192
+ {
193
+ "css": "--bulma-hover-card-shadow",
194
+ "sass": "$hover-card-shadow",
195
+ "default": "var(--bulma-shadow)",
196
+ "scope": "element"
197
+ },
198
+ {
199
+ "css": "--bulma-hover-card-padding",
200
+ "sass": "$hover-card-padding",
201
+ "default": "1rem",
202
+ "scope": "element"
203
+ },
204
+ {
205
+ "css": "--bulma-hover-card-min-width",
206
+ "sass": "$hover-card-min-width",
207
+ "default": "12rem",
208
+ "scope": "element"
209
+ },
210
+ {
211
+ "css": "--bulma-hover-card-max-width",
212
+ "sass": "$hover-card-max-width",
213
+ "default": "min(20rem, calc(100vw - 2rem))",
214
+ "scope": "element"
215
+ },
216
+ {
217
+ "css": "--bulma-hover-card-offset",
218
+ "sass": "$hover-card-offset",
219
+ "default": "0.25rem",
220
+ "scope": "element"
221
+ },
222
+ {
223
+ "css": "--bulma-hover-card-animation-duration",
224
+ "sass": "$hover-card-animation-duration",
225
+ "default": "0.15s",
226
+ "scope": "element"
227
+ }
228
+ ]
229
+ }
@@ -41,6 +41,7 @@
41
41
  "accessibility": "`Popover` follows the [WAI-ARIA dialog pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/)\nfor a non-modal dialog:\n\n- The panel is a `role=\"dialog\"` without `aria-modal`. It is named by its `Popover.Header` through\n `aria-labelledby`, or by `ariaLabel`, which takes precedence. A development build warns when an\n open panel has neither.\n- The trigger gets `aria-haspopup=\"dialog\"`, `aria-expanded`, and `aria-controls` pointing at the\n panel while it is open.\n- Opening moves focus to the first control in the panel, or to the panel itself when it has none.\n Closing hands focus back to the trigger, as long as focus is still in the panel then, so a click\n that put it somewhere else keeps it there.\n- Tab and Shift+Tab wrap inside the open panel, which the pattern asks of non-modal dialogs too.\n Pointer focus, the screen reader's reading cursor and the rest of the page stay free: nothing\n outside is hidden or made inert, and the page still scrolls. `trapFocus={false}` lets Tab leave.\n- <kbd>Escape</kbd> closes the popover while focus is in the panel or on the trigger. A dialog\n nested inside the panel, such as a date picker's calendar or another popover, takes its own\n Escape first.\n- <kbd>Enter</kbd> and <kbd>Space</kbd> toggle a trigger the browser doesn't click on its own.\n- The open animation is turned off under `prefers-reduced-motion: reduce`.",
42
42
  "related": [
43
43
  "Dropdown",
44
+ "HoverCard",
44
45
  "Modal",
45
46
  "Portal",
46
47
  "Tooltip",
@@ -47,7 +47,7 @@
47
47
  }
48
48
  ],
49
49
  "accessibility": "- Tooltip content has `role=\"tooltip\"` for screen reader announcement\n- Has `aria-hidden` that toggles based on visibility\n- Tooltip shows on both hover and focus for keyboard users\n- The `dashed` style provides a visual cue that more information is available",
50
- "related": [],
50
+ "related": ["Button", "HoverCard", "Icon", "Popover"],
51
51
  "storybook": null,
52
52
  "summary": "The `Tooltip` component displays helpful information when users hover over or focus on an element.",
53
53
  "import": "import { Tooltip } from '@allxsmith/bestax-bulma';",
@@ -67,6 +67,13 @@ A panel opened from a button (a filter form, share options, an inline edit) is `
67
67
  it rather than building one. It anchors the panel, moves focus in and back, and closes on
68
68
  Escape and outside presses.
69
69
 
70
+ A preview that shows up on hover (a profile card on a username, a summary on a link) is
71
+ `HoverCard`: use it rather than wiring pointer events to a `Popover`. It opens on hover and
72
+ keyboard focus after a delay, lets the pointer move onto the card, closes on Escape, and ignores
73
+ touch unless `openOnTap` is on, which suits only a trigger with no tap action of its own (a
74
+ `Button` with no `onClick`, never a link). Its `trigger` has to be a link or a button, and a trigger in running text takes
75
+ `appendToBody`. A form never goes in one; that's `Popover`.
76
+
70
77
  Building something else that floats (a command palette)? Render it through the library's
71
78
  `Portal` rather than `createPortal`: it renders nothing on the server and during hydration, so
72
79
  the server and client markup match. `references/api.md` has the details.
@@ -114,8 +114,8 @@ hard-coding values.
114
114
  ## Floating content: `Portal`
115
115
 
116
116
  A panel anchored to the button that opens it is `Popover`, which already portals
117
- (`appendToBody`), traps focus and dismisses itself. `Portal` is for the overlays it doesn't
118
- cover.
117
+ (`appendToBody`), traps focus and dismisses itself, and a preview that opens on hover is
118
+ `HoverCard`, which portals the same way. `Portal` is for the overlays they don't cover.
119
119
 
120
120
  `<Portal container?>` (`helpers/portal.tsx`) renders its children into `document.body`, or into
121
121
  `container` (an element or a selector), so floating content escapes an ancestor's `overflow`,
@@ -123,8 +123,10 @@ cover.
123
123
  first client render matches; `disabled` renders in place instead. Use it rather than calling
124
124
  `createPortal` yourself, which React's server renderer can't render.
125
125
 
126
- Focus follows the DOM, not the React tree: portaled content comes last in the Tab order, so move
127
- focus into it when it opens and back to its trigger when it closes. To trap portaled content,
126
+ Focus follows the DOM, not the React tree: portaled content sits in the Tab order where its
127
+ container is, which for the default `document.body` is last, so an overlay you build that takes
128
+ focus moves it in when it opens and back to its trigger when it closes. A `HoverCard` moves no
129
+ focus when it opens. To trap portaled content,
128
130
  put the trap's ref on the element inside the `Portal`, as below with
129
131
  `useFocusTrap(panelRef, { active: open, restoreFocus: buttonRef })`. A focus trap doesn't cover
130
132
  what a `Portal` inside it renders, so render nested overlays inside the trapped element.
@@ -37,7 +37,7 @@ instead of hand-writing markup.
37
37
  - Raw `*Base` form exports (`InputBase`, `SelectBase`, `TextAreaBase`, …) are
38
38
  escape-hatch variants of the convenience wrappers above them; see the Form docs.
39
39
 
40
- 94 documented components. Generated from the API docs — every exported
40
+ 95 documented components. Generated from the API docs — every exported
41
41
  component is guaranteed to appear (the generator fails if one lacks an API page).
42
42
 
43
43
  ## Elements
@@ -86,6 +86,7 @@ component is guaranteed to appear (the generator fails if one lacks an API page)
86
86
  - [Collapses](https://bestax.io/docs/api/components/collapses) — The `Collapses` component groups `Collapse` items into an accordion that keeps one item open at a time, or any number with `multiple`.
87
87
  - [Dialog](https://bestax.io/docs/api/components/dialog) — The `Dialog` component provides ready-made confirm and alert dialogs, so a destructive action stays one `await dialog.confirm()` call away.
88
88
  - [Dropdown](https://bestax.io/docs/api/components/dropdown) — The `Dropdown` component provides Bulma's versatile dropdown menu for your Bulma React UI.
89
+ - [HoverCard](https://bestax.io/docs/api/components/hovercard) — The `HoverCard` component shows a card previewing what's behind a link or a button while the pointer rests on it or keyboard focus is on it.
89
90
  - [Loading](https://bestax.io/docs/api/components/loading) — The `Loading` component provides a loading overlay with a spinner animation.
90
91
  - [Menu](https://bestax.io/docs/api/components/menu) — The `Menu` component provides Bulma's vertical navigation menu: a simple, accessible sidebar or section menu for your Bulma React UI.
91
92
  - [Message](https://bestax.io/docs/api/components/message) — The `Message` component provides Bulma's flexible notice/message box for your Bulma React UI.
@@ -63,6 +63,12 @@ Centered; a collection of items → Card grid. For mixed requests, pick the domi
63
63
  element, not a node: Popover clones it to add the click and ARIA, so never wrap it in a
64
64
  clickable of your own; build the panel from `Popover.Header`/`Body`/`Footer`/`Close`, and a
65
65
  panel without a `Popover.Header` needs `ariaLabel`),
66
+ `HoverCard trigger={<Link href="…">…</Link>}` for a preview on hover or keyboard focus
67
+ (`trigger` is one link or button, cloned the same way; the card's content goes straight in as
68
+ children with no sub-components; a trigger inside a `Paragraph` needs `appendToBody`; hover
69
+ and focus only unless `openOnTap` is set, which suits only a trigger with no tap action of its
70
+ own, such as a `Button` with no `onClick`; on touch a link trigger just follows the link, so
71
+ what the card shows must be on that page too, and a form is a `Popover`),
66
72
  `Steps value={i}/onStepClick items={[{label, icon?}]}` (child form is `Steps.Step`, not
67
73
  `Steps.Item`). `Reveal cascade` staggers only its **direct children** — to stagger a grid,
68
74
  put `<Reveal delay={i * 80}>` inside each `Cell`, not around the container.
@@ -73,8 +73,8 @@ Every extras partial that exists (from the library's `src/scss/**/_index.scss`
73
73
  is **more complete** than the docs page's Option C example, which omits several):
74
74
 
75
75
  **Components** (`@allxsmith/bestax-bulma/scss/components/<name>`):
76
- `loading`, `collapse`, `tooltip`, `popover`, `steps`, `sidebar`, `toast`, `dialog`, `carousel`,
77
- `tabs`, `reveal`, `avatar`, `avatars`, `badge`
76
+ `loading`, `collapse`, `tooltip`, `popover`, `hovercard`, `steps`, `sidebar`, `toast`, `dialog`,
77
+ `carousel`, `tabs`, `reveal`, `avatar`, `avatars`, `badge`
78
78
 
79
79
  **Form** (`@allxsmith/bestax-bulma/scss/form/<name>`):
80
80
  `checkbox`, `radio`, `switch`, `slider`, `numberinput`, `rate`, `autocomplete`, `taginput`,
@@ -170,7 +170,8 @@ lone class or the `style` prop cannot outrank:
170
170
  styles with a selector that matches or exceeds the compound:
171
171
  `.button.link-button { --bulma-link-button-ghost-color: … }`.
172
172
  - **Constituent elements** — Tooltip's variables (all but `--bulma-tooltip-dashed-color`)
173
- are declared on `.tooltip-content`, Popover's on its panel, `.popover-content`, and Sidebar's
173
+ are declared on `.tooltip-content`, Popover's on its panel, `.popover-content`, HoverCard's
174
+ on its card, `.hover-card-content`, and Sidebar's
174
175
  `--bulma-sidebar-overlay-background` on `.sidebar-background`. Values set via `className` or
175
176
  `style` land on the component root and are only inherited by the constituent, so they lose to
176
177
  its own declaration — target the declaring element in your CSS:
@@ -297,6 +298,16 @@ The field around the two inputs. Its calendar is the `DateInput` one, with the v
297
298
  `--bulma-dialog-radius`, `--bulma-dialog-shadow`, `--bulma-dialog-title-color`,
298
299
  `--bulma-dialog-title-size`, `--bulma-dialog-title-weight`, `--bulma-dialog-width`
299
300
 
301
+ ### HoverCard
302
+
303
+ All are declared on the card, `.hover-card-content`, so a card rendered with `appendToBody` keeps
304
+ them. See the constituent-element exception above.
305
+
306
+ `--bulma-hover-card-animation-duration`, `--bulma-hover-card-background`,
307
+ `--bulma-hover-card-border-color`, `--bulma-hover-card-color`, `--bulma-hover-card-max-width`,
308
+ `--bulma-hover-card-min-width`, `--bulma-hover-card-offset`, `--bulma-hover-card-padding`,
309
+ `--bulma-hover-card-radius`, `--bulma-hover-card-shadow`, `--bulma-hover-card-z-index`
310
+
300
311
  ### LinkButton
301
312
 
302
313
  Declared on the compound `.button.link-button` — see the compound-selector exception above.
package/data/skills.json CHANGED
@@ -6,11 +6,11 @@
6
6
  "promptName": "custom-component",
7
7
  "dir": "bestax-custom-component",
8
8
  "references": [
9
- { "id": "api", "file": "references/api.md", "bytes": 10851 },
9
+ { "id": "api", "file": "references/api.md", "bytes": 11068 },
10
10
  {
11
11
  "id": "component-catalog",
12
12
  "file": "references/component-catalog.md",
13
- "bytes": 18753
13
+ "bytes": 18961
14
14
  },
15
15
  {
16
16
  "id": "library-contributor",
@@ -162,7 +162,7 @@
162
162
  {
163
163
  "id": "modular-build",
164
164
  "file": "references/modular-build.md",
165
- "bytes": 10113
165
+ "bytes": 10126
166
166
  }
167
167
  ],
168
168
  "examples": []
@@ -176,7 +176,7 @@
176
176
  {
177
177
  "id": "css-variables",
178
178
  "file": "references/css-variables.md",
179
- "bytes": 31590
179
+ "bytes": 32153
180
180
  },
181
181
  {
182
182
  "id": "themeable-components",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bestax-mcp",
3
- "version": "1.14.4",
3
+ "version": "1.14.5",
4
4
  "mcpName": "io.github.allxsmith/bestax-mcp",
5
5
  "description": "MCP server for @allxsmith/bestax-bulma — component props, examples, CSS variables and agent skills, served offline from a version-pinned index",
6
6
  "type": "module",
@@ -42,7 +42,7 @@
42
42
  "dependencies": {
43
43
  "@modelcontextprotocol/sdk": "^1.31.0",
44
44
  "zod": "^4.4.3",
45
- "@allxsmith/bestax-bulma": "^5.27.8"
45
+ "@allxsmith/bestax-bulma": "^5.28.0"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@jest/globals": "^30.0.0",