diff --git a/.changeset/brand-tint.md b/.changeset/brand-tint.md deleted file mode 100644 index d692c1e6c..000000000 --- a/.changeset/brand-tint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Setting `--onu-primary` now re-brands the whole UI, not just buttons. The neutral tokens (`accent`, `secondary`, `muted`, `border`, `input` and the sidebar ones) are tinted with a little of the primary colour, and brand-coloured states use it: the active sidebar item (with a bar on sub-items), tab underlines, selected table rows, the current pagination page, calendar ranges and today, nav pills and stacked tabs, outline and ghost button hovers, pressed toggles, command items and text selection. Dark-mode `primary-subtle` is stronger so it shows on cards, and scoped `data-onu-theme` sections inside dark mode now get the lifted dark primary. Turn the tint down or off with `--onu-tint` (e.g. `0%`) or `data-onu-tint="none"`; setting a token such as `--onu-accent` still replaces it, and the untinted values are available as `--onu-neutral-*`. The light `muted-foreground` is slightly darker (`oklch(0.5 0 0)`) to keep AA contrast on tinted surfaces. diff --git a/.changeset/chart-animation-off.md b/.changeset/chart-animation-off.md deleted file mode 100644 index 6fc791fde..000000000 --- a/.changeset/chart-animation-off.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Charts: add `ChartAnimationProvider` (and export `useChartAnimation`) to turn animation off for every Onu chart in an area, e.g. for print, kiosks or screenshot tests. Tooltips now also stop animating under `prefers-reduced-motion`, so every Onu chart passes `isAnimationActive={false}` to all its Recharts elements when reduced motion is preferred. The visual regression spec emulates reduced motion and loads fonts before charts render, so chart screenshots are stable. diff --git a/.changeset/chart-gradient-fills.md b/.changeset/chart-gradient-fills.md deleted file mode 100644 index ef7994050..000000000 --- a/.changeset/chart-gradient-fills.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Charts: gradient fills, on by default. Areas (`LineChart` and `TimeSeriesChart` areas, stacked areas, `Sparkline`, `StatTile` sparklines) fade from the series colour to almost clear at the baseline, bars (`BarChart` vertical, horizontal and stacked, `TimeSeriesChart` bars, `PeriodComparisonChart` bars) run from a lighter base to the full colour (mirrored for negative values and for horizontal bars in RTL), and the `PeriodComparisonChart` line variant gets a soft wash under the current period. Gradients use the series colour, so they follow the theme and `--onu-primary`, have ids unique per chart instance, and fall back to solid in forced-colours mode. Turn them off with `gradient={false}` on a chart (`sparklineGradient` on `StatTile`) or for an area with the new `ChartStyleProvider gradient={false}`; `useChartGradient` is exported for custom charts. Pie and donut slices stay solid. Tooltip and legend swatches stay solid when a series is filled with a gradient. diff --git a/.changeset/charts-group.md b/.changeset/charts-group.md deleted file mode 100644 index e40f0f6ae..000000000 --- a/.changeset/charts-group.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Charts (`@javaabu/onu/charts`): BarChart, LineChart, PieChart, TimeSeriesChart, PeriodComparisonChart, Sparkline, StatTile/StatTiles, DeltaIndicator and MapChart, plus the shadcn chart primitives and locale-aware formatters (`formatMVR`, `useChartFormat`). diff --git a/.changeset/client-side-export.md b/.changeset/client-side-export.md deleted file mode 100644 index 5939ed9f3..000000000 --- a/.changeset/client-side-export.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -New `@javaabu/onu/export` entry: `exportRows({ format, rows, columns, filename, title, scope })` and `useExportRows()` build CSV, Excel or PDF files in the browser, so `ExportMenu` / `ListingPage` can export without a server in one line (`onExport={(format) => exportRows({ format, rows, columns })}`). Columns take a header, an accessor (key, dotted path or function) and an optional type (`text`, `number`, `currency`, `date`, `datetime`, `boolean`) and formatter. CSV is UTF-8 with a BOM, RFC 4180 quoted and guarded against formula injection. Excel uses the optional `write-excel-file` peer (loaded on first use), keeps numbers numeric and dates as dates, and writes right-to-left sheets for Dhivehi. PDF opens the print dialog with a paginated, escaped table document (title, scope, generated date, repeated header row, page numbers, `dir`/`lang`, Onu fonts), so Thaana renders correctly. Per-format helpers (`toCsv`, `buildExcelSheet`, `toExcelBlob`, `buildPrintDocument`, `printHtml`, …) are exported too. diff --git a/.changeset/code-block-token-contrast.md b/.changeset/code-block-token-contrast.md deleted file mode 100644 index 60901e27c..000000000 --- a/.changeset/code-block-token-contrast.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": patch ---- - -CodeBlock: Shiki token colours are adjusted to at least 4.5:1 contrast on the code background (and on highlighted lines) in light and dark mode. The default GitHub themes' keyword red and comment grey fell short of WCAG AA. `highlightCode` returns the adjusted colours too. diff --git a/.changeset/display-and-feedback.md b/.changeset/display-and-feedback.md deleted file mode 100644 index 668ffbec8..000000000 --- a/.changeset/display-and-feedback.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Display and feedback components: DescriptionList, StatusBadge, Tag, UserAvatar, UserAvatarGroup, KeyboardKey, Callout, Notice, AnnouncementBar, CookieConsent, Toaster/toast, ConditionalLink, ConditionalDisplay, PublishBox, LastEditedBy, RelativeDate, Countdown, ActivityFeed, CommentThread, Notes, IconText, ShareButtons, PrintButton/BackButton, MiniCalendar, ContentCard and error pages (403, 404, 500, 503). Adds the `cookie`, `megaphone`, `message` and `wrench` semantic icons. diff --git a/.changeset/dropzone-controlled-value.md b/.changeset/dropzone-controlled-value.md deleted file mode 100644 index f68964fc4..000000000 --- a/.changeset/dropzone-controlled-value.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -`DropzoneUploader`: controlled `value` / `onValueChange` and `defaultValue` for its file list, so an edit page can show files already saved on the record (`{ id, name, size?, type?, url?, thumbnailUrl? }`), let the user remove them, and submit the kept ids as hidden inputs. With an uploader, finished uploads are added to the value (`{ id, name, size, type, file, response }`); without one, picked `File`s are. Existing files count toward `maxFiles`; removing a file moves focus back to the Browse button and is announced. New types `DropzoneFile` and `UploadedFile`. Without the new props the uploader behaves as before, except that with `multiple={false}` and an uploader, a finished upload now replaces the previous one instead of listing both. diff --git a/.changeset/editor-list-direction.md b/.changeset/editor-list-direction.md deleted file mode 100644 index 1f0ed1ffd..000000000 --- a/.changeset/editor-list-direction.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": patch ---- - -Editor and BlockRenderer: lists and quotes now get the direction of their first strong character instead of `dir="auto"` (which the browser resolved to LTR because every paragraph inside has its own `dir`), so bullets, numbers and the quote border sit on the right of Dhivehi text. The direction updates while typing and is included in `getHTML()`. diff --git a/.changeset/editor-table-direction.md b/.changeset/editor-table-direction.md deleted file mode 100644 index fe2a766d9..000000000 --- a/.changeset/editor-table-direction.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": patch ---- - -Editor and BlockRenderer: tables now take the direction of their first strong text, like lists and quotes. The table and its scroll wrapper get the resolved `dir` (in `BlockRenderer`, `getHTML()` and, updated while typing, both editors), so a Dhivehi table puts its first column on the right even on an English page. Table cells align to their logical start. An explicit `dir` in the content still wins; a table with no strong text yet stays `dir="auto"`. diff --git a/.changeset/files-and-media.md b/.changeset/files-and-media.md deleted file mode 100644 index e8d8930fb..000000000 --- a/.changeset/files-and-media.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Files and media: FileInput, MultipleFileInput, InstantFileUpload, DropzoneUploader, UploadProgress (with `useUploadQueue` and an XHR uploader that understands Laravel JSON errors), AdditionalFilesUpload, ImageInput, MediaLister, Carousel (dots, autoplay with pause, RTL), AttachmentPreview, DocumentDownload, VideoEmbed and FileIcon; and in `@javaabu/onu/media`: ImageCropper, AvatarUpload, Lightbox, Gallery and MediaPlayer. diff --git a/.changeset/form-field-min-width.md b/.changeset/form-field-min-width.md deleted file mode 100644 index c97019b58..000000000 --- a/.changeset/form-field-min-width.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": patch ---- - -FormField no longer grows past its grid or flex column when a control holds long content (such as a long file name); its root now has `min-w-0`. diff --git a/.changeset/form-scaffolding.md b/.changeset/form-scaffolding.md deleted file mode 100644 index b4d475d63..000000000 --- a/.changeset/form-scaffolding.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Form scaffolding: `Form` (Laravel 422 and react-hook-form support, error summary, focus on the first invalid field), `ValidationSummary`, `FormGroup`, `Fieldset` / `FormSection`, `Label`, `FormContainer`, `RepeatingGroup`, `InlineEdit`, `AutosaveIndicator` + `useAutosave`, `SaveBar` + `useUnsavedChangesGuard`, `FloatingSubmit`, `SubmitButton`, `Button` (loading, icons, success/warning), `LinkButton`, `ButtonGroup` and the auth forms (`SignInForm`, `RegisterForm`, `ForgotPasswordForm`, `ResetPasswordForm`). diff --git a/.changeset/forms-listing-layout-fixes.md b/.changeset/forms-listing-layout-fixes.md deleted file mode 100644 index a9fe44d8b..000000000 --- a/.changeset/forms-listing-layout-fixes.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Form, listing and layout fixes: - -- Textarea keeps its character counter in LTR order on RTL pages; SegmentedControl never truncates labels and scrolls sideways when space runs out. -- File names use `dir="auto"` and sizes read left-to-right in MediaLister, AttachmentPreview, DocumentDownload, FileInput and file rows. -- SaveBar keeps inside the main column (mirrored in RTL) and reads "No changes yet" when clean. -- The unsaved-changes guard covers hash-router links and, where the Navigation API exists, Back/Forward (new `interceptHistory` option). -- `describeChanges` is typed per key; auth forms pass every named field to `onSubmit` (`AuthFormValues`) and use the transparent divider. -- Nav items match on path and query; AppSidebar parent badges sit before the chevron. -- Card pads content placed straight inside it (`padded={false}` opts out). -- DataTable selection checkboxes are 24px targets. -- ListingPage with custom `children` keeps pagination and adds a Sort by menu; state equal to `defaultState` stays out of the URL. -- New `useFormatFilter`, `useActiveFilterLabels` and `formatFilterLabel`; new `useFormatDate`, `useFormatNumber` and `useFormatCurrency`. -- TreeView shows partly selected parents and gains opt-in `selectionPropagation` (`propagateTreeSelection` exported). diff --git a/.changeset/full-calendar-rtl-overflow.md b/.changeset/full-calendar-rtl-overflow.md deleted file mode 100644 index 1c78b1e29..000000000 --- a/.changeset/full-calendar-rtl-overflow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": patch ---- - -FullCalendar: the agenda view no longer overflows by 10,000px in RTL (FullCalendar's off-screen list header is now hidden in place), and month events clip inside their day cell on phones. diff --git a/.changeset/google-maps-adapter-fixes.md b/.changeset/google-maps-adapter-fixes.md deleted file mode 100644 index 3461edccf..000000000 --- a/.changeset/google-maps-adapter-fixes.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@javaabu/onu": patch ---- - -Maps (Google adapter), found by running the adapter against the real Maps JavaScript API: - -- `MapPolygon` / `MapRoute`: the initial value is no longer wiped when it is loaded into terra-draw (terra-draw reported its `clear()` as the user deleting every shape). -- terra-draw now starts once the map has a projection, instead of throwing `Cannot read properties of null (reading 'addEventListener')` when it loaded before the map was ready. -- Shapes stay on the map when the drawing tone changes (e.g. picking another zone type). -- Maps keep their camera when they switch between light and dark, instead of jumping back to the initial centre and zoom. -- Clustered markers use `PinElement` directly and `gmp-click`, removing Google's deprecation warnings. diff --git a/.changeset/hero-feature-grid.md b/.changeset/hero-feature-grid.md deleted file mode 100644 index c065dc5a7..000000000 --- a/.changeset/hero-feature-grid.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -New portal building blocks (R3.7): `Hero` (heading, lead text, actions, search slot, media or a background image under a token-coloured scrim) and `FeatureGrid` (icon, title, description and link per item, with container-query columns). Adds a fluid type scale (R3.4): `text-fluid-sm` … `text-fluid-5xl` utilities built on `clamp()`, overridable with `--onu-text-fluid-*`, with taller line heights for Thaana. `cn()` merges the fluid utilities as font sizes. diff --git a/.changeset/icon-bundle-size.md b/.changeset/icon-bundle-size.md deleted file mode 100644 index e9ae609ef..000000000 --- a/.changeset/icon-bundle-size.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@javaabu/onu": minor ---- - -Smaller single-component bundles: `` no longer imports the full Lucide map (~250 icons). `OnuProvider` supplies the default set through the icon context, and components with fixed glyphs (Button's loading spinner, Spinner, the shadcn primitives' close buttons, chevrons and checks) pass their Lucide icon as the new `fallback` prop, so they keep working outside `OnuProvider` and `OnuProvider icons` overrides still win. Importing only `Button` drops from 20.7 kB to 11.9 kB (brotli), `FormField` + `TextInput` from 37.2 kB to 28.2 kB. The `Icon` exported from the package root still resolves every name anywhere. Outside `OnuProvider`, names chosen at runtime inside components (e.g. `