Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
bdd9d94
Pkg - Upgrade monorepo stack (tsdown, Nuxt 4, Astro 5, oxfmt)
smastrom Mar 24, 2026
08223e1
Notification - Tip accent and progress corners (#76, #78)
smastrom Mar 24, 2026
666706e
Pkg - Expand README with Astro, headless example, docs pointer
smastrom Mar 24, 2026
329dbee
Pkg - Gitignore local docs directory
smastrom Mar 24, 2026
0dc3a88
Playground - Simplify Vite minify option
smastrom Mar 24, 2026
0fe6cfc
Core, Notivue - Notify API with push alias
smastrom Mar 24, 2026
f0efb71
Notification - NotificationSwipe as primary name
smastrom Mar 24, 2026
73b9950
Demo, Astro - Improve captions and dynamic notification labels
smastrom Mar 24, 2026
7b07f80
README - Expand quick start (headless, options, swipe)
smastrom Mar 24, 2026
52e5e8f
GitHub - Update FUNDING donation links
smastrom Mar 24, 2026
a2ff613
Astro - Add playground-astro, retire astro-playground
smastrom Mar 25, 2026
a7c302f
Core, Astro - Align PushAstroEvent with NotifyOptions
smastrom Mar 25, 2026
7812ce9
Demo - Refresh README quick start and examples
smastrom Mar 25, 2026
ac38a43
Playground - Use notify; isolate push alias in headless demo
smastrom Mar 25, 2026
68529a9
Core, Notifications, Astro, Nuxt - Introduce notify.loading and loadi…
smastrom Mar 25, 2026
daee681
Tests - Align Cypress and Vitest with notify.loading and config
smastrom Mar 25, 2026
c45b0af
Playground, Playground Astro - Update demos for notify.loading
smastrom Mar 25, 2026
fa8bdc9
Pkg - Add docs package to workspace, scripts, and gitignore
smastrom Mar 25, 2026
9bc22f7
Notifications - Remove tabindex=-1 from close button
smastrom Mar 26, 2026
18008ed
Core, Astro, Playground - Deprecate isTopAlign, useNotify/usePush; fi…
smastrom Mar 26, 2026
db86441
Core - Fix notification options merge order: global before per-type
smastrom Mar 26, 2026
054e39b
Core - Update JSDoc links to new docs structure; add .claude/ to giti…
smastrom Mar 26, 2026
0f251cf
Core - Move shared notification defaults into global config
smastrom Mar 26, 2026
99ca9cb
Core - Revert NotificationSwipe back to NotivueSwipe
smastrom Mar 26, 2026
1d57781
Core - Remove default focus outline from notification containers; upd…
smastrom Mar 26, 2026
9b51bd8
Core - Add pause-on-focus to Notivue stream; drop containersTabIndex …
smastrom Mar 26, 2026
2d89518
Core - Refactor NotivueKeyboard: drop provide/inject, manage tabindex…
smastrom Mar 26, 2026
e5b6ceb
Playground, Tests - Update consumers for new NotivueKeyboard API
smastrom Mar 26, 2026
97d3c77
Core - Exclude tabindex="-1" elements from focusable candidates selector
smastrom Mar 26, 2026
3d9e720
Tests - Update keyboard tests for new API; add pause-on-focus tests
smastrom Mar 26, 2026
fec0190
Docs - Streamline README features; add key exports table
smastrom Mar 26, 2026
6667da4
Docs - Move key exports table below examples; add useNotifications
smastrom Mar 27, 2026
36650e2
Core - Improve consumer-facing types; skip per-item callbacks on clea…
smastrom Mar 27, 2026
aae1163
Playground - Use Nuxt 4 idioms; clean up config
smastrom Mar 27, 2026
37c25a4
Playground - Display package version next to logo
smastrom Mar 27, 2026
03b236e
Core, Docs - Default renderAnnouncement to false; add isCandidate exa…
smastrom Mar 27, 2026
e3499a4
Add Claude Code GitHub Workflow (#82)
smastrom Mar 27, 2026
f22fb69
Remove automatic Claude Code Review workflow
smastrom Mar 27, 2026
913f140
Add CodeRabbit configuration
smastrom Mar 27, 2026
26f247e
CodeRabbit - Prevent PR title/description edits
smastrom Mar 27, 2026
45ad045
Remove claude-code-review.yml and add workflow permissions
smastrom Mar 27, 2026
2bc2cf4
CodeRabbit - Reorganize config; enable incremental reviews
smastrom Mar 27, 2026
63dacbc
Remove Claude Code GitHub workflow
smastrom May 29, 2026
520f9e2
NotivueKeyboard - Fix focusable element tabindex selector
smastrom May 29, 2026
4b45487
NotivueKeyboard - Return -1 from deprecated useNotivueKeyboard shim
smastrom May 29, 2026
ece0515
Pkg - Declare vue as peer dependency
smastrom May 29, 2026
5d38714
Docs - Add agent workflow guidance
smastrom May 29, 2026
ba94767
Astro - Generate declarations for subpath export
smastrom May 29, 2026
edb96ae
Notifications - Remove blank line before box-shadow
smastrom May 29, 2026
185f57c
Pkg - Drop stale KEYBOARD_FINDINGS from gitignore
smastrom May 29, 2026
40eb4b1
Core - Align warning ARIA defaults with error severity
smastrom May 29, 2026
939f264
CodeRabbit - Skip minor nits in reviews
smastrom May 29, 2026
86086c0
Docs - Refresh README intro and features list
smastrom May 29, 2026
b82ce86
Pkg - Add oxlint and two-pass format pipeline
smastrom May 29, 2026
dc87833
Apply oxfmt and oxlint formatting
smastrom May 29, 2026
33c984e
Core, Tests - Align notification option priority
smastrom May 29, 2026
35ebe69
Docs - Update agent workflow and funding metadata
smastrom May 29, 2026
4e9c170
Tests - Rename integration branch v3 to dev
smastrom May 29, 2026
fab223f
Core, Tests - Replace motion config with CSS variables (#85)
smastrom May 29, 2026
030a5da
Core, NotivueKeyboard, Tests - Address CodeRabbit review on v3 PR
smastrom May 29, 2026
4718230
Tests - Forward isCandidate prop in keyboard test harness
smastrom May 29, 2026
c3fecba
Notivue - Move notification gap from padding to margin
smastrom May 29, 2026
5a9f420
Core, Notivue, NotivueKeyboard, Playground, Tests - List item gap, fo…
smastrom May 29, 2026
40abb90
Tests, Notivue, NotivueKeyboard - Fix CI after list item a11y move
smastrom May 29, 2026
892ebb7
Notivue, Playground, Agents - Align placement with position config only
smastrom May 29, 2026
e5bf4a1
Agents - Update PR description before push
smastrom May 29, 2026
ee88095
Core, Notivue, NotivueKeyboard - Rename stream data attributes and al…
smastrom May 30, 2026
d2ad176
Playground - Remove center on mobile demo toggle
smastrom May 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

language: en-US
tone_instructions: >-
Be direct and concise. Use imperative mood. Skip filler
and marketing language. Assume the reader is a competent
developer. State facts, not opinions.

reviews:
profile: chill
instructions: >-
Do not report minor severity issues or formatting nits (markdown structure,
heading levels, trailing punctuation, blank lines in blockquotes). Focus on
critical and major issues that affect correctness, security, or public API
behavior.
sequence_diagrams: true
poem: false
auto_review:
enabled: true
drafts: false
auto_incremental_review: true
auto_pause_after_reviewed_commits: 0
ignore_title_keywords:
- 'WIP'
- 'DO NOT MERGE'
base_branches:
- main
- dev

# Never edit PR title or description. Reviews go in comments only.
high_level_summary: false
high_level_summary_placeholder: ''
auto_title_placeholder: ''
collapse_walkthrough: true

path_filters:
- '!pnpm-lock.yaml'
- '!**/*.snap'
- '!docs/public/**'
- '!playground/**'
- '!playground-astro/**'

path_instructions:
- path: 'packages/notivue/core/**'
instructions: |
This is the core notification engine. Pay close attention to:
- Reactivity correctness (Vue 3 reactive/ref usage)
- Type safety (strict TypeScript)
- Public API surface: any change here affects all consumers
- Backwards compatibility of exported types and functions
- path: 'packages/notivue/Notivue/**'
instructions: |
Main wrapper component with aria-live region for accessibility.
Ensure ARIA attributes and live region behavior are correct.
- path: 'packages/notivue/Notifications/**'
instructions: |
Pre-built notification components and themes.
Check CSS variable usage, theme consistency, and icon accessibility.
- path: 'packages/notivue/nuxt/**'
instructions: |
Nuxt module integration. Verify module hooks, auto-imports,
and compatibility with Nuxt 4 conventions.
- path: 'packages/notivue/astro/**'
instructions: |
Astro integration. Ensure SSR/island compatibility
and correct lifecycle handling.
- path: 'tests/**'
instructions: |
Test suite using Vitest (unit) and Cypress (component).
Includes accessibility testing via cypress-axe.
Ensure tests are deterministic and cover edge cases.
- path: 'docs/**'
instructions: |
VitePress documentation. Check code examples for accuracy,
correct imports, and consistency with the actual API.

tools:
eslint:
enabled: false
biome:
enabled: false
markdownlint:
enabled: false
actionlint:
enabled: true
gitleaks:
enabled: true

finishing_touches:
docstrings:
enabled: false
unit_tests:
enabled: false
simplify:
enabled: false

chat:
auto_reply: true
allow_non_org_members: false

code_generation:
unit_tests:
path_instructions:
- path: 'tests/**'
instructions: |
This project uses Cypress component tests as the primary
test suite, not unit tests. Include cypress-axe accessibility
checks where relevant. Use cypress-real-events for user
interaction testing. A small Vitest suite exists in
tests/config/ for configuration logic only.

knowledge_base:
learnings:
scope: local
web_search:
enabled: true
code_guidelines:
enabled: true
2 changes: 2 additions & 0 deletions .cursorignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
!docs/
!.claude/
Comment on lines +1 to +2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Negation-only patterns are likely ineffective here.

!docs/ and !.claude/ only re-include paths after an ignore match. With no preceding ignore rule, this likely does not exclude anything.

Suggested fix
-!docs/
-!.claude/
+docs/
+!.claude/
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
!docs/
!.claude/
docs/
!.claude/
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.cursorignore around lines 1 - 2, The two lines use negation-only patterns
('!docs/' and '!.claude/') which do nothing without a preceding ignore; either
remove the leading '!' to actually ignore these directories (change to 'docs/'
and '.claude/') or add a preceding broad ignore that would match them (e.g., a
rule that ignores parent paths or a glob like '*' or 'docs/**') so the negation
can re-include them—update the .cursorignore accordingly to reflect the intended
behavior.

1 change: 0 additions & 1 deletion .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
polar: smastrom
buy_me_a_coffee: smastrom
4 changes: 4 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@ on:
tags: ['v*']
workflow_dispatch:

permissions: {}

jobs:
tests-workflow:
uses: ./.github/workflows/tests.yml
Comment thread
coderabbitai[bot] marked this conversation as resolved.
permissions:
contents: read
publish:
needs: tests-workflow
runs-on: ubuntu-latest
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,18 @@ on:
pull_request:
branches:
- main
- dev
push:
branches:
- main
- dev
tags-ignore:
- '*'
workflow_call:

permissions:
contents: read

jobs:
cypress-run:
runs-on: ubuntu-latest
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ pnpm-debug.log*

.vscode
.idea
.cursor
.DS_Store

node_modules
Expand All @@ -13,3 +14,5 @@ notivue-*.tgz

.nuxt
pnpm-lock.yaml
docs/
Comment thread
smastrom marked this conversation as resolved.
.claude/
21 changes: 21 additions & 0 deletions .oxfmtrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"printWidth": 100,
"semi": false,
"singleQuote": true,
"tabWidth": 3,
"trailingComma": "es5",
"useTabs": false,
"ignorePatterns": [".vscode/**", "node_modules/**", "dist/**", "target/**"],
"sortPackageJson": {
"sortScripts": true
},
"overrides": [
{
"files": ["*.md"],
"options": {
"tabWidth": 2
}
}
]
}
93 changes: 93 additions & 0 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["typescript", "unicorn", "oxc"],
"jsPlugins": ["./oxlint-plugins.mjs"],
"categories": {
"correctness": "off",
"perf": "off",
"restriction": "off",
"suspicious": "off",
"pedantic": "off",
"style": "off",
"nursery": "off"
},
"rules": {
"stylistic/sort-imports": [
"error",
{
"internalPattern": ["^@/.+"],
"newlinesBetween": 1,
"customGroups": [
{ "groupName": "vue-files", "elementNamePattern": "\\.vue$" },
{ "groupName": "constants", "elementNamePattern": "/constants(/|$)" }
],
"groups": [
"vue-files",
"type",
"builtin",
"external",
"internal",
"constants",
["parent", "sibling", "index"],
"side-effect",
"style",
"unknown"
]
}
],
"stylistic/padding-line-between-statements": [
"error",
{ "blankLine": "always", "prev": "import", "next": "*" },
{ "blankLine": "any", "prev": "import", "next": "import" },
{
"blankLine": "always",
"prev": ["block-like", "if", "for", "while", "do", "switch", "try"],
"next": "*"
},
{
"blankLine": "always",
"prev": "*",
"next": ["block-like", "if", "for", "while", "do", "switch", "try"]
},
{
"blankLine": "any",
"prev": ["block-like", "if", "for", "while", "do", "switch", "try"],
"next": ["block-like", "if", "for", "while", "do", "switch", "try"]
},
{ "blankLine": "always", "prev": "expression", "next": ["const", "let"] },
{ "blankLine": "always", "prev": ["const", "let"], "next": "expression" },
{ "blankLine": "always", "prev": "const", "next": "let" },
{ "blankLine": "always", "prev": "let", "next": "const" },
{
"blankLine": "always",
"prev": [
{ "selector": "ExpressionStatement[expression.type='AssignmentExpression']" },
{ "selector": "ExpressionStatement[expression.type='UpdateExpression']" }
],
"next": [
{ "selector": "ExpressionStatement[expression.type='CallExpression']" },
{ "selector": "ExpressionStatement[expression.type='AwaitExpression']" }
]
},
{
"blankLine": "always",
"prev": [
{ "selector": "ExpressionStatement[expression.type='CallExpression']" },
{ "selector": "ExpressionStatement[expression.type='AwaitExpression']" }
],
"next": [
{ "selector": "ExpressionStatement[expression.type='AssignmentExpression']" },
{ "selector": "ExpressionStatement[expression.type='UpdateExpression']" }
]
},
{
"blankLine": "always",
"prev": "*",
"next": ["return", "throw", "break", "continue"]
}
]
},
"env": {
"builtin": true
}
}
63 changes: 63 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Agents

## Project

Notivue is a public OSS Vue 3 toast notification library. Treat `packages/notivue` as the product, with Nuxt and Astro integrations, playgrounds for manual checks, docs for the public contract, and `tests` as the regression suite.

- Keep changes small and library-grade. Prefer existing APIs, file layout, and naming over new patterns.
- Protect public exports, types, CSS entrypoints, accessibility behavior, SSR compatibility, and backwards compatibility unless the user explicitly asks for a breaking change.
- For behavior changes, update or add focused tests near the affected area. Cypress component tests are the main suite; Vitest is used for config logic.
- Never run development servers unless the user explicitly requests them.
- Use `pnpm` and the repo scripts: `pnpm build`, `pnpm test`, `pnpm test:unit`, `pnpm format:check`, `pnpm dev`, `pnpm dev:astro`.

## Notivue stream layout

- Notification rows use `width: max-content` on `<li data-notivue-list-item>` so keyboard focus rings hug the toast. Stream focus and `aria-label` belong on the `<li>`; `[data-notivue-item]` is not focusable.
- Horizontal alignment follows `position` (`*-left`, `*-center`, `*-right`). Responsive changes use `config.update` / `updateConfig`, not CSS alignment overrides.
- `--nv-gap` is block-end margin on list items. Stacking uses `getListItemStackHeight` in `packages/notivue/core/utils.ts`.
- `NotivueKeyboard` `isCandidate` receives the `<li>` (`[data-notivue-list-item]`), same element as stream focus.

## Workflow

- **GitHub (PR review):** CodeRabbit comments on pull requests. Triage each thread: fix when valid, dismiss with a short reason when not. Resolve threads after replying.
- **Local (implementation):** Cursor Agent makes changes, commits, and pushes on request. When answering CodeRabbit on GitHub, post replies on the review thread and note they were written by the agent (see below).
- Do not create commits or push to remotes unless the user explicitly requests it in the current conversation.
- After implementing changes, stop and let the user review the diff before committing or pushing. Do not commit proactively at the end of a task unless they asked for it in that message.
- **Before pushing:** If the branch has an open PR, run `gh pr view` and update the PR title and body when new commits change scope, behavior, dependencies, or the test plan. Do not push with an outdated description.

## Writing

- Do not use em-dashes. Use a hyphen, a comma, a colon, or separate sentences instead.

## Git

Match the style on `main`. Do **not** use Conventional Commits (`feat:`, `fix:`, `chore:`, etc.).

**Titles**

- Scoped: `{Area} - {Description}`. Capitalize the part after `-`.
- Areas: `Core`, `Notivue`, `Notification`, `Notifications`, `Pkg`, `Demo`, `Playground`, `Astro`, `Tests`, `Docs`, `CodeRabbit`, …
- Examples: `Core - Rename useRepositioning to useSizes`, `NotivueKeyboard - Fix focusable element tabindex selector`
- Multi-scope: `Core, Astro - Cleanup`
- Releases: `2.4.5 (#63)` (include PR number for version bumps)
- Small / misc: short imperative is fine (e.g. `Remove Claude Code GitHub workflow`)

**Body (optional)**

- Bullet lines: `* {Area} - …`

**Agent commits**

- Append co-author trailer:

```text
Co-authored-by: Cursor <cursoragent@cursor.com>
```

**GitHub review replies**

- When replying to CodeRabbit (or any PR comment) on the user's behalf, end with:

```text
Added by Cursor Agent
```
30 changes: 15 additions & 15 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,24 @@ diverse, inclusive, and healthy community.
Examples of behavior that contributes to a positive environment for our
community include:

- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the
overall community
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the
overall community

Examples of unacceptable behavior include:

- The use of sexualized language or imagery, and sexual attention or
advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
- The use of sexualized language or imagery, and sexual attention or
advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting

## Enforcement Responsibilities

Expand Down
Loading
Loading