@imfusion/web-ui 0.9.0 → 0.9.1-dev.11.g7c95abf5

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 CHANGED
@@ -1,5 +1,65 @@
1
1
  # Changelog
2
2
 
3
+ ## `0.10.0`          2026.10.15
4
+
5
+ ### Highlights
6
+
7
+ #### A type hierarchy that holds at every width
8
+
9
+ Every fluid font size grows across the same viewport range, 360px to 1920px, so a heading never ends up smaller than the one
10
+ below it. `--imf-ui-font-size-fluid-0` to `fluid-2` follow one ratio scale above `--imf-ui-font-size-body`: `fluid-0` runs
11
+ from 19.2px to 25px, `fluid-1` from 23px to 31.25px, and `fluid-2` from 27.6px to 39px.
12
+
13
+ Headings change with it, so check your pages. `Typo.H3` uses `fluid-1` and `Typo.H4` uses `fluid-0`, both at the regular
14
+ weight. `Typo.H2` is medium weight, `Typo.Blockquote` uses `fluid-0`, and `--imf-ui-font-lineheight-title` follows the larger
15
+ H2 range. The Typo page has a Hierarchy story that shows every member at 360px, 768px, 1440px, and 1920px side by side.
16
+
17
+ ![Typo hierarchy at 1440px, light](docs/assets/changelog/0.10.0-typo-hierarchy-light.webp)
18
+ ![Typo hierarchy at 1440px, dark](docs/assets/changelog/0.10.0-typo-hierarchy-dark.webp)
19
+
20
+ #### New and updated components
21
+
22
+ - `RichLink` is new. It is a link that fills a row: an optional icon on a tile tinted in the primary color, a label, an
23
+ optional description, and a trailing arrow that `endGlyph` replaces. It renders a plain anchor, so TanStack Router's
24
+ `createLink` can wrap it. `imf-web-ui-ux` picks it for a link that fills its own row, and `ChipLink` for one inside text
25
+ ([WEBSDK-272](https://imfusion.atlassian.net/browse/WEBSDK-272)).
26
+
27
+ ![RichLink in a stack, light](docs/assets/changelog/0.10.0-rich-link-light.webp)
28
+ ![RichLink in a stack, dark](docs/assets/changelog/0.10.0-rich-link-dark.webp)
29
+
30
+ - `Skeleton.Root` takes `loading` and fades the data in over the bones when it turns false.
31
+
32
+ - The `variant="position"` `Slider` thumb is primary at rest and gray on hover. It is opaque, so a `Slider.Indicator` under
33
+ it stays hidden. Every Slider thumb now draws its focus ring on keyboard focus.
34
+
35
+ ![Slider position variant, light](docs/assets/changelog/0.10.0-slider-position-light.webp)
36
+ ![Slider position variant, dark](docs/assets/changelog/0.10.0-slider-position-dark.webp)
37
+
38
+ ### Added
39
+
40
+ - Agent skills — Nikolaus Brunner <brunner@imfusion.com>
41
+ - `imf-web-ui-conventions` puts a stand-in for a missing Web UI component in `components/web-ui-pending/`, built as
42
+ the library would ship it and deleted once it does.
43
+
44
+ ### Changed
45
+
46
+ - Agent skills — Nikolaus Brunner <brunner@imfusion.com>
47
+ - The `web-ui-dev-new-component` interview asks where the design comes from: a new Claude Design canvas, a local HTML
48
+ sketch when the session has no Claude Design, an existing design or placeholder, or a sibling to copy. The plan links
49
+ the design source, and verification checks the built stories against it.
50
+ - `web-ui-dev-update-component` and `web-ui-dev-design-component` ask how to preview a visual change when the session has
51
+ Claude Design, and recommend a canvas for a bigger change. A canvas is made in the Claude app before plan mode.
52
+ - Documentation — Nikolaus Brunner <brunner@imfusion.com>
53
+ - `docs/design-system.md` says to start new designs in the Claude app and when an agent session has Claude Design. The
54
+ standalone project's README marks it as legacy.
55
+
56
+ ### Fixed
57
+
58
+ - Storybook — Nikolaus Brunner <brunner@imfusion.com>
59
+ - The Slider `All` story renders the position variant without an indicator, as the `Position` story does.
60
+
61
+ ---
62
+
3
63
  ## `0.9.0` &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2026.10.14
4
64
 
5
65
  ### Highlights
@@ -0,0 +1,2 @@
1
+ export { RichLink } from './rich-link';
2
+ export { richLinkMeta } from './rich-link.meta';
@@ -0,0 +1,18 @@
1
+ import { IconComponent } from '../icon';
2
+ type Props = React.ComponentProps<"a"> & {
3
+ /** Leading icon from `@imfusion/web-ui/icons`, shown on a tile in the primary color. */
4
+ glyph?: IconComponent;
5
+ /** Second line under the label. When set, the label turns bold. */
6
+ description?: React.ReactNode;
7
+ /** Link target scope. `"external"` (default) opens in a new tab with a diagonal `ArrowUpRight` icon; `"internal"` stays in the current tab with a horizontal `ArrowRight` icon. */
8
+ kind?: "external" | "internal";
9
+ /** Trailing icon from `@imfusion/web-ui/icons`, replacing the arrow `kind` picks, such as `Download` for a file. */
10
+ endGlyph?: IconComponent;
11
+ };
12
+ /**
13
+ * RichLink — a link as a whole row: an optional leading icon on a tinted tile, the label with an optional description
14
+ * line, and a trailing icon for where it leads. Draws no divider; stacked links get their spacing from the layout. Wrap it
15
+ * with TanStack Router's `createLink` to use it as a router link.
16
+ */
17
+ export declare function RichLink({ glyph, description, kind, endGlyph, children, ...props }: Props): import("react/jsx-runtime").JSX.Element;
18
+ export {};
@@ -0,0 +1,2 @@
1
+ import { ComponentMeta } from '../../types/meta';
2
+ export declare const richLinkMeta: ComponentMeta;
@@ -2,14 +2,17 @@ import { useRender } from '@base-ui/react/use-render';
2
2
  type RootProps = useRender.ComponentProps<"div"> & {
3
3
  /** Announced once through a visually hidden status. Pass `""` when something else already speaks for the region. */
4
4
  label: string;
5
- /** `none` holds every bone inside still. */
5
+ /** Whether the region is still loading. Root stays mounted and reveals the data when this turns false. */
6
+ loading?: boolean;
7
+ /** `none` holds every bone inside still and swaps in the data without a reveal. */
6
8
  animation?: "shimmer" | "none";
7
9
  };
8
10
  /**
9
- * Skeleton.Root — marks a region as loading. The view inside renders for real; bones stand in for the data. Sets
10
- * `aria-busy` and announces `label` once, however many bones it holds.
11
+ * Skeleton.Root — marks a region as loading. The view inside renders for real; bones stand in for the data. While
12
+ * `loading`, sets `aria-busy` and announces `label` once, however many bones it holds. When `loading` turns false, the
13
+ * data fades in over the bones.
11
14
  */
12
- declare function Root({ label, animation, render, ...props }: RootProps): import("react/jsx-runtime").JSX.Element;
15
+ declare function Root({ label, loading, animation, render, children, ...props }: RootProps): import("react/jsx-runtime").JSX.Element;
13
16
  declare namespace Root {
14
17
  var displayName: string;
15
18
  }
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export { Button, buttonMeta } from './components/button';
2
2
  export { ChipLink, chipLinkMeta } from './components/chip-link';
3
3
  export { CopyButton, copyButtonMeta } from './components/copy-button';
4
4
  export { IconButton, iconButtonMeta } from './components/icon-button';
5
+ export { RichLink, richLinkMeta } from './components/rich-link';
5
6
  export { Checkbox, checkboxMeta } from './components/checkbox';
6
7
  export { Field, fieldMeta } from './components/field';
7
8
  export { Fieldset, fieldsetMeta } from './components/fieldset';