* fix: Cache used MFA codes using hash of secret rather than secret and code
* support non-locking drivers
* consistency
* fix: return an array from `SpatieTagsEntry`/`SpatieTagsColumn` `getState()` when state is not a Collection or array
The early-return branch returned the raw state from a method typed `array`,
which threw a `TypeError` for any truthy scalar state. PHPStan 2.2.8 narrows
`mixed` more precisely and surfaced this, failing CI on every branch.
The early-return branch returned the raw state from a method typed `array`,
which threw a `TypeError` for any truthy scalar state. PHPStan 2.2.8 narrows
`mixed` more precisely and surfaced this, failing CI on every branch.
* fix: derive per-key state path when unsetting missing array keys in tests
`unsetMissingNumericArrayKeys()` appended `.{$key}` to `$currentStatePath`
inside its `foreach`, so each sibling key inherited the preceding keys'
segments instead of deriving `parent.key` per key.
Walking `$this->mountedActions`, the entry's keys are ordered `name`,
`arguments`, `context`, `data`, so by the time the loop reaches `data` the
path has become:
mountedActions.0.name.arguments.context.data
The `startsWith($schemaStatePath)` guard then never matches
`mountedActions.0.data`, which leaves the `unset()` for stale numeric keys
unreachable. In a test, filling a mounted action's form with a shorter list
silently keeps the removed items:
// CheckboxList::make('roles'), mounted state ['viewer', 'creator']
->fillForm(['roles' => ['viewer']])
// state is still ['viewer', 'creator']
`callAction(..., data: [...])` and `setActionData()` route through
`fillForm()`, so they are affected too. Growing the list works, and clearing
it to `[]` works because an empty array stays a leaf for `Arr::dot()` and
`data_set()` replaces the whole value. Only a partial shrink breaks, and it
breaks silently: the assertion after it passes against state that was never
changed.
Page-level forms were unaffected, because their state path is the single
segment `data` and every corrupted path still starts with it.
* Update InteractsWithSchemasTest.php
---------
Co-authored-by: Dan Harrin <git@danharrin.com>
* fix: table header height consistency and button loading height
* fix button loading height with `align-middle` and scope header action margins to `sm`
* apply header action negative margins to the container so wrapped rows keep their gap
* remove vestigial `-mt-px` from table header so its optics match a section header
* keep the table heading visible while reordering, only hiding the header actions
* remove reordering header test
* pin link and badge baselines to their labels so loading indicators do not shift them in inline flow
* wrap the link label in optimized rendering paths to match the Blade component
---------
Co-authored-by: Dan Harrin <git@danharrin.com>
* fix(forms): refresh CodeMirror when MarkdownEditor becomes visible
* Restore `#20134` state sync fix and only refresh on the hidden-to-visible transition
- Reinstates the current `4.x` change handler and state watcher, which were
accidentally reverted when this patch was authored against an older copy of
`markdown-editor.js`.
- Keeps the `ResizeObserver` and `IntersectionObserver` connected for the whole
lifecycle of the editor, since the state may change while it is hidden and it
can be revealed again, but only calls `refresh()` when the editor transitions
from hidden to visible instead of on every resize or scroll.
- Detects visibility using both `offsetParent` (inactive tabs use
`display: none`) and computed `visibility` (collapsed sections hide content
with `visibility: hidden`).
- Rebuilds the dist output against the latest `4.x`, resolving the merge
conflict.
---------
Co-authored-by: Dan Harrin <git@danharrin.com>
* fix: preserve configuration context when mounting navigation
* test: cover navigation mounting with active configurations
* consistency and more tests
---------
Co-authored-by: Dan Harrin <git@danharrin.com>
* Add accessible names to the non-native date/time picker panel
The custom (`->native(false)`) date/time picker panel renders several
interactive controls with no accessible name, so screen readers announce
them without any indication of their purpose:
- the month `<select>`
- the year `<input>`
- the hour, minute, and second `<input>`s
This adds a translatable `aria-label` to each, sourced from new
`date_time_picker.aria_labels` translation keys. `DatePicker` extends
`DateTimePicker`, so it inherits the fix.
The change is purely additive: no existing HTML tags, attributes, or
behavior are altered, so it is backward-compatible for anyone targeting
the existing markup with CSS/JS/tests.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* cleanup
---------
Co-authored-by: Dotan Mazor <atlassian@dotanmazor.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Dan Harrin <git@danharrin.com>