@idyeah/diya 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@ All notable changes to `@idyeah/diya` are documented here. The format is based
4
4
  on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
5
5
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [1.0.1] - 2026-11-11
8
+
9
+ ### Fixed
10
+
11
+ - `Progress`: under Reduce Motion, indeterminate progress no longer freezes as
12
+ a 35% bar or a 28% ring, which read as a stuck amount. It shows a full bar or
13
+ ring that fades gently between faint and clear, so it still reads as working.
14
+ Without Reduce Motion nothing changes. The indeterminate bar's width now comes
15
+ from CSS instead of an inline style, and the rule uses no `!important`, so
16
+ your own styles can still restyle it.
17
+ - `Drawer`: the docs no longer say it slides in from the side, which it doesn't
18
+ in 1.0. The description and the `side` prop now say where it sits; `api.json`
19
+ and the type declarations follow.
20
+
7
21
  ## [1.0.0] - 2026-11-07
8
22
 
9
23
  First public release, under the MIT License.
@@ -314,4 +328,5 @@ change in any release. The README lists the public tokens.
314
328
  - Chatbot and Data Viz (`DataViz`, `Chart`) are `experimental`: outside semver
315
329
  until their API settles.
316
330
 
331
+ [1.0.1]: https://github.com/idyeah-studio/diya/releases/tag/v1.0.1
317
332
  [1.0.0]: https://github.com/idyeah-studio/diya/releases/tag/v1.0.0
package/dist/api.json CHANGED
@@ -1515,7 +1515,7 @@
1515
1515
  "propsType": "DiyaProviderProps"
1516
1516
  },
1517
1517
  "Drawer": {
1518
- "description": "A modal panel that slides in from the side, traps focus and returns it on close. The ref, `className`, `style` and other attributes go to the native `dialog` element.",
1518
+ "description": "A modal panel at the side of the page that traps focus and returns it on close. The ref, `className`, `style` and other attributes go to the native `dialog` element.",
1519
1519
  "entry": ".",
1520
1520
  "extendsDom": "dialog",
1521
1521
  "props": {
@@ -1566,7 +1566,7 @@
1566
1566
  },
1567
1567
  "side": {
1568
1568
  "default": "right",
1569
- "description": "Edge the drawer slides from; defaults to 'right'.",
1569
+ "description": "Which edge of the page the drawer sits on; defaults to 'right'.",
1570
1570
  "required": false,
1571
1571
  "type": "\"left\" | \"right\"",
1572
1572
  "values": [
@@ -7273,5 +7273,5 @@
7273
7273
  "WizardProps": "Omit<HTMLAttributes<HTMLElement>, \"children\"> & { steps: readonly WizardStep[]; activeStep: number; onStepChange: (step: number) => void; onComplete: () => void; orientation?: \"horizontal\" | \"vertical\"; showStepCount?: boolean; loading?: boolean; label?: string; backLabel?: string; nextLabel?: string; completeLabel?: string; noValidate?: boolean; headingLevel?: 1 | 2 | 3 | 4 | 5 | 6; }",
7274
7274
  "WizardStep": "{ id: string; label: string; title?: string; description?: ReactNode; content: ReactNode; }"
7275
7275
  },
7276
- "version": "1.0.0"
7276
+ "version": "1.0.1"
7277
7277
  }
@@ -10,5 +10,5 @@ export const Progress = forwardRef(function Progress({ value, variant = 'linear'
10
10
  const locale = useDiyaLocale();
11
11
  const indeterminate = forced || value === undefined || !Number.isFinite(value);
12
12
  const amount = indeterminate ? 0 : Math.min(100, Math.max(0, value));
13
- return _jsxs("div", { ...props, ref: ref, className: cx('diya-progress', className), "data-variant": variant, "data-indeterminate": indeterminate, children: [_jsx("div", { className: "diya-progress-meter", role: "progressbar", "aria-label": label, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": indeterminate ? undefined : amount, "aria-valuetext": indeterminate ? t.inProgress : undefined, children: variant === 'linear' ? _jsx("div", { className: "diya-progress-track", children: _jsx("span", { style: { width: indeterminate ? '35%' : `${amount}%` } }) }) : _jsxs("svg", { viewBox: "0 0 100 100", "aria-hidden": "true", children: [_jsx("circle", { className: "diya-progress-track-circle", cx: "50", cy: "50", r: "42" }), _jsx("circle", { className: "diya-progress-fill-circle", cx: "50", cy: "50", r: "42", pathLength: "100", strokeDasharray: "100", strokeDashoffset: indeterminate ? 72 : 100 - amount })] }) }), showValue && !indeterminate && _jsx("span", { className: "diya-progress-value", "aria-hidden": "true", children: new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(Math.round(amount) / 100) })] });
13
+ return _jsxs("div", { ...props, ref: ref, className: cx('diya-progress', className), "data-variant": variant, "data-indeterminate": indeterminate, children: [_jsx("div", { className: "diya-progress-meter", role: "progressbar", "aria-label": label, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": indeterminate ? undefined : amount, "aria-valuetext": indeterminate ? t.inProgress : undefined, children: variant === 'linear' ? _jsx("div", { className: "diya-progress-track", children: _jsx("span", { style: indeterminate ? undefined : { width: `${amount}%` } }) }) : _jsxs("svg", { viewBox: "0 0 100 100", "aria-hidden": "true", children: [_jsx("circle", { className: "diya-progress-track-circle", cx: "50", cy: "50", r: "42" }), _jsx("circle", { className: "diya-progress-fill-circle", cx: "50", cy: "50", r: "42", pathLength: "100", strokeDasharray: "100", strokeDashoffset: indeterminate ? 72 : 100 - amount })] }) }), showValue && !indeterminate && _jsx("span", { className: "diya-progress-value", "aria-hidden": "true", children: new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(Math.round(amount) / 100) })] });
14
14
  });
package/dist/styles.css CHANGED
@@ -1819,12 +1819,19 @@
1819
1819
  .diya-root .diya-progress-track-circle { stroke: var(--diya-color-selected); }
1820
1820
  .diya-root .diya-progress-fill-circle { stroke: var(--diya-color-accent); stroke-linecap: round; }
1821
1821
  .diya-root .diya-progress[data-variant='circular'] .diya-progress-value { position: absolute; inset: 0; display: grid; place-items: center; }
1822
- .diya-root .diya-progress[data-indeterminate='true'][data-variant='linear'] .diya-progress-track > span { animation: diya-progress-travel 1.8s ease-in-out infinite alternate; }
1822
+ .diya-root .diya-progress[data-indeterminate='true'][data-variant='linear'] .diya-progress-track > span { width: 35%; animation: diya-progress-travel 1.8s ease-in-out infinite alternate; }
1823
1823
  .diya-root .diya-progress[data-indeterminate='true'][data-variant='circular'] svg { animation: diya-progress-spin 1.4s linear infinite; }
1824
1824
  @keyframes diya-progress-travel { from { transform: translateX(-100%); } to { transform: translateX(285%); } }
1825
1825
  @keyframes diya-progress-spin { to { transform: rotate(270deg); } }
1826
- @media (prefers-reduced-motion: reduce) { .diya-root .diya-progress[data-indeterminate='true'] svg,
1827
- .diya-root .diya-progress[data-indeterminate='true'] .diya-progress-track > span { animation: none !important; } }
1826
+ /* Under Reduce Motion, indeterminate progress stops travelling or spinning and
1827
+ breathes in place instead: a full bar or ring that fades between faint and
1828
+ clear, so it reads as "working", never as a stuck amount or as done. */
1829
+ @keyframes diya-progress-breathe { from { opacity: .25; } to { opacity: .7; } }
1830
+ @media (prefers-reduced-motion: reduce) {
1831
+ .diya-root .diya-progress[data-indeterminate='true'][data-variant='circular'] svg { animation: none; }
1832
+ .diya-root .diya-progress[data-indeterminate='true'][data-variant='circular'] .diya-progress-fill-circle { stroke-dashoffset: 0; animation: diya-progress-breathe 2s ease-in-out infinite alternate; }
1833
+ .diya-root .diya-progress[data-indeterminate='true'][data-variant='linear'] .diya-progress-track > span { width: 100%; transform: none; animation: diya-progress-breathe 2s ease-in-out infinite alternate; }
1834
+ }
1828
1835
  @media (forced-colors: active) { .diya-root .diya-progress-track { outline: 1px solid CanvasText; } .diya-root .diya-progress-track > span { background: Highlight; } .diya-root .diya-progress-fill-circle { stroke: Highlight; } }
1829
1836
 
1830
1837
 
@@ -20,12 +20,12 @@ export type DrawerProps = Omit<DialogHTMLAttributes<HTMLDialogElement>, 'title'
20
20
  children: ReactNode;
21
21
  /** Content pinned to the bottom, usually action buttons. */
22
22
  footer?: ReactNode;
23
- /** Edge the drawer slides from; defaults to 'right'. */
23
+ /** Which edge of the page the drawer sits on; defaults to 'right'. */
24
24
  side?: 'left' | 'right';
25
25
  /** Shows the close icon button in the header; defaults to true. */
26
26
  showClose?: boolean;
27
27
  };
28
- /** A modal panel that slides in from the side, traps focus and returns it on close. The ref, `className`, `style` and other attributes go to the native `dialog` element. */
28
+ /** A modal panel at the side of the page that traps focus and returns it on close. The ref, `className`, `style` and other attributes go to the native `dialog` element. */
29
29
  export declare const Drawer: import("react").ForwardRefExoticComponent<Omit<DialogHTMLAttributes<HTMLDialogElement>, "children" | "open" | "title"> & {
30
30
  /** Whether the drawer is shown; the caller owns this state. */
31
31
  open: boolean;
@@ -41,7 +41,7 @@ export declare const Drawer: import("react").ForwardRefExoticComponent<Omit<Dial
41
41
  children: ReactNode;
42
42
  /** Content pinned to the bottom, usually action buttons. */
43
43
  footer?: ReactNode;
44
- /** Edge the drawer slides from; defaults to 'right'. */
44
+ /** Which edge of the page the drawer sits on; defaults to 'right'. */
45
45
  side?: "left" | "right";
46
46
  /** Shows the close icon button in the header; defaults to true. */
47
47
  showClose?: boolean;
@@ -7,7 +7,7 @@ import { useDiyaMessages } from '../DiyaProvider.js';
7
7
  import { cx } from '../internal/cx.js';
8
8
  import { composeRefs } from '../internal/slot.js';
9
9
  import { drawerMessages } from './drawer-messages.js';
10
- /** A modal panel that slides in from the side, traps focus and returns it on close. The ref, `className`, `style` and other attributes go to the native `dialog` element. */
10
+ /** A modal panel at the side of the page that traps focus and returns it on close. The ref, `className`, `style` and other attributes go to the native `dialog` element. */
11
11
  export const Drawer = forwardRef(function Drawer({ open, onOpenChange, title, headingLevel = 3, description, children, footer, side = 'right', showClose = true, className, onCancel, onClose, onClick, ...props }, ref) {
12
12
  const t = useDiyaMessages('drawer', drawerMessages);
13
13
  const dialog = useRef(null);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idyeah/diya",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "React components and patterns: Light, Dark and Glass. MIT.",