@bookjane2/bookjane-design-library 9.0.34 → 9.0.35

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.
@@ -0,0 +1,12 @@
1
+ import { StoryFn } from '@storybook/react';
2
+ import { BKJImage } from './BKJImage.js';
3
+ import { IBKJImageProps } from './BKJImage.types.js';
4
+ declare const setup: {
5
+ title: string;
6
+ component: typeof BKJImage;
7
+ };
8
+ export declare const Decorative: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJImageProps>;
9
+ export declare const Informative: import("@storybook/core/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, IBKJImageProps>;
10
+ export declare const Variants: StoryFn;
11
+ export default setup;
12
+ //# sourceMappingURL=BKJImage.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BKJImage.stories.d.ts","sourceRoot":"","sources":["../../../src/components/BKJImage/BKJImage.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0BlD,QAAA,MAAM,KAAK;;;CAGV,CAAC;AAIF,eAAO,MAAM,UAAU,0GAAoB,CAAC;AAmB5C,eAAO,MAAM,WAAW,0GAAoB,CAAC;AAmB7C,eAAO,MAAM,QAAQ,EAAE,OA2BtB,CAAC;AAUF,eAAe,KAAK,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { BKJImage } from './BKJImage.js';
3
+ const SkeletonDiv = () => (_jsx("div", { style: { width: '100%', height: '100%', background: '#f0f0f0' } }));
4
+ const PlaceholderDiv = () => (_jsx("div", { style: {
5
+ width: '100%',
6
+ height: '100%',
7
+ background: '#e0e0e0',
8
+ display: 'flex',
9
+ alignItems: 'center',
10
+ justifyContent: 'center',
11
+ color: '#666',
12
+ fontSize: 12,
13
+ }, children: "No image" }));
14
+ const SAMPLE_DECORATIVE_URL = 'https://picsum.photos/seed/decorative-bkjimage/240/120';
15
+ const SAMPLE_PORTRAIT_URL = 'https://picsum.photos/seed/portrait-bkjimage/240/240';
16
+ const setup = {
17
+ title: 'Basic Elements/BKJImage',
18
+ component: BKJImage,
19
+ };
20
+ const Template = (args) => _jsx(BKJImage, { ...args });
21
+ export const Decorative = Template.bind({});
22
+ Decorative.args = {
23
+ alt: '',
24
+ src: SAMPLE_DECORATIVE_URL,
25
+ width: '240px',
26
+ height: '120px',
27
+ LoadingComponent: SkeletonDiv,
28
+ FallbackComponent: PlaceholderDiv,
29
+ variant: 'Rectangle',
30
+ };
31
+ Decorative.parameters = {
32
+ docs: {
33
+ description: {
34
+ story: '`alt=""` is the correct value for decorative images per WCAG H67 ("Using null alt text and no title attribute on `img` elements that AT should ignore"); this is intentional, not a bug. Use this when the image is purely visual or when an adjacent visible label already names the content.',
35
+ },
36
+ },
37
+ };
38
+ export const Informative = Template.bind({});
39
+ Informative.args = {
40
+ alt: 'Jane Smith — Director of Engineering',
41
+ src: SAMPLE_PORTRAIT_URL,
42
+ width: '120px',
43
+ height: '120px',
44
+ LoadingComponent: SkeletonDiv,
45
+ FallbackComponent: PlaceholderDiv,
46
+ variant: 'Round',
47
+ };
48
+ Informative.parameters = {
49
+ docs: {
50
+ description: {
51
+ story: 'Informative image: the `alt` describes who or what the image shows. AT announces the alt text + "image". This is the dominant pattern when the image carries meaning that the consumer has not duplicated as adjacent visible text.',
52
+ },
53
+ },
54
+ };
55
+ export const Variants = () => (_jsxs("div", { style: { display: 'flex', gap: '24px', alignItems: 'flex-start' }, children: [_jsxs("div", { children: [_jsx("p", { style: { marginBottom: 8, fontSize: 12 }, children: "variant=\"Round\"" }), _jsx(BKJImage, { alt: "Profile photo of Alice", src: SAMPLE_PORTRAIT_URL, width: "120px", height: "120px", LoadingComponent: SkeletonDiv, FallbackComponent: PlaceholderDiv, variant: "Round" })] }), _jsxs("div", { children: [_jsx("p", { style: { marginBottom: 8, fontSize: 12 }, children: "variant=\"Rectangle\"" }), _jsx(BKJImage, { alt: "Conference room photo", src: SAMPLE_DECORATIVE_URL, width: "240px", height: "120px", LoadingComponent: SkeletonDiv, FallbackComponent: PlaceholderDiv, variant: "Rectangle" })] })] }));
56
+ Variants.parameters = {
57
+ docs: {
58
+ description: {
59
+ story: 'Side-by-side rendering of `Round` (border-radius: 50%) and `Rectangle` (no border-radius) variants. Both use informative `alt` values. The a11y panel scans both variants together — confirms neither variant has a per-CSS-rule a11y regression.',
60
+ },
61
+ },
62
+ };
63
+ export default setup;
64
+ //# sourceMappingURL=BKJImage.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BKJImage.stories.js","sourceRoot":"","sources":["../../../src/components/BKJImage/BKJImage.stories.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BKJImage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BKJImage.test.d.ts","sourceRoot":"","sources":["../../../src/components/BKJImage/BKJImage.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { fireEvent, screen } from '@testing-library/react';
3
+ import { renderAndCheckA11y, renderWithTheme } from '../../test-utils/index.js';
4
+ import { BKJImage } from './BKJImage.js';
5
+ const LoadingPlaceholder = () => _jsx("div", { "data-testid": "loading-ph" });
6
+ const FallbackPlaceholder = () => _jsx("div", { "data-testid": "fallback-ph" });
7
+ const STUB_SRC = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLz4=';
8
+ describe('BKJImage type contract (compile-time)', () => {
9
+ it('rejects missing alt prop at compile time', () => {
10
+ // FR-001. If this directive ever becomes "unused", IBKJImageProps.alt has been
11
+ // loosened (e.g., changed to alt?: string) and the compile-time safety check is gone.
12
+ const _bad = (
13
+ // @ts-expect-error — BKJImage with no `alt` must fail type-checking.
14
+ _jsx(BKJImage, { src: STUB_SRC, width: "40", height: "40", LoadingComponent: LoadingPlaceholder, FallbackComponent: FallbackPlaceholder, variant: "Round" }));
15
+ void _bad;
16
+ });
17
+ });
18
+ describe('BKJImage decorative render', () => {
19
+ it('renders alt="" byte-identically', () => {
20
+ const { container } = renderWithTheme(_jsx(BKJImage, { alt: "", src: STUB_SRC, width: "40", height: "40", LoadingComponent: LoadingPlaceholder, FallbackComponent: FallbackPlaceholder, variant: "Rectangle" }));
21
+ const img = container.querySelector('img');
22
+ expect(img).not.toBeNull();
23
+ expect(img).toHaveAttribute('alt', '');
24
+ });
25
+ it('decorative render is axe-clean (Rectangle variant)', async () => {
26
+ const { renderResult, axeResults } = await renderAndCheckA11y(_jsx(BKJImage, { alt: "", src: STUB_SRC, width: "40", height: "40", LoadingComponent: LoadingPlaceholder, FallbackComponent: FallbackPlaceholder, variant: "Rectangle" }));
27
+ const img = renderResult.container.querySelector('img');
28
+ if (img)
29
+ fireEvent.load(img);
30
+ expect(axeResults).toHaveNoViolations();
31
+ });
32
+ });
33
+ describe('BKJImage informative render', () => {
34
+ it('renders alt="Jane Smith" byte-identically', () => {
35
+ const { container } = renderWithTheme(_jsx(BKJImage, { alt: "Jane Smith", src: STUB_SRC, width: "40", height: "40", LoadingComponent: LoadingPlaceholder, FallbackComponent: FallbackPlaceholder, variant: "Round" }));
36
+ const img = container.querySelector('img');
37
+ expect(img).not.toBeNull();
38
+ expect(img).toHaveAttribute('alt', 'Jane Smith');
39
+ });
40
+ it('informative <img> is reachable via getByRole("img", { name }) after onLoad', () => {
41
+ const { container } = renderWithTheme(_jsx(BKJImage, { alt: "Jane Smith", src: STUB_SRC, width: "40", height: "40", LoadingComponent: LoadingPlaceholder, FallbackComponent: FallbackPlaceholder, variant: "Round" }));
42
+ const img = container.querySelector('img');
43
+ if (img)
44
+ fireEvent.load(img);
45
+ expect(screen.getByRole('img', { name: 'Jane Smith' })).toBeInTheDocument();
46
+ });
47
+ it('informative render is axe-clean (Round variant)', async () => {
48
+ const { renderResult, axeResults } = await renderAndCheckA11y(_jsx(BKJImage, { alt: "Jane Smith", src: STUB_SRC, width: "40", height: "40", LoadingComponent: LoadingPlaceholder, FallbackComponent: FallbackPlaceholder, variant: "Round" }));
49
+ const img = renderResult.container.querySelector('img');
50
+ if (img)
51
+ fireEvent.load(img);
52
+ expect(axeResults).toHaveNoViolations();
53
+ });
54
+ });
55
+ //# sourceMappingURL=BKJImage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BKJImage.test.js","sourceRoot":"","sources":["../../../src/components/BKJImage/BKJImage.test.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,6BAAiB,YAAY,GAAG,CAAC;AAClE,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,6BAAiB,aAAa,GAAG,CAAC;AAEpE,MAAM,QAAQ,GACZ,oFAAoF,CAAC;AAEvF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,+EAA+E;QAC/E,sFAAsF;QACtF,MAAM,IAAI,GAAG;QACX,qEAAqE;QACrE,KAAC,QAAQ,IACP,GAAG,EAAE,QAAQ,EACb,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,gBAAgB,EAAE,kBAAkB,EACpC,iBAAiB,EAAE,mBAAmB,EACtC,OAAO,EAAC,OAAO,GACf,CACH,CAAC;QACF,KAAK,IAAI,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CACnC,KAAC,QAAQ,IACP,GAAG,EAAC,EAAE,EACN,GAAG,EAAE,QAAQ,EACb,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,gBAAgB,EAAE,kBAAkB,EACpC,iBAAiB,EAAE,mBAAmB,EACtC,OAAO,EAAC,WAAW,GACnB,CACH,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAC3D,KAAC,QAAQ,IACP,GAAG,EAAC,EAAE,EACN,GAAG,EAAE,QAAQ,EACb,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,gBAAgB,EAAE,kBAAkB,EACpC,iBAAiB,EAAE,mBAAmB,EACtC,OAAO,EAAC,WAAW,GACnB,CACH,CAAC;QACF,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,GAAG;YAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CACnC,KAAC,QAAQ,IACP,GAAG,EAAC,YAAY,EAChB,GAAG,EAAE,QAAQ,EACb,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,gBAAgB,EAAE,kBAAkB,EACpC,iBAAiB,EAAE,mBAAmB,EACtC,OAAO,EAAC,OAAO,GACf,CACH,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,CACnC,KAAC,QAAQ,IACP,GAAG,EAAC,YAAY,EAChB,GAAG,EAAE,QAAQ,EACb,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,gBAAgB,EAAE,kBAAkB,EACpC,iBAAiB,EAAE,mBAAmB,EACtC,OAAO,EAAC,OAAO,GACf,CACH,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,GAAG;YAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAC3D,KAAC,QAAQ,IACP,GAAG,EAAC,YAAY,EAChB,GAAG,EAAE,QAAQ,EACb,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,gBAAgB,EAAE,kBAAkB,EACpC,iBAAiB,EAAE,mBAAmB,EACtC,OAAO,EAAC,OAAO,GACf,CACH,CAAC;QACF,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,GAAG;YAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bookjane2/bookjane-design-library",
3
- "version": "9.0.34",
3
+ "version": "9.0.35",
4
4
  "main": "./lib/index.js",
5
5
  "typings": "./lib/index.d.ts",
6
6
  "engines": {