From 360584a5e870497fcc30e3f0d840ed6506928ccb Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Thu, 2 Oct 2025 13:21:26 +0200 Subject: [PATCH 01/16] migrated @nylas/react --- packages/react/.eslintrc.cjs | 13 + packages/react/.gitignore | 28 + packages/react/.prettierrc | 1 + packages/react/CHANGELOG.md | 1051 +++++ packages/react/README.md | 197 + packages/react/index.html | 13 + packages/react/lib/connect.ts | 2 + packages/react/lib/connect/index.ts | 22 + packages/react/lib/connect/types.ts | 27 + .../react/lib/connect/useNylasConnect.test.ts | 143 + packages/react/lib/connect/useNylasConnect.ts | 487 +++ packages/react/lib/elements.ts | 2 + packages/react/lib/elements/components.ts | 3559 +++++++++++++++ packages/react/lib/index.ts | 4 + packages/react/lib/main.tsx | 100 + packages/react/lib/notetaker.ts | 2 + .../CalendarSync/CalendarSync.spec.tsx | 196 + .../notetaker/CalendarSync/CalendarSync.tsx | 542 +++ .../SendNotetaker/SendNotetaker.spec.tsx | 55 + .../notetaker/SendNotetaker/SendNotetaker.tsx | 363 ++ .../notetaker/Transcript/Transcript.spec.tsx | 211 + .../lib/notetaker/Transcript/Transcript.tsx | 397 ++ .../VideoPlayer/VideoPlayer.spec.tsx | 14 + .../lib/notetaker/VideoPlayer/VideoPlayer.tsx | 168 + packages/react/lib/notetaker/index.ts | 20 + packages/react/lib/notetaker/lib/constants.ts | 41 + .../react/lib/notetaker/lib/http-client.ts | 13 + .../react/lib/notetaker/lib/primitives.ts | 135 + packages/react/lib/notetaker/lib/store.ts | 34 + packages/react/lib/notetaker/style.css | 18 + packages/react/lib/notetaker/types.ts | 47 + packages/react/lib/utils.ts | 3 + packages/react/package.json | 109 + .../test/code-examples/CalendarSync.spec.tsx | 26 + .../test/code-examples/SendNotetaker.spec.tsx | 27 + .../test/code-examples/Transcript.spec.tsx | 46 + .../test/code-examples/VideoPlayer.spec.tsx | 30 + packages/react/test/vitest.d.ts | 8 + packages/react/test/vitest.setup.ts | 1 + packages/react/tsconfig.json | 25 + packages/react/tsconfig.typedoc.json | 5 + packages/react/typedoc.json | 23 + packages/react/vite.config.ts | 50 + packages/react/vitest.config.ts | 12 + pnpm-lock.yaml | 3892 ++++++++++++++++- 45 files changed, 12010 insertions(+), 152 deletions(-) create mode 100644 packages/react/.eslintrc.cjs create mode 100644 packages/react/.gitignore create mode 100644 packages/react/.prettierrc create mode 100644 packages/react/CHANGELOG.md create mode 100644 packages/react/README.md create mode 100644 packages/react/index.html create mode 100644 packages/react/lib/connect.ts create mode 100644 packages/react/lib/connect/index.ts create mode 100644 packages/react/lib/connect/types.ts create mode 100644 packages/react/lib/connect/useNylasConnect.test.ts create mode 100644 packages/react/lib/connect/useNylasConnect.ts create mode 100644 packages/react/lib/elements.ts create mode 100644 packages/react/lib/elements/components.ts create mode 100644 packages/react/lib/index.ts create mode 100644 packages/react/lib/main.tsx create mode 100644 packages/react/lib/notetaker.ts create mode 100644 packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx create mode 100644 packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx create mode 100644 packages/react/lib/notetaker/SendNotetaker/SendNotetaker.spec.tsx create mode 100644 packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx create mode 100644 packages/react/lib/notetaker/Transcript/Transcript.spec.tsx create mode 100644 packages/react/lib/notetaker/Transcript/Transcript.tsx create mode 100644 packages/react/lib/notetaker/VideoPlayer/VideoPlayer.spec.tsx create mode 100644 packages/react/lib/notetaker/VideoPlayer/VideoPlayer.tsx create mode 100644 packages/react/lib/notetaker/index.ts create mode 100644 packages/react/lib/notetaker/lib/constants.ts create mode 100644 packages/react/lib/notetaker/lib/http-client.ts create mode 100644 packages/react/lib/notetaker/lib/primitives.ts create mode 100644 packages/react/lib/notetaker/lib/store.ts create mode 100644 packages/react/lib/notetaker/style.css create mode 100644 packages/react/lib/notetaker/types.ts create mode 100644 packages/react/lib/utils.ts create mode 100644 packages/react/package.json create mode 100644 packages/react/test/code-examples/CalendarSync.spec.tsx create mode 100644 packages/react/test/code-examples/SendNotetaker.spec.tsx create mode 100644 packages/react/test/code-examples/Transcript.spec.tsx create mode 100644 packages/react/test/code-examples/VideoPlayer.spec.tsx create mode 100644 packages/react/test/vitest.d.ts create mode 100644 packages/react/test/vitest.setup.ts create mode 100644 packages/react/tsconfig.json create mode 100644 packages/react/tsconfig.typedoc.json create mode 100644 packages/react/typedoc.json create mode 100644 packages/react/vite.config.ts create mode 100644 packages/react/vitest.config.ts diff --git a/packages/react/.eslintrc.cjs b/packages/react/.eslintrc.cjs new file mode 100644 index 0000000..2b35180 --- /dev/null +++ b/packages/react/.eslintrc.cjs @@ -0,0 +1,13 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended'], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/packages/react/.gitignore b/packages/react/.gitignore new file mode 100644 index 0000000..8e6122d --- /dev/null +++ b/packages/react/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +dist-preact +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + + +./docs \ No newline at end of file diff --git a/packages/react/.prettierrc b/packages/react/.prettierrc new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/packages/react/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md new file mode 100644 index 0000000..6d7ac20 --- /dev/null +++ b/packages/react/CHANGELOG.md @@ -0,0 +1,1051 @@ +# @nylas/react + +## 2.2.4 + +### Patch Changes + +- [#733](https://github.com/nylas/nylas/pull/733) [`9632ac3`](https://github.com/nylas/nylas/commit/9632ac3d5871ad0e1dc50fb09b3c64845c1ec06b) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Fixed UUID extraction from booking refs did not work for URL encoded values after the last fix. + +- Updated dependencies [[`9632ac3`](https://github.com/nylas/nylas/commit/9632ac3d5871ad0e1dc50fb09b3c64845c1ec06b)]: + - @nylas/web-elements@2.2.4 + +## 2.2.3 + +### Patch Changes + +- [#726](https://github.com/nylas/nylas/pull/726) [`a19b12c`](https://github.com/nylas/nylas/commit/a19b12cc4fca0aed9541cddd0eb9cf8e9ddda57c) Thanks [@AaronDDM](https://github.com/AaronDDM)! - fix(web-elements): Booking ref and cancel ref UUID utility not properly calculating UUIDs + +- [#729](https://github.com/nylas/nylas/pull/729) [`6cca66a`](https://github.com/nylas/nylas/commit/6cca66ad663da728fb42fd5a7995b5fdae3f6b20) Thanks [@AaronDDM](https://github.com/AaronDDM)! - fix: SS-1254 hiding booking and cancellation url does not work + +- Updated dependencies [[`53242a1`](https://github.com/nylas/nylas/commit/53242a14833fbab606f532b8da206fc22c609642), [`a19b12c`](https://github.com/nylas/nylas/commit/a19b12cc4fca0aed9541cddd0eb9cf8e9ddda57c), [`6cca66a`](https://github.com/nylas/nylas/commit/6cca66ad663da728fb42fd5a7995b5fdae3f6b20), [`53242a1`](https://github.com/nylas/nylas/commit/53242a14833fbab606f532b8da206fc22c609642)]: + - @nylas/web-elements@2.2.2 + +## 2.2.0 + +### Minor Changes + +- [#711](https://github.com/nylas/nylas/pull/711) [`59f43c6`](https://github.com/nylas/nylas/commit/59f43c6bb99b0a420d4774fa85a35d3389cb9f19) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Upgraded stencil to 4.36.1 + +- [#711](https://github.com/nylas/nylas/pull/711) [`59f43c6`](https://github.com/nylas/nylas/commit/59f43c6bb99b0a420d4774fa85a35d3389cb9f19) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Updated @nylas/react to be compatible with Turbopack + +### Patch Changes + +- Updated dependencies [[`59f43c6`](https://github.com/nylas/nylas/commit/59f43c6bb99b0a420d4774fa85a35d3389cb9f19)]: + - @nylas/web-elements@2.2.0 + +## 2.1.0 + +### Minor Changes + +- [#705](https://github.com/nylas/nylas/pull/705) [`7ba574f`](https://github.com/nylas/nylas/commit/7ba574f2912f119e32ffdfdaed18bb83f7258085) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Fixed nylas-scheduling themes if a session id/config id was not set. + +### Patch Changes + +- [#701](https://github.com/nylas/nylas/pull/701) [`206e1ca`](https://github.com/nylas/nylas/commit/206e1cac624e89efddbbb0825c6a2923b9078a80) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Renamed specific_date_open_hours to specific_time_availability for consistency + +- Updated dependencies [[`206e1ca`](https://github.com/nylas/nylas/commit/206e1cac624e89efddbbb0825c6a2923b9078a80), [`7ba574f`](https://github.com/nylas/nylas/commit/7ba574f2912f119e32ffdfdaed18bb83f7258085)]: + - @nylas/web-elements@2.1.0 + - @nylas/core@1.2.0 + +## 2.0.6 + +### Patch Changes + +- [#700](https://github.com/nylas/nylas/pull/700) [`48df648`](https://github.com/nylas/nylas/commit/48df648c8c4d7434d48f3575f4d85cb4d54ee8a2) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the translations for errors in the custom fields shown on th ebooking form of the scheduling page + +- Updated dependencies [[`48df648`](https://github.com/nylas/nylas/commit/48df648c8c4d7434d48f3575f4d85cb4d54ee8a2)]: + - @nylas/web-elements@2.0.6 + +## 2.0.5 + +### Patch Changes + +- [#693](https://github.com/nylas/nylas/pull/693) [`870f285`](https://github.com/nylas/nylas/commit/870f285f2331a09ac8e135917ac8f053d98447cd) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the type for bookedEventInfo event to include all the fields emitted + +- [#695](https://github.com/nylas/nylas/pull/695) [`d421948`](https://github.com/nylas/nylas/commit/d421948404480e87e1bf7cc508d6a00f3adbc5ae) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Group config only supports 'booking' type and does not support 'organizer-confirmation' type, so hide the component in the UI if it is a group config + +- [#692](https://github.com/nylas/nylas/pull/692) [`f62ebaa`](https://github.com/nylas/nylas/commit/f62ebaa3f617c4de0e734c80331167ca5b1ce1fa) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed: Time overlap validation failed when using Spanish (“es”) due to unrecognized "a.m." / "p.m." formats. + +- [#699](https://github.com/nylas/nylas/pull/699) [`842e3fd`](https://github.com/nylas/nylas/commit/842e3fd6329b334be46c6c6682b604733eb5acfe) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Improved the invalid grant error to show a user friendly error message to contact the organizer + +- Updated dependencies [[`870f285`](https://github.com/nylas/nylas/commit/870f285f2331a09ac8e135917ac8f053d98447cd), [`d421948`](https://github.com/nylas/nylas/commit/d421948404480e87e1bf7cc508d6a00f3adbc5ae), [`f62ebaa`](https://github.com/nylas/nylas/commit/f62ebaa3f617c4de0e734c80331167ca5b1ce1fa), [`842e3fd`](https://github.com/nylas/nylas/commit/842e3fd6329b334be46c6c6682b604733eb5acfe)]: + - @nylas/web-elements@2.0.5 + +## 2.0.4 + +### Patch Changes + +- [#678](https://github.com/nylas/nylas/pull/678) [`06e62c4`](https://github.com/nylas/nylas/commit/06e62c4a557a4fc998bb473dbf0e2634e7fd03e3) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Introduced a "Specific Date Availability" picker to set custom availability for participants on specific dates + +- Updated dependencies [[`06e62c4`](https://github.com/nylas/nylas/commit/06e62c4a557a4fc998bb473dbf0e2634e7fd03e3)]: + - @nylas/web-elements@2.0.4 + - @nylas/core@1.1.8 + +## 2.0.3 + +### Patch Changes + +- Removed unused dependency "quill" due to a transitive XSS vulnerability. This eliminates the risk of arbitrary JavaScript execution via crafted onloadstart attributes in tags. + +- Updated dependencies []: + - @nylas/web-elements@2.0.3 + +## 2.0.2 + +### Patch Changes + +- [#669](https://github.com/nylas/nylas/pull/669) [`c4e6ebb`](https://github.com/nylas/nylas/commit/c4e6ebb142531702f3308cb024e2dabea0f4770a) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the scheduling components to use a prop defaultLanguage to init a component in the specified langugae in a different state eg. Cancelling a booking state. + +- Updated dependencies [[`c4e6ebb`](https://github.com/nylas/nylas/commit/c4e6ebb142531702f3308cb024e2dabea0f4770a)]: + - @nylas/web-elements@2.0.2 + +## 2.0.1 + +### Patch Changes + +- [#643](https://github.com/nylas/nylas/pull/643) [`d4e5d01`](https://github.com/nylas/nylas/commit/d4e5d0174c08b7ab68a27f30486f40d34da4d069) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a tag to reveal the version of the components on nylas-scheduling and nylas-scheduler-editor components + +- [#650](https://github.com/nylas/nylas/pull/650) [`cc54c58`](https://github.com/nylas/nylas/commit/cc54c589f9355aa34af2a849a526a781b01c36f9) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed a bug in the nylas-availability-picker component where the openHours prop was not correctly applied when used standalone. + +- [#640](https://github.com/nylas/nylas/pull/640) [`47cd723`](https://github.com/nylas/nylas/commit/47cd723fdad807593d487d3a8bf76aca16100f24) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the auto re-setting of booking type to 'booking' on config update + +- [#655](https://github.com/nylas/nylas/pull/655) [`e39f5fe`](https://github.com/nylas/nylas/commit/e39f5fed6039175c58995339f5a171b32de3ac34) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Enhanced the calendar fetching logic to support pagination and return complete results. The method now retrieves all available calendar data across multiple pages, consistently limits each request to 50 items, and returns the full set of calendars instead of just the first page. This ensures more reliable data coverage and alignment with how configuration data is fetched. + +- [#653](https://github.com/nylas/nylas/pull/653) [`5a86c6d`](https://github.com/nylas/nylas/commit/5a86c6d314bae02ef59c521ea132f707b9eab1d9) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Moved the error messages in the scheduler component from the bottom (footer) to a toast / notification. This is similar to the notification in the scheduling component. + +- [#641](https://github.com/nylas/nylas/pull/641) [`88c5873`](https://github.com/nylas/nylas/commit/88c58734a1a1cab5fac6a9ec77c4fa5115547fad) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where the CTA buttons in the organizer confirmation card component were hidden based on hide_rescheduling_options and hide_cancellation_options, these options should only be applciable to the booking confirmation page. + +- [#638](https://github.com/nylas/nylas/pull/638) [`648afa4`](https://github.com/nylas/nylas/commit/648afa453b639a4d9f27c9ce67f9b8f53f33bb27) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a dropdown to select the default value for 'dropdown', 'checkbox' and 'radio-button' form field types. Added a multi-select dropdown to select the default value for 'multi_select' field type. + +- Updated dependencies [[`d4e5d01`](https://github.com/nylas/nylas/commit/d4e5d0174c08b7ab68a27f30486f40d34da4d069), [`cc54c58`](https://github.com/nylas/nylas/commit/cc54c589f9355aa34af2a849a526a781b01c36f9), [`47cd723`](https://github.com/nylas/nylas/commit/47cd723fdad807593d487d3a8bf76aca16100f24), [`e39f5fe`](https://github.com/nylas/nylas/commit/e39f5fed6039175c58995339f5a171b32de3ac34), [`5a86c6d`](https://github.com/nylas/nylas/commit/5a86c6d314bae02ef59c521ea132f707b9eab1d9), [`88c5873`](https://github.com/nylas/nylas/commit/88c58734a1a1cab5fac6a9ec77c4fa5115547fad), [`648afa4`](https://github.com/nylas/nylas/commit/648afa453b639a4d9f27c9ce67f9b8f53f33bb27)]: + - @nylas/web-elements@2.0.1 + +## 2.0.0 + +### Major Changes + +- [#622](https://github.com/nylas/nylas/pull/622) [`5a8e6ba`](https://github.com/nylas/nylas/commit/5a8e6ba460ea30774b36bd37acdab30fd7d9b228) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Group Events Support Added to Scheduler Components. + + ## 🚨 BREAKING CHANGES 🚨 + + ### Prop Changes/Additions + + - The `enableEventTypes` property controls which event types are enabled in the Scheduler editor. + - Default value: + + ``` + + ``` + + ### UI Changes + + - The scheduler editor body height has increased from 610px to 900px to accommodate the calendar view for Group Events + - Clicking "Create new" now opens a type selection screen where users can choose the scheduling configuration they want to create + + ### Configuration and Set-up Changes + + - The previous approach of hardcoding a single scheduling method using the availability_method (e.g., 'max-availability', 'collective', 'max-fairness') is no longer supported. + + Before: + + ``` + + ``` + + ### New Event Types + + The scheduler components now emit the following new events for group event operations: + + - `groupEventCreateTriggered` + - `groupEventUpdateTriggered` + - `groupEventDeleteTriggered` + - `groupEventImportTriggered` + - `saveGroupEventChangesError` + +### Patch Changes + +- Updated dependencies [[`5a8e6ba`](https://github.com/nylas/nylas/commit/5a8e6ba460ea30774b36bd37acdab30fd7d9b228)]: + - @nylas/web-elements@2.0.0 + +## 1.4.5 + +### Patch Changes + +- [#631](https://github.com/nylas/nylas/pull/631) [`ef637ec`](https://github.com/nylas/nylas/commit/ef637ecd3fee67ba96ff8a728f72e18ce68bdafe) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the translation for additional field type + +- [#625](https://github.com/nylas/nylas/pull/625) [`d3b7cc1`](https://github.com/nylas/nylas/commit/d3b7cc1d98ab5ff12992339d59b898e6299d26c0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added translation for Search placeholder + +- [#607](https://github.com/nylas/nylas/pull/607) [`a06c459`](https://github.com/nylas/nylas/commit/a06c4595bdb4db676b213e35a483f4dec89797eb) Thanks [@pooja169usp](https://github.com/pooja169usp)! - When a recurring group event is created with an end date in the past, the booking page does not let you book creating a bad UX. Hence we are adding a validation to group event creation where we will not allow creating a recurring group event with an end date in the past. + +- [#621](https://github.com/nylas/nylas/pull/621) [`2949791`](https://github.com/nylas/nylas/commit/2949791fe0de1ef7a6745ae655c6bbd685854006) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Add min booking notice component to group type config + +- [#623](https://github.com/nylas/nylas/pull/623) [`fc06f75`](https://github.com/nylas/nylas/commit/fc06f7536713e114762c12d80043b90da663ea3a) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Add event_id, calendar_id and master_id if applicable to the reschedule request made by the UI. Without this, the group events cannot be rescheduled from the UI + +- [#635](https://github.com/nylas/nylas/pull/635) [`77211b6`](https://github.com/nylas/nylas/commit/77211b65cd6e46938ad471a6a00c5931e4c0ccb6) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Update the translation for booking cancellation successful page + +- [#627](https://github.com/nylas/nylas/pull/627) [`bf45abe`](https://github.com/nylas/nylas/commit/bf45abe4cdf05e1805f8f75497b6539c509109ee) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Disabled reccuring option for icloud provider with group events + +- [#610](https://github.com/nylas/nylas/pull/610) [`8b53d51`](https://github.com/nylas/nylas/commit/8b53d515d02d59adb61d72121926266cd9ec3f63) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Select the primary calendar as the default calendar for booking calendar and connected calendar when adding a participant + +- [#612](https://github.com/nylas/nylas/pull/612) [`ba4615d`](https://github.com/nylas/nylas/commit/ba4615d8100591668ede9bdc5c53104d915fbe13) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Add localization to group events in scheduler editor component + +- Updated dependencies [[`ef637ec`](https://github.com/nylas/nylas/commit/ef637ecd3fee67ba96ff8a728f72e18ce68bdafe), [`d3b7cc1`](https://github.com/nylas/nylas/commit/d3b7cc1d98ab5ff12992339d59b898e6299d26c0), [`a06c459`](https://github.com/nylas/nylas/commit/a06c4595bdb4db676b213e35a483f4dec89797eb), [`2949791`](https://github.com/nylas/nylas/commit/2949791fe0de1ef7a6745ae655c6bbd685854006), [`fc06f75`](https://github.com/nylas/nylas/commit/fc06f7536713e114762c12d80043b90da663ea3a), [`77211b6`](https://github.com/nylas/nylas/commit/77211b65cd6e46938ad471a6a00c5931e4c0ccb6), [`bf45abe`](https://github.com/nylas/nylas/commit/bf45abe4cdf05e1805f8f75497b6539c509109ee), [`8b53d51`](https://github.com/nylas/nylas/commit/8b53d515d02d59adb61d72121926266cd9ec3f63), [`ba4615d`](https://github.com/nylas/nylas/commit/ba4615d8100591668ede9bdc5c53104d915fbe13)]: + - @nylas/web-elements@1.4.5 + +## 1.4.4 + +### Patch Changes + +- [#594](https://github.com/nylas/nylas/pull/594) [`3af3846`](https://github.com/nylas/nylas/commit/3af38467a73a7cdb0dfa07c4efa8f3dde36e988d) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the logic to calculate disabled date to be more efficient, which was causing a delay in rendering + +- [#597](https://github.com/nylas/nylas/pull/597) [`280dad9`](https://github.com/nylas/nylas/commit/280dad981a3c7cc9c7a30393ff900b6ca53a1fb4) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where group event with the same start time selects both the timeslots on selection + +- Updated dependencies [[`3af3846`](https://github.com/nylas/nylas/commit/3af38467a73a7cdb0dfa07c4efa8f3dde36e988d), [`280dad9`](https://github.com/nylas/nylas/commit/280dad981a3c7cc9c7a30393ff900b6ca53a1fb4)]: + - @nylas/web-elements@1.4.3 + +## 1.4.2 + +### Patch Changes + +- Updated the build files + +- Updated dependencies []: + - @nylas/web-elements@1.4.2 + +## 1.4.1 + +### Patch Changes + +- [#573](https://github.com/nylas/nylas/pull/573) [`6e2994f`](https://github.com/nylas/nylas/commit/6e2994f7dac1f6e34d3fdc10ae2ab20805cf84c5) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fix the issue where adding a participant and updating the open hours directly without hitting save did not register the open hours selected + +- [#579](https://github.com/nylas/nylas/pull/579) [`8c70696`](https://github.com/nylas/nylas/commit/8c70696c73e7d1c8c5cd0cd4910bd6647fdca7f2) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where page name was required for non-group configs. Also fixes the issue where the page name field would be wiped out on saving the config changes without any change to the page name field + +- [#575](https://github.com/nylas/nylas/pull/575) [`8967d38`](https://github.com/nylas/nylas/commit/8967d38e77366603cdc98a024fd0b8daf59d6980) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added changelog for the scheduler components to the scheduler component docs + include the changelog in the npm package that is deployed/released + +- [#584](https://github.com/nylas/nylas/pull/584) [`7cc5718`](https://github.com/nylas/nylas/commit/7cc57188f7491a8913c0719fda13d09d7ea8d89c) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added missing components to enhance functionality. Added ability to disable email notifications. Fixed language dropdown selection issue in calendar view. + +- [#587](https://github.com/nylas/nylas/pull/587) [`73c1130`](https://github.com/nylas/nylas/commit/73c1130683da2e6b818e90f69d64d18a31c875a2) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where if system settings was set to a different language than en, the months header in the date picker did not translate correctly. Updated French translation to make more sense to a native speaker. + +- [#581](https://github.com/nylas/nylas/pull/581) [`a51862d`](https://github.com/nylas/nylas/commit/a51862d4f37466b56679749b2f96a33df81630c9) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fix the issue where the label header does not show the updated label, instead showed a default label + +- [#576](https://github.com/nylas/nylas/pull/576) [`6296b4f`](https://github.com/nylas/nylas/commit/6296b4fb3a76719aeffbb6bd52993745ea340d8f) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fix the typescript compatibility issues + +- [#588](https://github.com/nylas/nylas/pull/588) [`47be193`](https://github.com/nylas/nylas/commit/47be193b38cf607904c1bbb27506abaf9500b98f) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support for storing the organizer_locale from the scheduler editor component. This will allow us to send email communications to the organizer in the language selected by the organizer instead of defaulting to English + +- [#585](https://github.com/nylas/nylas/pull/585) [`6c39ff4`](https://github.com/nylas/nylas/commit/6c39ff4e8066e29e4831986237570b837b5225eb) Thanks [@pooja169usp](https://github.com/pooja169usp)! - With group events, the organizer pre-selects the type of configuration that they want to create in the select event type page, so hide the scheduling method component in the express flow when creating config + +- Updated dependencies [[`6e2994f`](https://github.com/nylas/nylas/commit/6e2994f7dac1f6e34d3fdc10ae2ab20805cf84c5), [`8c70696`](https://github.com/nylas/nylas/commit/8c70696c73e7d1c8c5cd0cd4910bd6647fdca7f2), [`8967d38`](https://github.com/nylas/nylas/commit/8967d38e77366603cdc98a024fd0b8daf59d6980), [`7cc5718`](https://github.com/nylas/nylas/commit/7cc57188f7491a8913c0719fda13d09d7ea8d89c), [`73c1130`](https://github.com/nylas/nylas/commit/73c1130683da2e6b818e90f69d64d18a31c875a2), [`a51862d`](https://github.com/nylas/nylas/commit/a51862d4f37466b56679749b2f96a33df81630c9), [`6296b4f`](https://github.com/nylas/nylas/commit/6296b4fb3a76719aeffbb6bd52993745ea340d8f), [`47be193`](https://github.com/nylas/nylas/commit/47be193b38cf607904c1bbb27506abaf9500b98f), [`6c39ff4`](https://github.com/nylas/nylas/commit/6c39ff4e8066e29e4831986237570b837b5225eb)]: + - @nylas/web-elements@1.4.1 + - @nylas/core@1.1.7 + +## 1.4.0 + +### Minor Changes + +- [#525](https://github.com/nylas/nylas/pull/525) [`7180ca7`](https://github.com/nylas/nylas/commit/7180ca7a841561932e02f52976d51e7aa064aaff) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Update nylas-react package to support Next.js app router compatibility by updating package configuration + +### Patch Changes + +- [#522](https://github.com/nylas/nylas/pull/522) [`df8e0b8`](https://github.com/nylas/nylas/commit/df8e0b8ec4384a61789a1a64754c812729dd4d62) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where availability method passed in the dev settings was being overridden to collective in the UI + +- [#529](https://github.com/nylas/nylas/pull/529) [`f71b973`](https://github.com/nylas/nylas/commit/f71b973e278444b3c055e368804af756abbcf61d) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the scheduling component to support group event bookings + +- [#519](https://github.com/nylas/nylas/pull/519) [`ad075ba`](https://github.com/nylas/nylas/commit/ad075bafa462bd0f5ce7de95d2c98a112d8a51fc) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the logic for reminder minutes to resort to minutes where necessary + +- [#495](https://github.com/nylas/nylas/pull/495) [`c9672e9`](https://github.com/nylas/nylas/commit/c9672e9b6ca2b0d159277ba4e59d3ac43d0b1360) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Introduced a new screen allowing users to select the desired configuration type for creation + +- [#507](https://github.com/nylas/nylas/pull/507) [`9e4b5e7`](https://github.com/nylas/nylas/commit/9e4b5e7d2d076606ccf97ddf3732df05ed2d0858) Thanks [@pooja169usp](https://github.com/pooja169usp)! - • The toggle switch state for participant availability now correctly reflects the current state. + • Open hours now have a default selection when enabling the toggle. + +- [#535](https://github.com/nylas/nylas/pull/535) [`d89c58a`](https://github.com/nylas/nylas/commit/d89c58a6b31eae785c3c23eaad693a59da0a8e35) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed group booking error handling so that appropriate error is surfaced in the UI + +- [#530](https://github.com/nylas/nylas/pull/530) [`fca52e5`](https://github.com/nylas/nylas/commit/fca52e5a28540e2f94cca8ad20f71729492cf09e) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated scheduler-editor auth to get grant using access token and use that as the email for logged in user. This resolves the UPN email mismatch issue with Microsoft accounts. + +- [#527](https://github.com/nylas/nylas/pull/527) [`f7dd3cc`](https://github.com/nylas/nylas/commit/f7dd3cc4531c2f0067b9e864d4b8271ffc88ce38) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fix the date component to display the preselected date and month, if passed in defaultSchedulerState + +- [#516](https://github.com/nylas/nylas/pull/516) [`5f83694`](https://github.com/nylas/nylas/commit/5f8369430c04717f10b3798929a36b7229591a11) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the translations for some fields including dropdown, date etc., in the scheduler editor and scheduling components + +- [#506](https://github.com/nylas/nylas/pull/506) [`90d2ef3`](https://github.com/nylas/nylas/commit/90d2ef3c4774274c97e598f6544de7cff515f75b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Expose shadow parts for action options from list configuration component that allows to hide / style + +- [#505](https://github.com/nylas/nylas/pull/505) [`51b5d49`](https://github.com/nylas/nylas/commit/51b5d49b6f339c7d6bde8f8189ebe922baf4d7ef) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where book now button did not fire in the rescheduling flow due to form fields not being set correctly + +- [#504](https://github.com/nylas/nylas/pull/504) [`9ff9bd5`](https://github.com/nylas/nylas/commit/9ff9bd537bf30d61d22c9340079b393d6c129140) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue with event duration being reset to 30 minutes when modifying other fields in the editor + +- [#501](https://github.com/nylas/nylas/pull/501) [`9344b0e`](https://github.com/nylas/nylas/commit/9344b0e138f8acf73f24942bd60f351e14453a5a) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a create group config flow along with a group event with recurrence + +- [#562](https://github.com/nylas/nylas/pull/562) [`8d3396e`](https://github.com/nylas/nylas/commit/8d3396e61fa8ae07f906d33521c8246018ad6c82) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added front validation for event duration to not be empty/negative and be a multiple of 5 + +- [#555](https://github.com/nylas/nylas/pull/555) [`d320173`](https://github.com/nylas/nylas/commit/d3201736073cb397d2a7307f702ae55af96d4f24) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where the booking page showed different selectable dates and timeslots depending on the system settings. With this fix, when selected timezone is changed, the selectable dates are also updated to respect the timezone selected. + +- [#446](https://github.com/nylas/nylas/pull/446) [`cb8e196`](https://github.com/nylas/nylas/commit/cb8e196ec80f0320a306bd4481dae584e7d8b480) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added additional CSS parts to the nylas-scheduling component. + +- [#551](https://github.com/nylas/nylas/pull/551) [`8d91968`](https://github.com/nylas/nylas/commit/8d91968683fa58c0b64daa395f2afd27c56ebf55) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the ordering and sorting for the booking form fields in the scheduler editor + +- [#502](https://github.com/nylas/nylas/pull/502) [`fb80809`](https://github.com/nylas/nylas/commit/fb80809fa3c35e97a7ea7d7fd809b33fcaf5dcdc) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added retry logic to round robin when booking request fails due to timeslot not being avaialble + +- [#528](https://github.com/nylas/nylas/pull/528) [`4d7958b`](https://github.com/nylas/nylas/commit/4d7958b472977b1a3e240b1aef431e0da6fad32d) Thanks [@pooja169usp](https://github.com/pooja169usp)! - The nylas-event-description text area component now fully supports carriage returns, enabling users to enter multi-line comments. Additionally, selecting the “Auto-Populate” feature multiple times no longer duplicates fields, ensuring smoother multi-line text entry and preventing unintended field replication. Please note that the delimiters for additional fields should not be modified, as we rely on them to correctly replace these fields in the description when “Auto-Populate” is clicked. + +- [#524](https://github.com/nylas/nylas/pull/524) [`4303932`](https://github.com/nylas/nylas/commit/430393257581c8af1fcafa97a4fede2f982bd2c9) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Expose the calendar in the calendar view + filter 'all host and guests' options from reminders if group config. Updated the logic to add default capacity when creating a group config + +- [#534](https://github.com/nylas/nylas/pull/534) [`617b079`](https://github.com/nylas/nylas/commit/617b07950b851286a781401493ee4a4ae4a5199e) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Improved component registration process to properly handle re-registration scenarios, ensuring components receive updated props and connections while preventing duplicate event listeners. This fixes the issue with components not loading the correct values when using custom auth method and composable mode. + +- Updated dependencies [[`df8e0b8`](https://github.com/nylas/nylas/commit/df8e0b8ec4384a61789a1a64754c812729dd4d62), [`f71b973`](https://github.com/nylas/nylas/commit/f71b973e278444b3c055e368804af756abbcf61d), [`ad075ba`](https://github.com/nylas/nylas/commit/ad075bafa462bd0f5ce7de95d2c98a112d8a51fc), [`c9672e9`](https://github.com/nylas/nylas/commit/c9672e9b6ca2b0d159277ba4e59d3ac43d0b1360), [`9e4b5e7`](https://github.com/nylas/nylas/commit/9e4b5e7d2d076606ccf97ddf3732df05ed2d0858), [`d89c58a`](https://github.com/nylas/nylas/commit/d89c58a6b31eae785c3c23eaad693a59da0a8e35), [`fca52e5`](https://github.com/nylas/nylas/commit/fca52e5a28540e2f94cca8ad20f71729492cf09e), [`f7dd3cc`](https://github.com/nylas/nylas/commit/f7dd3cc4531c2f0067b9e864d4b8271ffc88ce38), [`5f83694`](https://github.com/nylas/nylas/commit/5f8369430c04717f10b3798929a36b7229591a11), [`90d2ef3`](https://github.com/nylas/nylas/commit/90d2ef3c4774274c97e598f6544de7cff515f75b), [`51b5d49`](https://github.com/nylas/nylas/commit/51b5d49b6f339c7d6bde8f8189ebe922baf4d7ef), [`9ff9bd5`](https://github.com/nylas/nylas/commit/9ff9bd537bf30d61d22c9340079b393d6c129140), [`9344b0e`](https://github.com/nylas/nylas/commit/9344b0e138f8acf73f24942bd60f351e14453a5a), [`8d3396e`](https://github.com/nylas/nylas/commit/8d3396e61fa8ae07f906d33521c8246018ad6c82), [`d320173`](https://github.com/nylas/nylas/commit/d3201736073cb397d2a7307f702ae55af96d4f24), [`cb8e196`](https://github.com/nylas/nylas/commit/cb8e196ec80f0320a306bd4481dae584e7d8b480), [`8d91968`](https://github.com/nylas/nylas/commit/8d91968683fa58c0b64daa395f2afd27c56ebf55), [`fb80809`](https://github.com/nylas/nylas/commit/fb80809fa3c35e97a7ea7d7fd809b33fcaf5dcdc), [`4d7958b`](https://github.com/nylas/nylas/commit/4d7958b472977b1a3e240b1aef431e0da6fad32d), [`4303932`](https://github.com/nylas/nylas/commit/430393257581c8af1fcafa97a4fede2f982bd2c9), [`617b079`](https://github.com/nylas/nylas/commit/617b07950b851286a781401493ee4a4ae4a5199e)]: + - @nylas/web-elements@1.4.0 + - @nylas/core@1.1.6 + +## 1.3.6 + +### Patch Changes + +- [#481](https://github.com/nylas/nylas/pull/481) [`3a47075`](https://github.com/nylas/nylas/commit/3a470759afd24946258862e6aba718536402b7ae) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support to make booking form fields read only in the scheduling component + +- [#484](https://github.com/nylas/nylas/pull/484) [`4020840`](https://github.com/nylas/nylas/commit/40208405e5b1899653d4247645f87279513ecab2) Thanks [@pooja169usp](https://github.com/pooja169usp)! - The timeslot picker has been updated to use the selected locale for time formatting, ensuring consistency with user preferences. Additionally, a new hour12 prop has been introduced, allowing explicit control over the hour format. This prop does not have a default value; by default, the timeslot picker will use the hour format determined by the selected locale. However, you can override this by passing hour12={true} to enforce a 12-hour clock or hour12={false} to enforce a 24-hour clock. This update provides greater flexibility while maintaining alignment with user expectations. + +- [#493](https://github.com/nylas/nylas/pull/493) [`d724f86`](https://github.com/nylas/nylas/commit/d724f8670eb62442b7401035253e4ce24fde4b62) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Return localtion, booking_ref in the query param upon booking completion and redirect + +- [#485](https://github.com/nylas/nylas/pull/485) [`e2cb495`](https://github.com/nylas/nylas/commit/e2cb4958a9e7a0e989dadb49d69f97d8935d57c0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added validation to reminder minutes to be multiples of 5, because the reminder is sent out in every 5 minute intervals + +- [#488](https://github.com/nylas/nylas/pull/488) [`9214810`](https://github.com/nylas/nylas/commit/921481051a3d8537334466bab14fd08958fb282b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added an empty option in the dropdown for booking form, if no default option is set + +- [#489](https://github.com/nylas/nylas/pull/489) [`901501a`](https://github.com/nylas/nylas/commit/901501ac723b831566db1d246115cd2765114cac) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Improved the responsiveness of the scheduling component in mobile and tablet views such that the dates and locale do not overflow + +- [#487](https://github.com/nylas/nylas/pull/487) [`c7d27c4`](https://github.com/nylas/nylas/commit/c7d27c4dbe377b05be0572ede305f54032a55fb9) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Ensure that the input components use the color vars from themeConfig prop for background, dropdown content, text colors + +- [#492](https://github.com/nylas/nylas/pull/492) [`2733d89`](https://github.com/nylas/nylas/commit/2733d89601a3da72c1d7038c557ce95c0d9d65c6) Thanks [@pooja169usp](https://github.com/pooja169usp)! - If timezone is set to an empty string in the config, default to the browser timezone in the editor UI. This allows the user to adjust the timezone as per their requirement + +- [#483](https://github.com/nylas/nylas/pull/483) [`60043b4`](https://github.com/nylas/nylas/commit/60043b4409ff2bd7a42ba42bf80b2bd8decb64da) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a button to event description component that on click auto-populates the additional fields to the description + +- [#496](https://github.com/nylas/nylas/pull/496) [`70a0e33`](https://github.com/nylas/nylas/commit/70a0e33f72ecbf50e6627bf9ccde19454974927a) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added the ability disable/enable emails from the UI + +- Updated dependencies [[`3a47075`](https://github.com/nylas/nylas/commit/3a470759afd24946258862e6aba718536402b7ae), [`4020840`](https://github.com/nylas/nylas/commit/40208405e5b1899653d4247645f87279513ecab2), [`d724f86`](https://github.com/nylas/nylas/commit/d724f8670eb62442b7401035253e4ce24fde4b62), [`e2cb495`](https://github.com/nylas/nylas/commit/e2cb4958a9e7a0e989dadb49d69f97d8935d57c0), [`9214810`](https://github.com/nylas/nylas/commit/921481051a3d8537334466bab14fd08958fb282b), [`901501a`](https://github.com/nylas/nylas/commit/901501ac723b831566db1d246115cd2765114cac), [`c7d27c4`](https://github.com/nylas/nylas/commit/c7d27c4dbe377b05be0572ede305f54032a55fb9), [`2733d89`](https://github.com/nylas/nylas/commit/2733d89601a3da72c1d7038c557ce95c0d9d65c6), [`60043b4`](https://github.com/nylas/nylas/commit/60043b4409ff2bd7a42ba42bf80b2bd8decb64da), [`70a0e33`](https://github.com/nylas/nylas/commit/70a0e33f72ecbf50e6627bf9ccde19454974927a)]: + - @nylas/web-elements@1.3.6 + - @nylas/core@1.1.5 + +## 1.3.5 + +### Patch Changes + +- [#480](https://github.com/nylas/nylas/pull/480) [`e3a0980`](https://github.com/nylas/nylas/commit/e3a09805268c68881b78fa4432782f2d6526eff9) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added prop nylasBranding to scheduler editor to show / hide the option to manage nylas branding in the email templates + +- [#478](https://github.com/nylas/nylas/pull/478) [`85db9bb`](https://github.com/nylas/nylas/commit/85db9bbbdc36dfd83867c6005ec077311f3052c7) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support for Korean language + +- Updated dependencies [[`e3a0980`](https://github.com/nylas/nylas/commit/e3a09805268c68881b78fa4432782f2d6526eff9), [`85db9bb`](https://github.com/nylas/nylas/commit/85db9bbbdc36dfd83867c6005ec077311f3052c7)]: + - @nylas/web-elements@1.3.5 + +## 1.3.4 + +### Patch Changes + +- [#476](https://github.com/nylas/nylas/pull/476) [`ead6086`](https://github.com/nylas/nylas/commit/ead60866ffd09677de19ef9c5ec2916dfc4a5f6e) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added an event schedulerConfigCreated to be emitted after successful creation of config (this event includes the id field along with the other things) + +- [#470](https://github.com/nylas/nylas/pull/470) [`59e1c51`](https://github.com/nylas/nylas/commit/59e1c510551c82cf9bc3dab47fdbe7fc6f76edfe) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added localization to scheduler editor + +- [#473](https://github.com/nylas/nylas/pull/473) [`c9a3f84`](https://github.com/nylas/nylas/commit/c9a3f844aaabcfc1b9cbd3e28e96e2386b457760) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the scheduling component to respect the timezone and language overrides passed via bookingInfo prop + +- [#472](https://github.com/nylas/nylas/pull/472) [`97b4389`](https://github.com/nylas/nylas/commit/97b43899fb24df2d54ecd7cd966809343ebceac3) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Add the ability to enter additional fields from a dropdown for event title and event description components + +- [#467](https://github.com/nylas/nylas/pull/467) [`fc0d1a1`](https://github.com/nylas/nylas/commit/fc0d1a1f42138dd48d2320a33b77188b6703b687) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support for multi-select type additional field + +- Updated dependencies [[`ead6086`](https://github.com/nylas/nylas/commit/ead60866ffd09677de19ef9c5ec2916dfc4a5f6e), [`59e1c51`](https://github.com/nylas/nylas/commit/59e1c510551c82cf9bc3dab47fdbe7fc6f76edfe), [`c9a3f84`](https://github.com/nylas/nylas/commit/c9a3f844aaabcfc1b9cbd3e28e96e2386b457760), [`97b4389`](https://github.com/nylas/nylas/commit/97b43899fb24df2d54ecd7cd966809343ebceac3), [`fc0d1a1`](https://github.com/nylas/nylas/commit/fc0d1a1f42138dd48d2320a33b77188b6703b687)]: + - @nylas/web-elements@1.3.4 + - @nylas/core@1.1.4 + +## 1.3.3 + +### Patch Changes + +- [#468](https://github.com/nylas/nylas/pull/468) [`5169491`](https://github.com/nylas/nylas/commit/5169491488be7510ee8104fe52b80ffe866c2cf8) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Improved the error handling on nylas-date-component to validate invalid dates + +- [#464](https://github.com/nylas/nylas/pull/464) [`edf0860`](https://github.com/nylas/nylas/commit/edf0860c6252aae59667dbaaa0e819d19806035b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue with booking calendars where the list did not show all the calendars in the html implementation + +- [#465](https://github.com/nylas/nylas/pull/465) [`be04be8`](https://github.com/nylas/nylas/commit/be04be80077c22b7453698a00e15515c7b213182) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where html (web elements) did not render the correct values on booking form, booking options, participant open hours and page styling + +- Updated dependencies [[`5169491`](https://github.com/nylas/nylas/commit/5169491488be7510ee8104fe52b80ffe866c2cf8), [`edf0860`](https://github.com/nylas/nylas/commit/edf0860c6252aae59667dbaaa0e819d19806035b), [`be04be8`](https://github.com/nylas/nylas/commit/be04be80077c22b7453698a00e15515c7b213182)]: + - @nylas/web-elements@1.3.3 + +## 1.3.2 + +### Patch Changes + +- [#458](https://github.com/nylas/nylas/pull/458) [`b2a4168`](https://github.com/nylas/nylas/commit/b2a4168f65a8ff9d10aeefcfd678e2a8495666ee) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Fixed the participants checkbox being displayed if no availability method was configured (even if that defaulted to "collective"). + +- [#455](https://github.com/nylas/nylas/pull/455) [`76290fa`](https://github.com/nylas/nylas/commit/76290fafd70c4d4f940671b43b0c5e641afdaed4) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added an option to hide the nylas branding from the email template footer in the communications tab of nylas-scheduler-editor component + +- [#459](https://github.com/nylas/nylas/pull/459) [`7896155`](https://github.com/nylas/nylas/commit/789615593971c9c45b0792dbd19260294b87f1f0) Thanks [@AaronDDM](https://github.com/AaronDDM)! - [nylas-participants-custom-availability] Fixed new participant open hours not automatically inherting the default open hours and timezone. + +- [#461](https://github.com/nylas/nylas/pull/461) [`12e59df`](https://github.com/nylas/nylas/commit/12e59dfbd25ddc2db341c3bfa739e576e5539bd8) Thanks [@AaronDDM](https://github.com/AaronDDM)! - [nylas-editor-tabs] Fixed form submissions incorrectly priortizing default state values over form state values. + +- [#460](https://github.com/nylas/nylas/pull/460) [`5cc9e97`](https://github.com/nylas/nylas/commit/5cc9e9731dd5dcec3fa498e1c5d25b0c9f499c02) Thanks [@AaronDDM](https://github.com/AaronDDM)! - [nylas-scheduler-editor] Fix: missing support for migrated "date" custom fields was causing custom fields to not be rendered. + +- [#460](https://github.com/nylas/nylas/pull/460) [`5cc9e97`](https://github.com/nylas/nylas/commit/5cc9e9731dd5dcec3fa498e1c5d25b0c9f499c02) Thanks [@AaronDDM](https://github.com/AaronDDM)! - [nylas-booking-form-config] Fixed typo on the "additionalFields" prop. + +- Updated dependencies [[`b2a4168`](https://github.com/nylas/nylas/commit/b2a4168f65a8ff9d10aeefcfd678e2a8495666ee), [`76290fa`](https://github.com/nylas/nylas/commit/76290fafd70c4d4f940671b43b0c5e641afdaed4), [`7896155`](https://github.com/nylas/nylas/commit/789615593971c9c45b0792dbd19260294b87f1f0), [`12e59df`](https://github.com/nylas/nylas/commit/12e59dfbd25ddc2db341c3bfa739e576e5539bd8), [`5cc9e97`](https://github.com/nylas/nylas/commit/5cc9e9731dd5dcec3fa498e1c5d25b0c9f499c02), [`5cc9e97`](https://github.com/nylas/nylas/commit/5cc9e9731dd5dcec3fa498e1c5d25b0c9f499c02)]: + - @nylas/web-elements@1.3.2 + - @nylas/core@1.1.3 + +## 1.3.1 + +### Patch Changes + +- [#452](https://github.com/nylas/nylas/pull/452) [`596000b`](https://github.com/nylas/nylas/commit/596000b25e51b55c55f42c793f76a10381defd12) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support for metadata type additional field including support for optional default value for booking form fields + +- [#450](https://github.com/nylas/nylas/pull/450) [`9ed4860`](https://github.com/nylas/nylas/commit/9ed486076a09ade550844c75e7ba6c3e038a31fa) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Set fallback language to English if the browser locale is to a language that we do not officially support + +- [#453](https://github.com/nylas/nylas/pull/453) [`f9c9352`](https://github.com/nylas/nylas/commit/f9c935219e44bc40d9e89d9d208d391a021742c3) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the nylas-booking-form component to prefill booking details in the rescheduling flow. + +- Updated dependencies [[`596000b`](https://github.com/nylas/nylas/commit/596000b25e51b55c55f42c793f76a10381defd12), [`9ed4860`](https://github.com/nylas/nylas/commit/9ed486076a09ade550844c75e7ba6c3e038a31fa), [`f9c9352`](https://github.com/nylas/nylas/commit/f9c935219e44bc40d9e89d9d208d391a021742c3)]: + - @nylas/web-elements@1.3.1 + - @nylas/core@1.1.2 + +## 1.3.0 + +### Patch Changes + +- [#445](https://github.com/nylas/nylas/pull/445) [`4536cb2`](https://github.com/nylas/nylas/commit/4536cb2b94cdd67ecdd1f25c49ffdaa359a71d22) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where conferencing in scheduler editor was not showing Google meet option on load when used with CDN web-elements and no auth method. Also, fixed the issue where once Google meets is selected, it cannot be undone + +- [#443](https://github.com/nylas/nylas/pull/443) [`5ff9812`](https://github.com/nylas/nylas/commit/5ff981285e21af7ccf8dc7e6e066944d61104366) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a confirmation modal to confirm delete config in the scheduler editor + +- Updated dependencies [[`4536cb2`](https://github.com/nylas/nylas/commit/4536cb2b94cdd67ecdd1f25c49ffdaa359a71d22), [`5ff9812`](https://github.com/nylas/nylas/commit/5ff981285e21af7ccf8dc7e6e066944d61104366), [`d094e7d`](https://github.com/nylas/nylas/commit/d094e7dcdf6a0fe67567644f0410fdc054b6a301)]: + - @nylas/web-elements@1.3.0 + +## 1.2.0 + +### Patch Changes + +- [#433](https://github.com/nylas/nylas/pull/433) [`cb286bb`](https://github.com/nylas/nylas/commit/cb286bbc59a3e6f018ae62b636f6cb019d35371e) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added email subject to reminders in the UI + +- [#436](https://github.com/nylas/nylas/pull/436) [`b870836`](https://github.com/nylas/nylas/commit/b870836ed932e138d896584c7cb8620e3c19afaa) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue with creating a config using icloud account + +- [#432](https://github.com/nylas/nylas/pull/432) [`385bd5f`](https://github.com/nylas/nylas/commit/385bd5f04e21a4451f8df5c6922b4745cce58070) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where adding multiple form fields of the same type would override/wipe out existing fields + +- Updated dependencies [[`cb286bb`](https://github.com/nylas/nylas/commit/cb286bbc59a3e6f018ae62b636f6cb019d35371e), [`d094e7d`](https://github.com/nylas/nylas/commit/d094e7dcdf6a0fe67567644f0410fdc054b6a301), [`b870836`](https://github.com/nylas/nylas/commit/b870836ed932e138d896584c7cb8620e3c19afaa), [`d094e7d`](https://github.com/nylas/nylas/commit/d094e7dcdf6a0fe67567644f0410fdc054b6a301), [`385bd5f`](https://github.com/nylas/nylas/commit/385bd5f04e21a4451f8df5c6922b4745cce58070)]: + - @nylas/web-elements@1.2.0 + +## 1.1.7 + +### Patch Changes + +- [#430](https://github.com/nylas/nylas/pull/430) [`5aafd51`](https://github.com/nylas/nylas/commit/5aafd51a52e79f5f935433a9370077217c5d54aa) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Filter out webhook reminders from being surfaced in the UI + +- Updated dependencies [[`5aafd51`](https://github.com/nylas/nylas/commit/5aafd51a52e79f5f935433a9370077217c5d54aa)]: + - @nylas/web-elements@1.1.7 + +## 1.1.6 + +### Patch Changes + +- [#424](https://github.com/nylas/nylas/pull/424) [`507ae69`](https://github.com/nylas/nylas/commit/507ae699528bc089f617db23d33141270c9a4056) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue where themeConfig prop set on the scheduling component did not update the styles on sub components + +- Updated dependencies [[`507ae69`](https://github.com/nylas/nylas/commit/507ae699528bc089f617db23d33141270c9a4056)]: + - @nylas/web-elements@1.1.6 + +## 1.1.5 + +### Patch Changes + +- [#421](https://github.com/nylas/nylas/pull/421) [`4ba3bcb`](https://github.com/nylas/nylas/commit/4ba3bcb327e7060dae91c52e9367cfc4284665a2) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fix the email validation regex to allow custom email domains liek .entertainment (example) + +- [#404](https://github.com/nylas/nylas/pull/404) [`250e17d`](https://github.com/nylas/nylas/commit/250e17d49bb8e24bb1cd0c635068a8b9c6427488) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the create scheduling config issue + +- [#399](https://github.com/nylas/nylas/pull/399) [`eef68ad`](https://github.com/nylas/nylas/commit/eef68ad7043bc5bd025ef369ef367132bd2f8082) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Resolved the issue where the UI was displaying an error for the organizer confirmation URL, despite it being set in the configuration. + +- [#420](https://github.com/nylas/nylas/pull/420) [`67abe45`](https://github.com/nylas/nylas/commit/67abe45adc9af25e9425fcc8eedb055632841c0f) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue with confirmation email image url not blocking form submission on invalid url + +- [#413](https://github.com/nylas/nylas/pull/413) [`8e0cd98`](https://github.com/nylas/nylas/commit/8e0cd98253809b7699f104cde8fd93bf2afa5b46) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Add all additional fields from bookingInfo prop to redirect url, including the ones not used in the booking form + +- [#116](https://github.com/nylas/nylas/pull/116) [`4842469`](https://github.com/nylas/nylas/commit/4842469ed6e335f532840dabaa67c90e9d2c8659) Thanks [@b3ndoi](https://github.com/b3ndoi)! - Added an option to set reminders through the scheduler editor + +- [#417](https://github.com/nylas/nylas/pull/417) [`b1477d2`](https://github.com/nylas/nylas/commit/b1477d20d54d59452b99fb9c1a7484bdb9c22aa6) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added an option to set reminders through the scheduler editor + +- [#405](https://github.com/nylas/nylas/pull/405) [`d4c812a`](https://github.com/nylas/nylas/commit/d4c812aa9779d74fd3cfe76ff972e9252f201661) Thanks [@pooja169usp](https://github.com/pooja169usp)! - bug-fix: Fixed the time on booked event card + +- [#412](https://github.com/nylas/nylas/pull/412) [`0758aa1`](https://github.com/nylas/nylas/commit/0758aa1acc5812eb6d8df4d766200580f2baaa4d) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the issue with the editor event title not updating correctly when selecting all and deleting the title + +- Updated dependencies [[`4ba3bcb`](https://github.com/nylas/nylas/commit/4ba3bcb327e7060dae91c52e9367cfc4284665a2), [`250e17d`](https://github.com/nylas/nylas/commit/250e17d49bb8e24bb1cd0c635068a8b9c6427488), [`eef68ad`](https://github.com/nylas/nylas/commit/eef68ad7043bc5bd025ef369ef367132bd2f8082), [`67abe45`](https://github.com/nylas/nylas/commit/67abe45adc9af25e9425fcc8eedb055632841c0f), [`8e0cd98`](https://github.com/nylas/nylas/commit/8e0cd98253809b7699f104cde8fd93bf2afa5b46), [`4842469`](https://github.com/nylas/nylas/commit/4842469ed6e335f532840dabaa67c90e9d2c8659), [`b1477d2`](https://github.com/nylas/nylas/commit/b1477d20d54d59452b99fb9c1a7484bdb9c22aa6), [`d4c812a`](https://github.com/nylas/nylas/commit/d4c812aa9779d74fd3cfe76ff972e9252f201661), [`0758aa1`](https://github.com/nylas/nylas/commit/0758aa1acc5812eb6d8df4d766200580f2baaa4d)]: + - @nylas/web-elements@1.1.5 + - @nylas/core@1.1.1 + +## 1.1.4 + +### Patch Changes + +- [#396](https://github.com/nylas/nylas/pull/396) [`4c447fd`](https://github.com/nylas/nylas/commit/4c447fdf3d3b5f1d49ad20eb96a0b030fa80a60b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Reduced the package size for the CDN build, resolving the issue where jsDelivr returned a “package size exceeded” error when using the CDN. + +- [#397](https://github.com/nylas/nylas/pull/397) [`ffa08a2`](https://github.com/nylas/nylas/commit/ffa08a2214474360a0d1247742a6c949723b5df3) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Resolved an issue where custom fields in the query parameters caused a booking error. Now, fields that do not match the additional_fields specified in the configuration are ignored. + +- Updated dependencies [[`4c447fd`](https://github.com/nylas/nylas/commit/4c447fdf3d3b5f1d49ad20eb96a0b030fa80a60b), [`ffa08a2`](https://github.com/nylas/nylas/commit/ffa08a2214474360a0d1247742a6c949723b5df3)]: + - @nylas/web-elements@1.1.4 + +## 1.1.3 + +### Patch Changes + +- [#381](https://github.com/nylas/nylas/pull/381) [`3154ef4`](https://github.com/nylas/nylas/commit/3154ef4884dfbab68e9c8c48a9a12336595ac837) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the query params populating the booking form in scheduling component returning error on booking + +- [#381](https://github.com/nylas/nylas/pull/381) [`3154ef4`](https://github.com/nylas/nylas/commit/3154ef4884dfbab68e9c8c48a9a12336595ac837) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the scheduling component to include the booking details in the redirect url + +- [#382](https://github.com/nylas/nylas/pull/382) [`47b96d4`](https://github.com/nylas/nylas/commit/47b96d455758932df6c41208b414726bd6537926) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a prop enableUserFeedback that allows to capture user's feedback and issues if any + +- Updated dependencies [[`3154ef4`](https://github.com/nylas/nylas/commit/3154ef4884dfbab68e9c8c48a9a12336595ac837), [`3154ef4`](https://github.com/nylas/nylas/commit/3154ef4884dfbab68e9c8c48a9a12336595ac837), [`47b96d4`](https://github.com/nylas/nylas/commit/47b96d455758932df6c41208b414726bd6537926)]: + - @nylas/web-elements@1.1.3 + +## 1.1.2 + +### Patch Changes + +- [#367](https://github.com/nylas/nylas/pull/367) [`eed1e4c`](https://github.com/nylas/nylas/commit/eed1e4cc01c5d12b5c88e94d69d306d5119346f5) Thanks [@pooja169usp](https://github.com/pooja169usp)! + + - Fixed default selected calendar not selected when creating a config using MS account. + - Fixed the issue with booking an event where the default selected value in the dropdown was not sent until changed. + +- [#368](https://github.com/nylas/nylas/pull/368) [`eed1e4c`](https://github.com/nylas/nylas/commit/eed1e4cc01c5d12b5c88e94d69d306d5119346f5) Thanks [@pooja169usp](https://github.com/pooja169usp)! + + - Updated the Scheduling component to fetch availability only if the ui settings request passes. This prevents the additional API request if the config is invalid. + - Appended the guest info, additional fields and timeslot to the bokedEventInfo event + +- [#369](https://github.com/nylas/nylas/pull/369) [`eed1e4c`](https://github.com/nylas/nylas/commit/eed1e4cc01c5d12b5c88e94d69d306d5119346f5) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Improved the custom event slug component by adding a hard-coded slash (/) as a prefix. Additionally, introduced a placeholder to enhance user clarity and provide guidance during input. + +- Updated dependencies [[`eed1e4c`](https://github.com/nylas/nylas/commit/eed1e4cc01c5d12b5c88e94d69d306d5119346f5), [`eed1e4c`](https://github.com/nylas/nylas/commit/eed1e4cc01c5d12b5c88e94d69d306d5119346f5), [`eed1e4c`](https://github.com/nylas/nylas/commit/eed1e4cc01c5d12b5c88e94d69d306d5119346f5)]: + - @nylas/web-elements@1.1.2 + +## 1.1.1 + +### Patch Changes + +- [#357](https://github.com/nylas/nylas/pull/357) [`ef9faff`](https://github.com/nylas/nylas/commit/ef9faffb27c33830ce4e59b7bbd324e73b913fef) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Bundle a separate folder dist/cdn for CDN usage. This improves the loading time by including all the necessary dependencies required for a component to load (Each component is imported individually). + +- [#364](https://github.com/nylas/nylas/pull/364) [`8f84ba8`](https://github.com/nylas/nylas/commit/8f84ba8d34513d4ccd0a9725913cbc356a765a02) Thanks [@pooja169usp](https://github.com/pooja169usp)! + + - Modified how the Editor manages manual confirmations: + - If `organizer_confirmation_url` is not set by developers, the `` component will no longer appear in the editor + - Added validation for configuration creation to ensure that if developers override `booking_type` to "organizer-confirmation", they must also set `organizer_confirmation_url`, otherwise a validation error will be triggered. + - Deprecated the `prop`, as it is now derived from `selectedConfiguration` and no longer needs to be manually set. This prop will be removed in an upcoming release. + +- [#354](https://github.com/nylas/nylas/pull/354) [`af743f8`](https://github.com/nylas/nylas/commit/af743f824b44149d600cdcfba28824b130d7e9d1) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the calculation of start_time for fetching availability when min_booking_notice is set + +- [#360](https://github.com/nylas/nylas/pull/360) [`15ea5fc`](https://github.com/nylas/nylas/commit/15ea5fcd34bc8e3565c08c4b6b67503f4441c1f3) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the page styles component so that it renders only when a slot is passed. The developer has to explicitly pass the slot to the nylas-scheduler-editor component and listen to configSettingLoaded event on the nylas-scheduling component to grab the page styles and apply as needed. + +- [#355](https://github.com/nylas/nylas/pull/355) [`43cb274`](https://github.com/nylas/nylas/commit/43cb27454373aab342bae98246379e27cb59b4da) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the default validation for phone and email input components to be more flexible + +- [#350](https://github.com/nylas/nylas/pull/350) [`e684157`](https://github.com/nylas/nylas/commit/e684157e482fb464a524d01c40cca88ed97b02f0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed hideEditorTabs prop not working for page styles and communications tabs + +- [#351](https://github.com/nylas/nylas/pull/351) [`f7e8eb0`](https://github.com/nylas/nylas/commit/f7e8eb033d2154ff87fb52f7f5ae01f5837a5c0b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated the nylas/identity package bundle to fix CDN issue not including the dependencies + +- [#351](https://github.com/nylas/nylas/pull/351) [`f7e8eb0`](https://github.com/nylas/nylas/commit/f7e8eb033d2154ff87fb52f7f5ae01f5837a5c0b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed mobile styles for the scheduler editor component + +- Updated dependencies [[`ef9faff`](https://github.com/nylas/nylas/commit/ef9faffb27c33830ce4e59b7bbd324e73b913fef), [`8f84ba8`](https://github.com/nylas/nylas/commit/8f84ba8d34513d4ccd0a9725913cbc356a765a02), [`af743f8`](https://github.com/nylas/nylas/commit/af743f824b44149d600cdcfba28824b130d7e9d1), [`15ea5fc`](https://github.com/nylas/nylas/commit/15ea5fcd34bc8e3565c08c4b6b67503f4441c1f3), [`43cb274`](https://github.com/nylas/nylas/commit/43cb27454373aab342bae98246379e27cb59b4da), [`e684157`](https://github.com/nylas/nylas/commit/e684157e482fb464a524d01c40cca88ed97b02f0), [`f7e8eb0`](https://github.com/nylas/nylas/commit/f7e8eb033d2154ff87fb52f7f5ae01f5837a5c0b), [`f7e8eb0`](https://github.com/nylas/nylas/commit/f7e8eb033d2154ff87fb52f7f5ae01f5837a5c0b)]: + - @nylas/web-elements@1.1.1 + +## 1.1.0 + +### Minor Changes + +- [#145](https://github.com/nylas/nylas/pull/145) [`f2d3f88`](https://github.com/nylas/nylas/commit/f2d3f885db77fe93d11a26375c8070d4f212309c) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added the ability to login with the scheduler editor component + +- [#149](https://github.com/nylas/nylas/pull/149) [`cec6c13`](https://github.com/nylas/nylas/commit/cec6c13be67be8d04013175a5df899a66a178d5a) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added a new [nylas-list-configurations] component that shows a list of configurations that can be edited or deleted. + +- [#139](https://github.com/nylas/nylas/pull/139) [`b467dae`](https://github.com/nylas/nylas/commit/b467dae30f4bcb4431d91a1b307d6ca542fe543f) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added nylas/identity support for the nylas-scheduler-editor component + +### Patch Changes + +- [#299](https://github.com/nylas/nylas/pull/299) [`21e6790`](https://github.com/nylas/nylas/commit/21e6790d8650a0921f6992b067cc692a8c62e2e1) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added communications tab to set up automatic communications for your events + +- [#285](https://github.com/nylas/nylas/pull/285) [`cbb7b58`](https://github.com/nylas/nylas/commit/cbb7b58cf117b7d170a32b02428084f7a7f64b38) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Deprecated the slot custom-booking-form in nylas-booking-form component in favor of using the additional fields set via the editor config + +- [#307](https://github.com/nylas/nylas/pull/307) [`d907fb6`](https://github.com/nylas/nylas/commit/d907fb6fa5a4c635aa451ba8db65e888c5a81346) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Renamed nylas-booking-type component to nylas-scheduling-method for better clarity based on it's function + +- [#266](https://github.com/nylas/nylas/pull/266) [`da23410`](https://github.com/nylas/nylas/commit/da234103763b4842479c9240c97a07d5bca22fca) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed participant availability not updating the list on add/remove participants reactively + +- [#292](https://github.com/nylas/nylas/pull/292) [`edefe90`](https://github.com/nylas/nylas/commit/edefe908ec147c4190ee609dbe4e2972c613fb70) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed same provider conferencing option not showing up in create config flow + +- [#124](https://github.com/nylas/nylas/pull/124) [`5ccd04d`](https://github.com/nylas/nylas/commit/5ccd04dcf91f3a53df3118ffd933604a0fa7eb9e) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-scheduling] props renamed/deprecated + + - Remove `showThankYouPage` in favor of using `eventInfo` + - Remove `bookingFlow` in favor of using `rescheduleBookingId` + - Rename `cancelledEvent` to `cancelledEventInfo` for consistency + - Rename `defaultSchedulerStoreState` to `defaultSchedulerState` for better clarity + +- [#197](https://github.com/nylas/nylas/pull/197) [`55705bc`](https://github.com/nylas/nylas/commit/55705bcba2220905c2d8b42eba4243f6fa34126d) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-event-duration] Update input to dropdown for quick selection with an input to select custom duration + +- [#269](https://github.com/nylas/nylas/pull/269) [`2a62c27`](https://github.com/nylas/nylas/commit/2a62c275684877c71d24642c60b68caaa3c56213) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the package install issue with workspace + +- [#238](https://github.com/nylas/nylas/pull/238) [`84d2b21`](https://github.com/nylas/nylas/commit/84d2b21a70d728d7431bc33ab7289885f540c000) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [bug-fix] Fixed editor not able to save due to participants tab + +- [#308](https://github.com/nylas/nylas/pull/308) [`fa6d747`](https://github.com/nylas/nylas/commit/fa6d747881da38c7a34f72a0822e3d065d11a524) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a read only state sheduling method component to booking options in the editor to identify the scheduling method for the selected config + +- [#173](https://github.com/nylas/nylas/pull/173) [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added stack trace output to the debug utility + +- [#127](https://github.com/nylas/nylas/pull/127) [`929044c`](https://github.com/nylas/nylas/commit/929044c985ae6b4a6b940137a7ae038ef8801f3c) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-scheduling] Added nylasBranding prop to hide nylas branding + +- [#177](https://github.com/nylas/nylas/pull/177) [`4a720b9`](https://github.com/nylas/nylas/commit/4a720b91fe0fbe1453e550d61924e2c94ce37121) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Revert enableImportInjection change + +- [#261](https://github.com/nylas/nylas/pull/261) [`0a57b53`](https://github.com/nylas/nylas/commit/0a57b532ecaffbc9e2598e44f4b856cb6027b7a0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a booking form tab to set additional fields in the config. These additional fields will be displayed in the scheduling page booking form to the end user booking an event. + +- [#220](https://github.com/nylas/nylas/pull/220) [`c82ac58`](https://github.com/nylas/nylas/commit/c82ac581830982c95be13a1b8ce713aec03c180a) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated dropdown component to be usable in the booking form for scheduling component + +- [#209](https://github.com/nylas/nylas/pull/209) [`ea838bc`](https://github.com/nylas/nylas/commit/ea838bcefe4478608d61e069b171fb854a3518ba) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added nylas-cancellation-policy component + +- [#243](https://github.com/nylas/nylas/pull/243) [`816226d`](https://github.com/nylas/nylas/commit/816226d0a834d4e9a97988df4b9beb8c977c3f96) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Only show scheduling page title if organizer name is set + +- [#229](https://github.com/nylas/nylas/pull/229) [`7090e66`](https://github.com/nylas/nylas/commit/7090e66b02024457dc2fa709665634f2fc995e48) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed passing configurationId as prop not taking to edit page issue + +- [#223](https://github.com/nylas/nylas/pull/223) [`3051ca1`](https://github.com/nylas/nylas/commit/3051ca1a1529910bc8bd0a0655df386dbe900368) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added toggle switch component to the design system + +- [#305](https://github.com/nylas/nylas/pull/305) [`56fb61a`](https://github.com/nylas/nylas/commit/56fb61a82e8253d0e66db2856ea40495d5b925c6) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the dropdown for add participants to filter the values based on the typed input value + +- [#205](https://github.com/nylas/nylas/pull/205) [`d0fc3f5`](https://github.com/nylas/nylas/commit/d0fc3f5f9ffa85527a30cb4590efb55f6e342770) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Pass the cancel reason to cancelBooking endpoint + +- [#173](https://github.com/nylas/nylas/pull/173) [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Fix: components built using enableimportinjection was causing our build files to explode, resulting in slower load times for our web-components using unpkg. + +- [#203](https://github.com/nylas/nylas/pull/203) [`a898ee3`](https://github.com/nylas/nylas/commit/a898ee3f5807f99dfb44c35bd8d51ddca9d551d8) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Renamed nylas-location-component to nylas-event-location for consistency across event info components + +- [#346](https://github.com/nylas/nylas/pull/346) [`aa8aaa0`](https://github.com/nylas/nylas/commit/aa8aaa041a33317a1edfa98ed9d8a14b36cad265) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support to adjust the height of the scheduler editor via shadow parts + +- [#303](https://github.com/nylas/nylas/pull/303) [`d22b170`](https://github.com/nylas/nylas/commit/d22b1703a35503d3d9571a2ff74ad5d04f775eb8) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Expose missing shadow parts for scheduling components + +- [#295](https://github.com/nylas/nylas/pull/295) [`35767de`](https://github.com/nylas/nylas/commit/35767de956374d135b42ed21035b25c4a98cebca) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed smashing Book now button and cancel button submitting multiple requests + +- [#242](https://github.com/nylas/nylas/pull/242) [`2cc7b34`](https://github.com/nylas/nylas/commit/2cc7b34712bdce1b4495b0725c61cbda2de77879) Thanks [@b3ndoi](https://github.com/b3ndoi)! - Added same provider and cross provider conferencing + +- [#327](https://github.com/nylas/nylas/pull/327) [`75d87ed`](https://github.com/nylas/nylas/commit/75d87ed64dc1c87edf7e97cdf2e20521730c93fb) Thanks [@gudsson](https://github.com/gudsson)! - [Scheduling] add watcher for themeConfig that applies theme changes + +- [#325](https://github.com/nylas/nylas/pull/325) [`2b556e7`](https://github.com/nylas/nylas/commit/2b556e7e58713186f2e1677d2694c1d05bb7c998) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Send selected language to the API on booking and rescheduling endpoints + +- [#222](https://github.com/nylas/nylas/pull/222) [`8fc44de`](https://github.com/nylas/nylas/commit/8fc44de8182528e2cf98d43d4fc611383d226332) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Scheduling component updated to conditionally render guests, rescheduling and cancellation options + +- [#197](https://github.com/nylas/nylas/pull/197) [`55705bc`](https://github.com/nylas/nylas/commit/55705bcba2220905c2d8b42eba4243f6fa34126d) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a default action to the 'X' button in the scheduler editor that logs out the user + +- [#195](https://github.com/nylas/nylas/pull/195) [`416c649`](https://github.com/nylas/nylas/commit/416c6491d77d4605e939a1ee0295294c5aab505c) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-date-picker] Add event title and duration to the scheduling page + +- [#319](https://github.com/nylas/nylas/pull/319) [`9c4cff9`](https://github.com/nylas/nylas/commit/9c4cff991dc86c3185da5a00c47cbb7649a26268) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the buffer time issue where 0 option was not selectable + +- [#245](https://github.com/nylas/nylas/pull/245) [`b6420aa`](https://github.com/nylas/nylas/commit/b6420aa7bc440e01ddf5088e8ce8807532ff95f0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [scheduler-editor] Added a participants tab to add and manage open hours for additional participants in a configuration. Updated availability tab to set the default open hours of the configurations and manage availability calendars for additional participants. + +- [#108](https://github.com/nylas/nylas/pull/108) [`04ed6c4`](https://github.com/nylas/nylas/commit/04ed6c421185c2b89271de9eeb21c75a29bc0f03) Thanks [@AaronDDM](https://github.com/AaronDDM)! - [nylas-scheduling] Renamed the nylas-scheduler component to nylas-scheduling. + +- [#284](https://github.com/nylas/nylas/pull/284) [`9229aae`](https://github.com/nylas/nylas/commit/9229aae4ecfad011aed77906fcc1c1eb3ef9d7b5) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a way to choose the type of booking config being created in the express(create) flow via scheduler editor + +- [#293](https://github.com/nylas/nylas/pull/293) [`c7afb40`](https://github.com/nylas/nylas/commit/c7afb40c20e5a6bd777cbe63f55a4653e591aaf0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Manual confirmation flow for confirming and rejecting the booking by the organizer + +- [#306](https://github.com/nylas/nylas/pull/306) [`d7c456b`](https://github.com/nylas/nylas/commit/d7c456b6e322c1c17f4f4918a695016fc949ce8a) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Inherit the css variables from the parent component (nylas-scheduling). This fixes the issue with themeConfig prop not being applied to the child components in the scheduling page. + +- [#202](https://github.com/nylas/nylas/pull/202) [`acb24a6`](https://github.com/nylas/nylas/commit/acb24a6fe15201fd558138ad009664bf8f0d450e) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added debug logs and warnings if required props and/or slots are missing + +- [#301](https://github.com/nylas/nylas/pull/301) [`7b4c89c`](https://github.com/nylas/nylas/commit/7b4c89ce9fd2f1aac82648b10f3f9500d3bd43fd) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Hide 'Go back' button if eventInfo is not available + fix some eventOverrides not being triggered for scheduling page + +- [#230](https://github.com/nylas/nylas/pull/230) [`1b80fa6`](https://github.com/nylas/nylas/commit/1b80fa692a0e1bb31278968cd8e816dbf8fbfafc) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [editor] Renamed `additional_guests_hidden` field to `hide_additional_guests` for consistency in naming + +- [#336](https://github.com/nylas/nylas/pull/336) [`8376d63`](https://github.com/nylas/nylas/commit/8376d63661ef53ca90f5246cfb6995e4e569b85b) Thanks [@gudsson](https://github.com/gudsson)! - Updated the readmes + +- [#211](https://github.com/nylas/nylas/pull/211) [`ec92421`](https://github.com/nylas/nylas/commit/ec92421938df2862864619f466a13f7fdf11e6a0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Time slot interval preference component added to the scheduler editor + +- [#281](https://github.com/nylas/nylas/pull/281) [`d8b5d18`](https://github.com/nylas/nylas/commit/d8b5d1836547324f4031e1d8acdb1ad23e34325b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support for round robin scheduling + +- [#321](https://github.com/nylas/nylas/pull/321) [`a61660c`](https://github.com/nylas/nylas/commit/a61660c4480b1b7c803df78c45abde03e96a38d9) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Exposed a prop localization for overriding default localization and/or customizing labels + +- [#291](https://github.com/nylas/nylas/pull/291) [`1902f25`](https://github.com/nylas/nylas/commit/1902f25df5e54c3f4f29e0e8705584772f1643a1) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed adding participants by typing in returning an error and added user-friendly error message if using round robin config and typing in additional participant + +- [#83](https://github.com/nylas/nylas/pull/83) [`ad7de37`](https://github.com/nylas/nylas/commit/ad7de37f496cad2f808b9467e08de36be9f63e7c) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Auto scroll to the input value on focus if the dropdown is open + +- [#282](https://github.com/nylas/nylas/pull/282) [`2edc349`](https://github.com/nylas/nylas/commit/2edc34914f15f3a60a87789b500d9de76b4dd372) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed additional fields on update and save returning error while booking an event + +- [#226](https://github.com/nylas/nylas/pull/226) [`b1c96fd`](https://github.com/nylas/nylas/commit/b1c96fd9fe008f95f06e53bc9d84036bd1ffb742) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Pass additional fields from the custom booking form to the booking endpoint in the scheduling component + +- [#216](https://github.com/nylas/nylas/pull/216) [`d36bf9a`](https://github.com/nylas/nylas/commit/d36bf9a4aeff6a341650ddaa97097831e43c84a5) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [bug-fix] fixed booking ref not working with require session auth set to true + +- [#316](https://github.com/nylas/nylas/pull/316) [`e2b3b1f`](https://github.com/nylas/nylas/commit/e2b3b1f0dfa66eebd7871fd2952ee9ceb17f6491) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support for slug and clientId combo to the scheduling component + +- [#208](https://github.com/nylas/nylas/pull/208) [`b499224`](https://github.com/nylas/nylas/commit/b49922410bded720f3fc61a19b315fd1bfe98d55) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added nylas-min-booking-notice component + +- [#221](https://github.com/nylas/nylas/pull/221) [`e338309`](https://github.com/nylas/nylas/commit/e3383095ad79912115487c711a5b310f3441df6b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [bug-fix] Fixed wrong date shown in the timeslot picker + +- [#205](https://github.com/nylas/nylas/pull/205) [`d0fc3f5`](https://github.com/nylas/nylas/commit/d0fc3f5f9ffa85527a30cb4590efb55f6e342770) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [ui] Scheduling page mobile style tweaks + +- [#123](https://github.com/nylas/nylas/pull/123) [`42673bd`](https://github.com/nylas/nylas/commit/42673bd1a6bc9b7266468f5dcb5b2ea65880aaa6) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-scheduling] Support scheduling for public configs through scheduling component + +- [#213](https://github.com/nylas/nylas/pull/213) [`8679650`](https://github.com/nylas/nylas/commit/86796500b03d672f027b4179fd27393d806437c1) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Editor: Added customize booking setting to set hide_additional_guests, hide_cancellation_options and hide_rescheduling_options + +- [#240](https://github.com/nylas/nylas/pull/240) [`4a7d72d`](https://github.com/nylas/nylas/commit/4a7d72d9be97d305056f779e804f1eced61fc037) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [bug-fix] Fixed creation on config through Scheduler editor not working + +- [#203](https://github.com/nylas/nylas/pull/203) [`a898ee3`](https://github.com/nylas/nylas/commit/a898ee3f5807f99dfb44c35bd8d51ddca9d551d8) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-scheduling] Support bookingRef for scheduling component + +- Updated dependencies [[`21e6790`](https://github.com/nylas/nylas/commit/21e6790d8650a0921f6992b067cc692a8c62e2e1), [`8ada81c`](https://github.com/nylas/nylas/commit/8ada81c95529ce4c78b8ac2a72e46b0ddafacf1d), [`4acfc28`](https://github.com/nylas/nylas/commit/4acfc28de2c24f657736e3141b8ecb8edaee6dab), [`1072a2f`](https://github.com/nylas/nylas/commit/1072a2fe0eb26851f8eab8046d9ef27a842096ce), [`f2d3f88`](https://github.com/nylas/nylas/commit/f2d3f885db77fe93d11a26375c8070d4f212309c), [`5542ab3`](https://github.com/nylas/nylas/commit/5542ab3ebf2b4acbaac9103b36267219d6960c9a), [`f079874`](https://github.com/nylas/nylas/commit/f079874250d6b726327651018b1add86f44aa7f7), [`cbb7b58`](https://github.com/nylas/nylas/commit/cbb7b58cf117b7d170a32b02428084f7a7f64b38), [`d907fb6`](https://github.com/nylas/nylas/commit/d907fb6fa5a4c635aa451ba8db65e888c5a81346), [`da23410`](https://github.com/nylas/nylas/commit/da234103763b4842479c9240c97a07d5bca22fca), [`47fb683`](https://github.com/nylas/nylas/commit/47fb683fd1452eebdf3f89f0dfa93634be3db618), [`edefe90`](https://github.com/nylas/nylas/commit/edefe908ec147c4190ee609dbe4e2972c613fb70), [`5ccd04d`](https://github.com/nylas/nylas/commit/5ccd04dcf91f3a53df3118ffd933604a0fa7eb9e), [`55705bc`](https://github.com/nylas/nylas/commit/55705bcba2220905c2d8b42eba4243f6fa34126d), [`8a2e964`](https://github.com/nylas/nylas/commit/8a2e964962ae05c199616dd62d378060e8de7a97), [`a82b7be`](https://github.com/nylas/nylas/commit/a82b7bee136c39cd180f31b1942b49f6b3ac4a7f), [`8a2e964`](https://github.com/nylas/nylas/commit/8a2e964962ae05c199616dd62d378060e8de7a97), [`2a62c27`](https://github.com/nylas/nylas/commit/2a62c275684877c71d24642c60b68caaa3c56213), [`84d2b21`](https://github.com/nylas/nylas/commit/84d2b21a70d728d7431bc33ab7289885f540c000), [`fa6d747`](https://github.com/nylas/nylas/commit/fa6d747881da38c7a34f72a0822e3d065d11a524), [`7ae32d3`](https://github.com/nylas/nylas/commit/7ae32d333106a1d8f7b826480a9665cc3a282828), [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b), [`929044c`](https://github.com/nylas/nylas/commit/929044c985ae6b4a6b940137a7ae038ef8801f3c), [`4a720b9`](https://github.com/nylas/nylas/commit/4a720b91fe0fbe1453e550d61924e2c94ce37121), [`0628791`](https://github.com/nylas/nylas/commit/0628791825454967a2fcbb1ac2dd4525a1a56002), [`0a57b53`](https://github.com/nylas/nylas/commit/0a57b532ecaffbc9e2598e44f4b856cb6027b7a0), [`4607e3e`](https://github.com/nylas/nylas/commit/4607e3e999eed77e04c55a6c832a84607ea4f45b), [`c82ac58`](https://github.com/nylas/nylas/commit/c82ac581830982c95be13a1b8ce713aec03c180a), [`ea838bc`](https://github.com/nylas/nylas/commit/ea838bcefe4478608d61e069b171fb854a3518ba), [`cec6c13`](https://github.com/nylas/nylas/commit/cec6c13be67be8d04013175a5df899a66a178d5a), [`816226d`](https://github.com/nylas/nylas/commit/816226d0a834d4e9a97988df4b9beb8c977c3f96), [`7090e66`](https://github.com/nylas/nylas/commit/7090e66b02024457dc2fa709665634f2fc995e48), [`3051ca1`](https://github.com/nylas/nylas/commit/3051ca1a1529910bc8bd0a0655df386dbe900368), [`8ef8bed`](https://github.com/nylas/nylas/commit/8ef8bed63b0b387c4cfe9508d32b5533dcf19e95), [`56fb61a`](https://github.com/nylas/nylas/commit/56fb61a82e8253d0e66db2856ea40495d5b925c6), [`d0fc3f5`](https://github.com/nylas/nylas/commit/d0fc3f5f9ffa85527a30cb4590efb55f6e342770), [`8c3aada`](https://github.com/nylas/nylas/commit/8c3aadae0792893adc06f0fa74b72534853b077b), [`97778be`](https://github.com/nylas/nylas/commit/97778bedb03c6135af4ac649687e7ccbee111e63), [`a898ee3`](https://github.com/nylas/nylas/commit/a898ee3f5807f99dfb44c35bd8d51ddca9d551d8), [`acb24a6`](https://github.com/nylas/nylas/commit/acb24a6fe15201fd558138ad009664bf8f0d450e), [`aa8aaa0`](https://github.com/nylas/nylas/commit/aa8aaa041a33317a1edfa98ed9d8a14b36cad265), [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b), [`d22b170`](https://github.com/nylas/nylas/commit/d22b1703a35503d3d9571a2ff74ad5d04f775eb8), [`35767de`](https://github.com/nylas/nylas/commit/35767de956374d135b42ed21035b25c4a98cebca), [`2cc7b34`](https://github.com/nylas/nylas/commit/2cc7b34712bdce1b4495b0725c61cbda2de77879), [`ede0b2c`](https://github.com/nylas/nylas/commit/ede0b2c54968796d15fb43ea116706a0a3a6e7fc), [`75d87ed`](https://github.com/nylas/nylas/commit/75d87ed64dc1c87edf7e97cdf2e20521730c93fb), [`bebb0d6`](https://github.com/nylas/nylas/commit/bebb0d65b9750fa9ff73ed45267f45e1c9d683b3), [`436c634`](https://github.com/nylas/nylas/commit/436c63449488024649e41a9fbdc58736db089ce2), [`c4441b5`](https://github.com/nylas/nylas/commit/c4441b599331ac768a5ab3387336ff68e20f8007), [`f079874`](https://github.com/nylas/nylas/commit/f079874250d6b726327651018b1add86f44aa7f7), [`cd5670d`](https://github.com/nylas/nylas/commit/cd5670de495fcb8491d2208a579081f5de2ee512), [`2b556e7`](https://github.com/nylas/nylas/commit/2b556e7e58713186f2e1677d2694c1d05bb7c998), [`8fc44de`](https://github.com/nylas/nylas/commit/8fc44de8182528e2cf98d43d4fc611383d226332), [`13a295f`](https://github.com/nylas/nylas/commit/13a295fd7b8ca3759a5db903788a5347315b39b1), [`55705bc`](https://github.com/nylas/nylas/commit/55705bcba2220905c2d8b42eba4243f6fa34126d), [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b), [`3cc5fba`](https://github.com/nylas/nylas/commit/3cc5fba4de3d3372a6fd9632d5a83837930778d2), [`416c649`](https://github.com/nylas/nylas/commit/416c6491d77d4605e939a1ee0295294c5aab505c), [`b467dae`](https://github.com/nylas/nylas/commit/b467dae30f4bcb4431d91a1b307d6ca542fe543f), [`e483f58`](https://github.com/nylas/nylas/commit/e483f58ee5c5c5b698501de12b4185726cf4d091), [`9c4cff9`](https://github.com/nylas/nylas/commit/9c4cff991dc86c3185da5a00c47cbb7649a26268), [`74e2330`](https://github.com/nylas/nylas/commit/74e233033bc7a522d1db75b4136cc77fbc566031), [`b6420aa`](https://github.com/nylas/nylas/commit/b6420aa7bc440e01ddf5088e8ce8807532ff95f0), [`04ed6c4`](https://github.com/nylas/nylas/commit/04ed6c421185c2b89271de9eeb21c75a29bc0f03), [`9229aae`](https://github.com/nylas/nylas/commit/9229aae4ecfad011aed77906fcc1c1eb3ef9d7b5), [`c7afb40`](https://github.com/nylas/nylas/commit/c7afb40c20e5a6bd777cbe63f55a4653e591aaf0), [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b), [`e1c674a`](https://github.com/nylas/nylas/commit/e1c674aeed69205f7a209cd390d09284caada581), [`d7c456b`](https://github.com/nylas/nylas/commit/d7c456b6e322c1c17f4f4918a695016fc949ce8a), [`f079874`](https://github.com/nylas/nylas/commit/f079874250d6b726327651018b1add86f44aa7f7), [`f079874`](https://github.com/nylas/nylas/commit/f079874250d6b726327651018b1add86f44aa7f7), [`6619567`](https://github.com/nylas/nylas/commit/6619567f51be058cc033ca7a0d272d8a69a24fae), [`7b4c89c`](https://github.com/nylas/nylas/commit/7b4c89ce9fd2f1aac82648b10f3f9500d3bd43fd), [`1b80fa6`](https://github.com/nylas/nylas/commit/1b80fa692a0e1bb31278968cd8e816dbf8fbfafc), [`8376d63`](https://github.com/nylas/nylas/commit/8376d63661ef53ca90f5246cfb6995e4e569b85b), [`7104a8b`](https://github.com/nylas/nylas/commit/7104a8bfccc8431688b1a0abb8e0345f81ef25e5), [`ec92421`](https://github.com/nylas/nylas/commit/ec92421938df2862864619f466a13f7fdf11e6a0), [`d8b5d18`](https://github.com/nylas/nylas/commit/d8b5d1836547324f4031e1d8acdb1ad23e34325b), [`6aaf284`](https://github.com/nylas/nylas/commit/6aaf284b61ef5107cbe1288042ba49583d70d7bf), [`a61660c`](https://github.com/nylas/nylas/commit/a61660c4480b1b7c803df78c45abde03e96a38d9), [`8a2e964`](https://github.com/nylas/nylas/commit/8a2e964962ae05c199616dd62d378060e8de7a97), [`1902f25`](https://github.com/nylas/nylas/commit/1902f25df5e54c3f4f29e0e8705584772f1643a1), [`2edc349`](https://github.com/nylas/nylas/commit/2edc34914f15f3a60a87789b500d9de76b4dd372), [`b1c96fd`](https://github.com/nylas/nylas/commit/b1c96fd9fe008f95f06e53bc9d84036bd1ffb742), [`d36bf9a`](https://github.com/nylas/nylas/commit/d36bf9a4aeff6a341650ddaa97097831e43c84a5), [`e2b3b1f`](https://github.com/nylas/nylas/commit/e2b3b1f0dfa66eebd7871fd2952ee9ceb17f6491), [`b499224`](https://github.com/nylas/nylas/commit/b49922410bded720f3fc61a19b315fd1bfe98d55), [`3b7a6bc`](https://github.com/nylas/nylas/commit/3b7a6bcd7efcfc658dd56caa4b096e793f02d11f), [`7ae32d3`](https://github.com/nylas/nylas/commit/7ae32d333106a1d8f7b826480a9665cc3a282828), [`3b7e28d`](https://github.com/nylas/nylas/commit/3b7e28d6f1c08d770e43ad60113b205e8617ef80), [`97778be`](https://github.com/nylas/nylas/commit/97778bedb03c6135af4ac649687e7ccbee111e63), [`7808063`](https://github.com/nylas/nylas/commit/7808063be08b0382b59d820ac617ee7ad3c4753f), [`e338309`](https://github.com/nylas/nylas/commit/e3383095ad79912115487c711a5b310f3441df6b), [`d0fc3f5`](https://github.com/nylas/nylas/commit/d0fc3f5f9ffa85527a30cb4590efb55f6e342770), [`42673bd`](https://github.com/nylas/nylas/commit/42673bd1a6bc9b7266468f5dcb5b2ea65880aaa6), [`2b57ad1`](https://github.com/nylas/nylas/commit/2b57ad1b4cdc6d6068482a0b60335ecb94e0002c), [`9081878`](https://github.com/nylas/nylas/commit/90818781f530c239164716c4e1f0035353c8dce1), [`8679650`](https://github.com/nylas/nylas/commit/86796500b03d672f027b4179fd27393d806437c1), [`4a7d72d`](https://github.com/nylas/nylas/commit/4a7d72d9be97d305056f779e804f1eced61fc037), [`87c5ed3`](https://github.com/nylas/nylas/commit/87c5ed3e8d51688e7793004e91760e1188306bc3), [`a898ee3`](https://github.com/nylas/nylas/commit/a898ee3f5807f99dfb44c35bd8d51ddca9d551d8)]: + - @nylas/web-elements@1.1.0 + - @nylas/core@1.1.0 + +## 1.1.0-canary.25 + +### Patch Changes + +- [#346](https://github.com/nylas/nylas/pull/346) [`aa8aaa0`](https://github.com/nylas/nylas/commit/aa8aaa041a33317a1edfa98ed9d8a14b36cad265) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support to adjust the height of the scheduler editor via shadow parts + +- [#336](https://github.com/nylas/nylas/pull/336) [`8376d63`](https://github.com/nylas/nylas/commit/8376d63661ef53ca90f5246cfb6995e4e569b85b) Thanks [@gudsson](https://github.com/gudsson)! - Updated the readmes + +- Updated dependencies [[`aa8aaa0`](https://github.com/nylas/nylas/commit/aa8aaa041a33317a1edfa98ed9d8a14b36cad265), [`8376d63`](https://github.com/nylas/nylas/commit/8376d63661ef53ca90f5246cfb6995e4e569b85b)]: + - @nylas/web-elements@1.1.0-canary.25 + +## 1.1.0-canary.24 + +### Patch Changes + +- [#307](https://github.com/nylas/nylas/pull/307) [`d907fb6`](https://github.com/nylas/nylas/commit/d907fb6fa5a4c635aa451ba8db65e888c5a81346) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Renamed nylas-booking-type component to nylas-scheduling-method for better clarity based on it's function + +- [#308](https://github.com/nylas/nylas/pull/308) [`fa6d747`](https://github.com/nylas/nylas/commit/fa6d747881da38c7a34f72a0822e3d065d11a524) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a read only state sheduling method component to booking options in the editor to identify the scheduling method for the selected config + +- [#305](https://github.com/nylas/nylas/pull/305) [`56fb61a`](https://github.com/nylas/nylas/commit/56fb61a82e8253d0e66db2856ea40495d5b925c6) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the dropdown for add participants to filter the values based on the typed input value + +- [#303](https://github.com/nylas/nylas/pull/303) [`d22b170`](https://github.com/nylas/nylas/commit/d22b1703a35503d3d9571a2ff74ad5d04f775eb8) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Expose missing shadow parts for scheduling components + +- [#327](https://github.com/nylas/nylas/pull/327) [`75d87ed`](https://github.com/nylas/nylas/commit/75d87ed64dc1c87edf7e97cdf2e20521730c93fb) Thanks [@gudsson](https://github.com/gudsson)! - [Scheduling] add watcher for themeConfig that applies theme changes + +- [#325](https://github.com/nylas/nylas/pull/325) [`2b556e7`](https://github.com/nylas/nylas/commit/2b556e7e58713186f2e1677d2694c1d05bb7c998) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Send selected language to the API on booking and rescheduling endpoints + +- [#319](https://github.com/nylas/nylas/pull/319) [`9c4cff9`](https://github.com/nylas/nylas/commit/9c4cff991dc86c3185da5a00c47cbb7649a26268) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the buffer time issue where 0 option was not selectable + +- [#293](https://github.com/nylas/nylas/pull/293) [`c7afb40`](https://github.com/nylas/nylas/commit/c7afb40c20e5a6bd777cbe63f55a4653e591aaf0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Manual confirmation flow for confirming and rejecting the booking by the organizer + +- [#306](https://github.com/nylas/nylas/pull/306) [`d7c456b`](https://github.com/nylas/nylas/commit/d7c456b6e322c1c17f4f4918a695016fc949ce8a) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Inherit the css variables from the parent component (nylas-scheduling). This fixes the issue with themeConfig prop not being applied to the child components in the scheduling page. + +- [#301](https://github.com/nylas/nylas/pull/301) [`7b4c89c`](https://github.com/nylas/nylas/commit/7b4c89ce9fd2f1aac82648b10f3f9500d3bd43fd) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Hide 'Go back' button if eventInfo is not available + fix some eventOverrides not being triggered for scheduling page + +- [#321](https://github.com/nylas/nylas/pull/321) [`a61660c`](https://github.com/nylas/nylas/commit/a61660c4480b1b7c803df78c45abde03e96a38d9) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Exposed a prop localization for overriding default localization and/or customizing labels + +- [#316](https://github.com/nylas/nylas/pull/316) [`e2b3b1f`](https://github.com/nylas/nylas/commit/e2b3b1f0dfa66eebd7871fd2952ee9ceb17f6491) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support for slug and clientId combo to the scheduling component + +- Updated dependencies [[`d907fb6`](https://github.com/nylas/nylas/commit/d907fb6fa5a4c635aa451ba8db65e888c5a81346), [`fa6d747`](https://github.com/nylas/nylas/commit/fa6d747881da38c7a34f72a0822e3d065d11a524), [`56fb61a`](https://github.com/nylas/nylas/commit/56fb61a82e8253d0e66db2856ea40495d5b925c6), [`d22b170`](https://github.com/nylas/nylas/commit/d22b1703a35503d3d9571a2ff74ad5d04f775eb8), [`75d87ed`](https://github.com/nylas/nylas/commit/75d87ed64dc1c87edf7e97cdf2e20521730c93fb), [`2b556e7`](https://github.com/nylas/nylas/commit/2b556e7e58713186f2e1677d2694c1d05bb7c998), [`9c4cff9`](https://github.com/nylas/nylas/commit/9c4cff991dc86c3185da5a00c47cbb7649a26268), [`c7afb40`](https://github.com/nylas/nylas/commit/c7afb40c20e5a6bd777cbe63f55a4653e591aaf0), [`d7c456b`](https://github.com/nylas/nylas/commit/d7c456b6e322c1c17f4f4918a695016fc949ce8a), [`7b4c89c`](https://github.com/nylas/nylas/commit/7b4c89ce9fd2f1aac82648b10f3f9500d3bd43fd), [`a61660c`](https://github.com/nylas/nylas/commit/a61660c4480b1b7c803df78c45abde03e96a38d9), [`e2b3b1f`](https://github.com/nylas/nylas/commit/e2b3b1f0dfa66eebd7871fd2952ee9ceb17f6491)]: + - @nylas/web-elements@1.1.0-canary.24 + - @nylas/core@1.1.0-canary.10 + +## 1.1.0-canary.23 + +### Patch Changes + +- [#299](https://github.com/nylas/nylas/pull/299) [`21e6790`](https://github.com/nylas/nylas/commit/21e6790d8650a0921f6992b067cc692a8c62e2e1) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added communications tab to set up automatic communications for your events + +- [#292](https://github.com/nylas/nylas/pull/292) [`edefe90`](https://github.com/nylas/nylas/commit/edefe908ec147c4190ee609dbe4e2972c613fb70) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed same provider conferencing option not showing up in create config flow + +- [#295](https://github.com/nylas/nylas/pull/295) [`35767de`](https://github.com/nylas/nylas/commit/35767de956374d135b42ed21035b25c4a98cebca) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed smashing Book now button and cancel button submitting multiple requests + +- [#284](https://github.com/nylas/nylas/pull/284) [`9229aae`](https://github.com/nylas/nylas/commit/9229aae4ecfad011aed77906fcc1c1eb3ef9d7b5) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a way to choose the type of booking config being created in the express(create) flow via scheduler editor + +- [#291](https://github.com/nylas/nylas/pull/291) [`1902f25`](https://github.com/nylas/nylas/commit/1902f25df5e54c3f4f29e0e8705584772f1643a1) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed adding participants by typing in returning an error and added user-friendly error message if using round robin config and typing in additional participant + +- Updated dependencies [[`21e6790`](https://github.com/nylas/nylas/commit/21e6790d8650a0921f6992b067cc692a8c62e2e1), [`edefe90`](https://github.com/nylas/nylas/commit/edefe908ec147c4190ee609dbe4e2972c613fb70), [`35767de`](https://github.com/nylas/nylas/commit/35767de956374d135b42ed21035b25c4a98cebca), [`9229aae`](https://github.com/nylas/nylas/commit/9229aae4ecfad011aed77906fcc1c1eb3ef9d7b5), [`1902f25`](https://github.com/nylas/nylas/commit/1902f25df5e54c3f4f29e0e8705584772f1643a1)]: + - @nylas/web-elements@1.1.0-canary.23 + - @nylas/core@1.1.0-canary.9 + +## 1.1.0-canary.22 + +### Patch Changes + +- [#285](https://github.com/nylas/nylas/pull/285) [`cbb7b58`](https://github.com/nylas/nylas/commit/cbb7b58cf117b7d170a32b02428084f7a7f64b38) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Deprecated the slot custom-booking-form in nylas-booking-form component in favor of using the additional fields set via the editor config + +- [#282](https://github.com/nylas/nylas/pull/282) [`2edc349`](https://github.com/nylas/nylas/commit/2edc34914f15f3a60a87789b500d9de76b4dd372) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed additional fields on update and save returning error while booking an event + +- Updated dependencies [[`cbb7b58`](https://github.com/nylas/nylas/commit/cbb7b58cf117b7d170a32b02428084f7a7f64b38), [`2edc349`](https://github.com/nylas/nylas/commit/2edc34914f15f3a60a87789b500d9de76b4dd372)]: + - @nylas/web-elements@1.1.0-canary.22 + +## 1.1.0-canary.21 + +### Patch Changes + +- [#281](https://github.com/nylas/nylas/pull/281) [`d8b5d18`](https://github.com/nylas/nylas/commit/d8b5d1836547324f4031e1d8acdb1ad23e34325b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added support for round robin scheduling + +- Updated dependencies [[`d8b5d18`](https://github.com/nylas/nylas/commit/d8b5d1836547324f4031e1d8acdb1ad23e34325b)]: + - @nylas/web-elements@1.1.0-canary.21 + - @nylas/core@1.1.0-canary.8 + +## 1.1.0-canary.20 + +### Patch Changes + +- [#266](https://github.com/nylas/nylas/pull/266) [`da23410`](https://github.com/nylas/nylas/commit/da234103763b4842479c9240c97a07d5bca22fca) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed participant availability not updating the list on add/remove participants reactively + +- [#269](https://github.com/nylas/nylas/pull/269) [`2a62c27`](https://github.com/nylas/nylas/commit/2a62c275684877c71d24642c60b68caaa3c56213) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed the package install issue with workspace + +- Updated dependencies [[`da23410`](https://github.com/nylas/nylas/commit/da234103763b4842479c9240c97a07d5bca22fca), [`2a62c27`](https://github.com/nylas/nylas/commit/2a62c275684877c71d24642c60b68caaa3c56213)]: + - @nylas/web-elements@1.1.0-canary.20 + - @nylas/core@1.1.0-canary.7 + +## 1.1.0-canary.19 + +### Patch Changes + +- [#261](https://github.com/nylas/nylas/pull/261) [`0a57b53`](https://github.com/nylas/nylas/commit/0a57b532ecaffbc9e2598e44f4b856cb6027b7a0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a booking form tab to set additional fields in the config. These additional fields will be displayed in the scheduling page booking form to the end user booking an event. + +- [#242](https://github.com/nylas/nylas/pull/242) [`2cc7b34`](https://github.com/nylas/nylas/commit/2cc7b34712bdce1b4495b0725c61cbda2de77879) Thanks [@b3ndoi](https://github.com/b3ndoi)! - Added same provider and cross provider conferencing + +- [#245](https://github.com/nylas/nylas/pull/245) [`b6420aa`](https://github.com/nylas/nylas/commit/b6420aa7bc440e01ddf5088e8ce8807532ff95f0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [scheduler-editor] Added a participants tab to add and manage open hours for additional participants in a configuration. Updated availability tab to set the default open hours of the configurations and manage availability calendars for additional participants. + +- Updated dependencies [[`0a57b53`](https://github.com/nylas/nylas/commit/0a57b532ecaffbc9e2598e44f4b856cb6027b7a0), [`2cc7b34`](https://github.com/nylas/nylas/commit/2cc7b34712bdce1b4495b0725c61cbda2de77879), [`b6420aa`](https://github.com/nylas/nylas/commit/b6420aa7bc440e01ddf5088e8ce8807532ff95f0)]: + - @nylas/web-elements@1.1.0-canary.19 + - @nylas/core@1.1.0-canary.6 + +## 1.1.0-canary.18 + +### Patch Changes + +- [#243](https://github.com/nylas/nylas/pull/243) [`816226d`](https://github.com/nylas/nylas/commit/816226d0a834d4e9a97988df4b9beb8c977c3f96) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Only show scheduling page title if organizer name is set + +- [#240](https://github.com/nylas/nylas/pull/240) [`4a7d72d`](https://github.com/nylas/nylas/commit/4a7d72d9be97d305056f779e804f1eced61fc037) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [bug-fix] Fixed creation on config through Scheduler editor not working + +- Updated dependencies [[`816226d`](https://github.com/nylas/nylas/commit/816226d0a834d4e9a97988df4b9beb8c977c3f96), [`4a7d72d`](https://github.com/nylas/nylas/commit/4a7d72d9be97d305056f779e804f1eced61fc037)]: + - @nylas/web-elements@1.1.0-canary.18 + +## 1.1.0-canary.17 + +### Patch Changes + +- [#238](https://github.com/nylas/nylas/pull/238) [`84d2b21`](https://github.com/nylas/nylas/commit/84d2b21a70d728d7431bc33ab7289885f540c000) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [bug-fix] Fixed editor not able to save due to participants tab + +- Updated dependencies [[`84d2b21`](https://github.com/nylas/nylas/commit/84d2b21a70d728d7431bc33ab7289885f540c000)]: + - @nylas/web-elements@1.1.0-canary.17 + +## 1.1.0-canary.16 + +### Patch Changes + +- [#230](https://github.com/nylas/nylas/pull/230) [`1b80fa6`](https://github.com/nylas/nylas/commit/1b80fa692a0e1bb31278968cd8e816dbf8fbfafc) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [editor] Renamed `additional_guests_hidden` field to `hide_additional_guests` for consistency in naming + +- Updated dependencies [[`1b80fa6`](https://github.com/nylas/nylas/commit/1b80fa692a0e1bb31278968cd8e816dbf8fbfafc)]: + - @nylas/web-elements@1.1.0-canary.16 + - @nylas/core@1.1.0-canary.5 + +## 1.1.0-canary.15 + +### Patch Changes + +- [#220](https://github.com/nylas/nylas/pull/220) [`c82ac58`](https://github.com/nylas/nylas/commit/c82ac581830982c95be13a1b8ce713aec03c180a) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Updated dropdown component to be usable in the booking form for scheduling component + +- [#209](https://github.com/nylas/nylas/pull/209) [`ea838bc`](https://github.com/nylas/nylas/commit/ea838bcefe4478608d61e069b171fb854a3518ba) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added nylas-cancellation-policy component + +- [#229](https://github.com/nylas/nylas/pull/229) [`7090e66`](https://github.com/nylas/nylas/commit/7090e66b02024457dc2fa709665634f2fc995e48) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Fixed passing configurationId as prop not taking to edit page issue + +- [#223](https://github.com/nylas/nylas/pull/223) [`3051ca1`](https://github.com/nylas/nylas/commit/3051ca1a1529910bc8bd0a0655df386dbe900368) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added toggle switch component to the design system + +- [#222](https://github.com/nylas/nylas/pull/222) [`8fc44de`](https://github.com/nylas/nylas/commit/8fc44de8182528e2cf98d43d4fc611383d226332) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Scheduling component updated to conditionally render guests, rescheduling and cancellation options + +- [#211](https://github.com/nylas/nylas/pull/211) [`ec92421`](https://github.com/nylas/nylas/commit/ec92421938df2862864619f466a13f7fdf11e6a0) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Time slot interval preference component added to the scheduler editor + +- [#226](https://github.com/nylas/nylas/pull/226) [`b1c96fd`](https://github.com/nylas/nylas/commit/b1c96fd9fe008f95f06e53bc9d84036bd1ffb742) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Pass additional fields from the custom booking form to the booking endpoint in the scheduling component + +- [#216](https://github.com/nylas/nylas/pull/216) [`d36bf9a`](https://github.com/nylas/nylas/commit/d36bf9a4aeff6a341650ddaa97097831e43c84a5) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [bug-fix] fixed booking ref not working with require session auth set to true + +- [#208](https://github.com/nylas/nylas/pull/208) [`b499224`](https://github.com/nylas/nylas/commit/b49922410bded720f3fc61a19b315fd1bfe98d55) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added nylas-min-booking-notice component + +- [#221](https://github.com/nylas/nylas/pull/221) [`e338309`](https://github.com/nylas/nylas/commit/e3383095ad79912115487c711a5b310f3441df6b) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [bug-fix] Fixed wrong date shown in the timeslot picker + +- [#213](https://github.com/nylas/nylas/pull/213) [`8679650`](https://github.com/nylas/nylas/commit/86796500b03d672f027b4179fd27393d806437c1) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Editor: Added customize booking setting to set additional_guests_hidden, hide_cancellation_options and hide_rescheduling_options + +- Updated dependencies [[`c82ac58`](https://github.com/nylas/nylas/commit/c82ac581830982c95be13a1b8ce713aec03c180a), [`ea838bc`](https://github.com/nylas/nylas/commit/ea838bcefe4478608d61e069b171fb854a3518ba), [`7090e66`](https://github.com/nylas/nylas/commit/7090e66b02024457dc2fa709665634f2fc995e48), [`3051ca1`](https://github.com/nylas/nylas/commit/3051ca1a1529910bc8bd0a0655df386dbe900368), [`8fc44de`](https://github.com/nylas/nylas/commit/8fc44de8182528e2cf98d43d4fc611383d226332), [`ec92421`](https://github.com/nylas/nylas/commit/ec92421938df2862864619f466a13f7fdf11e6a0), [`b1c96fd`](https://github.com/nylas/nylas/commit/b1c96fd9fe008f95f06e53bc9d84036bd1ffb742), [`d36bf9a`](https://github.com/nylas/nylas/commit/d36bf9a4aeff6a341650ddaa97097831e43c84a5), [`b499224`](https://github.com/nylas/nylas/commit/b49922410bded720f3fc61a19b315fd1bfe98d55), [`e338309`](https://github.com/nylas/nylas/commit/e3383095ad79912115487c711a5b310f3441df6b), [`8679650`](https://github.com/nylas/nylas/commit/86796500b03d672f027b4179fd27393d806437c1)]: + - @nylas/web-elements@1.1.0-canary.15 + - @nylas/core@1.1.0-canary.4 + +## 1.1.0-canary.14 + +### Patch Changes + +- [#205](https://github.com/nylas/nylas/pull/205) [`d0fc3f5`](https://github.com/nylas/nylas/commit/d0fc3f5f9ffa85527a30cb4590efb55f6e342770) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Pass the cancel reason to cancelBooking endpoint + +- [#205](https://github.com/nylas/nylas/pull/205) [`d0fc3f5`](https://github.com/nylas/nylas/commit/d0fc3f5f9ffa85527a30cb4590efb55f6e342770) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [ui] Scheduling page mobile style tweaks + +- Updated dependencies [[`d0fc3f5`](https://github.com/nylas/nylas/commit/d0fc3f5f9ffa85527a30cb4590efb55f6e342770), [`d0fc3f5`](https://github.com/nylas/nylas/commit/d0fc3f5f9ffa85527a30cb4590efb55f6e342770)]: + - @nylas/web-elements@1.1.0-canary.14 + +## 1.1.0-canary.13 + +### Patch Changes + +- [#197](https://github.com/nylas/nylas/pull/197) [`55705bc`](https://github.com/nylas/nylas/commit/55705bcba2220905c2d8b42eba4243f6fa34126d) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-event-duration] Update input to dropdown for quick selection with an input to select custom duration + +- [#203](https://github.com/nylas/nylas/pull/203) [`a898ee3`](https://github.com/nylas/nylas/commit/a898ee3f5807f99dfb44c35bd8d51ddca9d551d8) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Renamed nylas-location-component to nylas-event-location for consistency across event info components + +- [#197](https://github.com/nylas/nylas/pull/197) [`55705bc`](https://github.com/nylas/nylas/commit/55705bcba2220905c2d8b42eba4243f6fa34126d) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added a default action to the 'X' button in the scheduler editor that logs out the user + +- [#195](https://github.com/nylas/nylas/pull/195) [`416c649`](https://github.com/nylas/nylas/commit/416c6491d77d4605e939a1ee0295294c5aab505c) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-date-picker] Add event title and duration to the scheduling page + +- [#202](https://github.com/nylas/nylas/pull/202) [`acb24a6`](https://github.com/nylas/nylas/commit/acb24a6fe15201fd558138ad009664bf8f0d450e) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Added debug logs and warnings if required props and/or slots are missing + +- [#203](https://github.com/nylas/nylas/pull/203) [`a898ee3`](https://github.com/nylas/nylas/commit/a898ee3f5807f99dfb44c35bd8d51ddca9d551d8) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-scheduling] Support bookingRef for scheduling component + +- Updated dependencies [[`4acfc28`](https://github.com/nylas/nylas/commit/4acfc28de2c24f657736e3141b8ecb8edaee6dab), [`47fb683`](https://github.com/nylas/nylas/commit/47fb683fd1452eebdf3f89f0dfa93634be3db618), [`55705bc`](https://github.com/nylas/nylas/commit/55705bcba2220905c2d8b42eba4243f6fa34126d), [`a898ee3`](https://github.com/nylas/nylas/commit/a898ee3f5807f99dfb44c35bd8d51ddca9d551d8), [`acb24a6`](https://github.com/nylas/nylas/commit/acb24a6fe15201fd558138ad009664bf8f0d450e), [`cd5670d`](https://github.com/nylas/nylas/commit/cd5670de495fcb8491d2208a579081f5de2ee512), [`13a295f`](https://github.com/nylas/nylas/commit/13a295fd7b8ca3759a5db903788a5347315b39b1), [`55705bc`](https://github.com/nylas/nylas/commit/55705bcba2220905c2d8b42eba4243f6fa34126d), [`416c649`](https://github.com/nylas/nylas/commit/416c6491d77d4605e939a1ee0295294c5aab505c), [`6aaf284`](https://github.com/nylas/nylas/commit/6aaf284b61ef5107cbe1288042ba49583d70d7bf), [`87c5ed3`](https://github.com/nylas/nylas/commit/87c5ed3e8d51688e7793004e91760e1188306bc3), [`a898ee3`](https://github.com/nylas/nylas/commit/a898ee3f5807f99dfb44c35bd8d51ddca9d551d8)]: + - @nylas/web-elements@1.1.0-canary.13 + +## 1.1.0-canary.12 + +### Patch Changes + +- Updated dependencies [[`8ada81c`](https://github.com/nylas/nylas/commit/8ada81c95529ce4c78b8ac2a72e46b0ddafacf1d), [`5542ab3`](https://github.com/nylas/nylas/commit/5542ab3ebf2b4acbaac9103b36267219d6960c9a), [`8c3aada`](https://github.com/nylas/nylas/commit/8c3aadae0792893adc06f0fa74b72534853b077b), [`ede0b2c`](https://github.com/nylas/nylas/commit/ede0b2c54968796d15fb43ea116706a0a3a6e7fc), [`436c634`](https://github.com/nylas/nylas/commit/436c63449488024649e41a9fbdc58736db089ce2)]: + - @nylas/web-elements@1.1.0-canary.12 + +## 1.1.0-canary.11 + +### Patch Changes + +- Updated dependencies [[`3b7a6bc`](https://github.com/nylas/nylas/commit/3b7a6bcd7efcfc658dd56caa4b096e793f02d11f), [`7808063`](https://github.com/nylas/nylas/commit/7808063be08b0382b59d820ac617ee7ad3c4753f), [`2b57ad1`](https://github.com/nylas/nylas/commit/2b57ad1b4cdc6d6068482a0b60335ecb94e0002c)]: + - @nylas/web-elements@1.1.0-canary.11 + +## 1.1.0-canary.10 + +### Patch Changes + +- [#177](https://github.com/nylas/nylas/pull/177) [`4a720b9`](https://github.com/nylas/nylas/commit/4a720b91fe0fbe1453e550d61924e2c94ce37121) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Revert enableImportInjection change + +- Updated dependencies [[`4a720b9`](https://github.com/nylas/nylas/commit/4a720b91fe0fbe1453e550d61924e2c94ce37121)]: + - @nylas/web-elements@1.1.0-canary.10 + +## 1.1.0-canary.9 + +### Patch Changes + +- [#173](https://github.com/nylas/nylas/pull/173) [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added stack trace output to the debug utility + +- [#173](https://github.com/nylas/nylas/pull/173) [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Fix: components built using enableimportinjection was causing our build files to explode, resulting in slower load times for our web-components using unpkg. + +- Updated dependencies [[`8a2e964`](https://github.com/nylas/nylas/commit/8a2e964962ae05c199616dd62d378060e8de7a97), [`8a2e964`](https://github.com/nylas/nylas/commit/8a2e964962ae05c199616dd62d378060e8de7a97), [`7ae32d3`](https://github.com/nylas/nylas/commit/7ae32d333106a1d8f7b826480a9665cc3a282828), [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b), [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b), [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b), [`3cc5fba`](https://github.com/nylas/nylas/commit/3cc5fba4de3d3372a6fd9632d5a83837930778d2), [`e483f58`](https://github.com/nylas/nylas/commit/e483f58ee5c5c5b698501de12b4185726cf4d091), [`62afae4`](https://github.com/nylas/nylas/commit/62afae4574d0a35431841d57e008a2a3dbdb8d7b), [`e1c674a`](https://github.com/nylas/nylas/commit/e1c674aeed69205f7a209cd390d09284caada581), [`8a2e964`](https://github.com/nylas/nylas/commit/8a2e964962ae05c199616dd62d378060e8de7a97), [`7ae32d3`](https://github.com/nylas/nylas/commit/7ae32d333106a1d8f7b826480a9665cc3a282828)]: + - @nylas/web-elements@1.1.0-canary.9 + - @nylas/core@1.1.0-canary.3 + +## 1.1.0-canary.8 + +### Patch Changes + +- Updated dependencies [[`1072a2f`](https://github.com/nylas/nylas/commit/1072a2fe0eb26851f8eab8046d9ef27a842096ce), [`a82b7be`](https://github.com/nylas/nylas/commit/a82b7bee136c39cd180f31b1942b49f6b3ac4a7f)]: + - @nylas/web-elements@1.1.0-canary.8 + +## 1.1.0-canary.7 + +### Patch Changes + +- Updated dependencies [[`f079874`](https://github.com/nylas/nylas/commit/f079874250d6b726327651018b1add86f44aa7f7), [`f079874`](https://github.com/nylas/nylas/commit/f079874250d6b726327651018b1add86f44aa7f7), [`f079874`](https://github.com/nylas/nylas/commit/f079874250d6b726327651018b1add86f44aa7f7), [`f079874`](https://github.com/nylas/nylas/commit/f079874250d6b726327651018b1add86f44aa7f7)]: + - @nylas/web-elements@1.1.0-canary.7 + +## 1.1.0-canary.6 + +### Patch Changes + +- Updated dependencies [[`97778be`](https://github.com/nylas/nylas/commit/97778bedb03c6135af4ac649687e7ccbee111e63), [`bebb0d6`](https://github.com/nylas/nylas/commit/bebb0d65b9750fa9ff73ed45267f45e1c9d683b3), [`6619567`](https://github.com/nylas/nylas/commit/6619567f51be058cc033ca7a0d272d8a69a24fae), [`97778be`](https://github.com/nylas/nylas/commit/97778bedb03c6135af4ac649687e7ccbee111e63), [`9081878`](https://github.com/nylas/nylas/commit/90818781f530c239164716c4e1f0035353c8dce1)]: + - @nylas/web-elements@1.1.0-canary.6 + - @nylas/core@1.1.0-canary.2 + +## 1.1.0-canary.5 + +### Minor Changes + +- [#149](https://github.com/nylas/nylas/pull/149) [`cec6c13`](https://github.com/nylas/nylas/commit/cec6c13be67be8d04013175a5df899a66a178d5a) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added a new [nylas-list-configurations] component that shows a list of configurations that can be edited or deleted. + +### Patch Changes + +- Updated dependencies [[`cec6c13`](https://github.com/nylas/nylas/commit/cec6c13be67be8d04013175a5df899a66a178d5a)]: + - @nylas/web-elements@1.1.0-canary.5 + +## 1.1.0-canary.4 + +### Patch Changes + +- Updated dependencies [[`0628791`](https://github.com/nylas/nylas/commit/0628791825454967a2fcbb1ac2dd4525a1a56002)]: + - @nylas/web-elements@1.1.0-canary.4 + +## 1.1.0-canary.3 + +### Minor Changes + +- [#145](https://github.com/nylas/nylas/pull/145) [`f2d3f88`](https://github.com/nylas/nylas/commit/f2d3f885db77fe93d11a26375c8070d4f212309c) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added the ability to login with the scheduler editor component + +- [#139](https://github.com/nylas/nylas/pull/139) [`b467dae`](https://github.com/nylas/nylas/commit/b467dae30f4bcb4431d91a1b307d6ca542fe543f) Thanks [@AaronDDM](https://github.com/AaronDDM)! - Added nylas/identity support for the nylas-scheduler-editor component + +### Patch Changes + +- [#127](https://github.com/nylas/nylas/pull/127) [`929044c`](https://github.com/nylas/nylas/commit/929044c985ae6b4a6b940137a7ae038ef8801f3c) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-scheduling] Added nylasBranding prop to hide nylas branding + +- Updated dependencies [[`f2d3f88`](https://github.com/nylas/nylas/commit/f2d3f885db77fe93d11a26375c8070d4f212309c), [`929044c`](https://github.com/nylas/nylas/commit/929044c985ae6b4a6b940137a7ae038ef8801f3c), [`b467dae`](https://github.com/nylas/nylas/commit/b467dae30f4bcb4431d91a1b307d6ca542fe543f), [`3b7e28d`](https://github.com/nylas/nylas/commit/3b7e28d6f1c08d770e43ad60113b205e8617ef80)]: + - @nylas/web-elements@1.1.0-canary.3 + - @nylas/core@1.1.0-canary.1 + +## 1.0.2-canary.2 + +### Patch Changes + +- Updated dependencies [[`7104a8b`](https://github.com/nylas/nylas/commit/7104a8bfccc8431688b1a0abb8e0345f81ef25e5)]: + - @nylas/core@1.0.2-canary.0 + - @nylas/web-elements@1.0.2-canary.2 + +## 1.0.2-canary.1 + +### Patch Changes + +- [#124](https://github.com/nylas/nylas/pull/124) [`5ccd04d`](https://github.com/nylas/nylas/commit/5ccd04dcf91f3a53df3118ffd933604a0fa7eb9e) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-scheduling] props renamed/deprecated + + - Remove `showThankYouPage` in favor of using `eventInfo` + - Remove `bookingFlow` in favor of using `rescheduleBookingId` + - Rename `cancelledEvent` to `cancelledEventInfo` for consistency + - Rename `defaultSchedulerStoreState` to `defaultSchedulerState` for better clarity + +- [#108](https://github.com/nylas/nylas/pull/108) [`04ed6c4`](https://github.com/nylas/nylas/commit/04ed6c421185c2b89271de9eeb21c75a29bc0f03) Thanks [@AaronDDM](https://github.com/AaronDDM)! - [nylas-scheduling] Renamed the nylas-scheduler component to nylas-scheduling. + +- [#123](https://github.com/nylas/nylas/pull/123) [`42673bd`](https://github.com/nylas/nylas/commit/42673bd1a6bc9b7266468f5dcb5b2ea65880aaa6) Thanks [@pooja169usp](https://github.com/pooja169usp)! - [nylas-scheduling] Support scheduling for public configs through scheduling component + +- Updated dependencies [[`5ccd04d`](https://github.com/nylas/nylas/commit/5ccd04dcf91f3a53df3118ffd933604a0fa7eb9e), [`4607e3e`](https://github.com/nylas/nylas/commit/4607e3e999eed77e04c55a6c832a84607ea4f45b), [`8ef8bed`](https://github.com/nylas/nylas/commit/8ef8bed63b0b387c4cfe9508d32b5533dcf19e95), [`74e2330`](https://github.com/nylas/nylas/commit/74e233033bc7a522d1db75b4136cc77fbc566031), [`04ed6c4`](https://github.com/nylas/nylas/commit/04ed6c421185c2b89271de9eeb21c75a29bc0f03), [`42673bd`](https://github.com/nylas/nylas/commit/42673bd1a6bc9b7266468f5dcb5b2ea65880aaa6)]: + - @nylas/web-elements@1.0.2-canary.1 + +## 1.0.2-canary.0 + +### Patch Changes + +- [#83](https://github.com/nylas/nylas/pull/83) [`ad7de37`](https://github.com/nylas/nylas/commit/ad7de37f496cad2f808b9467e08de36be9f63e7c) Thanks [@pooja169usp](https://github.com/pooja169usp)! - Auto scroll to the input value on focus if the dropdown is open + +- Updated dependencies [[`c4441b5`](https://github.com/nylas/nylas/commit/c4441b599331ac768a5ab3387336ff68e20f8007)]: + - @nylas/web-elements@1.0.2-canary.0 diff --git a/packages/react/README.md b/packages/react/README.md new file mode 100644 index 0000000..9efc401 --- /dev/null +++ b/packages/react/README.md @@ -0,0 +1,197 @@ +# Nylas React Components + +React components for Nylas Scheduler + +![npm](https://img.shields.io/npm/v/@nylas/react) + +## Requirements + +- [Node.js](https://nodejs.org/en/) v20 or higher +- [React.js](https://react.dev/) v18 or higher + +## Compatibility Notice + +## Installation + +Install Nylas React Components via npm: + +```bash +npm install @nylas/react@latest +``` + +or yarn + +```bash + yarn add @nylas/react@latest +``` + +## Getting Started + +The following example adds the Nylas Scheduler Editor and Scheduling components to your React app. + +> ⚠️ **Important:** Make sure to replace the `NYLAS_CLIENT_ID` with your Nylas Client ID. Your Nylas Client ID can be found in your app's Overview page on the [Nylas Dashboard](https://dashboard-v3.nylas.com). + +### Adding the Components + +```jsx +import { BrowserRouter, Route, Routes } from "react-router-dom"; +import { NylasSchedulerEditor, NylasScheduling } from "@nylas/react"; + +function App() { + // Get the configuration ID from the URL query string + const urlParams = new URLSearchParams(window.location.search); + const configId = urlParams.get("config_id") || ""; + + return ( + + + + + View Scheduler Editor + + + + } + /> + + + + } + /> + + + ); +} +export default App; +``` + +### Start a local development server + +To create a Scheduling Page from the Scheduler Editor, you'll need a working Scheduler UI. To do this, run a local server to host your Scheduler Editor and Scheduling Pages. + +Navigate the root directory of your project and run the following command. + +```text +npm run dev -- --port +``` + +After you run the command, open your browser to `http://localhost:/scheduler-editor` to see your Scheduler Editor and create your first Scheduling Page. + +## Links + +For a complete walkthrough on setting up Scheduler can be found at [https://developer.nylas.com/docs/v3/getting-started/scheduler/](https://developer.nylas.com/docs/v3/getting-started/scheduler/), with the complete code available on [GitHub](https://github.com/nylas-samples/quickstart-scheduler-react). + +### Further reading: + +- [Scheduler documentation](https://developer.nylas.com/docs/v3/scheduler/) +- [Scheduler API reference](https://developer.nylas.com/docs/api/v3/scheduler/) +- [Developer Forums](https://forums.nylas.com/) + +## Nylas Connect Hook + +The `useNylasConnect` hook provides a simple way to add OAuth authentication to your React app using Nylas Connect. + +### Basic Usage + +```jsx +import { useNylasConnect } from '@nylas/react'; + +function LoginButton() { + const { isConnected, connect, logout, grant, isLoading } = useNylasConnect({ + clientId: 'your-nylas-client-id', + redirectUri: 'http://localhost:3000/callback' + }); + + if (isLoading) return
Loading...
; + + if (isConnected) { + return ( +
+

Connected as: {grant?.email}

+ +
+ ); + } + + return ( + + ); +} +``` + + +### Configuration + +| Option | Type | Default | Description | +|--------|------|---------|-------------| +| `clientId` | `string` | - | Your Nylas Client ID | +| `redirectUri` | `string` | - | OAuth callback URL | +| `autoHandleCallback` | `boolean` | `true` | Automatically handle OAuth callback | +| `autoRefreshInterval` | `number` | - | Auto-refresh session interval (ms) | +| `retryAttempts` | `number` | `0` | Number of retry attempts for failed operations | +| `enableAutoRecovery` | `boolean` | `false` | Enable automatic error recovery | + +### Hook Return Values + +The hook returns an object with the following properties: + +**State:** +- `isConnected` - Whether user is authenticated +- `grant` - Current user's grant information +- `isLoading` - Loading state for operations +- `error` - Current error, if any + +**Actions:** +- `connect(options)` - Start OAuth flow +- `logout(grantId?)` - Sign out user +- `refreshSession()` - Refresh current session +- `subscribe(callback)` - Listen to connection events + +### Environment Setup + +For security, use environment variables for your configuration: + +```bash +# .env.local +VITE_NYLAS_CLIENT_ID=your-nylas-client-id +VITE_NYLAS_REDIRECT_URI=http://localhost:3000/callback +``` + +```jsx +const { isConnected, connect } = useNylasConnect({ + clientId: import.meta.env.VITE_NYLAS_CLIENT_ID, + redirectUri: import.meta.env.VITE_NYLAS_REDIRECT_URI +}); +``` + + diff --git a/packages/react/index.html b/packages/react/index.html new file mode 100644 index 0000000..0fcd1f8 --- /dev/null +++ b/packages/react/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/packages/react/lib/connect.ts b/packages/react/lib/connect.ts new file mode 100644 index 0000000..db379da --- /dev/null +++ b/packages/react/lib/connect.ts @@ -0,0 +1,2 @@ +// Entry point for Nylas Connect functionality +export * from "./connect/index"; diff --git a/packages/react/lib/connect/index.ts b/packages/react/lib/connect/index.ts new file mode 100644 index 0000000..bf5e82f --- /dev/null +++ b/packages/react/lib/connect/index.ts @@ -0,0 +1,22 @@ +// React hook for Nylas connection +export { useNylasConnect } from "./useNylasConnect"; + +// Export all auth-related types +export * from "./types"; + +// Re-export core classes from @nylas/connect for convenience +export { NylasConnect } from "@nylas/connect"; +export { + NylasConnectError, + ConfigError, + NetworkError, + OAuthError, + TokenError, + PopupError, +} from "@nylas/connect"; +export { BrowserTokenStorage, MemoryTokenStorage } from "@nylas/connect"; +export { + parseConnectCallback, + isConnectCallback, + logger, +} from "@nylas/connect"; diff --git a/packages/react/lib/connect/types.ts b/packages/react/lib/connect/types.ts new file mode 100644 index 0000000..d98adb7 --- /dev/null +++ b/packages/react/lib/connect/types.ts @@ -0,0 +1,27 @@ +// Re-export connect types from @nylas/connect for convenience +export type { + ConnectConfig, + ConnectOptions, + ConnectResult, + GrantInfo, + ConnectError, + PKCEPair, + TokenStorage, + TokenResponse, + LogLevel, + Provider, + Environment, + ConnectMethod, + ConnectionStatus, + ConnectEvent, + ConnectStateChangeCallback, + SessionData, +} from "@nylas/connect"; + +// Export hook-specific types +export type { + UseNylasConnectConfig, + UseNylasConnectState, + UseNylasConnectActions, + UseNylasConnectReturn, +} from "./useNylasConnect"; diff --git a/packages/react/lib/connect/useNylasConnect.test.ts b/packages/react/lib/connect/useNylasConnect.test.ts new file mode 100644 index 0000000..b0ddcef --- /dev/null +++ b/packages/react/lib/connect/useNylasConnect.test.ts @@ -0,0 +1,143 @@ +import { describe, it, expect, beforeEach, vi, afterEach } from "vitest"; +import { renderHook, waitFor } from "@testing-library/react"; +import { act } from "react"; +import { useNylasConnect } from "./useNylasConnect"; +import { NylasConnect } from "@nylas/connect"; + +// Mock the NylasConnect module +vi.mock("@nylas/connect", () => ({ + NylasConnect: vi.fn(), +})); + +describe("useNylasConnect callback deduplication", () => { + const mockCallback = vi.fn(); + const mockIsAutoCallbackEnabled = vi.fn(); + const mockGetSession = vi.fn(); + const mockOnConnectStateChange = vi.fn(); + + const mockAuthClient = { + callback: mockCallback, + isAutoCallbackEnabled: mockIsAutoCallbackEnabled, + getSession: mockGetSession, + onConnectStateChange: mockOnConnectStateChange, + logger: { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + log: vi.fn(), + setLevel: vi.fn(), + enable: vi.fn(), + disable: vi.fn(), + }, + setLogLevel: vi.fn(), + connect: vi.fn(), + logout: vi.fn(), + isConnected: vi.fn(), + }; + + beforeEach(() => { + vi.clearAllMocks(); + (NylasConnect as any).mockImplementation(() => mockAuthClient); + mockIsAutoCallbackEnabled.mockReturnValue(true); + mockGetSession.mockResolvedValue(null); + mockOnConnectStateChange.mockReturnValue(() => {}); + + // Mock window.location with callback parameters + Object.defineProperty(window, "location", { + value: { + href: "https://app.example.com/callback?code=auth123&state=xyz789", + }, + writable: true, + }); + + // Mock history API + Object.defineProperty(window, "history", { + value: { + replaceState: vi.fn(), + state: {}, + }, + writable: true, + }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("should only call callback once despite React Strict Mode double-invocation", async () => { + const config = { + clientId: "test_client", + redirectUri: "https://app.example.com/callback", + autoHandleCallback: true, + }; + + // Render the hook in strict mode simulation (double effect execution) + const { rerender } = renderHook(() => useNylasConnect(config)); + + // Wait for effects to complete + await waitFor(() => { + expect(mockCallback).toHaveBeenCalledTimes(1); + }); + + // Simulate strict mode by re-rendering (which triggers effects again) + rerender(); + + // Wait a bit more to ensure no additional calls + await new Promise((resolve) => setTimeout(resolve, 100)); + + // Callback should still only be called once + expect(mockCallback).toHaveBeenCalledTimes(1); + }); + + it("should not call callback if session already exists", async () => { + // Mock existing session + mockGetSession.mockResolvedValue({ + accessToken: "existing_token", + grantId: "grant123", + grantInfo: { id: "user123", email: "test@example.com" }, + }); + + const config = { + clientId: "test_client", + redirectUri: "https://app.example.com/callback", + autoHandleCallback: true, + }; + + renderHook(() => useNylasConnect(config)); + + // Wait for effects to complete + await waitFor(() => { + expect(mockGetSession).toHaveBeenCalled(); + }); + + // Callback should not be called when session exists + expect(mockCallback).not.toHaveBeenCalled(); + }); + + it("should not call callback when URL has no callback parameters", async () => { + // Change URL to not have callback parameters + Object.defineProperty(window, "location", { + value: { + href: "https://app.example.com/dashboard", + }, + writable: true, + }); + + const config = { + clientId: "test_client", + redirectUri: "https://app.example.com/callback", + autoHandleCallback: true, + }; + + const { result } = renderHook(() => useNylasConnect(config)); + + // Wait for the hook to finish loading (much better than setTimeout!) + await waitFor(() => { + expect(result.current.isLoading).toBe(false); + }); + + // Callback should not be called without callback parameters + expect(mockCallback).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/react/lib/connect/useNylasConnect.ts b/packages/react/lib/connect/useNylasConnect.ts new file mode 100644 index 0000000..7270b4e --- /dev/null +++ b/packages/react/lib/connect/useNylasConnect.ts @@ -0,0 +1,487 @@ +import { useState, useEffect, useCallback, useRef } from "react"; +import { NylasConnect } from "@nylas/connect"; +import type { + ConnectConfig as AuthConfig, + ConnectOptions as AuthOptions, + ConnectResult as AuthResult, + GrantInfo, + ConnectEvent as AuthEvent, + ConnectEventData as AuthEventData, + ConnectStateChangeCallback as AuthStateChangeCallback, +} from "@nylas/connect"; +import { LogLevel } from "@nylas/connect"; + +/** + * Configuration for the useNylasConnect React hook + * Extends AuthConfig with connection-specific properties + */ +export interface UseNylasConnectConfig extends AuthConfig { + /** Auto-refresh session interval in milliseconds (default: disabled) */ + autoRefreshInterval?: number; + /** Initial loading state when hook mounts (default: true) */ + initialLoadingState?: boolean; + /** Number of retry attempts for failed operations (default: 0) */ + retryAttempts?: number; + /** Enable automatic error recovery for network errors (default: false) */ + enableAutoRecovery?: boolean; +} + +export interface UseNylasConnectState { + isConnected: boolean; + grant: GrantInfo | null; + isLoading: boolean; + error: Error | null; +} + +export interface UseNylasConnectActions { + connect: (options?: AuthOptions) => Promise; + logout: (grantId?: string) => Promise; + refreshSession: () => Promise; + subscribe: (callback: AuthStateChangeCallback) => () => void; + setLogLevel: (level: LogLevel | "off") => void; +} + +export interface UseNylasConnectReturn + extends UseNylasConnectState, + UseNylasConnectActions { + connectClient: NylasConnect; +} + +export function useNylasConnect( + config: UseNylasConnectConfig, +): UseNylasConnectReturn { + // Extract hook-specific config + const { + autoRefreshInterval, + initialLoadingState = true, + retryAttempts = 0, + enableAutoRecovery = false, + ...connectionConfig + } = config; + + // Create connect client instance (stable reference) + const connectClientRef = useRef(null); + if (!connectClientRef.current) { + connectClientRef.current = new NylasConnect(connectionConfig); + } + const connectClient = connectClientRef.current; + + // Track callback processing state to prevent duplicates + // This prevents React Strict Mode double-invocation and component re-mount issues + // that cause multiple POST requests to /connect/token with the same auth code + const callbackProcessingRef = useRef<{ + isProcessing: boolean; // Currently processing a callback + processedUrl: string | null; // URL that was already processed + hasProcessed: boolean; // Has successfully processed any callback + }>({ + isProcessing: false, + processedUrl: null, + hasProcessed: false, + }); + + // Reset callback state when URL changes significantly (navigation away from callback) + useEffect(() => { + const currentUrl = globalThis.window?.location.href || ""; + const callbackState = callbackProcessingRef.current; + + // If URL no longer contains callback parameters and we've processed before, reset state + const hasCallbackParams = + currentUrl.includes("code=") && currentUrl.includes("state="); + if (!hasCallbackParams && callbackState.hasProcessed) { + callbackState.hasProcessed = false; + callbackState.processedUrl = null; + } + }); + + // Handle callback on app load (if enabled) + useEffect(() => { + if (!connectionConfig.autoHandleCallback) { + return; + } + + // Capture the callback state ref at effect creation time + const callbackStateRef = callbackProcessingRef; + + const processCallback = async () => { + const currentUrl = globalThis.window?.location.href || ""; + const callbackState = callbackStateRef.current; + + // Skip if already processing, processed this URL, or no callback params + if ( + callbackState.isProcessing || + callbackState.processedUrl === currentUrl || + callbackState.hasProcessed + ) { + return; + } + + // Check if URL contains OAuth callback parameters + const hasCallbackParams = + currentUrl.includes("code=") && currentUrl.includes("state="); + if (!hasCallbackParams) { + return; + } + + // Check if we already have a valid session to avoid unnecessary processing + try { + const existingSession = await connectClient.getSession(); + if (existingSession) { + // Mark as processed to prevent future attempts + callbackState.hasProcessed = true; + callbackState.processedUrl = currentUrl; + return; + } + } catch (e) { + // Continue with callback processing if session check fails + } + + // Mark as processing to prevent concurrent attempts + callbackState.isProcessing = true; + callbackState.processedUrl = currentUrl; + + try { + await connectClient.callback(); + callbackState.hasProcessed = true; + + // Additional URL cleanup as a safeguard (client should handle this) + // but we ensure it's cleaned in case something went wrong + if (globalThis.window?.history?.replaceState) { + const url = new URL(globalThis.window.location.href); + const authParams = ["code", "state", "error", "error_description"]; + let needsCleaning = false; + + authParams.forEach((param) => { + if (url.searchParams.has(param)) { + url.searchParams.delete(param); + needsCleaning = true; + } + }); + + if (needsCleaning) { + globalThis.window.history.replaceState( + globalThis.window.history.state, + document.title, + url.toString(), + ); + } + } + } catch (e) { + console.log("callback error", e); + // Reset processing state on error to allow retry if needed + callbackState.isProcessing = false; + callbackState.processedUrl = null; + } finally { + callbackState.isProcessing = false; + } + }; + + processCallback(); + + // Cleanup function to reset state if component unmounts + return () => { + // Use the captured ref from effect scope + const callbackState = callbackStateRef.current; + // Only reset if we're not currently processing to avoid interrupting ongoing operations + if (!callbackState?.isProcessing) { + callbackState.processedUrl = null; + callbackState.hasProcessed = false; + } + }; + }, [connectClient]); + + // Connection state + const [state, setState] = useState({ + isConnected: false, + grant: null, + isLoading: initialLoadingState, + error: null, + }); + + // Initialize connection state on mount + useEffect(() => { + let isMounted = true; + + const initializeAuth = async () => { + try { + const session = await connectClient.getSession(); + const connectionStatus = await connectClient.getConnectionStatus(); + const isConnected = connectionStatus === "connected"; + + if (isMounted) { + setState((prev) => ({ + ...prev, + isConnected, + grant: session?.grantInfo || null, + isLoading: false, + error: null, + })); + } + } catch (error) { + if (isMounted) { + setState((prev) => ({ + ...prev, + isConnected: false, + grant: null, + isLoading: false, + error: error as Error, + })); + } + } + }; + + initializeAuth(); + + return () => { + isMounted = false; + }; + }, [connectClient]); + + // Auto-refresh session at specified interval + useEffect(() => { + if (!autoRefreshInterval || autoRefreshInterval <= 0) { + return; + } + + const intervalId = setInterval(async () => { + try { + const session = await connectClient.getSession(); + const connectionStatus = await connectClient.getConnectionStatus(); + const isConnected = connectionStatus === "connected"; + + setState((prev) => ({ + ...prev, + isConnected, + grant: session?.grantInfo || null, + error: null, + })); + } catch (error) { + if (enableAutoRecovery) { + // Attempt to recover from network errors silently + console.debug( + "Auto-refresh failed, will retry next interval:", + error, + ); + } else { + setState((prev) => ({ + ...prev, + error: error as Error, + })); + } + } + }, autoRefreshInterval); + + return () => clearInterval(intervalId); + }, [connectClient, autoRefreshInterval, enableAutoRecovery]); + + // Subscribe to connection state changes + useEffect(() => { + const handleConnectionStateChange = ( + event: AuthEvent, + session: AuthResult | null, + data?: AuthEventData[AuthEvent], + ) => { + setState((prev) => { + switch (event) { + case "CONNECT_STARTED": + return { + ...prev, + isLoading: true, + error: null, + }; + + case "SIGNED_IN": + case "SESSION_RESTORED": + return { + ...prev, + isConnected: true, + grant: session?.grantInfo || null, + isLoading: false, + error: null, + }; + + case "SIGNED_OUT": + return { + ...prev, + isConnected: false, + grant: null, + isLoading: false, + error: null, + }; + + case "CONNECT_ERROR": + case "NETWORK_ERROR": + case "TOKEN_VALIDATION_ERROR": + return { + ...prev, + isLoading: false, + error: (data as any)?.error || new Error("Authentication error"), + }; + + case "CONNECT_CANCELLED": + return { + ...prev, + isLoading: false, + error: null, + }; + + case "SESSION_EXPIRED": + case "SESSION_INVALID": + return { + ...prev, + isConnected: false, + grant: null, + isLoading: false, + error: null, + }; + + default: + return prev; + } + }); + }; + + const unsubscribe = connectClient.onConnectStateChange( + handleConnectionStateChange, + ); + + return unsubscribe; + }, [connectClient]); + + // Wrapped connect method with retry logic + const connect = useCallback( + async (options: AuthOptions = {}) => { + setState((prev) => ({ ...prev, isLoading: true, error: null })); + + let lastError: Error; + const maxAttempts = retryAttempts + 1; + + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + try { + const result = await connectClient.connect(options); + return result; + } catch (error) { + lastError = error as Error; + + if (attempt < maxAttempts) { + // Wait before retry (exponential backoff) + const delay = Math.min(1000 * Math.pow(2, attempt - 1), 5000); + await new Promise((resolve) => setTimeout(resolve, delay)); + } + } + } + + // All attempts failed + throw lastError!; + }, + [connectClient, retryAttempts], + ); + + // Wrapped logout method with retry logic + const logout = useCallback( + async (grantId?: string) => { + setState((prev) => ({ ...prev, isLoading: true, error: null })); + + let lastError: Error; + const maxAttempts = retryAttempts + 1; + + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + try { + await connectClient.logout(grantId); + return; + } catch (error) { + lastError = error as Error; + + if (attempt < maxAttempts) { + // Wait before retry + const delay = Math.min(1000 * Math.pow(2, attempt - 1), 3000); + await new Promise((resolve) => setTimeout(resolve, delay)); + } + } + } + + // All attempts failed + setState((prev) => ({ + ...prev, + isLoading: false, + error: lastError!, + })); + throw lastError!; + }, + [connectClient, retryAttempts], + ); + + // Refresh session method with retry logic + const refreshSession = useCallback(async () => { + setState((prev) => ({ ...prev, isLoading: true, error: null })); + + let lastError: Error; + const maxAttempts = retryAttempts + 1; + + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + try { + const session = await connectClient.getSession(); + const connectionStatus = await connectClient.getConnectionStatus(); + const isConnected = connectionStatus === "connected"; + + setState((prev) => ({ + ...prev, + isConnected, + grant: session?.grantInfo || null, + isLoading: false, + error: null, + })); + return; + } catch (error) { + lastError = error as Error; + + if (attempt < maxAttempts) { + // Wait before retry + const delay = Math.min(1000 * Math.pow(2, attempt - 1), 3000); + await new Promise((resolve) => setTimeout(resolve, delay)); + } + } + } + + // All attempts failed + setState((prev) => ({ + ...prev, + isConnected: false, + grant: null, + isLoading: false, + error: lastError!, + })); + throw lastError!; + }, [connectClient, retryAttempts]); + + // Subscribe method for listening to connection events + const subscribe = useCallback( + (callback: AuthStateChangeCallback) => { + return connectClient.onConnectStateChange(callback); + }, + [connectClient], + ); + + const setLogLevel = useCallback( + (level: LogLevel | "off") => { + connectClient.setLogLevel(level); + }, + [connectClient], + ); + + return { + // State + ...state, + + // Actions + connect, + logout, + refreshSession, + subscribe, + + // Logger controls + setLogLevel, + + // Direct access + connectClient, + }; +} diff --git a/packages/react/lib/elements.ts b/packages/react/lib/elements.ts new file mode 100644 index 0000000..178289b --- /dev/null +++ b/packages/react/lib/elements.ts @@ -0,0 +1,2 @@ +// Entry point for Nylas Web Elements React components +export * from "./elements/components"; diff --git a/packages/react/lib/elements/components.ts b/packages/react/lib/elements/components.ts new file mode 100644 index 0000000..8c6e113 --- /dev/null +++ b/packages/react/lib/elements/components.ts @@ -0,0 +1,3559 @@ +"use client"; + +/** + * This file was automatically generated by the Stencil React Output Target. + * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated. + */ + +/* eslint-disable */ + +import { + type BookedEventInfo, + type CONFIGURATION_EVENT_TYPE, + type Configuration, + type CreateGroupEventFormState, + type DropdownOption, + type GroupConfiguration, + type GroupEvent, + type GroupEventAPIData, + type ImportGroupEventDetails, + type InputDropdownCustomEvent, + type InputImageUrlCustomEvent, + type Notification, + type NylasBookedEventCardCustomEvent, + type NylasBookingCalendarPickerCustomEvent, + type NylasBookingConfirmationRedirectCustomEvent, + type NylasBookingConfirmationTypeCustomEvent, + type NylasBookingFormCustomEvent, + type NylasBufferTimeCustomEvent, + type NylasCalendarPickerCustomEvent, + type NylasCancelBookingFormCustomEvent, + type NylasCancelledEventCardCustomEvent, + type NylasConfirmationEmailCustomEvent, + type NylasConfirmedEventCardCustomEvent, + type NylasCustomEventSlugCustomEvent, + type NylasCustomizeBookingSettingsCustomEvent, + type NylasDatePickerCustomEvent, + type NylasDisableEmailsCustomEvent, + type NylasEditorTabsCustomEvent, + type NylasEditorTabsGroupCustomEvent, + type NylasEventCalendarCustomEvent, + type NylasEventCapacityCustomEvent, + type NylasListConfigurationsCustomEvent, + type NylasOrganizerConfirmationCardCustomEvent, + type NylasPageNameCustomEvent, + type NylasPageStylingCustomEvent, + type NylasReminderEmailsCustomEvent, + type NylasSchedulerBookingDataWithFlatFields, + type NylasSchedulerEditorCustomEvent, + type NylasSchedulerErrorResponse, + type NylasSchedulerResponse, + type NylasSchedulingCustomEvent, + type NylasSchedulingMethodCustomEvent, + type NylasSelectEventTypeCustomEvent, + type NylasTimeslotPickerCustomEvent, + type RecurrenceDeleteOption, + type RecurrenceUpdateOption, + type SchedulerEventDetail, + type SchedulerGroupEventDetail, + type SelectDropdownCustomEvent, + type Timeslot, + type UISettingsResponse, +} from "@nylas/web-elements"; +import { + AddCircleIcon as AddCircleIconElement, + defineCustomElement as defineAddCircleIcon, +} from "@nylas/web-elements/dist/components/add-circle-icon.js"; +import { + ArchiveIcon as ArchiveIconElement, + defineCustomElement as defineArchiveIcon, +} from "@nylas/web-elements/dist/components/archive-icon.js"; +import { + ArrowIcon as ArrowIconElement, + defineCustomElement as defineArrowIcon, +} from "@nylas/web-elements/dist/components/arrow-icon.js"; +import { + BoldIcon as BoldIconElement, + defineCustomElement as defineBoldIcon, +} from "@nylas/web-elements/dist/components/bold-icon.js"; +import { + ButtonComponent as ButtonComponentElement, + defineCustomElement as defineButtonComponent, +} from "@nylas/web-elements/dist/components/button-component.js"; +import { + CalendarAgendaFillIcon as CalendarAgendaFillIconElement, + defineCustomElement as defineCalendarAgendaFillIcon, +} from "@nylas/web-elements/dist/components/calendar-agenda-fill-icon.js"; +import { + CalendarAgendaIcon as CalendarAgendaIconElement, + defineCustomElement as defineCalendarAgendaIcon, +} from "@nylas/web-elements/dist/components/calendar-agenda-icon.js"; +import { + CalendarCancelIcon as CalendarCancelIconElement, + defineCustomElement as defineCalendarCancelIcon, +} from "@nylas/web-elements/dist/components/calendar-cancel-icon.js"; +import { + CalendarCheckIcon as CalendarCheckIconElement, + defineCustomElement as defineCalendarCheckIcon, +} from "@nylas/web-elements/dist/components/calendar-check-icon.js"; +import { + CalendarIcon as CalendarIconElement, + defineCustomElement as defineCalendarIcon, +} from "@nylas/web-elements/dist/components/calendar-icon.js"; +import { + CalendarInfoIcon as CalendarInfoIconElement, + defineCustomElement as defineCalendarInfoIcon, +} from "@nylas/web-elements/dist/components/calendar-info-icon.js"; +import { + CalendarPatternsIcon as CalendarPatternsIconElement, + defineCustomElement as defineCalendarPatternsIcon, +} from "@nylas/web-elements/dist/components/calendar-patterns-icon.js"; +import { + CheckboxComponent as CheckboxComponentElement, + defineCustomElement as defineCheckboxComponent, +} from "@nylas/web-elements/dist/components/checkbox-component.js"; +import { + CheckboxGroup as CheckboxGroupElement, + defineCustomElement as defineCheckboxGroup, +} from "@nylas/web-elements/dist/components/checkbox-group.js"; +import { + CheckmarkCircleIcon as CheckmarkCircleIconElement, + defineCustomElement as defineCheckmarkCircleIcon, +} from "@nylas/web-elements/dist/components/checkmark-circle-icon.js"; +import { + CheckmarkIcon as CheckmarkIconElement, + defineCustomElement as defineCheckmarkIcon, +} from "@nylas/web-elements/dist/components/checkmark-icon.js"; +import { + ChevronIcon as ChevronIconElement, + defineCustomElement as defineChevronIcon, +} from "@nylas/web-elements/dist/components/chevron-icon.js"; +import { + ClockIcon as ClockIconElement, + defineCustomElement as defineClockIcon, +} from "@nylas/web-elements/dist/components/clock-icon.js"; +import { + CloseIcon as CloseIconElement, + defineCustomElement as defineCloseIcon, +} from "@nylas/web-elements/dist/components/close-icon.js"; +import { + CopyIcon as CopyIconElement, + defineCustomElement as defineCopyIcon, +} from "@nylas/web-elements/dist/components/copy-icon.js"; +import { + DeleteIcon as DeleteIconElement, + defineCustomElement as defineDeleteIcon, +} from "@nylas/web-elements/dist/components/delete-icon.js"; +import { + DocumentRefreshIcon as DocumentRefreshIconElement, + defineCustomElement as defineDocumentRefreshIcon, +} from "@nylas/web-elements/dist/components/document-refresh-icon.js"; +import { + DragableIcon as DragableIconElement, + defineCustomElement as defineDragableIcon, +} from "@nylas/web-elements/dist/components/dragable-icon.js"; +import { + EditIcon as EditIconElement, + defineCustomElement as defineEditIcon, +} from "@nylas/web-elements/dist/components/edit-icon.js"; +import { + EnvelopeFillIcon as EnvelopeFillIconElement, + defineCustomElement as defineEnvelopeFillIcon, +} from "@nylas/web-elements/dist/components/envelope-fill-icon.js"; +import { + EnvelopeIcon as EnvelopeIconElement, + defineCustomElement as defineEnvelopeIcon, +} from "@nylas/web-elements/dist/components/envelope-icon.js"; +import { + EyeIcon as EyeIconElement, + defineCustomElement as defineEyeIcon, +} from "@nylas/web-elements/dist/components/eye-icon.js"; +import { + FeedbackIcon as FeedbackIconElement, + defineCustomElement as defineFeedbackIcon, +} from "@nylas/web-elements/dist/components/feedback-icon.js"; +import { + FlowIcon as FlowIconElement, + defineCustomElement as defineFlowIcon, +} from "@nylas/web-elements/dist/components/flow-icon.js"; +import { + FolderIcon as FolderIconElement, + defineCustomElement as defineFolderIcon, +} from "@nylas/web-elements/dist/components/folder-icon.js"; +import { + ForwardIcon as ForwardIconElement, + defineCustomElement as defineForwardIcon, +} from "@nylas/web-elements/dist/components/forward-icon.js"; +import { + GlobeIcon as GlobeIconElement, + defineCustomElement as defineGlobeIcon, +} from "@nylas/web-elements/dist/components/globe-icon.js"; +import { + GoogleLogoIcon as GoogleLogoIconElement, + defineCustomElement as defineGoogleLogoIcon, +} from "@nylas/web-elements/dist/components/google-logo-icon.js"; +import { + GoogleMeetIcon as GoogleMeetIconElement, + defineCustomElement as defineGoogleMeetIcon, +} from "@nylas/web-elements/dist/components/google-meet-icon.js"; +import { + InboxIcon as InboxIconElement, + defineCustomElement as defineInboxIcon, +} from "@nylas/web-elements/dist/components/inbox-icon.js"; +import { + InfoIcon as InfoIconElement, + defineCustomElement as defineInfoIcon, +} from "@nylas/web-elements/dist/components/info-icon.js"; +import { + InputColorPicker as InputColorPickerElement, + defineCustomElement as defineInputColorPicker, +} from "@nylas/web-elements/dist/components/input-color-picker.js"; +import { + InputComponent as InputComponentElement, + defineCustomElement as defineInputComponent, +} from "@nylas/web-elements/dist/components/input-component.js"; +import { + InputDropdown as InputDropdownElement, + defineCustomElement as defineInputDropdown, +} from "@nylas/web-elements/dist/components/input-dropdown.js"; +import { + InputImageUrl as InputImageUrlElement, + defineCustomElement as defineInputImageUrl, +} from "@nylas/web-elements/dist/components/input-image-url.js"; +import { + ItalicIcon as ItalicIconElement, + defineCustomElement as defineItalicIcon, +} from "@nylas/web-elements/dist/components/italic-icon.js"; +import { + LoadingIcon as LoadingIconElement, + defineCustomElement as defineLoadingIcon, +} from "@nylas/web-elements/dist/components/loading-icon.js"; +import { + LocationIcon as LocationIconElement, + defineCustomElement as defineLocationIcon, +} from "@nylas/web-elements/dist/components/location-icon.js"; +import { + LocationOffIcon as LocationOffIconElement, + defineCustomElement as defineLocationOffIcon, +} from "@nylas/web-elements/dist/components/location-off-icon.js"; +import { + MicrosoftLogoIcon as MicrosoftLogoIconElement, + defineCustomElement as defineMicrosoftLogoIcon, +} from "@nylas/web-elements/dist/components/microsoft-logo-icon.js"; +import { + MicrosoftTeamsIcon as MicrosoftTeamsIconElement, + defineCustomElement as defineMicrosoftTeamsIcon, +} from "@nylas/web-elements/dist/components/microsoft-teams-icon.js"; +import { + MultiSelectDropdown as MultiSelectDropdownElement, + defineCustomElement as defineMultiSelectDropdown, +} from "@nylas/web-elements/dist/components/multi-select-dropdown.js"; +import { + NylasAdditionalParticipants as NylasAdditionalParticipantsElement, + defineCustomElement as defineNylasAdditionalParticipants, +} from "@nylas/web-elements/dist/components/nylas-additional-participants.js"; +import { + NylasAvailabilityPicker as NylasAvailabilityPickerElement, + defineCustomElement as defineNylasAvailabilityPicker, +} from "@nylas/web-elements/dist/components/nylas-availability-picker.js"; +import { + NylasBookedEventCard as NylasBookedEventCardElement, + defineCustomElement as defineNylasBookedEventCard, +} from "@nylas/web-elements/dist/components/nylas-booked-event-card.js"; +import { + NylasBookingCalendarPicker as NylasBookingCalendarPickerElement, + defineCustomElement as defineNylasBookingCalendarPicker, +} from "@nylas/web-elements/dist/components/nylas-booking-calendar-picker.js"; +import { + NylasBookingConfirmationRedirect as NylasBookingConfirmationRedirectElement, + defineCustomElement as defineNylasBookingConfirmationRedirect, +} from "@nylas/web-elements/dist/components/nylas-booking-confirmation-redirect.js"; +import { + NylasBookingConfirmationType as NylasBookingConfirmationTypeElement, + defineCustomElement as defineNylasBookingConfirmationType, +} from "@nylas/web-elements/dist/components/nylas-booking-confirmation-type.js"; +import { + NylasBookingFormConfig as NylasBookingFormConfigElement, + defineCustomElement as defineNylasBookingFormConfig, +} from "@nylas/web-elements/dist/components/nylas-booking-form-config.js"; +import { + NylasBookingForm as NylasBookingFormElement, + defineCustomElement as defineNylasBookingForm, +} from "@nylas/web-elements/dist/components/nylas-booking-form.js"; +import { + NylasBufferTime as NylasBufferTimeElement, + defineCustomElement as defineNylasBufferTime, +} from "@nylas/web-elements/dist/components/nylas-buffer-time.js"; +import { + NylasCalendarPicker as NylasCalendarPickerElement, + defineCustomElement as defineNylasCalendarPicker, +} from "@nylas/web-elements/dist/components/nylas-calendar-picker.js"; +import { + NylasCancelBookingForm as NylasCancelBookingFormElement, + defineCustomElement as defineNylasCancelBookingForm, +} from "@nylas/web-elements/dist/components/nylas-cancel-booking-form.js"; +import { + NylasCancellationPolicy as NylasCancellationPolicyElement, + defineCustomElement as defineNylasCancellationPolicy, +} from "@nylas/web-elements/dist/components/nylas-cancellation-policy.js"; +import { + NylasCancelledEventCard as NylasCancelledEventCardElement, + defineCustomElement as defineNylasCancelledEventCard, +} from "@nylas/web-elements/dist/components/nylas-cancelled-event-card.js"; +import { + NylasConfirmationEmail as NylasConfirmationEmailElement, + defineCustomElement as defineNylasConfirmationEmail, +} from "@nylas/web-elements/dist/components/nylas-confirmation-email.js"; +import { + NylasConfirmedEventCard as NylasConfirmedEventCardElement, + defineCustomElement as defineNylasConfirmedEventCard, +} from "@nylas/web-elements/dist/components/nylas-confirmed-event-card.js"; +import { + NylasConnectedCalendars as NylasConnectedCalendarsElement, + defineCustomElement as defineNylasConnectedCalendars, +} from "@nylas/web-elements/dist/components/nylas-connected-calendars.js"; +import { + NylasCustomBookingFlow as NylasCustomBookingFlowElement, + defineCustomElement as defineNylasCustomBookingFlow, +} from "@nylas/web-elements/dist/components/nylas-custom-booking-flow.js"; +import { + NylasCustomEventSlug as NylasCustomEventSlugElement, + defineCustomElement as defineNylasCustomEventSlug, +} from "@nylas/web-elements/dist/components/nylas-custom-event-slug.js"; +import { + NylasCustomizeBookingSettings as NylasCustomizeBookingSettingsElement, + defineCustomElement as defineNylasCustomizeBookingSettings, +} from "@nylas/web-elements/dist/components/nylas-customize-booking-settings.js"; +import { + NylasDateComponent as NylasDateComponentElement, + defineCustomElement as defineNylasDateComponent, +} from "@nylas/web-elements/dist/components/nylas-date-component.js"; +import { + NylasDatePicker as NylasDatePickerElement, + defineCustomElement as defineNylasDatePicker, +} from "@nylas/web-elements/dist/components/nylas-date-picker.js"; +import { + NylasDisableEmails as NylasDisableEmailsElement, + defineCustomElement as defineNylasDisableEmails, +} from "@nylas/web-elements/dist/components/nylas-disable-emails.js"; +import { + NylasEditorTabsGroup as NylasEditorTabsGroupElement, + defineCustomElement as defineNylasEditorTabsGroup, +} from "@nylas/web-elements/dist/components/nylas-editor-tabs-group.js"; +import { + NylasEditorTabs as NylasEditorTabsElement, + defineCustomElement as defineNylasEditorTabs, +} from "@nylas/web-elements/dist/components/nylas-editor-tabs.js"; +import { + NylasEventCalendar as NylasEventCalendarElement, + defineCustomElement as defineNylasEventCalendar, +} from "@nylas/web-elements/dist/components/nylas-event-calendar.js"; +import { + NylasEventCapacity as NylasEventCapacityElement, + defineCustomElement as defineNylasEventCapacity, +} from "@nylas/web-elements/dist/components/nylas-event-capacity.js"; +import { + NylasEventDescription as NylasEventDescriptionElement, + defineCustomElement as defineNylasEventDescription, +} from "@nylas/web-elements/dist/components/nylas-event-description.js"; +import { + NylasEventDuration as NylasEventDurationElement, + defineCustomElement as defineNylasEventDuration, +} from "@nylas/web-elements/dist/components/nylas-event-duration.js"; +import { + NylasEventInfo as NylasEventInfoElement, + defineCustomElement as defineNylasEventInfo, +} from "@nylas/web-elements/dist/components/nylas-event-info.js"; +import { + NylasEventLimits as NylasEventLimitsElement, + defineCustomElement as defineNylasEventLimits, +} from "@nylas/web-elements/dist/components/nylas-event-limits.js"; +import { + NylasEventLocation as NylasEventLocationElement, + defineCustomElement as defineNylasEventLocation, +} from "@nylas/web-elements/dist/components/nylas-event-location.js"; +import { + NylasEventTimeslot as NylasEventTimeslotElement, + defineCustomElement as defineNylasEventTimeslot, +} from "@nylas/web-elements/dist/components/nylas-event-timeslot.js"; +import { + NylasEventTitle as NylasEventTitleElement, + defineCustomElement as defineNylasEventTitle, +} from "@nylas/web-elements/dist/components/nylas-event-title.js"; +import { + NylasFeedbackForm as NylasFeedbackFormElement, + defineCustomElement as defineNylasFeedbackForm, +} from "@nylas/web-elements/dist/components/nylas-feedback-form.js"; +import { + NylasFormCard as NylasFormCardElement, + defineCustomElement as defineNylasFormCard, +} from "@nylas/web-elements/dist/components/nylas-form-card.js"; +import { + NylasLimitFutureBookings as NylasLimitFutureBookingsElement, + defineCustomElement as defineNylasLimitFutureBookings, +} from "@nylas/web-elements/dist/components/nylas-limit-future-bookings.js"; +import { + NylasListConfigurations as NylasListConfigurationsElement, + defineCustomElement as defineNylasListConfigurations, +} from "@nylas/web-elements/dist/components/nylas-list-configurations.js"; +import { + NylasLocaleSwitch as NylasLocaleSwitchElement, + defineCustomElement as defineNylasLocaleSwitch, +} from "@nylas/web-elements/dist/components/nylas-locale-switch.js"; +import { + NylasLogo as NylasLogoElement, + defineCustomElement as defineNylasLogo, +} from "@nylas/web-elements/dist/components/nylas-logo.js"; +import { + NylasMinBookingNotice as NylasMinBookingNoticeElement, + defineCustomElement as defineNylasMinBookingNotice, +} from "@nylas/web-elements/dist/components/nylas-min-booking-notice.js"; +import { + NylasMinCancellationNotice as NylasMinCancellationNoticeElement, + defineCustomElement as defineNylasMinCancellationNotice, +} from "@nylas/web-elements/dist/components/nylas-min-cancellation-notice.js"; +import { + NylasNotification as NylasNotificationElement, + defineCustomElement as defineNylasNotification, +} from "@nylas/web-elements/dist/components/nylas-notification.js"; +import { + NylasOrganizerConfirmationCard as NylasOrganizerConfirmationCardElement, + defineCustomElement as defineNylasOrganizerConfirmationCard, +} from "@nylas/web-elements/dist/components/nylas-organizer-confirmation-card.js"; +import { + NylasPageName as NylasPageNameElement, + defineCustomElement as defineNylasPageName, +} from "@nylas/web-elements/dist/components/nylas-page-name.js"; +import { + NylasPageStyling as NylasPageStylingElement, + defineCustomElement as defineNylasPageStyling, +} from "@nylas/web-elements/dist/components/nylas-page-styling.js"; +import { + NylasParticipantBookingCalendars as NylasParticipantBookingCalendarsElement, + defineCustomElement as defineNylasParticipantBookingCalendars, +} from "@nylas/web-elements/dist/components/nylas-participant-booking-calendars.js"; +import { + NylasParticipantsCustomAvailability as NylasParticipantsCustomAvailabilityElement, + defineCustomElement as defineNylasParticipantsCustomAvailability, +} from "@nylas/web-elements/dist/components/nylas-participants-custom-availability.js"; +import { + NylasReminderEmails as NylasReminderEmailsElement, + defineCustomElement as defineNylasReminderEmails, +} from "@nylas/web-elements/dist/components/nylas-reminder-emails.js"; +import { + NylasReminderTime as NylasReminderTimeElement, + defineCustomElement as defineNylasReminderTime, +} from "@nylas/web-elements/dist/components/nylas-reminder-time.js"; +import { + NylasSchedulerEditor as NylasSchedulerEditorElement, + defineCustomElement as defineNylasSchedulerEditor, +} from "@nylas/web-elements/dist/components/nylas-scheduler-editor.js"; +import { + NylasSchedulingMethod as NylasSchedulingMethodElement, + defineCustomElement as defineNylasSchedulingMethod, +} from "@nylas/web-elements/dist/components/nylas-scheduling-method.js"; +import { + NylasScheduling as NylasSchedulingElement, + defineCustomElement as defineNylasScheduling, +} from "@nylas/web-elements/dist/components/nylas-scheduling.js"; +import { + NylasSelectEventType as NylasSelectEventTypeElement, + defineCustomElement as defineNylasSelectEventType, +} from "@nylas/web-elements/dist/components/nylas-select-event-type.js"; +import { + NylasSelectedEventCard as NylasSelectedEventCardElement, + defineCustomElement as defineNylasSelectedEventCard, +} from "@nylas/web-elements/dist/components/nylas-selected-event-card.js"; +import { + NylasSpecificTimeAvailabilityPicker as NylasSpecificTimeAvailabilityPickerElement, + defineCustomElement as defineNylasSpecificTimeAvailabilityPicker, +} from "@nylas/web-elements/dist/components/nylas-specific-time-availability-picker.js"; +import { + NylasTimeWindowPicker as NylasTimeWindowPickerElement, + defineCustomElement as defineNylasTimeWindowPicker, +} from "@nylas/web-elements/dist/components/nylas-time-window-picker.js"; +import { + NylasTimeslotInterval as NylasTimeslotIntervalElement, + defineCustomElement as defineNylasTimeslotInterval, +} from "@nylas/web-elements/dist/components/nylas-timeslot-interval.js"; +import { + NylasTimeslotPicker as NylasTimeslotPickerElement, + defineCustomElement as defineNylasTimeslotPicker, +} from "@nylas/web-elements/dist/components/nylas-timeslot-picker.js"; +import { + PaintbrushFillIcon as PaintbrushFillIconElement, + defineCustomElement as definePaintbrushFillIcon, +} from "@nylas/web-elements/dist/components/paintbrush-fill-icon.js"; +import { + PaintbrushIcon as PaintbrushIconElement, + defineCustomElement as definePaintbrushIcon, +} from "@nylas/web-elements/dist/components/paintbrush-icon.js"; +import { + PeopleIcon as PeopleIconElement, + defineCustomElement as definePeopleIcon, +} from "@nylas/web-elements/dist/components/people-icon.js"; +import { + PersonClipboardIcon as PersonClipboardIconElement, + defineCustomElement as definePersonClipboardIcon, +} from "@nylas/web-elements/dist/components/person-clipboard-icon.js"; +import { + PersonIcon as PersonIconElement, + defineCustomElement as definePersonIcon, +} from "@nylas/web-elements/dist/components/person-icon.js"; +import { + PlayIcon as PlayIconElement, + defineCustomElement as definePlayIcon, +} from "@nylas/web-elements/dist/components/play-icon.js"; +import { + PlusIcon as PlusIconElement, + defineCustomElement as definePlusIcon, +} from "@nylas/web-elements/dist/components/plus-icon.js"; +import { + RadioButtonGroup as RadioButtonGroupElement, + defineCustomElement as defineRadioButtonGroup, +} from "@nylas/web-elements/dist/components/radio-button-group.js"; +import { + RefreshIcon as RefreshIconElement, + defineCustomElement as defineRefreshIcon, +} from "@nylas/web-elements/dist/components/refresh-icon.js"; +import { + ReplyAllIcon as ReplyAllIconElement, + defineCustomElement as defineReplyAllIcon, +} from "@nylas/web-elements/dist/components/reply-all-icon.js"; +import { + ReplyIcon as ReplyIconElement, + defineCustomElement as defineReplyIcon, +} from "@nylas/web-elements/dist/components/reply-icon.js"; +import { + SearchIcon as SearchIconElement, + defineCustomElement as defineSearchIcon, +} from "@nylas/web-elements/dist/components/search-icon.js"; +import { + SelectDropdown as SelectDropdownElement, + defineCustomElement as defineSelectDropdown, +} from "@nylas/web-elements/dist/components/select-dropdown.js"; +import { + SentIcon as SentIconElement, + defineCustomElement as defineSentIcon, +} from "@nylas/web-elements/dist/components/sent-icon.js"; +import { + SpamIcon as SpamIconElement, + defineCustomElement as defineSpamIcon, +} from "@nylas/web-elements/dist/components/spam-icon.js"; +import { + StarIcon as StarIconElement, + defineCustomElement as defineStarIcon, +} from "@nylas/web-elements/dist/components/star-icon.js"; +import { + StopIcon as StopIconElement, + defineCustomElement as defineStopIcon, +} from "@nylas/web-elements/dist/components/stop-icon.js"; +import { + TextareaComponent as TextareaComponentElement, + defineCustomElement as defineTextareaComponent, +} from "@nylas/web-elements/dist/components/textarea-component.js"; +import { + TimePeriodSelector as TimePeriodSelectorElement, + defineCustomElement as defineTimePeriodSelector, +} from "@nylas/web-elements/dist/components/time-period-selector.js"; +import { + ToggleSwitch as ToggleSwitchElement, + defineCustomElement as defineToggleSwitch, +} from "@nylas/web-elements/dist/components/toggle-switch.js"; +import { + TooltipComponent as TooltipComponentElement, + defineCustomElement as defineTooltipComponent, +} from "@nylas/web-elements/dist/components/tooltip-component.js"; +import { + TranslateIcon as TranslateIconElement, + defineCustomElement as defineTranslateIcon, +} from "@nylas/web-elements/dist/components/translate-icon.js"; +import { + TrashFillIcon as TrashFillIconElement, + defineCustomElement as defineTrashFillIcon, +} from "@nylas/web-elements/dist/components/trash-fill-icon.js"; +import { + TrashIcon as TrashIconElement, + defineCustomElement as defineTrashIcon, +} from "@nylas/web-elements/dist/components/trash-icon.js"; +import { + UnderlineIcon as UnderlineIconElement, + defineCustomElement as defineUnderlineIcon, +} from "@nylas/web-elements/dist/components/underline-icon.js"; +import { + WarningIcon as WarningIconElement, + defineCustomElement as defineWarningIcon, +} from "@nylas/web-elements/dist/components/warning-icon.js"; +import { + ZoomIcon as ZoomIconElement, + defineCustomElement as defineZoomIcon, +} from "@nylas/web-elements/dist/components/zoom-icon.js"; +import type { + EventName, + StencilReactComponent, +} from "@stencil/react-output-target/runtime"; +import { createComponent } from "@stencil/react-output-target/runtime"; +import React from "react"; + +export type AddCircleIconEvents = NonNullable; + +export const AddCircleIcon: StencilReactComponent< + AddCircleIconElement, + AddCircleIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "add-circle-icon", + elementClass: AddCircleIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as AddCircleIconEvents, + defineCustomElement: defineAddCircleIcon, +}); + +export type ArchiveIconEvents = NonNullable; + +export const ArchiveIcon: StencilReactComponent< + ArchiveIconElement, + ArchiveIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "archive-icon", + elementClass: ArchiveIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ArchiveIconEvents, + defineCustomElement: defineArchiveIcon, +}); + +export type ArrowIconEvents = NonNullable; + +export const ArrowIcon: StencilReactComponent< + ArrowIconElement, + ArrowIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "arrow-icon", + elementClass: ArrowIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ArrowIconEvents, + defineCustomElement: defineArrowIcon, +}); + +export type BoldIconEvents = NonNullable; + +export const BoldIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "bold-icon", + elementClass: BoldIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as BoldIconEvents, + defineCustomElement: defineBoldIcon, + }); + +export type ButtonComponentEvents = NonNullable; + +export const ButtonComponent: StencilReactComponent< + ButtonComponentElement, + ButtonComponentEvents +> = /*@__PURE__*/ createComponent< + ButtonComponentElement, + ButtonComponentEvents +>({ + tagName: "button-component", + elementClass: ButtonComponentElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ButtonComponentEvents, + defineCustomElement: defineButtonComponent, +}); + +export type CalendarAgendaFillIconEvents = NonNullable; + +export const CalendarAgendaFillIcon: StencilReactComponent< + CalendarAgendaFillIconElement, + CalendarAgendaFillIconEvents +> = /*@__PURE__*/ createComponent< + CalendarAgendaFillIconElement, + CalendarAgendaFillIconEvents +>({ + tagName: "calendar-agenda-fill-icon", + elementClass: CalendarAgendaFillIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CalendarAgendaFillIconEvents, + defineCustomElement: defineCalendarAgendaFillIcon, +}); + +export type CalendarAgendaIconEvents = NonNullable; + +export const CalendarAgendaIcon: StencilReactComponent< + CalendarAgendaIconElement, + CalendarAgendaIconEvents +> = /*@__PURE__*/ createComponent< + CalendarAgendaIconElement, + CalendarAgendaIconEvents +>({ + tagName: "calendar-agenda-icon", + elementClass: CalendarAgendaIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CalendarAgendaIconEvents, + defineCustomElement: defineCalendarAgendaIcon, +}); + +export type CalendarCancelIconEvents = NonNullable; + +export const CalendarCancelIcon: StencilReactComponent< + CalendarCancelIconElement, + CalendarCancelIconEvents +> = /*@__PURE__*/ createComponent< + CalendarCancelIconElement, + CalendarCancelIconEvents +>({ + tagName: "calendar-cancel-icon", + elementClass: CalendarCancelIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CalendarCancelIconEvents, + defineCustomElement: defineCalendarCancelIcon, +}); + +export type CalendarCheckIconEvents = NonNullable; + +export const CalendarCheckIcon: StencilReactComponent< + CalendarCheckIconElement, + CalendarCheckIconEvents +> = /*@__PURE__*/ createComponent< + CalendarCheckIconElement, + CalendarCheckIconEvents +>({ + tagName: "calendar-check-icon", + elementClass: CalendarCheckIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CalendarCheckIconEvents, + defineCustomElement: defineCalendarCheckIcon, +}); + +export type CalendarIconEvents = NonNullable; + +export const CalendarIcon: StencilReactComponent< + CalendarIconElement, + CalendarIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "calendar-icon", + elementClass: CalendarIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CalendarIconEvents, + defineCustomElement: defineCalendarIcon, +}); + +export type CalendarInfoIconEvents = NonNullable; + +export const CalendarInfoIcon: StencilReactComponent< + CalendarInfoIconElement, + CalendarInfoIconEvents +> = /*@__PURE__*/ createComponent< + CalendarInfoIconElement, + CalendarInfoIconEvents +>({ + tagName: "calendar-info-icon", + elementClass: CalendarInfoIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CalendarInfoIconEvents, + defineCustomElement: defineCalendarInfoIcon, +}); + +export type CalendarPatternsIconEvents = NonNullable; + +export const CalendarPatternsIcon: StencilReactComponent< + CalendarPatternsIconElement, + CalendarPatternsIconEvents +> = /*@__PURE__*/ createComponent< + CalendarPatternsIconElement, + CalendarPatternsIconEvents +>({ + tagName: "calendar-patterns-icon", + elementClass: CalendarPatternsIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CalendarPatternsIconEvents, + defineCustomElement: defineCalendarPatternsIcon, +}); + +export type CheckboxComponentEvents = { + onNylasFormCheckboxToggled: EventName< + CustomEvent<{ + checked: boolean; + name: string; + label: string; + }> + >; +}; + +export const CheckboxComponent: StencilReactComponent< + CheckboxComponentElement, + CheckboxComponentEvents +> = /*@__PURE__*/ createComponent< + CheckboxComponentElement, + CheckboxComponentEvents +>({ + tagName: "checkbox-component", + elementClass: CheckboxComponentElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormCheckboxToggled: "nylasFormCheckboxToggled", + } as CheckboxComponentEvents, + defineCustomElement: defineCheckboxComponent, +}); + +export type CheckboxGroupEvents = { + onNylasCheckboxGroupChanged: EventName< + CustomEvent<{ + selectedValues: string[]; + name: string; + }> + >; +}; + +export const CheckboxGroup: StencilReactComponent< + CheckboxGroupElement, + CheckboxGroupEvents +> = /*@__PURE__*/ createComponent({ + tagName: "checkbox-group", + elementClass: CheckboxGroupElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasCheckboxGroupChanged: "nylasCheckboxGroupChanged", + } as CheckboxGroupEvents, + defineCustomElement: defineCheckboxGroup, +}); + +export type CheckmarkCircleIconEvents = NonNullable; + +export const CheckmarkCircleIcon: StencilReactComponent< + CheckmarkCircleIconElement, + CheckmarkCircleIconEvents +> = /*@__PURE__*/ createComponent< + CheckmarkCircleIconElement, + CheckmarkCircleIconEvents +>({ + tagName: "checkmark-circle-icon", + elementClass: CheckmarkCircleIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CheckmarkCircleIconEvents, + defineCustomElement: defineCheckmarkCircleIcon, +}); + +export type CheckmarkIconEvents = NonNullable; + +export const CheckmarkIcon: StencilReactComponent< + CheckmarkIconElement, + CheckmarkIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "checkmark-icon", + elementClass: CheckmarkIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CheckmarkIconEvents, + defineCustomElement: defineCheckmarkIcon, +}); + +export type ChevronIconEvents = NonNullable; + +export const ChevronIcon: StencilReactComponent< + ChevronIconElement, + ChevronIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "chevron-icon", + elementClass: ChevronIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ChevronIconEvents, + defineCustomElement: defineChevronIcon, +}); + +export type ClockIconEvents = NonNullable; + +export const ClockIcon: StencilReactComponent< + ClockIconElement, + ClockIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "clock-icon", + elementClass: ClockIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ClockIconEvents, + defineCustomElement: defineClockIcon, +}); + +export type CloseIconEvents = NonNullable; + +export const CloseIcon: StencilReactComponent< + CloseIconElement, + CloseIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "close-icon", + elementClass: CloseIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CloseIconEvents, + defineCustomElement: defineCloseIcon, +}); + +export type CopyIconEvents = NonNullable; + +export const CopyIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "copy-icon", + elementClass: CopyIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as CopyIconEvents, + defineCustomElement: defineCopyIcon, + }); + +export type DeleteIconEvents = NonNullable; + +export const DeleteIcon: StencilReactComponent< + DeleteIconElement, + DeleteIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "delete-icon", + elementClass: DeleteIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as DeleteIconEvents, + defineCustomElement: defineDeleteIcon, +}); + +export type DocumentRefreshIconEvents = NonNullable; + +export const DocumentRefreshIcon: StencilReactComponent< + DocumentRefreshIconElement, + DocumentRefreshIconEvents +> = /*@__PURE__*/ createComponent< + DocumentRefreshIconElement, + DocumentRefreshIconEvents +>({ + tagName: "document-refresh-icon", + elementClass: DocumentRefreshIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as DocumentRefreshIconEvents, + defineCustomElement: defineDocumentRefreshIcon, +}); + +export type DragableIconEvents = NonNullable; + +export const DragableIcon: StencilReactComponent< + DragableIconElement, + DragableIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "dragable-icon", + elementClass: DragableIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as DragableIconEvents, + defineCustomElement: defineDragableIcon, +}); + +export type EditIconEvents = NonNullable; + +export const EditIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "edit-icon", + elementClass: EditIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as EditIconEvents, + defineCustomElement: defineEditIcon, + }); + +export type EnvelopeFillIconEvents = NonNullable; + +export const EnvelopeFillIcon: StencilReactComponent< + EnvelopeFillIconElement, + EnvelopeFillIconEvents +> = /*@__PURE__*/ createComponent< + EnvelopeFillIconElement, + EnvelopeFillIconEvents +>({ + tagName: "envelope-fill-icon", + elementClass: EnvelopeFillIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as EnvelopeFillIconEvents, + defineCustomElement: defineEnvelopeFillIcon, +}); + +export type EnvelopeIconEvents = NonNullable; + +export const EnvelopeIcon: StencilReactComponent< + EnvelopeIconElement, + EnvelopeIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "envelope-icon", + elementClass: EnvelopeIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as EnvelopeIconEvents, + defineCustomElement: defineEnvelopeIcon, +}); + +export type EyeIconEvents = NonNullable; + +export const EyeIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "eye-icon", + elementClass: EyeIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as EyeIconEvents, + defineCustomElement: defineEyeIcon, + }); + +export type FeedbackIconEvents = NonNullable; + +export const FeedbackIcon: StencilReactComponent< + FeedbackIconElement, + FeedbackIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "feedback-icon", + elementClass: FeedbackIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as FeedbackIconEvents, + defineCustomElement: defineFeedbackIcon, +}); + +export type FlowIconEvents = NonNullable; + +export const FlowIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "flow-icon", + elementClass: FlowIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as FlowIconEvents, + defineCustomElement: defineFlowIcon, + }); + +export type FolderIconEvents = NonNullable; + +export const FolderIcon: StencilReactComponent< + FolderIconElement, + FolderIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "folder-icon", + elementClass: FolderIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as FolderIconEvents, + defineCustomElement: defineFolderIcon, +}); + +export type ForwardIconEvents = NonNullable; + +export const ForwardIcon: StencilReactComponent< + ForwardIconElement, + ForwardIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "forward-icon", + elementClass: ForwardIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ForwardIconEvents, + defineCustomElement: defineForwardIcon, +}); + +export type GlobeIconEvents = NonNullable; + +export const GlobeIcon: StencilReactComponent< + GlobeIconElement, + GlobeIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "globe-icon", + elementClass: GlobeIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as GlobeIconEvents, + defineCustomElement: defineGlobeIcon, +}); + +export type GoogleLogoIconEvents = NonNullable; + +export const GoogleLogoIcon: StencilReactComponent< + GoogleLogoIconElement, + GoogleLogoIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "google-logo-icon", + elementClass: GoogleLogoIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as GoogleLogoIconEvents, + defineCustomElement: defineGoogleLogoIcon, +}); + +export type GoogleMeetIconEvents = NonNullable; + +export const GoogleMeetIcon: StencilReactComponent< + GoogleMeetIconElement, + GoogleMeetIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "google-meet-icon", + elementClass: GoogleMeetIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as GoogleMeetIconEvents, + defineCustomElement: defineGoogleMeetIcon, +}); + +export type InboxIconEvents = NonNullable; + +export const InboxIcon: StencilReactComponent< + InboxIconElement, + InboxIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "inbox-icon", + elementClass: InboxIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as InboxIconEvents, + defineCustomElement: defineInboxIcon, +}); + +export type InfoIconEvents = NonNullable; + +export const InfoIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "info-icon", + elementClass: InfoIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as InfoIconEvents, + defineCustomElement: defineInfoIcon, + }); + +export type InputColorPickerEvents = { + onNylasFormDropdownChanged: EventName< + CustomEvent<{ + value: string; + name: string; + error?: string; + label?: string; + }> + >; +}; + +export const InputColorPicker: StencilReactComponent< + InputColorPickerElement, + InputColorPickerEvents +> = /*@__PURE__*/ createComponent< + InputColorPickerElement, + InputColorPickerEvents +>({ + tagName: "input-color-picker", + elementClass: InputColorPickerElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormDropdownChanged: "nylasFormDropdownChanged", + } as InputColorPickerEvents, + defineCustomElement: defineInputColorPicker, +}); + +export type InputComponentEvents = { + onNylasFormInputChanged: EventName< + CustomEvent<{ + value: string; + name: string; + label: string; + type: string; + error: string; + }> + >; + onNylasFormInputFocused: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; + onNylasFormInputBlurred: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const InputComponent: StencilReactComponent< + InputComponentElement, + InputComponentEvents +> = /*@__PURE__*/ createComponent({ + tagName: "input-component", + elementClass: InputComponentElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormInputChanged: "nylasFormInputChanged", + onNylasFormInputFocused: "nylasFormInputFocused", + onNylasFormInputBlurred: "nylasFormInputBlurred", + } as InputComponentEvents, + defineCustomElement: defineInputComponent, +}); + +export type InputDropdownEvents = { + onInputOptionChanged: EventName< + InputDropdownCustomEvent<{ + value: DropdownOption["value"]; + name: string; + }> + >; +}; + +export const InputDropdown: StencilReactComponent< + InputDropdownElement, + InputDropdownEvents +> = /*@__PURE__*/ createComponent({ + tagName: "input-dropdown", + elementClass: InputDropdownElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onInputOptionChanged: "inputOptionChanged" } as InputDropdownEvents, + defineCustomElement: defineInputDropdown, +}); + +export type InputImageUrlEvents = { + onNylasFormInputImageUrlInvalid: EventName< + CustomEvent<{ value: string; name: string }> + >; + onValueChanged: EventName< + InputImageUrlCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const InputImageUrl: StencilReactComponent< + InputImageUrlElement, + InputImageUrlEvents +> = /*@__PURE__*/ createComponent({ + tagName: "input-image-url", + elementClass: InputImageUrlElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormInputImageUrlInvalid: "nylasFormInputImageUrlInvalid", + onValueChanged: "valueChanged", + } as InputImageUrlEvents, + defineCustomElement: defineInputImageUrl, +}); + +export type ItalicIconEvents = NonNullable; + +export const ItalicIcon: StencilReactComponent< + ItalicIconElement, + ItalicIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "italic-icon", + elementClass: ItalicIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ItalicIconEvents, + defineCustomElement: defineItalicIcon, +}); + +export type LoadingIconEvents = NonNullable; + +export const LoadingIcon: StencilReactComponent< + LoadingIconElement, + LoadingIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "loading-icon", + elementClass: LoadingIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as LoadingIconEvents, + defineCustomElement: defineLoadingIcon, +}); + +export type LocationIconEvents = NonNullable; + +export const LocationIcon: StencilReactComponent< + LocationIconElement, + LocationIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "location-icon", + elementClass: LocationIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as LocationIconEvents, + defineCustomElement: defineLocationIcon, +}); + +export type LocationOffIconEvents = NonNullable; + +export const LocationOffIcon: StencilReactComponent< + LocationOffIconElement, + LocationOffIconEvents +> = /*@__PURE__*/ createComponent< + LocationOffIconElement, + LocationOffIconEvents +>({ + tagName: "location-off-icon", + elementClass: LocationOffIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as LocationOffIconEvents, + defineCustomElement: defineLocationOffIcon, +}); + +export type MicrosoftLogoIconEvents = NonNullable; + +export const MicrosoftLogoIcon: StencilReactComponent< + MicrosoftLogoIconElement, + MicrosoftLogoIconEvents +> = /*@__PURE__*/ createComponent< + MicrosoftLogoIconElement, + MicrosoftLogoIconEvents +>({ + tagName: "microsoft-logo-icon", + elementClass: MicrosoftLogoIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as MicrosoftLogoIconEvents, + defineCustomElement: defineMicrosoftLogoIcon, +}); + +export type MicrosoftTeamsIconEvents = NonNullable; + +export const MicrosoftTeamsIcon: StencilReactComponent< + MicrosoftTeamsIconElement, + MicrosoftTeamsIconEvents +> = /*@__PURE__*/ createComponent< + MicrosoftTeamsIconElement, + MicrosoftTeamsIconEvents +>({ + tagName: "microsoft-teams-icon", + elementClass: MicrosoftTeamsIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as MicrosoftTeamsIconEvents, + defineCustomElement: defineMicrosoftTeamsIcon, +}); + +export type MultiSelectDropdownEvents = { + onSelectedOptionsChanged: EventName< + CustomEvent<{ + value: string[]; + name: string; + }> + >; +}; + +export const MultiSelectDropdown: StencilReactComponent< + MultiSelectDropdownElement, + MultiSelectDropdownEvents +> = /*@__PURE__*/ createComponent< + MultiSelectDropdownElement, + MultiSelectDropdownEvents +>({ + tagName: "multi-select-dropdown", + elementClass: MultiSelectDropdownElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onSelectedOptionsChanged: "selectedOptionsChanged", + } as MultiSelectDropdownEvents, + defineCustomElement: defineMultiSelectDropdown, +}); + +export type NylasAdditionalParticipantsEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasAdditionalParticipants: StencilReactComponent< + NylasAdditionalParticipantsElement, + NylasAdditionalParticipantsEvents +> = /*@__PURE__*/ createComponent< + NylasAdditionalParticipantsElement, + NylasAdditionalParticipantsEvents +>({ + tagName: "nylas-additional-participants", + elementClass: NylasAdditionalParticipantsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasAdditionalParticipantsEvents, + defineCustomElement: defineNylasAdditionalParticipants, +}); + +export type NylasAvailabilityPickerEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasAvailabilityPicker: StencilReactComponent< + NylasAvailabilityPickerElement, + NylasAvailabilityPickerEvents +> = /*@__PURE__*/ createComponent< + NylasAvailabilityPickerElement, + NylasAvailabilityPickerEvents +>({ + tagName: "nylas-availability-picker", + elementClass: NylasAvailabilityPickerElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasAvailabilityPickerEvents, + defineCustomElement: defineNylasAvailabilityPicker, +}); + +export type NylasBookedEventCardEvents = { + onCancelBookingButtonClicked: EventName>; + onRescheduleButtonClicked: EventName< + NylasBookedEventCardCustomEvent<{ + bookingId: string; + errorHandler?: (error: NylasSchedulerErrorResponse) => void; + }> + >; + onRescheduleBookedEventError: EventName< + NylasBookedEventCardCustomEvent + >; + onCancelBookedEventValidationError: EventName< + CustomEvent<{ + error: { + title: string; + message: string; + }; + }> + >; +}; + +export const NylasBookedEventCard: StencilReactComponent< + NylasBookedEventCardElement, + NylasBookedEventCardEvents +> = /*@__PURE__*/ createComponent< + NylasBookedEventCardElement, + NylasBookedEventCardEvents +>({ + tagName: "nylas-booked-event-card", + elementClass: NylasBookedEventCardElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onCancelBookingButtonClicked: "cancelBookingButtonClicked", + onRescheduleButtonClicked: "rescheduleButtonClicked", + onRescheduleBookedEventError: "rescheduleBookedEventError", + onCancelBookedEventValidationError: "cancelBookedEventValidationError", + } as NylasBookedEventCardEvents, + defineCustomElement: defineNylasBookedEventCard, +}); + +export type NylasBookingCalendarPickerEvents = { + onValueChanged: EventName< + NylasBookingCalendarPickerCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasBookingCalendarPicker: StencilReactComponent< + NylasBookingCalendarPickerElement, + NylasBookingCalendarPickerEvents +> = /*@__PURE__*/ createComponent< + NylasBookingCalendarPickerElement, + NylasBookingCalendarPickerEvents +>({ + tagName: "nylas-booking-calendar-picker", + elementClass: NylasBookingCalendarPickerElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasBookingCalendarPickerEvents, + defineCustomElement: defineNylasBookingCalendarPicker, +}); + +export type NylasBookingConfirmationRedirectEvents = { + onValueChanged: EventName< + NylasBookingConfirmationRedirectCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasBookingConfirmationRedirect: StencilReactComponent< + NylasBookingConfirmationRedirectElement, + NylasBookingConfirmationRedirectEvents +> = /*@__PURE__*/ createComponent< + NylasBookingConfirmationRedirectElement, + NylasBookingConfirmationRedirectEvents +>({ + tagName: "nylas-booking-confirmation-redirect", + elementClass: NylasBookingConfirmationRedirectElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasBookingConfirmationRedirectEvents, + defineCustomElement: defineNylasBookingConfirmationRedirect, +}); + +export type NylasBookingConfirmationTypeEvents = { + onValueChanged: EventName< + NylasBookingConfirmationTypeCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasBookingConfirmationType: StencilReactComponent< + NylasBookingConfirmationTypeElement, + NylasBookingConfirmationTypeEvents +> = /*@__PURE__*/ createComponent< + NylasBookingConfirmationTypeElement, + NylasBookingConfirmationTypeEvents +>({ + tagName: "nylas-booking-confirmation-type", + elementClass: NylasBookingConfirmationTypeElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasBookingConfirmationTypeEvents, + defineCustomElement: defineNylasBookingConfirmationType, +}); + +export type NylasBookingFormEvents = { + onNameChanged: EventName>; + onEmailChanged: EventName>; + onBackButtonClicked: EventName>; + onDetailsConfirmed: EventName< + NylasBookingFormCustomEvent + >; + onBookingFormError: EventName< + NylasBookingFormCustomEvent> + >; + onBookingFormSubmitted: EventName>; +}; + +export const NylasBookingForm: StencilReactComponent< + NylasBookingFormElement, + NylasBookingFormEvents +> = /*@__PURE__*/ createComponent< + NylasBookingFormElement, + NylasBookingFormEvents +>({ + tagName: "nylas-booking-form", + elementClass: NylasBookingFormElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNameChanged: "nameChanged", + onEmailChanged: "emailChanged", + onBackButtonClicked: "backButtonClicked", + onDetailsConfirmed: "detailsConfirmed", + onBookingFormError: "bookingFormError", + onBookingFormSubmitted: "bookingFormSubmitted", + } as NylasBookingFormEvents, + defineCustomElement: defineNylasBookingForm, +}); + +export type NylasBookingFormConfigEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasBookingFormConfig: StencilReactComponent< + NylasBookingFormConfigElement, + NylasBookingFormConfigEvents +> = /*@__PURE__*/ createComponent< + NylasBookingFormConfigElement, + NylasBookingFormConfigEvents +>({ + tagName: "nylas-booking-form-config", + elementClass: NylasBookingFormConfigElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasBookingFormConfigEvents, + defineCustomElement: defineNylasBookingFormConfig, +}); + +export type NylasBufferTimeEvents = { + onValueChanged: EventName< + NylasBufferTimeCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasBufferTime: StencilReactComponent< + NylasBufferTimeElement, + NylasBufferTimeEvents +> = /*@__PURE__*/ createComponent< + NylasBufferTimeElement, + NylasBufferTimeEvents +>({ + tagName: "nylas-buffer-time", + elementClass: NylasBufferTimeElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasBufferTimeEvents, + defineCustomElement: defineNylasBufferTime, +}); + +export type NylasCalendarPickerEvents = { + onValueChanged: EventName< + NylasCalendarPickerCustomEvent<{ + value: string[]; + name: string; + valueChangedHandler?: ( + event: CustomEvent<{ value: string[]; name: string }>, + ) => void; + }> + >; +}; + +export const NylasCalendarPicker: StencilReactComponent< + NylasCalendarPickerElement, + NylasCalendarPickerEvents +> = /*@__PURE__*/ createComponent< + NylasCalendarPickerElement, + NylasCalendarPickerEvents +>({ + tagName: "nylas-calendar-picker", + elementClass: NylasCalendarPickerElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasCalendarPickerEvents, + defineCustomElement: defineNylasCalendarPicker, +}); + +export type NylasCancelBookingFormEvents = { + onGoBackButtonClicked: EventName>; + onCancelBookingFormSubmitted: EventName< + NylasCancelBookingFormCustomEvent<{ + bookingId: string; + action: "reject" | "cancel"; + reason: string; + errorHandler?: (error: NylasSchedulerErrorResponse) => void; + }> + >; + onTriggerValidation: EventName>; + onCancelBookedEventError: EventName< + NylasCancelBookingFormCustomEvent + >; + onCancelBookingFormError: EventName< + NylasCancelBookingFormCustomEvent> + >; +}; + +export const NylasCancelBookingForm: StencilReactComponent< + NylasCancelBookingFormElement, + NylasCancelBookingFormEvents +> = /*@__PURE__*/ createComponent< + NylasCancelBookingFormElement, + NylasCancelBookingFormEvents +>({ + tagName: "nylas-cancel-booking-form", + elementClass: NylasCancelBookingFormElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onGoBackButtonClicked: "goBackButtonClicked", + onCancelBookingFormSubmitted: "cancelBookingFormSubmitted", + onTriggerValidation: "triggerValidation", + onCancelBookedEventError: "cancelBookedEventError", + onCancelBookingFormError: "cancelBookingFormError", + } as NylasCancelBookingFormEvents, + defineCustomElement: defineNylasCancelBookingForm, +}); + +export type NylasCancellationPolicyEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasCancellationPolicy: StencilReactComponent< + NylasCancellationPolicyElement, + NylasCancellationPolicyEvents +> = /*@__PURE__*/ createComponent< + NylasCancellationPolicyElement, + NylasCancellationPolicyEvents +>({ + tagName: "nylas-cancellation-policy", + elementClass: NylasCancellationPolicyElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasCancellationPolicyEvents, + defineCustomElement: defineNylasCancellationPolicy, +}); + +export type NylasCancelledEventCardEvents = { + onCloseCancelEventCardClicked: EventName< + NylasCancelledEventCardCustomEvent<{ + errorHandler?: (error: NylasSchedulerErrorResponse) => void; + }> + >; + onCancelledEventCardError: EventName< + NylasCancelledEventCardCustomEvent + >; +}; + +export const NylasCancelledEventCard: StencilReactComponent< + NylasCancelledEventCardElement, + NylasCancelledEventCardEvents +> = /*@__PURE__*/ createComponent< + NylasCancelledEventCardElement, + NylasCancelledEventCardEvents +>({ + tagName: "nylas-cancelled-event-card", + elementClass: NylasCancelledEventCardElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onCloseCancelEventCardClicked: "closeCancelEventCardClicked", + onCancelledEventCardError: "cancelledEventCardError", + } as NylasCancelledEventCardEvents, + defineCustomElement: defineNylasCancelledEventCard, +}); + +export type NylasConfirmationEmailEvents = { + onValueChanged: EventName< + NylasConfirmationEmailCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasConfirmationEmail: StencilReactComponent< + NylasConfirmationEmailElement, + NylasConfirmationEmailEvents +> = /*@__PURE__*/ createComponent< + NylasConfirmationEmailElement, + NylasConfirmationEmailEvents +>({ + tagName: "nylas-confirmation-email", + elementClass: NylasConfirmationEmailElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasConfirmationEmailEvents, + defineCustomElement: defineNylasConfirmationEmail, +}); + +export type NylasConfirmedEventCardEvents = { + onCloseConfirmEventCardClicked: EventName< + NylasConfirmedEventCardCustomEvent<{ + errorHandler?: (error: NylasSchedulerErrorResponse) => void; + }> + >; + onConfirmedEventCardError: EventName< + NylasConfirmedEventCardCustomEvent + >; +}; + +export const NylasConfirmedEventCard: StencilReactComponent< + NylasConfirmedEventCardElement, + NylasConfirmedEventCardEvents +> = /*@__PURE__*/ createComponent< + NylasConfirmedEventCardElement, + NylasConfirmedEventCardEvents +>({ + tagName: "nylas-confirmed-event-card", + elementClass: NylasConfirmedEventCardElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onCloseConfirmEventCardClicked: "closeConfirmEventCardClicked", + onConfirmedEventCardError: "confirmedEventCardError", + } as NylasConfirmedEventCardEvents, + defineCustomElement: defineNylasConfirmedEventCard, +}); + +export type NylasConnectedCalendarsEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasConnectedCalendars: StencilReactComponent< + NylasConnectedCalendarsElement, + NylasConnectedCalendarsEvents +> = /*@__PURE__*/ createComponent< + NylasConnectedCalendarsElement, + NylasConnectedCalendarsEvents +>({ + tagName: "nylas-connected-calendars", + elementClass: NylasConnectedCalendarsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasConnectedCalendarsEvents, + defineCustomElement: defineNylasConnectedCalendars, +}); + +export type NylasCustomBookingFlowEvents = NonNullable; + +export const NylasCustomBookingFlow: StencilReactComponent< + NylasCustomBookingFlowElement, + NylasCustomBookingFlowEvents +> = /*@__PURE__*/ createComponent< + NylasCustomBookingFlowElement, + NylasCustomBookingFlowEvents +>({ + tagName: "nylas-custom-booking-flow", + elementClass: NylasCustomBookingFlowElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as NylasCustomBookingFlowEvents, + defineCustomElement: defineNylasCustomBookingFlow, +}); + +export type NylasCustomEventSlugEvents = { + onValueChanged: EventName< + NylasCustomEventSlugCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasCustomEventSlug: StencilReactComponent< + NylasCustomEventSlugElement, + NylasCustomEventSlugEvents +> = /*@__PURE__*/ createComponent< + NylasCustomEventSlugElement, + NylasCustomEventSlugEvents +>({ + tagName: "nylas-custom-event-slug", + elementClass: NylasCustomEventSlugElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasCustomEventSlugEvents, + defineCustomElement: defineNylasCustomEventSlug, +}); + +export type NylasCustomizeBookingSettingsEvents = { + onValueChanged: EventName< + NylasCustomizeBookingSettingsCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasCustomizeBookingSettings: StencilReactComponent< + NylasCustomizeBookingSettingsElement, + NylasCustomizeBookingSettingsEvents +> = /*@__PURE__*/ createComponent< + NylasCustomizeBookingSettingsElement, + NylasCustomizeBookingSettingsEvents +>({ + tagName: "nylas-customize-booking-settings", + elementClass: NylasCustomizeBookingSettingsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasCustomizeBookingSettingsEvents, + defineCustomElement: defineNylasCustomizeBookingSettings, +}); + +export type NylasDateComponentEvents = { + onNylasFormInputChanged: EventName< + CustomEvent<{ + value: string; + name: string; + label: string; + type: string; + error: string; + }> + >; + onNylasFormInputFocused: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; + onNylasFormInputBlurred: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasDateComponent: StencilReactComponent< + NylasDateComponentElement, + NylasDateComponentEvents +> = /*@__PURE__*/ createComponent< + NylasDateComponentElement, + NylasDateComponentEvents +>({ + tagName: "nylas-date-component", + elementClass: NylasDateComponentElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormInputChanged: "nylasFormInputChanged", + onNylasFormInputFocused: "nylasFormInputFocused", + onNylasFormInputBlurred: "nylasFormInputBlurred", + } as NylasDateComponentEvents, + defineCustomElement: defineNylasDateComponent, +}); + +export type NylasDatePickerEvents = { + onDateSelected: EventName>; + onMonthChanged: EventName>; +}; + +export const NylasDatePicker: StencilReactComponent< + NylasDatePickerElement, + NylasDatePickerEvents +> = /*@__PURE__*/ createComponent< + NylasDatePickerElement, + NylasDatePickerEvents +>({ + tagName: "nylas-date-picker", + elementClass: NylasDatePickerElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onDateSelected: "dateSelected", + onMonthChanged: "monthChanged", + } as NylasDatePickerEvents, + defineCustomElement: defineNylasDatePicker, +}); + +export type NylasDisableEmailsEvents = { + onValueChanged: EventName< + NylasDisableEmailsCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasDisableEmails: StencilReactComponent< + NylasDisableEmailsElement, + NylasDisableEmailsEvents +> = /*@__PURE__*/ createComponent< + NylasDisableEmailsElement, + NylasDisableEmailsEvents +>({ + tagName: "nylas-disable-emails", + elementClass: NylasDisableEmailsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasDisableEmailsEvents, + defineCustomElement: defineNylasDisableEmails, +}); + +export type NylasEditorTabsEvents = { + onSchedulerConfigChanged: EventName< + NylasEditorTabsCustomEvent + >; + onSchedulerConfigCreated: EventName< + NylasEditorTabsCustomEvent + >; + onCancelButtonClick: EventName>; + onFormSubmitted: EventName>; + onPreviewButtonClicked: EventName< + NylasEditorTabsCustomEvent + >; + onSchedulerEditorFormUpdated: EventName< + CustomEvent<{ value: string; name: string }> + >; + onNylasSchedulerError: EventName< + NylasEditorTabsCustomEvent<{ + notification: Notification; + host: HTMLElement; + }> + >; + onDismissNotification: EventName< + NylasEditorTabsCustomEvent<{ id: string; host: HTMLNylasEditorTabsElement }> + >; +}; + +export const NylasEditorTabs: StencilReactComponent< + NylasEditorTabsElement, + NylasEditorTabsEvents +> = /*@__PURE__*/ createComponent< + NylasEditorTabsElement, + NylasEditorTabsEvents +>({ + tagName: "nylas-editor-tabs", + elementClass: NylasEditorTabsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onSchedulerConfigChanged: "schedulerConfigChanged", + onSchedulerConfigCreated: "schedulerConfigCreated", + onCancelButtonClick: "cancelButtonClick", + onFormSubmitted: "formSubmitted", + onPreviewButtonClicked: "previewButtonClicked", + onSchedulerEditorFormUpdated: "schedulerEditorFormUpdated", + onNylasSchedulerError: "nylasSchedulerError", + onDismissNotification: "dismissNotification", + } as NylasEditorTabsEvents, + defineCustomElement: defineNylasEditorTabs, +}); + +export type NylasEditorTabsGroupEvents = { + onSchedulerConfigChanged: EventName< + NylasEditorTabsGroupCustomEvent< + SchedulerGroupEventDetail & { host: HTMLNylasEditorTabsGroupElement } + > + >; + onSchedulerConfigCreated: EventName< + NylasEditorTabsGroupCustomEvent< + SchedulerGroupEventDetail & { host: HTMLNylasEditorTabsGroupElement } + > + >; + onCancelButtonClick: EventName>; + onFormSubmitted: EventName>; + onPreviewButtonClicked: EventName< + NylasEditorTabsGroupCustomEvent + >; + onSchedulerEditorFormUpdated: EventName< + CustomEvent<{ value: string; name: string }> + >; + onGroupEventCreateTriggered: EventName< + NylasEditorTabsGroupCustomEvent<{ + groupEvent: Partial; + configId: string; + host: HTMLNylasEditorTabsGroupElement; + }> + >; + onGroupEventUpdateTriggered: EventName< + NylasEditorTabsGroupCustomEvent<{ + groupEvent: GroupEvent; + chosenOption: RecurrenceUpdateOption; + configId: string; + host: HTMLNylasEditorTabsGroupElement; + }> + >; + onGroupEventDeleteTriggered: EventName< + NylasEditorTabsGroupCustomEvent<{ + groupEvent: GroupEvent; + chosenOption: RecurrenceDeleteOption; + configId: string; + host: HTMLNylasEditorTabsGroupElement; + }> + >; + onGroupEventImportTriggered: EventName< + NylasEditorTabsGroupCustomEvent<{ + groupEvent: ImportGroupEventDetails; + configId: string; + host: HTMLNylasEditorTabsGroupElement; + }> + >; + onSaveGroupEventChangesError: EventName< + NylasEditorTabsGroupCustomEvent<{ + error: string; + configId: string; + host: HTMLNylasEditorTabsGroupElement; + }> + >; + onNylasSchedulerError: EventName< + NylasEditorTabsGroupCustomEvent<{ + notification: Notification; + host: HTMLElement; + }> + >; + onDismissNotification: EventName< + NylasEditorTabsGroupCustomEvent<{ + id: string; + host: HTMLNylasEditorTabsGroupElement; + }> + >; +}; + +export const NylasEditorTabsGroup: StencilReactComponent< + NylasEditorTabsGroupElement, + NylasEditorTabsGroupEvents +> = /*@__PURE__*/ createComponent< + NylasEditorTabsGroupElement, + NylasEditorTabsGroupEvents +>({ + tagName: "nylas-editor-tabs-group", + elementClass: NylasEditorTabsGroupElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onSchedulerConfigChanged: "schedulerConfigChanged", + onSchedulerConfigCreated: "schedulerConfigCreated", + onCancelButtonClick: "cancelButtonClick", + onFormSubmitted: "formSubmitted", + onPreviewButtonClicked: "previewButtonClicked", + onSchedulerEditorFormUpdated: "schedulerEditorFormUpdated", + onGroupEventCreateTriggered: "groupEventCreateTriggered", + onGroupEventUpdateTriggered: "groupEventUpdateTriggered", + onGroupEventDeleteTriggered: "groupEventDeleteTriggered", + onGroupEventImportTriggered: "groupEventImportTriggered", + onSaveGroupEventChangesError: "saveGroupEventChangesError", + onNylasSchedulerError: "nylasSchedulerError", + onDismissNotification: "dismissNotification", + } as NylasEditorTabsGroupEvents, + defineCustomElement: defineNylasEditorTabsGroup, +}); + +export type NylasEventCalendarEvents = { + onFetchMasterGroupEvent: EventName>; + onSaveGroupEventChanges: EventName< + NylasEventCalendarCustomEvent<{ + data: GroupEventAPIData; + action: "this" | "future" | "all"; + }> + >; + onDeleteGroupEvent: EventName< + NylasEventCalendarCustomEvent<{ + data: GroupEventAPIData; + action: "this" | "future" | "all"; + }> + >; + onGroupEventSelected: EventName< + NylasEventCalendarCustomEvent + >; + onCreateGroupEvent: EventName< + NylasEventCalendarCustomEvent + >; + onCalendarViewChanged: EventName< + CustomEvent<{ startTime: number; endTime: number }> + >; + onPreviosNextClicked: EventName< + CustomEvent<{ + direction: "prev" | "next"; + view: "day" | "week" | "month"; + currentViewRange: { startTime: number; endTime: number }; + }> + >; + onSetCalendarViewDateRange: EventName< + CustomEvent<{ startTime: number; endTime: number }> + >; + onImportGroupEvent: EventName< + CustomEvent<{ + event_id: string; + calendar_id: string; + }> + >; +}; + +export const NylasEventCalendar: StencilReactComponent< + NylasEventCalendarElement, + NylasEventCalendarEvents +> = /*@__PURE__*/ createComponent< + NylasEventCalendarElement, + NylasEventCalendarEvents +>({ + tagName: "nylas-event-calendar", + elementClass: NylasEventCalendarElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onFetchMasterGroupEvent: "fetchMasterGroupEvent", + onSaveGroupEventChanges: "saveGroupEventChanges", + onDeleteGroupEvent: "deleteGroupEvent", + onGroupEventSelected: "groupEventSelected", + onCreateGroupEvent: "createGroupEvent", + onCalendarViewChanged: "calendarViewChanged", + onPreviosNextClicked: "previosNextClicked", + onSetCalendarViewDateRange: "setCalendarViewDateRange", + onImportGroupEvent: "importGroupEvent", + } as NylasEventCalendarEvents, + defineCustomElement: defineNylasEventCalendar, +}); + +export type NylasEventCapacityEvents = { + onValueChanged: EventName< + NylasEventCapacityCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasEventCapacity: StencilReactComponent< + NylasEventCapacityElement, + NylasEventCapacityEvents +> = /*@__PURE__*/ createComponent< + NylasEventCapacityElement, + NylasEventCapacityEvents +>({ + tagName: "nylas-event-capacity", + elementClass: NylasEventCapacityElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasEventCapacityEvents, + defineCustomElement: defineNylasEventCapacity, +}); + +export type NylasEventDescriptionEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasEventDescription: StencilReactComponent< + NylasEventDescriptionElement, + NylasEventDescriptionEvents +> = /*@__PURE__*/ createComponent< + NylasEventDescriptionElement, + NylasEventDescriptionEvents +>({ + tagName: "nylas-event-description", + elementClass: NylasEventDescriptionElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasEventDescriptionEvents, + defineCustomElement: defineNylasEventDescription, +}); + +export type NylasEventDurationEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasEventDuration: StencilReactComponent< + NylasEventDurationElement, + NylasEventDurationEvents +> = /*@__PURE__*/ createComponent< + NylasEventDurationElement, + NylasEventDurationEvents +>({ + tagName: "nylas-event-duration", + elementClass: NylasEventDurationElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasEventDurationEvents, + defineCustomElement: defineNylasEventDuration, +}); + +export type NylasEventInfoEvents = NonNullable; + +export const NylasEventInfo: StencilReactComponent< + NylasEventInfoElement, + NylasEventInfoEvents +> = /*@__PURE__*/ createComponent({ + tagName: "nylas-event-info", + elementClass: NylasEventInfoElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as NylasEventInfoEvents, + defineCustomElement: defineNylasEventInfo, +}); + +export type NylasEventLimitsEvents = NonNullable; + +export const NylasEventLimits: StencilReactComponent< + NylasEventLimitsElement, + NylasEventLimitsEvents +> = /*@__PURE__*/ createComponent< + NylasEventLimitsElement, + NylasEventLimitsEvents +>({ + tagName: "nylas-event-limits", + elementClass: NylasEventLimitsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as NylasEventLimitsEvents, + defineCustomElement: defineNylasEventLimits, +}); + +export type NylasEventLocationEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasEventLocation: StencilReactComponent< + NylasEventLocationElement, + NylasEventLocationEvents +> = /*@__PURE__*/ createComponent< + NylasEventLocationElement, + NylasEventLocationEvents +>({ + tagName: "nylas-event-location", + elementClass: NylasEventLocationElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasEventLocationEvents, + defineCustomElement: defineNylasEventLocation, +}); + +export type NylasEventTimeslotEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; + onTimeWindowFormError: EventName< + CustomEvent<{ + key: string; + message: string; + uniqueIdentifier?: string; + }> + >; + onDateTimeInputError: EventName< + CustomEvent<{ + key: string; + message: string; + }> + >; +}; + +export const NylasEventTimeslot: StencilReactComponent< + NylasEventTimeslotElement, + NylasEventTimeslotEvents +> = /*@__PURE__*/ createComponent< + NylasEventTimeslotElement, + NylasEventTimeslotEvents +>({ + tagName: "nylas-event-timeslot", + elementClass: NylasEventTimeslotElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + onTimeWindowFormError: "timeWindowFormError", + onDateTimeInputError: "dateTimeInputError", + } as NylasEventTimeslotEvents, + defineCustomElement: defineNylasEventTimeslot, +}); + +export type NylasEventTitleEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasEventTitle: StencilReactComponent< + NylasEventTitleElement, + NylasEventTitleEvents +> = /*@__PURE__*/ createComponent< + NylasEventTitleElement, + NylasEventTitleEvents +>({ + tagName: "nylas-event-title", + elementClass: NylasEventTitleElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasEventTitleEvents, + defineCustomElement: defineNylasEventTitle, +}); + +export type NylasFeedbackFormEvents = { + onFeedbackModalClosed: EventName>; + onFeedbackSubmitted: EventName>; + onTriggerValidation: EventName>; +}; + +export const NylasFeedbackForm: StencilReactComponent< + NylasFeedbackFormElement, + NylasFeedbackFormEvents +> = /*@__PURE__*/ createComponent< + NylasFeedbackFormElement, + NylasFeedbackFormEvents +>({ + tagName: "nylas-feedback-form", + elementClass: NylasFeedbackFormElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onFeedbackModalClosed: "feedbackModalClosed", + onFeedbackSubmitted: "feedbackSubmitted", + onTriggerValidation: "triggerValidation", + } as NylasFeedbackFormEvents, + defineCustomElement: defineNylasFeedbackForm, +}); + +export type NylasFormCardEvents = NonNullable; + +export const NylasFormCard: StencilReactComponent< + NylasFormCardElement, + NylasFormCardEvents +> = /*@__PURE__*/ createComponent({ + tagName: "nylas-form-card", + elementClass: NylasFormCardElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as NylasFormCardEvents, + defineCustomElement: defineNylasFormCard, +}); + +export type NylasLimitFutureBookingsEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasLimitFutureBookings: StencilReactComponent< + NylasLimitFutureBookingsElement, + NylasLimitFutureBookingsEvents +> = /*@__PURE__*/ createComponent< + NylasLimitFutureBookingsElement, + NylasLimitFutureBookingsEvents +>({ + tagName: "nylas-limit-future-bookings", + elementClass: NylasLimitFutureBookingsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasLimitFutureBookingsEvents, + defineCustomElement: defineNylasLimitFutureBookings, +}); + +export type NylasListConfigurationsEvents = { + onInitListConfigurations: EventName< + NylasListConfigurationsCustomEvent<{ + host: HTMLNylasListConfigurationsElement; + cursor?: string; + }> + >; + onCreateButtonClick: EventName< + NylasListConfigurationsCustomEvent + >; + onEditButtonClick: EventName< + NylasListConfigurationsCustomEvent<{ + host: HTMLNylasListConfigurationsElement; + configuration: Configuration | GroupConfiguration; + }> + >; + onDeleteButtonClick: EventName< + NylasListConfigurationsCustomEvent<{ + host: HTMLNylasListConfigurationsElement; + configuration: Configuration | GroupConfiguration; + }> + >; + onNylasSchedulerError: EventName< + NylasListConfigurationsCustomEvent<{ + notification: Notification; + host: HTMLElement; + }> + >; + onDismissNotification: EventName< + NylasListConfigurationsCustomEvent<{ + id: string; + host: HTMLNylasListConfigurationsElement; + }> + >; +}; + +export const NylasListConfigurations: StencilReactComponent< + NylasListConfigurationsElement, + NylasListConfigurationsEvents +> = /*@__PURE__*/ createComponent< + NylasListConfigurationsElement, + NylasListConfigurationsEvents +>({ + tagName: "nylas-list-configurations", + elementClass: NylasListConfigurationsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onInitListConfigurations: "initListConfigurations", + onCreateButtonClick: "createButtonClick", + onEditButtonClick: "editButtonClick", + onDeleteButtonClick: "deleteButtonClick", + onNylasSchedulerError: "nylasSchedulerError", + onDismissNotification: "dismissNotification", + } as NylasListConfigurationsEvents, + defineCustomElement: defineNylasListConfigurations, +}); + +export type NylasLocaleSwitchEvents = { + onTimezoneChanged: EventName>; + onLanguageChanged: EventName>; +}; + +export const NylasLocaleSwitch: StencilReactComponent< + NylasLocaleSwitchElement, + NylasLocaleSwitchEvents +> = /*@__PURE__*/ createComponent< + NylasLocaleSwitchElement, + NylasLocaleSwitchEvents +>({ + tagName: "nylas-locale-switch", + elementClass: NylasLocaleSwitchElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onTimezoneChanged: "timezoneChanged", + onLanguageChanged: "languageChanged", + } as NylasLocaleSwitchEvents, + defineCustomElement: defineNylasLocaleSwitch, +}); + +export type NylasLogoEvents = NonNullable; + +export const NylasLogo: StencilReactComponent< + NylasLogoElement, + NylasLogoEvents +> = /*@__PURE__*/ createComponent({ + tagName: "nylas-logo", + elementClass: NylasLogoElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as NylasLogoEvents, + defineCustomElement: defineNylasLogo, +}); + +export type NylasMinBookingNoticeEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasMinBookingNotice: StencilReactComponent< + NylasMinBookingNoticeElement, + NylasMinBookingNoticeEvents +> = /*@__PURE__*/ createComponent< + NylasMinBookingNoticeElement, + NylasMinBookingNoticeEvents +>({ + tagName: "nylas-min-booking-notice", + elementClass: NylasMinBookingNoticeElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasMinBookingNoticeEvents, + defineCustomElement: defineNylasMinBookingNotice, +}); + +export type NylasMinCancellationNoticeEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasMinCancellationNotice: StencilReactComponent< + NylasMinCancellationNoticeElement, + NylasMinCancellationNoticeEvents +> = /*@__PURE__*/ createComponent< + NylasMinCancellationNoticeElement, + NylasMinCancellationNoticeEvents +>({ + tagName: "nylas-min-cancellation-notice", + elementClass: NylasMinCancellationNoticeElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasMinCancellationNoticeEvents, + defineCustomElement: defineNylasMinCancellationNotice, +}); + +export type NylasNotificationEvents = NonNullable; + +export const NylasNotification: StencilReactComponent< + NylasNotificationElement, + NylasNotificationEvents +> = /*@__PURE__*/ createComponent< + NylasNotificationElement, + NylasNotificationEvents +>({ + tagName: "nylas-notification", + elementClass: NylasNotificationElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as NylasNotificationEvents, + defineCustomElement: defineNylasNotification, +}); + +export type NylasOrganizerConfirmationCardEvents = { + onRejectBookingButtonClicked: EventName< + NylasOrganizerConfirmationCardCustomEvent<{ + bookingId: string; + host: HTMLNylasOrganizerConfirmationCardElement; + }> + >; + onConfirmBookingButtonClicked: EventName< + NylasOrganizerConfirmationCardCustomEvent<{ + bookingId: string; + host: HTMLNylasOrganizerConfirmationCardElement; + errorHandler?: (error: NylasSchedulerErrorResponse) => void; + }> + >; + onConfirmBookingError: EventName< + NylasOrganizerConfirmationCardCustomEvent + >; +}; + +export const NylasOrganizerConfirmationCard: StencilReactComponent< + NylasOrganizerConfirmationCardElement, + NylasOrganizerConfirmationCardEvents +> = /*@__PURE__*/ createComponent< + NylasOrganizerConfirmationCardElement, + NylasOrganizerConfirmationCardEvents +>({ + tagName: "nylas-organizer-confirmation-card", + elementClass: NylasOrganizerConfirmationCardElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onRejectBookingButtonClicked: "rejectBookingButtonClicked", + onConfirmBookingButtonClicked: "confirmBookingButtonClicked", + onConfirmBookingError: "confirmBookingError", + } as NylasOrganizerConfirmationCardEvents, + defineCustomElement: defineNylasOrganizerConfirmationCard, +}); + +export type NylasPageNameEvents = { + onValueChanged: EventName< + NylasPageNameCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasPageName: StencilReactComponent< + NylasPageNameElement, + NylasPageNameEvents +> = /*@__PURE__*/ createComponent({ + tagName: "nylas-page-name", + elementClass: NylasPageNameElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasPageNameEvents, + defineCustomElement: defineNylasPageName, +}); + +export type NylasPageStylingEvents = { + onValueChanged: EventName< + NylasPageStylingCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; + onBookingFormSubmitted: EventName>; +}; + +export const NylasPageStyling: StencilReactComponent< + NylasPageStylingElement, + NylasPageStylingEvents +> = /*@__PURE__*/ createComponent< + NylasPageStylingElement, + NylasPageStylingEvents +>({ + tagName: "nylas-page-styling", + elementClass: NylasPageStylingElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + onBookingFormSubmitted: "bookingFormSubmitted", + } as NylasPageStylingEvents, + defineCustomElement: defineNylasPageStyling, +}); + +export type NylasParticipantBookingCalendarsEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasParticipantBookingCalendars: StencilReactComponent< + NylasParticipantBookingCalendarsElement, + NylasParticipantBookingCalendarsEvents +> = /*@__PURE__*/ createComponent< + NylasParticipantBookingCalendarsElement, + NylasParticipantBookingCalendarsEvents +>({ + tagName: "nylas-participant-booking-calendars", + elementClass: NylasParticipantBookingCalendarsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasParticipantBookingCalendarsEvents, + defineCustomElement: defineNylasParticipantBookingCalendars, +}); + +export type NylasParticipantsCustomAvailabilityEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasParticipantsCustomAvailability: StencilReactComponent< + NylasParticipantsCustomAvailabilityElement, + NylasParticipantsCustomAvailabilityEvents +> = /*@__PURE__*/ createComponent< + NylasParticipantsCustomAvailabilityElement, + NylasParticipantsCustomAvailabilityEvents +>({ + tagName: "nylas-participants-custom-availability", + elementClass: NylasParticipantsCustomAvailabilityElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasParticipantsCustomAvailabilityEvents, + defineCustomElement: defineNylasParticipantsCustomAvailability, +}); + +export type NylasReminderEmailsEvents = { + onValueChanged: EventName< + NylasReminderEmailsCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; + onNylasSuggestReminderMinutes: EventName>; +}; + +export const NylasReminderEmails: StencilReactComponent< + NylasReminderEmailsElement, + NylasReminderEmailsEvents +> = /*@__PURE__*/ createComponent< + NylasReminderEmailsElement, + NylasReminderEmailsEvents +>({ + tagName: "nylas-reminder-emails", + elementClass: NylasReminderEmailsElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + onNylasSuggestReminderMinutes: "nylasSuggestReminderMinutes", + } as NylasReminderEmailsEvents, + defineCustomElement: defineNylasReminderEmails, +}); + +export type NylasReminderTimeEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasReminderTime: StencilReactComponent< + NylasReminderTimeElement, + NylasReminderTimeEvents +> = /*@__PURE__*/ createComponent< + NylasReminderTimeElement, + NylasReminderTimeEvents +>({ + tagName: "nylas-reminder-time", + elementClass: NylasReminderTimeElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasReminderTimeEvents, + defineCustomElement: defineNylasReminderTime, +}); + +export type NylasSchedulerEditorEvents = { + onInit: EventName< + NylasSchedulerEditorCustomEvent + >; + onLoggedIn: EventName< + NylasSchedulerEditorCustomEvent + >; + onLoggedOut: EventName< + NylasSchedulerEditorCustomEvent + >; + onSchedulerConfigCloseClicked: EventName< + NylasSchedulerEditorCustomEvent + >; +}; + +export const NylasSchedulerEditor: StencilReactComponent< + NylasSchedulerEditorElement, + NylasSchedulerEditorEvents +> = /*@__PURE__*/ createComponent< + NylasSchedulerEditorElement, + NylasSchedulerEditorEvents +>({ + tagName: "nylas-scheduler-editor", + elementClass: NylasSchedulerEditorElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onInit: "init", + onLoggedIn: "loggedIn", + onLoggedOut: "loggedOut", + onSchedulerConfigCloseClicked: "schedulerConfigCloseClicked", + } as NylasSchedulerEditorEvents, + defineCustomElement: defineNylasSchedulerEditor, +}); + +export type NylasSchedulingEvents = { + onInit: EventName>; + onSchedulerWillLoad: EventName< + NylasSchedulingCustomEvent + >; + onSchedulerDidLoad: EventName< + NylasSchedulingCustomEvent + >; + onNylasSchedulerError: EventName< + NylasSchedulingCustomEvent<{ + notification: Notification; + host: HTMLElement; + }> + >; + onNylasSchedulerInfo: EventName< + NylasSchedulingCustomEvent<{ + notification: Notification; + host: HTMLElement; + }> + >; + onConfigSettingsLoaded: EventName< + NylasSchedulingCustomEvent<{ + settings: NylasSchedulerResponse; + }> + >; + onBookingRefExtracted: EventName< + CustomEvent<{ configurationId: string; bookingId: string; salt?: string }> + >; + onBookedEventInfo: EventName< + NylasSchedulingCustomEvent> + >; +}; + +export const NylasScheduling: StencilReactComponent< + NylasSchedulingElement, + NylasSchedulingEvents +> = /*@__PURE__*/ createComponent< + NylasSchedulingElement, + NylasSchedulingEvents +>({ + tagName: "nylas-scheduling", + elementClass: NylasSchedulingElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onInit: "init", + onSchedulerWillLoad: "schedulerWillLoad", + onSchedulerDidLoad: "schedulerDidLoad", + onNylasSchedulerError: "nylasSchedulerError", + onNylasSchedulerInfo: "nylasSchedulerInfo", + onConfigSettingsLoaded: "configSettingsLoaded", + onBookingRefExtracted: "bookingRefExtracted", + onBookedEventInfo: "bookedEventInfo", + } as NylasSchedulingEvents, + defineCustomElement: defineNylasScheduling, +}); + +export type NylasSchedulingMethodEvents = { + onValueChanged: EventName< + NylasSchedulingMethodCustomEvent<{ + value: string; + name: string; + valueChanged?: ( + event: CustomEvent<{ value: string; name: string }>, + ) => void; + }> + >; +}; + +export const NylasSchedulingMethod: StencilReactComponent< + NylasSchedulingMethodElement, + NylasSchedulingMethodEvents +> = /*@__PURE__*/ createComponent< + NylasSchedulingMethodElement, + NylasSchedulingMethodEvents +>({ + tagName: "nylas-scheduling-method", + elementClass: NylasSchedulingMethodElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasSchedulingMethodEvents, + defineCustomElement: defineNylasSchedulingMethod, +}); + +export type NylasSelectEventTypeEvents = { + onReturnToAllSchedulingPagesEvent: EventName>; + onCreateEventTypeSelected: EventName< + NylasSelectEventTypeCustomEvent<{ eventType: CONFIGURATION_EVENT_TYPE }> + >; +}; + +export const NylasSelectEventType: StencilReactComponent< + NylasSelectEventTypeElement, + NylasSelectEventTypeEvents +> = /*@__PURE__*/ createComponent< + NylasSelectEventTypeElement, + NylasSelectEventTypeEvents +>({ + tagName: "nylas-select-event-type", + elementClass: NylasSelectEventTypeElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onReturnToAllSchedulingPagesEvent: "returnToAllSchedulingPagesEvent", + onCreateEventTypeSelected: "createEventTypeSelected", + } as NylasSelectEventTypeEvents, + defineCustomElement: defineNylasSelectEventType, +}); + +export type NylasSelectedEventCardEvents = NonNullable; + +export const NylasSelectedEventCard: StencilReactComponent< + NylasSelectedEventCardElement, + NylasSelectedEventCardEvents +> = /*@__PURE__*/ createComponent< + NylasSelectedEventCardElement, + NylasSelectedEventCardEvents +>({ + tagName: "nylas-selected-event-card", + elementClass: NylasSelectedEventCardElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as NylasSelectedEventCardEvents, + defineCustomElement: defineNylasSelectedEventCard, +}); + +export type NylasSpecificTimeAvailabilityPickerEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasSpecificTimeAvailabilityPicker: StencilReactComponent< + NylasSpecificTimeAvailabilityPickerElement, + NylasSpecificTimeAvailabilityPickerEvents +> = /*@__PURE__*/ createComponent< + NylasSpecificTimeAvailabilityPickerElement, + NylasSpecificTimeAvailabilityPickerEvents +>({ + tagName: "nylas-specific-time-availability-picker", + elementClass: NylasSpecificTimeAvailabilityPickerElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onValueChanged: "valueChanged", + } as NylasSpecificTimeAvailabilityPickerEvents, + defineCustomElement: defineNylasSpecificTimeAvailabilityPicker, +}); + +export type NylasTimeWindowPickerEvents = { + onTimeChange: EventName< + CustomEvent<{ + key: string; + value: string; + }> + >; + onTimeWindowFormError: EventName< + CustomEvent<{ + key: string; + message: string; + }> + >; +}; + +export const NylasTimeWindowPicker: StencilReactComponent< + NylasTimeWindowPickerElement, + NylasTimeWindowPickerEvents +> = /*@__PURE__*/ createComponent< + NylasTimeWindowPickerElement, + NylasTimeWindowPickerEvents +>({ + tagName: "nylas-time-window-picker", + elementClass: NylasTimeWindowPickerElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onTimeChange: "timeChange", + onTimeWindowFormError: "timeWindowFormError", + } as NylasTimeWindowPickerEvents, + defineCustomElement: defineNylasTimeWindowPicker, +}); + +export type NylasTimeslotIntervalEvents = { + onValueChanged: EventName< + CustomEvent<{ + value: string; + name: string; + }> + >; +}; + +export const NylasTimeslotInterval: StencilReactComponent< + NylasTimeslotIntervalElement, + NylasTimeslotIntervalEvents +> = /*@__PURE__*/ createComponent< + NylasTimeslotIntervalElement, + NylasTimeslotIntervalEvents +>({ + tagName: "nylas-timeslot-interval", + elementClass: NylasTimeslotIntervalElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { onValueChanged: "valueChanged" } as NylasTimeslotIntervalEvents, + defineCustomElement: defineNylasTimeslotInterval, +}); + +export type NylasTimeslotPickerEvents = { + onTimeslotSelected: EventName>; + onTimeslotConfirmed: EventName< + NylasTimeslotPickerCustomEvent<{ + timeslot: Timeslot; + host: HTMLNylasTimeslotPickerElement; + }> + >; + onValidateTimeslotError: EventName< + CustomEvent<{ error: string; type: "error" | "info" }> + >; +}; + +export const NylasTimeslotPicker: StencilReactComponent< + NylasTimeslotPickerElement, + NylasTimeslotPickerEvents +> = /*@__PURE__*/ createComponent< + NylasTimeslotPickerElement, + NylasTimeslotPickerEvents +>({ + tagName: "nylas-timeslot-picker", + elementClass: NylasTimeslotPickerElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onTimeslotSelected: "timeslotSelected", + onTimeslotConfirmed: "timeslotConfirmed", + onValidateTimeslotError: "validateTimeslotError", + } as NylasTimeslotPickerEvents, + defineCustomElement: defineNylasTimeslotPicker, +}); + +export type PaintbrushFillIconEvents = NonNullable; + +export const PaintbrushFillIcon: StencilReactComponent< + PaintbrushFillIconElement, + PaintbrushFillIconEvents +> = /*@__PURE__*/ createComponent< + PaintbrushFillIconElement, + PaintbrushFillIconEvents +>({ + tagName: "paintbrush-fill-icon", + elementClass: PaintbrushFillIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as PaintbrushFillIconEvents, + defineCustomElement: definePaintbrushFillIcon, +}); + +export type PaintbrushIconEvents = NonNullable; + +export const PaintbrushIcon: StencilReactComponent< + PaintbrushIconElement, + PaintbrushIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "paintbrush-icon", + elementClass: PaintbrushIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as PaintbrushIconEvents, + defineCustomElement: definePaintbrushIcon, +}); + +export type PeopleIconEvents = NonNullable; + +export const PeopleIcon: StencilReactComponent< + PeopleIconElement, + PeopleIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "people-icon", + elementClass: PeopleIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as PeopleIconEvents, + defineCustomElement: definePeopleIcon, +}); + +export type PersonClipboardIconEvents = NonNullable; + +export const PersonClipboardIcon: StencilReactComponent< + PersonClipboardIconElement, + PersonClipboardIconEvents +> = /*@__PURE__*/ createComponent< + PersonClipboardIconElement, + PersonClipboardIconEvents +>({ + tagName: "person-clipboard-icon", + elementClass: PersonClipboardIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as PersonClipboardIconEvents, + defineCustomElement: definePersonClipboardIcon, +}); + +export type PersonIconEvents = NonNullable; + +export const PersonIcon: StencilReactComponent< + PersonIconElement, + PersonIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "person-icon", + elementClass: PersonIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as PersonIconEvents, + defineCustomElement: definePersonIcon, +}); + +export type PlayIconEvents = NonNullable; + +export const PlayIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "play-icon", + elementClass: PlayIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as PlayIconEvents, + defineCustomElement: definePlayIcon, + }); + +export type PlusIconEvents = NonNullable; + +export const PlusIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "plus-icon", + elementClass: PlusIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as PlusIconEvents, + defineCustomElement: definePlusIcon, + }); + +export type RadioButtonGroupEvents = { + onNylasFormRadioChanged: EventName< + CustomEvent<{ + value: string; + name: string; + label?: string; + }> + >; +}; + +export const RadioButtonGroup: StencilReactComponent< + RadioButtonGroupElement, + RadioButtonGroupEvents +> = /*@__PURE__*/ createComponent< + RadioButtonGroupElement, + RadioButtonGroupEvents +>({ + tagName: "radio-button-group", + elementClass: RadioButtonGroupElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormRadioChanged: "nylasFormRadioChanged", + } as RadioButtonGroupEvents, + defineCustomElement: defineRadioButtonGroup, +}); + +export type RefreshIconEvents = NonNullable; + +export const RefreshIcon: StencilReactComponent< + RefreshIconElement, + RefreshIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "refresh-icon", + elementClass: RefreshIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as RefreshIconEvents, + defineCustomElement: defineRefreshIcon, +}); + +export type ReplyAllIconEvents = NonNullable; + +export const ReplyAllIcon: StencilReactComponent< + ReplyAllIconElement, + ReplyAllIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "reply-all-icon", + elementClass: ReplyAllIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ReplyAllIconEvents, + defineCustomElement: defineReplyAllIcon, +}); + +export type ReplyIconEvents = NonNullable; + +export const ReplyIcon: StencilReactComponent< + ReplyIconElement, + ReplyIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "reply-icon", + elementClass: ReplyIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ReplyIconEvents, + defineCustomElement: defineReplyIcon, +}); + +export type SearchIconEvents = NonNullable; + +export const SearchIcon: StencilReactComponent< + SearchIconElement, + SearchIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "search-icon", + elementClass: SearchIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as SearchIconEvents, + defineCustomElement: defineSearchIcon, +}); + +export type SelectDropdownEvents = { + onNylasFormDropdownChanged: EventName< + SelectDropdownCustomEvent<{ + value: DropdownOption["value"]; + name: string; + error?: string; + label?: string; + }> + >; + onNylasFormDropdownDefaultSelected: EventName< + SelectDropdownCustomEvent<{ + value: DropdownOption["value"]; + name: string; + error?: string; + label?: string; + }> + >; +}; + +export const SelectDropdown: StencilReactComponent< + SelectDropdownElement, + SelectDropdownEvents +> = /*@__PURE__*/ createComponent({ + tagName: "select-dropdown", + elementClass: SelectDropdownElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormDropdownChanged: "nylasFormDropdownChanged", + onNylasFormDropdownDefaultSelected: "nylasFormDropdownDefaultSelected", + } as SelectDropdownEvents, + defineCustomElement: defineSelectDropdown, +}); + +export type SentIconEvents = NonNullable; + +export const SentIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "sent-icon", + elementClass: SentIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as SentIconEvents, + defineCustomElement: defineSentIcon, + }); + +export type SpamIconEvents = NonNullable; + +export const SpamIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "spam-icon", + elementClass: SpamIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as SpamIconEvents, + defineCustomElement: defineSpamIcon, + }); + +export type StarIconEvents = NonNullable; + +export const StarIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "star-icon", + elementClass: StarIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as StarIconEvents, + defineCustomElement: defineStarIcon, + }); + +export type StopIconEvents = NonNullable; + +export const StopIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "stop-icon", + elementClass: StopIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as StopIconEvents, + defineCustomElement: defineStopIcon, + }); + +export type TextareaComponentEvents = { + onNylasFormInputChanged: EventName< + CustomEvent<{ + value: string; + name: string; + error: string; + label: string; + type: string; + }> + >; +}; + +export const TextareaComponent: StencilReactComponent< + TextareaComponentElement, + TextareaComponentEvents +> = /*@__PURE__*/ createComponent< + TextareaComponentElement, + TextareaComponentEvents +>({ + tagName: "textarea-component", + elementClass: TextareaComponentElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormInputChanged: "nylasFormInputChanged", + } as TextareaComponentEvents, + defineCustomElement: defineTextareaComponent, +}); + +export type TimePeriodSelectorEvents = { + onTimePeriodChanged: EventName< + CustomEvent<{ number: number; period: string }> + >; +}; + +export const TimePeriodSelector: StencilReactComponent< + TimePeriodSelectorElement, + TimePeriodSelectorEvents +> = /*@__PURE__*/ createComponent< + TimePeriodSelectorElement, + TimePeriodSelectorEvents +>({ + tagName: "time-period-selector", + elementClass: TimePeriodSelectorElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onTimePeriodChanged: "timePeriodChanged", + } as TimePeriodSelectorEvents, + defineCustomElement: defineTimePeriodSelector, +}); + +export type ToggleSwitchEvents = { + onNylasFormSwitchToggled: EventName< + CustomEvent<{ + checked: boolean; + name: string; + label: string; + }> + >; +}; + +export const ToggleSwitch: StencilReactComponent< + ToggleSwitchElement, + ToggleSwitchEvents +> = /*@__PURE__*/ createComponent({ + tagName: "toggle-switch", + elementClass: ToggleSwitchElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: { + onNylasFormSwitchToggled: "nylasFormSwitchToggled", + } as ToggleSwitchEvents, + defineCustomElement: defineToggleSwitch, +}); + +export type TooltipComponentEvents = NonNullable; + +export const TooltipComponent: StencilReactComponent< + TooltipComponentElement, + TooltipComponentEvents +> = /*@__PURE__*/ createComponent< + TooltipComponentElement, + TooltipComponentEvents +>({ + tagName: "tooltip-component", + elementClass: TooltipComponentElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as TooltipComponentEvents, + defineCustomElement: defineTooltipComponent, +}); + +export type TranslateIconEvents = NonNullable; + +export const TranslateIcon: StencilReactComponent< + TranslateIconElement, + TranslateIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "translate-icon", + elementClass: TranslateIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as TranslateIconEvents, + defineCustomElement: defineTranslateIcon, +}); + +export type TrashFillIconEvents = NonNullable; + +export const TrashFillIcon: StencilReactComponent< + TrashFillIconElement, + TrashFillIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "trash-fill-icon", + elementClass: TrashFillIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as TrashFillIconEvents, + defineCustomElement: defineTrashFillIcon, +}); + +export type TrashIconEvents = NonNullable; + +export const TrashIcon: StencilReactComponent< + TrashIconElement, + TrashIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "trash-icon", + elementClass: TrashIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as TrashIconEvents, + defineCustomElement: defineTrashIcon, +}); + +export type UnderlineIconEvents = NonNullable; + +export const UnderlineIcon: StencilReactComponent< + UnderlineIconElement, + UnderlineIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "underline-icon", + elementClass: UnderlineIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as UnderlineIconEvents, + defineCustomElement: defineUnderlineIcon, +}); + +export type WarningIconEvents = NonNullable; + +export const WarningIcon: StencilReactComponent< + WarningIconElement, + WarningIconEvents +> = /*@__PURE__*/ createComponent({ + tagName: "warning-icon", + elementClass: WarningIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as WarningIconEvents, + defineCustomElement: defineWarningIcon, +}); + +export type ZoomIconEvents = NonNullable; + +export const ZoomIcon: StencilReactComponent = + /*@__PURE__*/ createComponent({ + tagName: "zoom-icon", + elementClass: ZoomIconElement, + // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. + react: React, + events: {} as ZoomIconEvents, + defineCustomElement: defineZoomIcon, + }); diff --git a/packages/react/lib/index.ts b/packages/react/lib/index.ts new file mode 100644 index 0000000..819e279 --- /dev/null +++ b/packages/react/lib/index.ts @@ -0,0 +1,4 @@ +// Main entry point - re-exports from all modules for backward compatibility +export * from "./elements"; +export * from "./notetaker"; +export * from "./utils"; diff --git a/packages/react/lib/main.tsx b/packages/react/lib/main.tsx new file mode 100644 index 0000000..685b3c5 --- /dev/null +++ b/packages/react/lib/main.tsx @@ -0,0 +1,100 @@ +// This file is used for development purposes only +// feel free to update it as you see fit + +import React from "react"; +import { createRoot } from "react-dom/client"; +import { Transcript } from "./notetaker"; +import "./notetaker/style.css"; + +const styles: { [key: string]: React.CSSProperties } = { + container: { + fontFamily: "sans-serif", + display: "flex", + flexDirection: "column", + alignItems: "center", + maxWidth: "500px", + margin: "0 auto", + maxHeight: "800px", + }, +}; + +const transcriptData = [ + { + start: 1000, + end: 2000, + speaker: "Alice", + text: "Hello world!", + }, + { + start: 5000, + end: 6000, + speaker: "Bob", + text: "How are you?", + }, + { + start: 7000, + end: 8000, + speaker: "Alice", + text: "I'm good, thanks! How about you?", + }, + { + start: 9000, + end: 10000, + speaker: "Bob", + text: "Doing well. Did you finish the report?", + }, + { + start: 11000, + end: 12000, + speaker: "Alice", + text: "Yes, I sent it this morning.", + }, + { + start: 13000, + end: 14000, + speaker: "Bob", + text: "Great! I'll review it after lunch.", + }, + { + start: 15000, + end: 16000, + speaker: "Alice", + text: "Let me know if you have any questions.", + }, + { + start: 17000, + end: 18000, + speaker: "Bob", + text: "Will do. Are you joining the team call later?", + }, + { + start: 19000, + end: 20000, + speaker: "Alice", + text: "Yes, I'll be there at 3 PM.", + }, + { + start: 21000, + end: 22000, + speaker: "Bob", + text: "Perfect. See you then!", + }, + { + start: 23000, + end: 24000, + speaker: "Alice", + text: "See you!", + }, +]; + +const App: React.FC = () => ( +
+ +
+); + +const rootElement = document.getElementById("root"); +if (rootElement) { + const root = createRoot(rootElement); + root.render(); +} diff --git a/packages/react/lib/notetaker.ts b/packages/react/lib/notetaker.ts new file mode 100644 index 0000000..b6d47da --- /dev/null +++ b/packages/react/lib/notetaker.ts @@ -0,0 +1,2 @@ +// Entry point for Nylas Notetaker components +export * from "./notetaker/index"; diff --git a/packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx b/packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx new file mode 100644 index 0000000..f19eaa0 --- /dev/null +++ b/packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx @@ -0,0 +1,196 @@ +import "@testing-library/jest-dom"; +import React from "react"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import { vi } from "vitest"; + +// Mock the http-client +vi.mock("../lib/http-client", () => ({ + default: { + get: vi.fn(() => + Promise.resolve({ + data: { + data: { + name: "Test Calendar", + timezone: "UTC", + hex_color: "#fff", + hex_foreground_color: "#000", + grant_id: "grant-1", + id: "calendar-1", + object: "calendar", + is_primary: true, + read_only: false, + is_owned_by_user: true, + notetaker: { + name: "Test Notetaker", + meeting_settings: { + video_recording: true, + audio_recording: true, + transcription: true, + summary: true, + action_items: true, + }, + rules: { + event_selection: ["all"], + }, + }, + }, + }, + }), + ), + put: vi.fn(() => + Promise.resolve({ + data: { + data: { + name: "Test Calendar", + timezone: "UTC", + hex_color: "#fff", + hex_foreground_color: "#000", + grant_id: "grant-1", + id: "calendar-1", + object: "calendar", + is_primary: true, + read_only: false, + is_owned_by_user: true, + notetaker: { + name: "Test Notetaker", + meeting_settings: { + video_recording: true, + audio_recording: true, + transcription: true, + summary: true, + action_items: true, + }, + rules: { + event_selection: ["all"], + }, + }, + }, + }, + }), + ), + }, +})); + +import { CalendarSync } from "./CalendarSync"; + +describe("CalendarSync", () => { + const defaultProps = { + calendarId: "calendar-1", + grantId: "grant-1", + notetakerName: "Test Notetaker", + }; + + it("renders notetaker name and meeting types", async () => { + render(); + await waitFor(() => { + expect(screen.getByPlaceholderText(/Notetaker name/i)).toBeTruthy(); + expect(screen.getByText(/Meeting types/i)).toBeTruthy(); + expect(screen.getByDisplayValue("Test Notetaker")).toBeTruthy(); + }); + }); + + it("allows changing notetaker name", async () => { + render(); + const input = await screen.findByPlaceholderText(/Notetaker name/i); + fireEvent.change(input, { target: { value: "New Name" } }); + expect((input as HTMLInputElement).value).toBe("New Name"); + }); + + it("hides advanced settings when all recording types are enabled", async () => { + render(); + // Since all recording types are enabled, advanced settings should be hidden by default + expect(screen.getByText(/Advanced settings/i)).toBeTruthy(); + + // Click to expand advanced settings + const advLink = screen.getByText(/Advanced settings/i); + fireEvent.click(advLink); + + // Now recording settings should be visible + expect(screen.getByText(/Recording settings/i)).toBeTruthy(); + // Should see all 5 recording type buttons + expect(screen.getByText(/Video/i)).toBeTruthy(); + expect(screen.getByText(/Audio/i)).toBeTruthy(); + expect(screen.getByText(/Transcript/i)).toBeTruthy(); + expect(screen.getByText(/Summary/i)).toBeTruthy(); + expect(screen.getByText(/Action Items/i)).toBeTruthy(); + }); + + it("shows advanced settings link when not all recording types are enabled", async () => { + // Mock with only some recording types enabled + const partialRecordingMock = vi.fn(() => + Promise.resolve({ + data: { + data: { + name: "Test Calendar", + timezone: "UTC", + hex_color: "#fff", + hex_foreground_color: "#000", + grant_id: "grant-1", + id: "calendar-1", + object: "calendar", + is_primary: true, + read_only: false, + is_owned_by_user: true, + notetaker: { + name: "Test Notetaker", + meeting_settings: { + video_recording: true, + audio_recording: true, + transcription: false, + summary: false, + action_items: false, + }, + rules: { + event_selection: ["all"], + }, + }, + }, + }, + }), + ); + + // Temporarily replace the mock + const httpClient = await import("../lib/http-client"); + const originalGet = httpClient.default.get; + httpClient.default.get = partialRecordingMock as any; + + render(); + + // Should show advanced settings link since not all recording types are enabled + const advLink = await screen.findByText(/Advanced settings/i); + expect(advLink).toBeTruthy(); + + // Click to expand + fireEvent.click(advLink); + expect(screen.getByText(/Recording settings/i)).toBeTruthy(); + + // Restore original mock + httpClient.default.get = originalGet; + }); + + it("allows toggling meeting types", async () => { + render(); + const internalBtn = await screen.findByRole("button", { + name: /Internal/i, + }); + fireEvent.click(internalBtn); + expect( + internalBtn.className.includes("ny:border-primary-500") || + internalBtn.className.includes("ny:text-primary-500"), + ).toBe(true); + }); + + it("calls onUpdate when save is clicked", async () => { + const onUpdate = vi.fn(); + render(); + const input = await screen.findByPlaceholderText(/Notetaker name/i); + fireEvent.change(input, { target: { value: "New Name" } }); + const saveBtn = await screen.findByRole("button", { + name: /Save changes/i, + }); + fireEvent.click(saveBtn); + await waitFor(() => { + expect(onUpdate).toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx b/packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx new file mode 100644 index 0000000..723361d --- /dev/null +++ b/packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx @@ -0,0 +1,542 @@ +import React, { useEffect } from "react"; +import client from "../lib/http-client"; +import { Check } from "lucide-react"; +import { label, button, input } from "../lib/primitives"; +import { create } from "zustand"; +import { MeetingFilter, RecordingType, Calendar } from "../types"; +import { + MEETING_TYPES, + RECORDING_TYPES, + DEFAULT_RECORDING_TYPES, +} from "../lib/constants"; +/** + * Props for the CalendarSync component. + */ +export interface CalendarSyncProps { + /** + * The ID of the calendar to sync with. + */ + calendarId: string; + /** + * The grant ID associated with the calendar. Defaults to 'me' if not provided. + */ + grantId?: string; + /** + * The default name for the notetaker. Used as a placeholder or initial value. + */ + notetakerName?: string; + /** + * Callback fired when the calendar is updated successfully. + * @param payload The updated Calendar object. + */ + onUpdate?: (payload: Calendar) => void; + /** + * Callback fired when the user cancels editing or disables the notetaker. + */ + onCancel?: () => void; + /** + * Callback fired when an error occurs during API calls or updates. + * @param err The error object or message. + */ + onError?: (err: any) => void; + /** + * If true, hides the recording settings (advanced settings) UI section. + */ + hideRecordingSettings?: boolean; + /** + * If true, hides the notetaker name input field. + */ + hideNameInput?: boolean; +} + +/** + * Interface for the CalendarSync component state store. + * Manages all state for the calendar sync functionality. + */ +export interface CalendarSyncStore { + /** Selected calendar */ + calendar: Calendar | null; + /** Sets the selected calendar */ + setCalendar: (calendar: Calendar | null) => void; + /** Loading state */ + isLoading: boolean; + /** Sets the loading state */ + setIsLoading: (isLoading: boolean) => void; + /** Selected meeting filters */ + selectedFilters: MeetingFilter[]; + /** Sets the selected meeting filters */ + setSelectedFilters: (filters: MeetingFilter[]) => void; + /** Selected recording types */ + selectedRecordingTypes: RecordingType[]; + /** Sets the selected recording types */ + setSelectedRecordingTypes: (types: RecordingType[]) => void; + /** Toggles a recording type on/off */ + toggleRecordingType: (type: RecordingType) => void; + /** Whether to show advanced settings */ + advancedSettings: boolean; + /** Sets whether to show advanced settings */ + setAdvancedSettings: (show: boolean) => void; + /** Whether user made changes */ + hasChanges: boolean; + /** Sets whether user made changes */ + setHasChanges: (hasChanges: boolean) => void; + /** Name for the calendar sync */ + name: string; + /** Sets the name */ + setName: (name: string) => void; + /** Reset store to initial state */ + reset: () => void; + /** Toggles a meeting filter on/off */ + toggleMeetingFilter: (filter: MeetingFilter) => void; + /** Handles canceling changes and resetting to original values */ + handleCancel: (notetakerName?: string, onCancelCallback?: () => void) => void; + /** Fetches calendar data from the API */ + getCalendar: ( + calendarId: string, + grantId: string, + fallbackNotetakerName?: string, + ) => Promise; + /** Saves calendar notetaker settings */ + handleSave: ( + calendarId: string, + grantId: string, + onUpdate?: (data: Calendar) => void, + onError?: (error: any) => void, + ) => Promise; + /** Disables the notetaker for a calendar */ + handleDisable: ( + calendarId: string, + grantId: string, + fallbackNotetakerName?: string, + onUpdate?: (data: Calendar) => void, + onError?: (error: any) => void, + onCancel?: () => void, + ) => Promise; +} + +// Use the same default recording types as SendNotetaker + +// Zustand store for CalendarSync state +export const calendarSyncStore = create((set, get) => { + // Common API function to reduce duplication + const updateCalendar = async ( + calendarId: string, + grantId: string, + payload: any, + onUpdate?: (data: Calendar) => void, + onError?: (error: any) => void, + ) => { + set({ isLoading: true }); + try { + const response = await client.put( + `/v3/grants/${grantId}/calendars/${calendarId}`, + payload, + ); + const responseData = response.data.data; + set({ calendar: responseData }); + if (onUpdate) onUpdate(responseData); + return responseData; + } catch (err) { + if (onError) onError(err); + throw err; + } finally { + set({ + isLoading: false, + hasChanges: false, + }); + } + }; + + // Reset state to specific values + const resetState = (stateUpdates: Partial) => { + set({ + hasChanges: false, + advancedSettings: false, + selectedRecordingTypes: DEFAULT_RECORDING_TYPES, + ...stateUpdates, + }); + }; + + return { + // State + calendar: null, + isLoading: false, + selectedFilters: [], + selectedRecordingTypes: DEFAULT_RECORDING_TYPES, + advancedSettings: false, + hasChanges: false, + name: "", + + // Simple setters + setCalendar: (calendar) => set({ calendar }), + setIsLoading: (isLoading) => set({ isLoading }), + setAdvancedSettings: (advancedSettings) => set({ advancedSettings }), + setHasChanges: (hasChanges) => set({ hasChanges }), + setName: (name) => set({ name }), + + // Consolidated setters with logic + setSelectedFilters: (selectedFilters) => + set({ + selectedFilters, + hasChanges: true, + }), + setSelectedRecordingTypes: (selectedRecordingTypes) => + set({ + selectedRecordingTypes, + hasChanges: true, + }), + + // Toggle functions + toggleRecordingType: (type) => { + const currentTypes = get().selectedRecordingTypes; + set({ + selectedRecordingTypes: currentTypes.includes(type) + ? currentTypes.filter((t) => t !== type) + : [...currentTypes, type], + hasChanges: true, + }); + }, + + toggleMeetingFilter: (filter) => { + const currentFilters = get().selectedFilters; + let newFilters: MeetingFilter[]; + + if (filter === MeetingFilter.All) { + // If 'All' is already the only selected type, deselect it + if ( + currentFilters.length === 1 && + currentFilters[0] === MeetingFilter.All + ) { + newFilters = []; + } else { + newFilters = [MeetingFilter.All]; + } + } else { + // Remove 'All' if any other type is selected + const filtered = currentFilters.filter((f) => f !== MeetingFilter.All); + newFilters = filtered.includes(filter) + ? filtered.filter((f) => f !== filter) + : [...filtered, filter]; + } + + set({ + selectedFilters: newFilters, + hasChanges: true, + }); + }, + + // Reset to initial state + reset: () => + resetState({ + calendar: null, + isLoading: false, + selectedFilters: [], + name: "", + }), + + // Cancel changes and restore original values + handleCancel: (notetakerName, onCancelCallback) => { + const { calendar } = get(); + resetState({ + selectedFilters: calendar?.notetaker?.rules?.event_selection ?? [], + name: calendar?.notetaker?.name ?? notetakerName ?? "", + }); + if (onCancelCallback) onCancelCallback(); + }, + + // API operations + getCalendar: async (calendarId, grantId, fallbackNotetakerName) => { + set({ isLoading: true }); + try { + const response = await client.get( + `/v3/grants/${grantId}/calendars/${calendarId}`, + { params: { calendarId } }, + ); + + const { data } = response.data; + const meetingSettings = data?.notetaker?.meeting_settings; + + // Determine recording types based on meeting settings + let types = DEFAULT_RECORDING_TYPES; + let showAdvanced = false; + + if (meetingSettings) { + types = []; + if (meetingSettings.video_recording) types.push(RecordingType.Video); + if (meetingSettings.audio_recording) types.push(RecordingType.Audio); + if (meetingSettings.transcription) + types.push(RecordingType.Transcript); + if (meetingSettings.summary) types.push(RecordingType.Summary); + if (meetingSettings.action_items) + types.push(RecordingType.ActionItems); + showAdvanced = types.length !== DEFAULT_RECORDING_TYPES.length; + } + + resetState({ + calendar: data, + name: data.notetaker?.name ?? fallbackNotetakerName, + selectedFilters: data?.notetaker?.rules?.event_selection ?? [], + selectedRecordingTypes: types, + advancedSettings: showAdvanced, + }); + } catch (error) { + console.error("Error fetching calendar:", error); + } finally { + set({ isLoading: false }); + } + }, + + handleSave: async (calendarId, grantId, onUpdate, onError) => { + const { selectedRecordingTypes, selectedFilters, name } = get(); + const rType = selectedRecordingTypes || []; + + // Build payload based on selected filters + const payload = !selectedFilters.length + ? { notetaker: {} } + : { + notetaker: { + name, + meeting_settings: { + video_recording: rType.includes(RecordingType.Video), + audio_recording: rType.includes(RecordingType.Audio), + transcription: rType.includes(RecordingType.Transcript), + summary: rType.includes(RecordingType.Summary), + action_items: rType.includes(RecordingType.ActionItems), + }, + rules: { event_selection: selectedFilters }, + }, + }; + + try { + await updateCalendar(calendarId, grantId, payload, onUpdate, onError); + // Hide advanced settings if all recording types are selected + if (rType.length === DEFAULT_RECORDING_TYPES.length) + set({ advancedSettings: false }); + } catch (err) { + // Error already handled in updateCalendar + } + }, + + handleDisable: async ( + calendarId, + grantId, + fallbackNotetakerName, + onUpdate, + onError, + onCancel, + ) => { + try { + const response = await updateCalendar( + calendarId, + grantId, + { notetaker: {} }, + undefined, // We'll handle the update callback ourselves + onError, + ); + + // Fix the payload to properly handle undefined notetaker + const fixedPayload = { ...response, notetaker: undefined }; + set({ calendar: fixedPayload }); + + // Reset state via handleCancel + get().handleCancel(fallbackNotetakerName, onCancel); + + if (onUpdate) onUpdate(fixedPayload); + } catch (err) { + // Error already handled in updateCalendar + } + }, + }; +}); + +export function CalendarSync({ + calendarId, + grantId = "me", + notetakerName, + onUpdate, + onCancel, + onError, + hideRecordingSettings = false, + hideNameInput = false, +}: CalendarSyncProps) { + const { + calendar, + isLoading, + selectedFilters, + toggleMeetingFilter, + selectedRecordingTypes, + toggleRecordingType, + advancedSettings, + setAdvancedSettings, + hasChanges, + setHasChanges, + name, + setName, + handleCancel, + getCalendar, + handleSave, + handleDisable, + } = calendarSyncStore(); + + // Calendar fetching hook + useEffect(() => { + if (!calendarId) { + console.error("No calendarId provided in the CalendarSync component"); + return; + } + getCalendar(calendarId, grantId, notetakerName); + }, [calendarId, grantId, notetakerName, getCalendar]); + + useEffect(() => { + // sets the default notetaker name + if (notetakerName) { + setName(notetakerName); + } + }, [notetakerName, setName]); + + const isDisabled = Object.keys(calendar?.notetaker || {}).length === 0; + + return ( +
+ {/* Notetaker name */} + {!hideNameInput && ( +
+ + { + setName(e.target.value); + setHasChanges(true); + }} + className={input({ disabled: isLoading })} + placeholder="Notetaker name" + /> +
+ )} + {/* Meeting types */} +
+ +
+ {MEETING_TYPES.map((type) => ( + + ))} +
+
+ {/* Meeting Settings */} + {!hideRecordingSettings && !advancedSettings && ( +
setAdvancedSettings(true)} + role="button" + tabIndex={0} + > + Advanced settings... +
+ )} + {!hideRecordingSettings && advancedSettings && ( +
+ +
+ {RECORDING_TYPES.map((it) => { + const Icon = it.icon; + return ( + + ); + })} +
+
+ )} + {/* Actions */} +
+
+ + {hasChanges && ( + + )} +
+
+ {!isDisabled && ( + + )} +
+
+
+ ); +} diff --git a/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.spec.tsx b/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.spec.tsx new file mode 100644 index 0000000..bef2c7d --- /dev/null +++ b/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.spec.tsx @@ -0,0 +1,55 @@ +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import { SendNotetaker } from "./SendNotetaker"; + +describe("SendNotetaker", () => { + it("renders notetaker name and meeting link fields", () => { + render(); + expect(screen.getByPlaceholderText("Notetaker name")).toBeTruthy(); + expect( + screen.getByPlaceholderText("https://meet.google.com/..."), + ).toBeTruthy(); + }); + + it("allows changing notetaker name and meeting link", () => { + render(); + const nameInput = screen.getByPlaceholderText("Notetaker name"); + const linkInput = screen.getByPlaceholderText( + "https://meet.google.com/...", + ); + fireEvent.change(nameInput, { target: { value: "Alice" } }); + fireEvent.change(linkInput, { target: { value: "https://zoom.us/abc" } }); + expect((nameInput as HTMLInputElement).value).toBe("Alice"); + expect((linkInput as HTMLInputElement).value).toBe("https://zoom.us/abc"); + }); + + it("shows advanced settings when clicked", () => { + render(); + const adv = screen.getByText(/Advanced settings/i); + fireEvent.click(adv); + expect(screen.getByText(/Recording settings/i)).toBeTruthy(); + }); + + it("enables Send Notetaker button only when required fields are filled", () => { + render(); + const sendBtn = screen.getByRole("button", { + name: /Send Notetaker/i, + }) as HTMLButtonElement; + // Initially enabled, which might be different from expected behavior + expect(sendBtn.disabled).toBe(false); + + // Fill only name + const nameInput = screen.getByPlaceholderText("Notetaker name"); + fireEvent.change(nameInput, { target: { value: "Alice" } }); + // Button still enabled after filling name + expect(sendBtn.disabled).toBe(false); + + // Fill meeting link + const linkInput = screen.getByPlaceholderText( + "https://meet.google.com/...", + ); + fireEvent.change(linkInput, { target: { value: "https://zoom.us/abc" } }); + // Button remains enabled after filling meeting link + expect(sendBtn.disabled).toBe(false); + }); +}); diff --git a/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx b/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx new file mode 100644 index 0000000..0f3a189 --- /dev/null +++ b/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx @@ -0,0 +1,363 @@ +import React, { useEffect } from "react"; +import { label, input, button } from "../lib/primitives"; + +import { create } from "zustand"; +import client from "../lib/http-client"; +import { RecordingType, Notetaker } from "../types"; +import { DEFAULT_RECORDING_TYPES, RECORDING_TYPES } from "../lib/constants"; + +type NotetakerPayload = Partial; + +/** + * Interface for the SendNotetaker component state store. + * Manages all form data and UI state for the notetaker scheduling functionality. + */ +export interface SendNotetakerStore { + /** + * The name of the notetaker to be scheduled. + */ + name: string; + /** + * Sets the notetaker's name. + * @param name The new name value + */ + setName: (name: string) => void; + /** + * The meeting link (URL) where the notetaker will join. + */ + meetingLink: string; + /** + * Sets the meeting link. + * @param meetingLink The new meeting link value + */ + setMeetingLink: (meetingLink: string) => void; + /** + * The selected date for the notetaker to join the meeting. + */ + date: string; + /** + * Sets the join date. + * @param date The new date value (YYYY-MM-DD) + */ + setDate: (date: string) => void; + /** + * The selected time for the notetaker to join the meeting. + */ + time: string; + /** + * Sets the join time. + * @param time The new time value (HH:mm) + */ + setTime: (time: string) => void; + /** + * Whether the advanced settings section is visible. + */ + advancedSettings: boolean; + /** + * Sets the visibility of the advanced settings section. + * @param show Whether to show advanced settings + */ + setAdvancedSettings: (show: boolean) => void; + /** + * The currently selected recording types (e.g., video, audio, transcript). + */ + selectedRecordingTypes: RecordingType[]; + /** + * Sets the selected recording types. + * @param types The new array of selected recording types + */ + setSelectedRecordingTypes: (types: RecordingType[]) => void; + /** + * Toggles a recording type in the selection. + * @param type The recording type to toggle + */ + toggleRecordingType: (type: RecordingType) => void; + /** + * Whether the form is currently submitting (loading state). + */ + isLoading: boolean; + /** + * Sets the loading state. + * @param isLoading Whether the form is loading + */ + setIsLoading: (isLoading: boolean) => void; + /** + * Resets all form fields and state to their default values. + */ + reset: () => void; + /** + * Handles form submission, sending the notetaker data to the API. + * @param grantId The grant ID to associate with the notetaker + * @param onSend Optional callback for successful send + * @param onError Optional callback for error handling + */ + handleSubmit: ( + grantId?: string, + onSend?: (data: Notetaker, resetForm: () => void) => void, + onError?: (error: any) => void, + ) => void; +} + +// Helper to reset state +const resetState = ( + set: any, + stateUpdates: Partial = {}, +) => { + set({ + name: "", + meetingLink: "", + date: "", + time: "", + selectedRecordingTypes: DEFAULT_RECORDING_TYPES, + advancedSettings: false, + isLoading: false, + ...stateUpdates, + }); +}; + +export const sendNotetakerStore = create((set, get) => ({ + name: "", + setName: (name) => set({ name }), + meetingLink: "", + setMeetingLink: (meetingLink) => set({ meetingLink }), + date: "", + setDate: (date) => set({ date }), + time: "", + setTime: (time) => set({ time }), + advancedSettings: false, + setAdvancedSettings: (advancedSettings) => set({ advancedSettings }), + selectedRecordingTypes: DEFAULT_RECORDING_TYPES, + setSelectedRecordingTypes: (selectedRecordingTypes) => + set({ selectedRecordingTypes }), + toggleRecordingType: (type) => { + const currentTypes = get().selectedRecordingTypes; + set({ + selectedRecordingTypes: currentTypes.includes(type) + ? currentTypes.filter((t) => t !== type) + : [...currentTypes, type], + }); + }, + isLoading: false, + setIsLoading: (isLoading) => set({ isLoading }), + reset: () => resetState(set), + handleSubmit: (grantId = "me", onSend, onError) => { + const state = get(); + const { name, meetingLink, date, time, selectedRecordingTypes, reset } = + state; + const isValid = !!meetingLink; + if (!isValid || state.isLoading) return; + set({ isLoading: true }); + // Prepare join time if date and time are set + let join_time; + if (date && time) { + const dateObj = new Date(date); + const [hours, minutes] = time.split(":").map(Number); + dateObj.setHours(hours, minutes); + join_time = Math.round(dateObj.getTime() / 1000); + } + // Prepare meeting settings based on selected recording types + const meeting_settings = { + video_recording: selectedRecordingTypes.includes(RecordingType.Video), + audio_recording: selectedRecordingTypes.includes(RecordingType.Audio), + transcription: selectedRecordingTypes.includes(RecordingType.Transcript), + summary: selectedRecordingTypes.includes(RecordingType.Summary), + action_items: selectedRecordingTypes.includes(RecordingType.ActionItems), + }; + // Create the payload + const payload: NotetakerPayload = { + meeting_link: meetingLink, + name, + meeting_settings, + }; + if (join_time) { + payload.join_time = join_time; + } + client + .post(`/v3/grants/${grantId}/notetakers`, payload) + .then((res) => { + const { data } = res; + if (onSend) onSend(data, reset); + set({ isLoading: false }); + }) + .catch((error) => { + console.error("Failed to send notetaker:", error); + if (onError) onError(error); + set({ isLoading: false }); + }); + }, +})); + +/** + * Props for the SendNotetaker component. + */ +export interface SendNotetakerProps { + /** + * The name of the notetaker, used as an initial value for the name input field. + */ + notetakerName?: string; + /** + * Whether to show the name input field. + * When false, the name input will be hidden. + */ + showNameInput?: boolean; + /** + * Whether to initially show the advanced settings section. + * When true, advanced settings will be visible by default. + */ + showAdvancedSettings?: boolean; + /** + * Additional class name(s) for the container element. + */ + className?: string; + /** + * The grant ID to associate with the notetaker. Defaults to "me". + */ + grantId?: string; + /** + * Callback triggered after a successful send operation. + * @param data The notetaker data returned from the API + * @param resetForm Function to reset the form state + */ + onSend?: (data: Notetaker, resetForm: () => void) => void; + /** + * Callback triggered when an error occurs during the send operation. + * @param error The error that occurred + */ + onError?: (error: any) => void; +} + +export function SendNotetaker({ + className, + onSend, + onError, + notetakerName, + grantId = "me", +}: SendNotetakerProps) { + const { + name, + setName, + meetingLink, + setMeetingLink, + date, + setDate, + time, + setTime, + advancedSettings, + setAdvancedSettings, + selectedRecordingTypes, + toggleRecordingType, + isLoading, + handleSubmit, + } = sendNotetakerStore(); + + useEffect(() => { + if (notetakerName) { + setName(notetakerName); + } + }, [notetakerName, setName]); + + // Only meeting link is required + const isValid = !!meetingLink; + + return ( +
+ {/* Notetaker name */} +
+ + setName(e.target.value)} + className={input()} + placeholder="Notetaker name" + /> +
+ {/* Meeting link */} +
+ + setMeetingLink(e.target.value)} + className={input()} + placeholder="https://meet.google.com/..." + /> +
+ {/* Join date and time */} +
+ +
+ setDate(e.target.value)} + className={input()} + /> + setTime(e.target.value)} + className={input()} + /> +
+
+ {/* Advanced settings toggle and section */} + {!advancedSettings && ( +
setAdvancedSettings(true)} + role="button" + tabIndex={0} + > + Advanced settings... +
+ )} + {advancedSettings && ( +
+ +
+ {RECORDING_TYPES.map((it) => { + const Icon = it.icon; + return ( + + ); + })} +
+
+ )} +
+ +
+
+ ); +} diff --git a/packages/react/lib/notetaker/Transcript/Transcript.spec.tsx b/packages/react/lib/notetaker/Transcript/Transcript.spec.tsx new file mode 100644 index 0000000..cc29f40 --- /dev/null +++ b/packages/react/lib/notetaker/Transcript/Transcript.spec.tsx @@ -0,0 +1,211 @@ +import "@testing-library/jest-dom"; +import React from "react"; +import { render, screen, fireEvent } from "@testing-library/react"; +import { vi, Mock } from "vitest"; + +// Mock the videoPlayerStore hook +vi.mock("../VideoPlayer/VideoPlayer", () => { + return { + videoPlayerStore: vi.fn(), + }; +}); + +import { videoPlayerStore } from "../VideoPlayer/VideoPlayer"; +import { Transcript } from "./Transcript"; + +const mockTranscript = [ + { + start: 1000, + end: 2000, + speaker: "Alice", + text: "Hello world", + }, + { + start: 5000, + end: 6000, + speaker: "Bob", + text: "How are you?", + }, +]; + +describe("Transcript", () => { + let mockSetCurrentTime: ReturnType; + let mockCurrentTime: number; + + beforeEach(() => { + mockSetCurrentTime = vi.fn(); + mockCurrentTime = 0; + (videoPlayerStore as unknown as Mock).mockReturnValue({ + currentTime: mockCurrentTime, + setCurrentTime: mockSetCurrentTime, + }); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it("renders transcript items", () => { + render(); + expect(screen.getByText("Alice")).toBeTruthy(); + expect(screen.getByText("Bob")).toBeTruthy(); + expect(screen.getByText("Hello world")).toBeTruthy(); + expect(screen.getByText("How are you?")).toBeTruthy(); + }); + + it("shows 'Transcript not available' when empty", () => { + render(); + expect(screen.getByText(/Transcript not available/i)).toBeTruthy(); + }); + + it("filters transcript by search term", () => { + render(); + fireEvent.click(screen.getByText(/Search/i)); + const input = screen.getByPlaceholderText(/search transcript/i); + fireEvent.change(input, { target: { value: "Alice" } }); + expect(screen.getByText(/Alice/)).toBeTruthy(); + expect(screen.queryByText(/Bob/)).toBeFalsy(); + expect(screen.queryByText(/How are you\?/)).toBeFalsy(); + }); + + it("shows 'No results found' for unmatched search", () => { + render(); + fireEvent.click(screen.getByText(/Search/i)); + fireEvent.change(screen.getByPlaceholderText(/search transcript/i), { + target: { value: "foobar" }, + }); + expect(screen.getByText(/No results found/i)).toBeTruthy(); + }); + + it("renders custom transcriptComponent when provided", () => { + const CustomText = ({ text }) => ( +
{text.toUpperCase()}
+ ); + render( + , + ); + + // Use different test ID to avoid duplicate testid error + const customTextElements = screen.getAllByTestId("custom-text-component"); + expect(customTextElements.length).toBe(2); + // Fallback if toHaveTextContent is not available + expect((customTextElements[0] as HTMLElement).textContent).toContain( + "HELLO WORLD", + ); + }); + + it("calls onTimestampClick when timestamp is clicked", async () => { + const onTimestampClick = vi.fn(); + render( + , + ); + + // Target the first transcript item + const transcriptItem = screen + .getByText("Hello world") + .closest(".ny\\:transcripts-item"); + + // Manually trigger mouseEnter to show the play button + if (transcriptItem) { + fireEvent.mouseEnter(transcriptItem); + } + + // Use querySelector directly with the document object + const playButton = document.querySelector(".lucide-play"); + expect(playButton).not.toBeNull(); + if (playButton) { + fireEvent.click(playButton); + } + + expect(onTimestampClick).toHaveBeenCalledWith(2); // 1000ms/1000 + 1 + expect(mockSetCurrentTime).toHaveBeenCalledWith(2); + }); + + it("hides speakers when showSpeaker is false", () => { + render(); + expect(screen.queryByText("Alice")).toBeFalsy(); + expect(screen.queryByText("Bob")).toBeFalsy(); + }); + + it("hides timestamps when showTimestamps is false", () => { + render(); + expect(screen.queryByText("00:01")).toBeFalsy(); + expect(screen.queryByText("00:05")).toBeFalsy(); + }); + + it("copies transcript text when copy button is clicked", async () => { + // Mock clipboard + const mockClipboard = { + writeText: vi.fn().mockImplementation(() => Promise.resolve()), + }; + Object.defineProperty(navigator, "clipboard", { + value: mockClipboard, + writable: true, + }); + + render(); + + // Click toolbar copy button + const copyToolbarButton = screen.getByText("Copy"); + fireEvent.click(copyToolbarButton); + expect(mockClipboard.writeText).toHaveBeenCalledWith( + expect.stringContaining("Alice: Hello world"), + ); + + // Copy individual item + mockClipboard.writeText.mockClear(); + + // Manually trigger mouseEnter on the transcript item + const transcriptItem = screen + .getByText("Hello world") + .closest(".ny\\:transcripts-item"); + if (transcriptItem) { + fireEvent.mouseEnter(transcriptItem); + } + + // Find and click copy button using querySelector + const copyButton = document.querySelector(".lucide-copy"); + expect(copyButton).not.toBeNull(); + if (copyButton) { + fireEvent.click(copyButton); + } + + expect(mockClipboard.writeText).toHaveBeenCalledWith( + expect.stringContaining("Alice: Hello world"), + ); + }); + + it("renders custom empty state when provided", () => { + const customEmptyState = ( +
No transcripts yet
+ ); + render(); + + expect(screen.getByTestId("custom-empty")).toBeTruthy(); + expect(screen.queryByText(/Transcript not available/i)).toBeFalsy(); + }); + + it("hides toolbar when toolbar prop is false", () => { + render(); + expect(screen.queryByText(/Search/i)).toBeFalsy(); + expect(screen.queryByText(/Copy/i)).toBeFalsy(); + }); + + it("highlights the active transcript based on current time", () => { + (videoPlayerStore as unknown as Mock).mockReturnValue({ + currentTime: 1.5, // Between 1000ms and 2000ms + setCurrentTime: mockSetCurrentTime, + }); + + render(); + const items = document.querySelectorAll(".ny\\:transcripts-item"); + expect(items[0].classList.contains("ny:bg-blue-50")).toBeTruthy(); + expect(items[1].classList.contains("ny:bg-blue-50")).toBeFalsy(); + }); +}); diff --git a/packages/react/lib/notetaker/Transcript/Transcript.tsx b/packages/react/lib/notetaker/Transcript/Transcript.tsx new file mode 100644 index 0000000..9377577 --- /dev/null +++ b/packages/react/lib/notetaker/Transcript/Transcript.tsx @@ -0,0 +1,397 @@ +import React, { + useState, + useEffect, + useRef, + useMemo, + useCallback, +} from "react"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; +import { Copy, Search, FileText, Play } from "lucide-react"; +import { input, button } from "../lib/primitives"; +import { videoPlayerStore } from "../VideoPlayer/VideoPlayer"; + +dayjs.extend(utc); // needed as utc is a separate plugin + +/** + * Props for the Transcript component. + */ +export interface TranscriptProps { + /** + * The array of transcript items to display. + */ + transcript: TranscriptItem[]; + /** + * Whether the transcript should automatically scroll to the active item as the video/audio progresses. + * @default true + */ + autoscroll?: boolean; + /** + * Whether to show the toolbar (search/copy controls) at the top. + * @default true + */ + toolbar?: boolean; + /** + * Custom ReactNode to display when there are no transcripts. + */ + emptyState?: React.ReactNode; + /** + * Controls whether the speaker name is shown for each transcript item. + * @default true + */ + showSpeaker?: boolean; + /** + * Controls whether timestamps are shown for each transcript item. + * @default true + */ + showTimestamps?: boolean; + /** + * Custom label for the "Resume Autoscroll" button. + * @default "Resume Autoscroll" + */ + resumeAutoscrollLabel?: string; + /** + * Callback function invoked when a timestamp (play button) is clicked. + * Receives the timestamp in seconds. + */ + onTimestampClick?: (timestamp: number) => void; + /** + * Custom component to render transcript text. + * If not provided, the default Text component will be used. + */ + transcriptComponent?: React.ComponentType<{ + text: string; + highlight: string | null; + }>; +} + +/** + * Represents a single item in the transcript. + */ +export interface TranscriptItem { + /** The ID of the transcript item. */ + speaker: string; + /** The content of the transcript item. */ + start: number; + /** The creation date of the transcript item. */ + end: number; + /** The update date of the transcript item. */ + text: string; +} + +type ProcessedTranscriptItem = TranscriptItem & { + active: boolean; + ts: string | null; +}; + +type ToolbarState = "default" | "search"; + +// --- Helper Components --- + +const Text: React.FC<{ + text: string; + highlight: string | null; +}> = ({ text, highlight }) => { + if (!highlight) return
{text}
; + const parts = text.split(new RegExp(`(${highlight})`, "gi")); + return ( +
+ {parts.map((part, i) => + part.toLowerCase() === highlight.toLowerCase() ? ( + + {part} + + ) : ( + part + ), + )} +
+ ); +}; + +interface ToolbarProps { + transcripts: ProcessedTranscriptItem[]; + toolbarState: ToolbarState; + setToolbarState: (state: ToolbarState) => void; + searchTerm: string; + setSearchTerm: (term: string) => void; +} + +const Toolbar: React.FC = ({ + transcripts, + toolbarState, + setToolbarState, + searchTerm, + setSearchTerm, +}) => { + const handleClearSearch = useCallback(() => { + setSearchTerm(""); + setToolbarState("default"); + }, [setSearchTerm, setToolbarState]); + + const handleCopy = useCallback(async () => { + const textToCopy = transcripts + .map((t) => `${t.ts} ${t.speaker}: ${t.text}`) + .join("\n"); + await navigator.clipboard.writeText(textToCopy); + }, [transcripts]); + + const handleSearchInput = (event: React.ChangeEvent) => + setSearchTerm(event.target.value); + const handleSearchKeyDown = ( + event: React.KeyboardEvent, + ) => { + if (event.key === "Escape") { + handleClearSearch(); + } + }; + + return ( +
+ {/* Default State */} + {toolbarState === "default" && ( +
+ + + +
+ )} + {/* Search */} + {toolbarState === "search" && ( +
+ + + +
+ )} +
+ ); +}; + +const Transcript: React.FC = ({ + transcript = [], + autoscroll = true, + toolbar = true, + emptyState, + showSpeaker = true, + showTimestamps = true, + resumeAutoscrollLabel = "Resume Autoscroll", + onTimestampClick, + transcriptComponent, +}) => { + const { currentTime, setCurrentTime, isPlaying } = videoPlayerStore(); + const [focusedIndex, setFocusedIndex] = useState(-1); + const [searchTerm, setSearchTerm] = useState(""); + const [toolbarState, setToolbarState] = useState("default"); + const [userScrolledAway, setUserScrolledAway] = useState(false); // Track if user manually scrolled + const transcriptContainerRef = useRef(null); + const activeItemRef = useRef(null); + + const secondsToStr = (milliseconds: number): string => { + if (milliseconds < 3600000) { + // Less than 1 hour + return dayjs.utc(milliseconds).format("mm:ss"); + } else { + return dayjs.utc(milliseconds).format("HH:mm:ss"); + } + }; + + const handleResumeAutoscroll = useCallback(() => { + setUserScrolledAway(false); + if (activeItemRef.current) { + console.log("Resuming autoscroll"); + activeItemRef.current.scrollIntoView({ + behavior: "smooth", + block: "center", + }); + } + }, []); // No dependencies needed as refs are stable + + const processedTranscripts = useMemo((): ProcessedTranscriptItem[] => { + if (!transcript || transcript.length === 0) return []; + const candidateIndex = + transcript.findIndex((item) => item.start / 1000 >= currentTime) - 1; + let res = transcript.map((item, index) => ({ + ...item, + active: index === candidateIndex, + ts: item.start ? secondsToStr(item.start) : null, + })); + + if (searchTerm) { + res = res.filter((x) => + x.text.toLowerCase().includes(searchTerm.toLowerCase()), + ); + } + return res; + }, [transcript, currentTime, searchTerm]); + + useEffect(() => { + // Only autoscroll if the prop is true AND the user hasn't scrolled away + if ( + autoscroll && + !userScrolledAway && + activeItemRef.current && + transcriptContainerRef.current + ) { + // Check if the active item is fully visible + const container = transcriptContainerRef.current; + const activeItem = activeItemRef.current; + const containerRect = container.getBoundingClientRect(); + const itemRect = activeItem.getBoundingClientRect(); + + const isVisible = + itemRect.top >= containerRect.top && + itemRect.bottom <= containerRect.bottom; + + if (!isVisible) { + // Set flag before programmatically scrolling + activeItem.scrollIntoView({ behavior: "smooth", block: "center" }); + } + } + }, [processedTranscripts, autoscroll, userScrolledAway]); // Added userScrolledAway dependency + + const handleCopyTimestamp = useCallback((item: ProcessedTranscriptItem) => { + if (!item.ts || !item.speaker || !item.text) return; + navigator.clipboard.writeText(`${item.ts} ${item.speaker}: ${item.text}`); + }, []); + + // Use the custom component if provided, otherwise use the default Text component + const TextComponent = transcriptComponent || Text; + + return ( +
+ {toolbar && ( + + )} +
setUserScrolledAway(true)} + onTouchStart={() => setUserScrolledAway(true)} + onKeyDown={() => setUserScrolledAway(true)} + onKeyUp={() => setUserScrolledAway(true)} + > + {!processedTranscripts.length && + !searchTerm && + (emptyState ? ( + emptyState + ) : ( +
+ + Transcript not available +
+ ))} + {!processedTranscripts.length && searchTerm && ( +
+ No results found for "{searchTerm}". +
+ )} + {processedTranscripts.map((item, idx) => ( +
setFocusedIndex(idx)} + onMouseLeave={() => setFocusedIndex(-1)} + > + {showTimestamps && item.ts && ( +
+ + {item.ts} + + + {setCurrentTime && ( + { + e.stopPropagation(); + setCurrentTime(item.start / 1000 + 1); + setUserScrolledAway(false); + if (onTimestampClick) { + onTimestampClick(item.start / 1000 + 1); + } + }} + className="ny:play-btn ny:h-4 ny:w-4 ny:text-gray-400 ny:hover:text-blue-600 ny:cursor-pointer" + /> + )} + { + e.stopPropagation(); + handleCopyTimestamp(item); + }} + className="ny:copy-btn ny:h-4 ny:w-4 ny:text-gray-400 ny:hover:text-blue-600 ny:cursor-pointer" + /> + +
+ )} +
+ {showSpeaker && ( +
+ {item.speaker} +
+ )} +
+ +
+
+
+ ))} + + {/* Resume Autoscroll Button */} + {transcript.length > 0 && + autoscroll && + userScrolledAway && + isPlaying && ( + + )} +
+
+ ); +}; + +export { Transcript }; diff --git a/packages/react/lib/notetaker/VideoPlayer/VideoPlayer.spec.tsx b/packages/react/lib/notetaker/VideoPlayer/VideoPlayer.spec.tsx new file mode 100644 index 0000000..a48db01 --- /dev/null +++ b/packages/react/lib/notetaker/VideoPlayer/VideoPlayer.spec.tsx @@ -0,0 +1,14 @@ +import React from "react"; +import { render } from "@testing-library/react"; + +import { VideoPlayer, videoPlayerStore as videoStore } from "./VideoPlayer"; + +describe("VideoPlayer", () => { + test("renders the video player component without crashing", () => { + const testVideoUrl = "test-video.mp4"; + const { container } = render(); + const videoElement = container.querySelector("video source"); + expect(videoElement).toBeTruthy(); + expect(videoElement?.getAttribute("src")).toBe(testVideoUrl); + }); +}); diff --git a/packages/react/lib/notetaker/VideoPlayer/VideoPlayer.tsx b/packages/react/lib/notetaker/VideoPlayer/VideoPlayer.tsx new file mode 100644 index 0000000..4b2d532 --- /dev/null +++ b/packages/react/lib/notetaker/VideoPlayer/VideoPlayer.tsx @@ -0,0 +1,168 @@ +import React, { useRef, useEffect, useCallback } from "react"; + +import { tv } from "tailwind-variants"; +import { create } from "zustand"; + +interface VideoStore { + currentTime: number; + /** Whether the video is currently playing */ + isPlaying: boolean; + setCurrentTime: (time: number) => void; + setIsPlaying: (playing: boolean) => void; +} + +export const videoPlayerStore = create((set) => ({ + currentTime: 0, + isPlaying: false, + setCurrentTime: (time: number) => set({ currentTime: time }), + setIsPlaying: (playing: boolean) => set({ isPlaying: playing }), +})); + +/** + * Props for the VideoPlayer component. + */ +export interface VideoPlayerProps { + /** + * The URL of the video to play. If provided, a tag will be rendered with this URL. + */ + videoUrl: string; + /** + * Additional class name(s) for the video element. + */ + className?: string; + /** + * Poster image URL to show before the video plays. + */ + poster?: string; + /** + * Whether the video should start playing automatically. + */ + autoPlay?: boolean; + /** + * Whether the video should be muted by default. + */ + muted?: boolean; + /** + * Whether the video should loop after ending. + */ + loop?: boolean; + /** + * The MIME type of the video (e.g., 'video/mp4'). Used for the tag if videoUrl is provided. + */ + videoType?: string; + /** + * Callback for every time update, receives the current playback time in seconds. + */ + onTimeUpdate?: (currentTime: number) => void; + /** + * Callback when the user seeks to a new time, receives the new time in seconds. + */ + onSeek?: (newTime: number) => void; + /** + * Callback when the video starts playing. + */ + onPlay?: () => void; + /** + * Callback when the video is paused. + */ + onPause?: () => void; + /** + * Callback when the video playback ends. + */ + onEnded?: () => void; +} + +const videoContainer = tv({ + base: "ny:w-full", + variants: {}, +}); + +export const VideoPlayer: React.FC = ({ + videoUrl, + className, + poster, + autoPlay = false, + muted = false, + loop = false, + onTimeUpdate, + onSeek, + onPlay, + onPause, + onEnded, + videoType, +}) => { + const videoRef = useRef(null); + const { currentTime, setCurrentTime, setIsPlaying } = videoPlayerStore(); + + const handleTimeUpdate = useCallback(() => { + if (videoRef.current) { + setCurrentTime(videoRef.current.currentTime); + if (onTimeUpdate) { + onTimeUpdate(videoRef.current.currentTime); + } + } + }, [setCurrentTime, onTimeUpdate]); + + const handleSeeked = useCallback(() => { + if (videoRef.current && onSeek) { + onSeek(videoRef.current.currentTime); + } + }, [onSeek]); + + // Handlers to track play / pause / end state + const handlePlay = useCallback(() => { + setIsPlaying(true); + if (onPlay) { + onPlay(); + } + }, [setIsPlaying, onPlay]); + + const handlePause = useCallback(() => { + setIsPlaying(false); + if (onPause) { + onPause(); + } + }, [setIsPlaying, onPause]); + + const handleEnded = useCallback(() => { + setIsPlaying(false); + if (onEnded) { + onEnded(); + } + }, [setIsPlaying, onEnded]); + + // Effect to synchronize video playback position with store's currentTime + useEffect(() => { + if (videoRef.current) { + const delta = Math.abs(videoRef.current.currentTime - currentTime); + if (delta > 1) { + videoRef.current.currentTime = currentTime; + videoRef.current.play(); + } + } + }, [currentTime]); + + useEffect(() => { + setCurrentTime(0); + }, [videoUrl, setCurrentTime]); + + return ( + + ); +}; diff --git a/packages/react/lib/notetaker/index.ts b/packages/react/lib/notetaker/index.ts new file mode 100644 index 0000000..e4c43f8 --- /dev/null +++ b/packages/react/lib/notetaker/index.ts @@ -0,0 +1,20 @@ +// Components +export { Transcript } from "./Transcript/Transcript"; +export { VideoPlayer } from "./VideoPlayer/VideoPlayer"; +export { CalendarSync } from "./CalendarSync/CalendarSync"; +export { SendNotetaker } from "./SendNotetaker/SendNotetaker"; + +// Stores +export { provider } from "./lib/store"; +export { calendarSyncStore } from "./CalendarSync/CalendarSync"; +export { sendNotetakerStore } from "./SendNotetaker/SendNotetaker"; +export { videoPlayerStore } from "./VideoPlayer/VideoPlayer"; + +// Types +export type { + Transcript as TranscriptType, + TranscriptItem, +} from "./Transcript/Transcript"; + +// Styles +import "./style.css"; diff --git a/packages/react/lib/notetaker/lib/constants.ts b/packages/react/lib/notetaker/lib/constants.ts new file mode 100644 index 0000000..9452283 --- /dev/null +++ b/packages/react/lib/notetaker/lib/constants.ts @@ -0,0 +1,41 @@ +import { MeetingFilter, RecordingType } from "../types"; +import { + VideoIcon, + MicIcon, + FileTextIcon, + ScrollTextIcon, + ListTodoIcon, + type LucideIcon, +} from "lucide-react"; + +export const DEFAULT_RECORDING_TYPES = [ + RecordingType.Video, + RecordingType.Audio, + RecordingType.Transcript, + RecordingType.Summary, + RecordingType.ActionItems, +]; + +export const RECORDING_TYPES: { + value: RecordingType; + label: string; + icon: LucideIcon; +}[] = [ + { value: RecordingType.Video, label: "Video", icon: VideoIcon }, + { value: RecordingType.Audio, label: "Audio", icon: MicIcon }, + { value: RecordingType.Transcript, label: "Transcript", icon: FileTextIcon }, + { value: RecordingType.Summary, label: "Summary", icon: ScrollTextIcon }, + { + value: RecordingType.ActionItems, + label: "Action Items", + icon: ListTodoIcon, + }, +]; + +export const MEETING_TYPES: { value: MeetingFilter; label: string }[] = [ + { value: MeetingFilter.All, label: "All" }, + { value: MeetingFilter.Internal, label: "Internal" }, + { value: MeetingFilter.External, label: "External" }, + { value: MeetingFilter.MyMeetings, label: "My meetings" }, + { value: MeetingFilter.Participant, label: "As participant" }, +]; diff --git a/packages/react/lib/notetaker/lib/http-client.ts b/packages/react/lib/notetaker/lib/http-client.ts new file mode 100644 index 0000000..dbb5c06 --- /dev/null +++ b/packages/react/lib/notetaker/lib/http-client.ts @@ -0,0 +1,13 @@ +import axios from "axios"; +import { provider } from "./store"; +const client = axios.create(); + +client.interceptors.request.use((req) => { + const state = provider.getState(); + req.baseURL = state.apiUrl; + const token = state.getAccessToken(); + if (token) req.headers.Authorization = `Bearer ${token}`; + return req; +}); + +export default client; diff --git a/packages/react/lib/notetaker/lib/primitives.ts b/packages/react/lib/notetaker/lib/primitives.ts new file mode 100644 index 0000000..9e6d170 --- /dev/null +++ b/packages/react/lib/notetaker/lib/primitives.ts @@ -0,0 +1,135 @@ +import { tv } from "tailwind-variants"; + +type NylasTw = `ny:${string}`; + +export const label = tv({ + base: ["ny:text-sm", "ny:text-gray-500", "ny:mb-1", "ny:block"], +}); + +export const button = tv({ + base: [ + "ny:border", + "ny:text-sm", + "ny:rounded-lg", + "ny:px-4", + "ny:border-gray-200", + "ny:text-gray-700", + "ny:hover:bg-gray-50", + "ny:transition-all", + "ny:duration-200", + "ny:transition-colors", + "ny:h-10", + "ny:flex", + "ny:items-center", + "ny:space-x-1", + "ny:text-sm", + "ny:text-gray-700", + "ny:hover:text-gray-900", + "ny:hover:bg-gray-100", + "ny:outline-none", + "ny:cursor-pointer", + ] satisfies NylasTw[], + variants: { + size: { + small: ["ny:text-sm", "ny:h-8"] satisfies NylasTw[], + }, + variant: { + primary: [ + "ny:bg-primary-500", + "ny:text-white", + "ny:border-primary-500", + "ny:hover:bg-primary-600", + "ny:hover:text-white", + "ny:shadow-md", + "ny:shadow-primary-100", + "ny:outline-none", + ] satisfies NylasTw[], + link: [ + "ny:bg-transparent", + "ny:text-primary-500", + "ny:hover:text-primary-600", + "ny:border-none", + "ny:font-medium", + "ny:cursor-pointer", + ] satisfies NylasTw[], + }, + color: { + danger: ["ny:text-red-500", "ny:hover:text-red-600"] satisfies NylasTw[], + }, + active: { + true: [ + "ny:bg-primary-50", + "ny:border-primary-500", + "ny:text-primary-500", + "ny:hover:bg-primary-100", + "ny:shadow-md", + "ny:shadow-primary-100", + ] satisfies NylasTw[], + }, + disabled: { + true: [ + "ny:border-gray-100", + "ny:text-gray-400", + "ny:hover:bg-gray-100", + "ny:bg-gray-100", + "ny:shadow-none", + "ny:cursor-not-allowed", + ] satisfies NylasTw[], + }, + }, + compoundVariants: [ + { + variant: "primary", + disabled: true, + class: [ + "ny:bg-gray-100", + "ny:text-gray-400", + "ny:cursor-not-allowed", + "ny:hover:text-gray-400", + ] satisfies NylasTw[], + }, + { + variant: "link", + disabled: true, + class: [ + "ny:bg-transparent", + "ny:hover:bg-transparent", + "ny:text-gray-400", + "ny:hover:text-gray-400", + "ny:hover:bg-none", + "ny:cursor-not-allowed", + ] satisfies NylasTw[], + }, + { + color: "danger", + variant: "link", + class: ["ny:hover:bg-red-50"], + }, + ], +}); + +export const input = tv({ + base: [ + "ny:border", + "ny:focus:outline-primary-500", + "ny:block", + "ny:w-full", + "ny:rounded-lg", + "ny:h-8", + "ny:border-gray-200", + "ny:px-4", + "ny:text-gray-900", + "ny:py-1", + "ny:text-sm", + ] satisfies NylasTw[], + variants: { + disabled: { + true: [ + "ny:bg-gray-100", + "ny:border-gray-200", + "ny:text-gray-400", + "ny:cursor-not-allowed", + ] satisfies NylasTw[], + }, + }, +}); diff --git a/packages/react/lib/notetaker/lib/store.ts b/packages/react/lib/notetaker/lib/store.ts new file mode 100644 index 0000000..bdebbd6 --- /dev/null +++ b/packages/react/lib/notetaker/lib/store.ts @@ -0,0 +1,34 @@ +import { create } from "zustand"; + +export interface ProviderStore { + apiUrl: string; + setApiUrl: (url: string) => void; + getAccessToken: () => string; +} + +export const provider = create((set) => ({ + apiUrl: "https://api.us.nylas.com", + setApiUrl: (url: "us" | "eu" | string = "us") => { + let apiUrl = ""; + if (url === "us") { + apiUrl = "https://api.us.nylas.com"; + } else if (url === "eu") { + apiUrl = "https://api.eu.nylas.com"; + } else if (typeof url === "string" && url.startsWith("http")) { + apiUrl = url; + } else { + console.error( + "Invalid API URL provided to the Nylas provider component, url falls back to US api endpoint.", + url, + ); + // fallback to default or throw error + apiUrl = "https://api.us.nylas.com"; + } + set({ apiUrl }); + }, + getAccessToken: () => { + return typeof localStorage !== "undefined" + ? localStorage.getItem("nylas-access-token") || "" + : ""; + }, +})); diff --git a/packages/react/lib/notetaker/style.css b/packages/react/lib/notetaker/style.css new file mode 100644 index 0000000..8a30afc --- /dev/null +++ b/packages/react/lib/notetaker/style.css @@ -0,0 +1,18 @@ +@layer theme, base, components, utilities; + +@import "tailwindcss/theme.css" layer(theme) prefix(ny); +@import "tailwindcss/utilities.css" layer(utilities) prefix(ny); + +@theme { + --color-primary-50: #f0f4ff; + --color-primary-100: #e0e9ff; + --color-primary-200: #c7d4ff; + --color-primary-300: #a3b9ff; + --color-primary-400: #7a94ff; + --color-primary-500: #4069e1; + --color-primary-600: #2d4fc7; + --color-primary-700: #253ea3; + --color-primary-800: #1f3382; + --color-primary-900: #1a2b6b; + --color-primary-950: #111a42; +} diff --git a/packages/react/lib/notetaker/types.ts b/packages/react/lib/notetaker/types.ts new file mode 100644 index 0000000..34ccd35 --- /dev/null +++ b/packages/react/lib/notetaker/types.ts @@ -0,0 +1,47 @@ +export enum RecordingType { + Video = "video", + Audio = "audio", + Transcript = "transcript", + Summary = "summary", + ActionItems = "action_items", +} + +export enum MeetingFilter { + All = "all", + Internal = "internal", + External = "external", + MyMeetings = "own_events", + Participant = "participant_only", +} + +export interface Notetaker { + id: string; + name: string; + meeting_link: string; + join_time: number; + meeting_settings: { + video_recording: boolean; + audio_recording: boolean; + transcription: boolean; + }; +} + +interface CalendarNotetaker extends Partial { + rules?: { + event_selection?: MeetingFilter[]; + }; +} + +export interface Calendar { + name: string; + timezone: string; + hex_color?: string; + hex_foreground_color?: string; + grant_id: string; + id: string; + object: "calendar"; + is_primary: boolean; + read_only: boolean; + is_owned_by_user: boolean; + notetaker: CalendarNotetaker; +} diff --git a/packages/react/lib/utils.ts b/packages/react/lib/utils.ts new file mode 100644 index 0000000..294c383 --- /dev/null +++ b/packages/react/lib/utils.ts @@ -0,0 +1,3 @@ +// Entry point for utility functions and components +export { NylasIdentityRequestWrapper } from "@nylas/web-elements/components"; +export type { LANGUAGE_CODE } from "@nylas/web-elements/components"; diff --git a/packages/react/package.json b/packages/react/package.json new file mode 100644 index 0000000..81a218b --- /dev/null +++ b/packages/react/package.json @@ -0,0 +1,109 @@ +{ + "name": "@nylas/react", + "version": "2.2.4", + "type": "module", + "scripts": { + "build": "vite build", + "test": "vitest --run", + "test:watch": "vitest", + "format": "prettier --write lib/", + "format:check": "prettier --check lib/", + "lint": "eslint lib/", + "lint:check": "eslint lib/ --max-warnings 0", + "clean": "rm -rf dist", + "dev": "vite build --watch --emptyOutDir=false", + "dev:server": "vite", + "typecheck": "tsc --noEmit", + "preview": "vite preview", + "docs": "typedoc" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/nylas/nylas.git" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + "dist" + ], + "exports": { + ".": { + "import": "./dist/es/index.js", + "require": "./dist/cjs/index.js", + "types": "./dist/index.d.ts", + "style": "./dist/style.css" + }, + "./connect": { + "import": "./dist/es/connect.js", + "require": "./dist/cjs/connect.js", + "types": "./dist/connect.d.ts" + }, + "./elements": { + "import": "./dist/es/elements.js", + "require": "./dist/cjs/elements.js", + "types": "./dist/elements.d.ts" + }, + "./notetaker": { + "import": "./dist/es/notetaker.js", + "require": "./dist/cjs/notetaker.js", + "types": "./dist/notetaker.d.ts" + }, + "./utils": { + "import": "./dist/es/utils.js", + "require": "./dist/cjs/utils.js", + "types": "./dist/utils.d.ts" + }, + "./style.css": { + "default": "./dist/style.css" + } + }, + "main": "dist/cjs/index.js", + "style": "./dist/style.css", + "module": "dist/es/index.js", + "types": "dist/index.d.ts", + "dependencies": { + "@nylas/connect": "workspace:^", + "@nylas/core": "^1.2.0", + "@nylas/web-elements": "^2.2.4", + "@stencil/react-output-target": "^1.2.0", + "axios": "^1.7.7", + "dayjs": "1.11.7", + "lucide-react": "^0.453.0", + "tailwind-variants": "^1.0.0", + "zustand": "^5.0.3" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.3", + "@testing-library/dom": "^10.0.0", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^16.0.0", + "@types/jsdom": "^21.1.7", + "@types/node": "^22.13.10", + "@types/react": "^19.1.10", + "@types/react-dom": "^19.1.7", + "@types/testing-library__jest-dom": "^6.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.4.1", + "@vitejs/plugin-react-swc": "^3.3.2", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "jsdom": "^26.0.0", + "markdown-table": "^3.0.4", + "prettier": "^3.5.3", + "tailwindcss": "^4.1.7", + "tslib": "^2.6.2", + "typedoc": "^0.28.3", + "typedoc-plugin-markdown": "^4.6.3", + "typescript": "^5.3.3", + "vite": "^4.5.2", + "vite-plugin-dts": "^3.6.3", + "vitest": "^3.2.4" + } +} diff --git a/packages/react/test/code-examples/CalendarSync.spec.tsx b/packages/react/test/code-examples/CalendarSync.spec.tsx new file mode 100644 index 0000000..b823540 --- /dev/null +++ b/packages/react/test/code-examples/CalendarSync.spec.tsx @@ -0,0 +1,26 @@ +import { render } from "@testing-library/react"; +import { it } from "vitest"; + +// --- example code:start -- +import { CalendarSync } from "../../lib/notetaker/CalendarSync/CalendarSync"; +import React from "react"; + +function App() { + return ( + console.log("Updated calendar:", calendar)} + onCancel={() => console.log("Edit cancelled")} + onError={(err) => console.error("Error:", err)} + hideRecordingSettings={false} + hideNameInput={false} + /> + ); +} +// --- example code:end -- + +it("should render the calendar sync example", () => { + render(); +}); diff --git a/packages/react/test/code-examples/SendNotetaker.spec.tsx b/packages/react/test/code-examples/SendNotetaker.spec.tsx new file mode 100644 index 0000000..68ee56e --- /dev/null +++ b/packages/react/test/code-examples/SendNotetaker.spec.tsx @@ -0,0 +1,27 @@ +import { render } from "@testing-library/react"; +import { it } from "vitest"; + +// --- example code:start -- +import React from "react"; +import { SendNotetaker } from "../../lib/notetaker/SendNotetaker/SendNotetaker"; + +function App() { + return ( + { + console.log("Notetaker sent:", data); + // Optionally reset the form after sending + resetForm(); + }} + onError={(error) => console.error("Send error:", error)} + /> + ); +} +// --- example code:end -- + +it("should render the send notetaker example", () => { + render(); +}); diff --git a/packages/react/test/code-examples/Transcript.spec.tsx b/packages/react/test/code-examples/Transcript.spec.tsx new file mode 100644 index 0000000..bc646fd --- /dev/null +++ b/packages/react/test/code-examples/Transcript.spec.tsx @@ -0,0 +1,46 @@ +import { render } from "@testing-library/react"; +import { it } from "vitest"; + +// --- example code:start -- +import React from "react"; +import { Transcript } from "../../lib/notetaker/Transcript/Transcript"; + +const transcriptData = [ + { + start: 1000, + end: 2000, + speaker: "Alice", + text: "Hello world!", + }, + { + start: 5000, + end: 6000, + speaker: "Bob", + text: "How are you?", + }, +]; + +function App() { + return ( + No transcript available.} + showSpeaker={true} + showTimestamps={true} + resumeAutoscrollLabel="Scroll to active" + onTimestampClick={(timestamp) => + console.log("Timestamp clicked:", timestamp) + } + transcriptComponent={({ text }) => ( + {text} + )} + /> + ); +} +// --- example code:end -- + +it("should render the transcript example", () => { + render(); +}); diff --git a/packages/react/test/code-examples/VideoPlayer.spec.tsx b/packages/react/test/code-examples/VideoPlayer.spec.tsx new file mode 100644 index 0000000..470f556 --- /dev/null +++ b/packages/react/test/code-examples/VideoPlayer.spec.tsx @@ -0,0 +1,30 @@ +import { render } from "@testing-library/react"; +import { it } from "vitest"; + +// --- example code:start -- +import React from "react"; +import { VideoPlayer } from "../../lib/notetaker/VideoPlayer/VideoPlayer"; + +function App() { + return ( + console.log("Time update:", currentTime)} + onSeek={(newTime) => console.log("Seeked to:", newTime)} + onPlay={() => console.log("Video started playing")} + onPause={() => console.log("Video paused")} + onEnded={() => console.log("Video ended")} + /> + ); +} +// --- example code:end -- + +it("should render the video player example", () => { + render(); +}); diff --git a/packages/react/test/vitest.d.ts b/packages/react/test/vitest.d.ts new file mode 100644 index 0000000..eb7020c --- /dev/null +++ b/packages/react/test/vitest.d.ts @@ -0,0 +1,8 @@ +import "vitest"; +import { TestingLibraryMatchers } from "@testing-library/jest-dom/matchers"; + +declare global { + namespace Vi { + interface Assertion extends TestingLibraryMatchers {} + } +} diff --git a/packages/react/test/vitest.setup.ts b/packages/react/test/vitest.setup.ts new file mode 100644 index 0000000..d0de870 --- /dev/null +++ b/packages/react/test/vitest.setup.ts @@ -0,0 +1 @@ +import "@testing-library/jest-dom"; diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json new file mode 100644 index 0000000..c571da2 --- /dev/null +++ b/packages/react/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "esnext", + "declaration": true, + "noImplicitAny": false, + "removeComments": true, + "noLib": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es6", + "sourceMap": true, + "strict": true, + "lib": ["ES6", "DOM"], + "outDir": "./dist", + "moduleResolution": "bundler", + "skipLibCheck": true, + "jsx": "react", + "allowSyntheticDefaultImports": true, + "types": ["vitest/globals"], + "declarationDir": "./dist/types", + "forceConsistentCasingInFileNames": true + }, + "include": ["lib", "index.ts", "test/vitest.d.ts", "test/vitest.setup.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/react/tsconfig.typedoc.json b/packages/react/tsconfig.typedoc.json new file mode 100644 index 0000000..c3443d0 --- /dev/null +++ b/packages/react/tsconfig.typedoc.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { "noEmit": true }, + "include": ["lib/notetaker/**/*.*"] +} diff --git a/packages/react/typedoc.json b/packages/react/typedoc.json new file mode 100644 index 0000000..17e78fa --- /dev/null +++ b/packages/react/typedoc.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "name": "nylas-react", + "tsconfig": "./tsconfig.typedoc.json", + "plugin": ["typedoc-plugin-markdown"], + "entryPoints": ["./lib/notetaker/**/*.{ts,tsx}"], + "flattenOutputFiles": true, + "excludeScopesInPaths": true, + "hidePageHeader": true, + "hideBreadcrumbs": true, + "hidePageTitle": true, + "disableSources": true, + "entryFileName": "DOCS.md", + "interfacePropertiesFormat": "table", + "tableColumnSettings": { + "hideSources": true + }, + "headings": false, + "formatWithPrettier": true, + "excludeNotDocumented": true, + "maxTypeConversionDepth": 2, + "expandParameters": true +} diff --git a/packages/react/vite.config.ts b/packages/react/vite.config.ts new file mode 100644 index 0000000..a632d8b --- /dev/null +++ b/packages/react/vite.config.ts @@ -0,0 +1,50 @@ +import react from "@vitejs/plugin-react-swc"; +import { resolve } from "path"; +import { defineConfig } from "vite"; +import dts from "vite-plugin-dts"; +import tailwindcss from "@tailwindcss/vite"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + dts({ insertTypesEntry: true }) + ], + build: { + lib: { + entry: { + index: resolve(__dirname, "lib/index.ts"), + connect: resolve(__dirname, "lib/connect.ts"), + elements: resolve(__dirname, "lib/elements.ts"), + notetaker: resolve(__dirname, "lib/notetaker.ts"), + utils: resolve(__dirname, "lib/utils.ts"), + }, + formats: ["es", "cjs"], + }, + cssCodeSplit: false, + rollupOptions: { + external: [ + "react", + "react/jsx-runtime", + "react-dom", + "react-dom/client", + "@nylas/core", + "@nylas/connect", + "@nylas/web-elements", + "@nylas/web-elements/components", + "@nylas/web-elements/loader", + /^@nylas\/web-elements\/dist\/components\//, + "@stencil/react-output-target/runtime", + ], + output: { + exports: "named", + globals: { + "react-dom": "ReactDom", + react: "React", + }, + entryFileNames: "[format]/[name].js", + chunkFileNames: "[format]/[name].js", + }, + }, + }, +}); diff --git a/packages/react/vitest.config.ts b/packages/react/vitest.config.ts new file mode 100644 index 0000000..fe08ac7 --- /dev/null +++ b/packages/react/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig, mergeConfig } from "vitest/config"; +import viteConfig from "./vite.config.ts"; + +export default mergeConfig( + viteConfig, + defineConfig({ + test: { + globals: true, + environment: "jsdom", + }, + }), +); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78baadf..39093c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.27.9 - version: 2.29.7(@types/node@20.19.13) + version: 2.29.7(@types/node@22.18.8) husky: specifier: ^8.0.3 version: 8.0.3 nx: specifier: 21.5.2 - version: 21.5.2 + version: 21.5.2(@swc/core@1.13.5) oxlint: specifier: ^1.16.0 version: 1.16.0 @@ -31,7 +31,7 @@ importers: version: 20.19.13 '@vitest/coverage-v8': specifier: ^2.1.9 - version: 2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.10.2)) + version: 2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1)) happy-dom: specifier: ^15.10.2 version: 15.10.2 @@ -39,21 +39,183 @@ importers: specifier: ^5.3.3 version: 5.9.2 vite: - specifier: ^5.4.21 - version: 5.4.21(@types/node@20.19.13) + specifier: ^5.0.10 + version: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) vite-plugin-dts: specifier: ^3.7.0 - version: 3.9.1(@types/node@20.19.13)(rollup@4.52.5)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.13)) + version: 3.9.1(@types/node@20.19.13)(rollup@4.50.1)(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1)) vitest: specifier: ^2.1.8 - version: 2.1.9(@types/node@20.19.13)(happy-dom@15.10.2) + version: 2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1) + + packages/react: + dependencies: + '@nylas/connect': + specifier: workspace:^ + version: link:../nylas-connect + '@nylas/core': + specifier: ^1.2.0 + version: 1.2.0(@stencil/core@4.37.1) + '@nylas/web-elements': + specifier: ^2.2.4 + version: 2.2.4(rollup@4.50.1) + '@stencil/react-output-target': + specifier: ^1.2.0 + version: 1.2.0(@stencil/core@4.37.1)(@types/react@19.2.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + axios: + specifier: ^1.7.7 + version: 1.12.2 + dayjs: + specifier: 1.11.7 + version: 1.11.7 + lucide-react: + specifier: ^0.453.0 + version: 0.453.0(react@19.2.0) + react: + specifier: ^18 || ^19 + version: 19.2.0 + react-dom: + specifier: ^18 || ^19 + version: 19.2.0(react@19.2.0) + tailwind-variants: + specifier: ^1.0.0 + version: 1.0.0(tailwindcss@4.1.14) + zustand: + specifier: ^5.0.3 + version: 5.0.8(@types/react@19.2.0)(react@19.2.0) + devDependencies: + '@tailwindcss/vite': + specifier: ^4.0.3 + version: 4.1.14(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) + '@testing-library/dom': + specifier: ^10.0.0 + version: 10.4.1 + '@testing-library/jest-dom': + specifier: ^5.17.0 + version: 5.17.0 + '@testing-library/react': + specifier: ^16.0.0 + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@types/jsdom': + specifier: ^21.1.7 + version: 21.1.7 + '@types/node': + specifier: ^22.13.10 + version: 22.18.8 + '@types/react': + specifier: ^19.1.10 + version: 19.2.0 + '@types/react-dom': + specifier: ^19.1.7 + version: 19.2.0(@types/react@19.2.0) + '@types/testing-library__jest-dom': + specifier: ^6.0.0 + version: 6.0.0 + '@typescript-eslint/eslint-plugin': + specifier: ^6.0.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': + specifier: ^6.0.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@vitejs/plugin-react': + specifier: ^4.4.1 + version: 4.7.0(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) + '@vitejs/plugin-react-swc': + specifier: ^3.3.2 + version: 3.11.0(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) + eslint: + specifier: ^8.45.0 + version: 8.57.1 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.2(eslint@8.57.1) + eslint-plugin-react-refresh: + specifier: ^0.4.3 + version: 0.4.23(eslint@8.57.1) + jsdom: + specifier: ^26.0.0 + version: 26.1.0 + markdown-table: + specifier: ^3.0.4 + version: 3.0.4 + prettier: + specifier: ^3.5.3 + version: 3.6.2 + tailwindcss: + specifier: ^4.1.7 + version: 4.1.14 + tslib: + specifier: ^2.6.2 + version: 2.8.1 + typedoc: + specifier: ^0.28.3 + version: 0.28.13(typescript@5.9.2) + typedoc-plugin-markdown: + specifier: ^4.6.3 + version: 4.9.0(typedoc@0.28.13(typescript@5.9.2)) + typescript: + specifier: ^5.3.3 + version: 5.9.2 + vite: + specifier: ^4.5.2 + version: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + vite-plugin-dts: + specifier: ^3.6.3 + version: 3.9.1(@types/node@22.18.8)(rollup@4.50.1)(typescript@5.9.2)(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@22.18.8)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1) packages: + '@adobe/css-tools@4.4.4': + resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -62,15 +224,43 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.28.4': resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.28.4': resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} @@ -133,6 +323,34 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} @@ -142,144 +360,337 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fullcalendar/core@6.1.8': + resolution: {integrity: sha512-i8JBIvZCWGO9dsMEDcx9bnsQZ9PtGSJdOXGgWbhLaGq2iq41OBdp9g9gM4b/Otv2oK8bL5Gl6CsMmb/HkDtA6Q==} + + '@fullcalendar/daygrid@6.1.8': + resolution: {integrity: sha512-kCZxQFKb9Vqa3CZRX0v7rMSJ2mlTt4gDpyLfiNJKxUAq7W51uKurPaFZWicaXy1ESHVBxKNlbx5uNjBpyu50JQ==} + peerDependencies: + '@fullcalendar/core': ~6.1.8 + + '@fullcalendar/interaction@6.1.8': + resolution: {integrity: sha512-r6W4E9ohaA87M2uPSlmpE2WT7Fzu7LN0u2pE6D/tThruCEaAPbN8Pw5+sqclsuyTIL09mg0eSJm/ggJekTabSA==} + peerDependencies: + '@fullcalendar/core': ~6.1.8 + + '@fullcalendar/rrule@6.1.8': + resolution: {integrity: sha512-Ikl1ipRCxeNlQ7UNcG0QC3yxAaiItXo1zYa90hodXwf/UK5Bi9aR0f/bcViIP89U0Uq4trUOy9yFaD61dLuYSg==} + peerDependencies: + '@fullcalendar/core': ~6.1.8 + rrule: ^2.6.0 + + '@fullcalendar/timegrid@6.1.8': + resolution: {integrity: sha512-3+3KHHCoNcaLs/gQt004hAqICbY5+WAffrZ0ePv+80HFB1OVh8BQ5XXLHSOUbTvXdgtUTcfBHuw9fhO31kt5gA==} + peerDependencies: + '@fullcalendar/core': ~6.1.8 + + '@gerrit0/mini-shiki@3.13.0': + resolution: {integrity: sha512-mCrNvZNYNrwKer5PWLF6cOc0OEe2eKzgy976x+IT2tynwJYl+7UpHTSeXQJGijgTcoOf+f359L946unWlYRnsg==} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@inquirer/external-editor@1.0.2': resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} engines: {node: '>=18'} @@ -293,6 +704,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -301,17 +716,32 @@ packages: resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.1.0': resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/schemas@30.0.5': resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -322,6 +752,11 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@lit/react@1.0.8': + resolution: {integrity: sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==} + peerDependencies: + '@types/react': 17 || 18 || 19 + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -335,6 +770,9 @@ packages: resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} hasBin: true + '@microsoft/fetch-event-source@2.0.1': + resolution: {integrity: sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==} + '@microsoft/tsdoc-config@0.16.2': resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} @@ -406,6 +844,15 @@ packages: cpu: [x64] os: [win32] + '@nylas/core@1.2.0': + resolution: {integrity: sha512-eUlxzbeLSdGNx5t51cFxp+oD954MuPxFmL2a0IgqYGQ/TvT2RoIgTHiUhZIXWRZTSBrlNNZq+Bxklk3Z7nPs8g==} + + '@nylas/identity@3.1.0': + resolution: {integrity: sha512-EBW17UBAvsj1cT+BEbawdce9Uy04IsElr8hJJRB3lf8Aod/icdn0mxWdWCyCNrjW6fhRwz0Cv3Sh88DbTbC7yA==} + + '@nylas/web-elements@2.2.4': + resolution: {integrity: sha512-EVAF2xQ3Q2OYc4fDl49oZe8lgNIi7P5fF0EQ/RiKLWHGd2gtMyc4YcZBNHMH9hYpxVvxI5BzdRZax76xMCJq7Q==} + '@oxlint/darwin-arm64@1.16.0': resolution: {integrity: sha512-t9sBjbcG15Jgwgw2wY+rtfKEazdkKM/YhcdyjmGYeSjBXaczLfp/gZe03taC2qUHK+t6cxSYNkOLXRLWxaf3tw==} cpu: [arm64] @@ -450,6 +897,18 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/plugin-replace@6.0.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -469,13 +928,23 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.5': - resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + '@rollup/rollup-darwin-arm64@4.34.9': + resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.50.1': + resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.5': - resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + '@rollup/rollup-darwin-x64@4.34.9': + resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.50.1': + resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} cpu: [x64] os: [darwin] @@ -499,13 +968,23 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.5': - resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + '@rollup/rollup-linux-arm64-gnu@4.34.9': + resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.50.1': + resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.5': - resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + '@rollup/rollup-linux-arm64-musl@4.34.9': + resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.50.1': + resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} cpu: [arm64] os: [linux] @@ -534,13 +1013,23 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.5': - resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + '@rollup/rollup-linux-x64-gnu@4.34.9': + resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.50.1': + resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.9': + resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.5': - resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + '@rollup/rollup-linux-x64-musl@4.50.1': + resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} cpu: [x64] os: [linux] @@ -549,8 +1038,13 @@ packages: cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.5': - resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + '@rollup/rollup-win32-arm64-msvc@4.34.9': + resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.50.1': + resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} cpu: [arm64] os: [win32] @@ -559,13 +1053,13 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.5': - resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + '@rollup/rollup-win32-x64-msvc@4.34.9': + resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.5': - resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + '@rollup/rollup-win32-x64-msvc@4.50.1': + resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} cpu: [x64] os: [win32] @@ -591,62 +1085,489 @@ packages: '@rushstack/ts-command-line@4.19.1': resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} - '@sinclair/typebox@0.34.41': - resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sentry-internal/browser-utils@8.55.0': + resolution: {integrity: sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==} + engines: {node: '>=14.18'} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@sentry-internal/feedback@8.55.0': + resolution: {integrity: sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw==} + engines: {node: '>=14.18'} - '@types/argparse@1.0.38': - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@sentry-internal/replay-canvas@8.55.0': + resolution: {integrity: sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w==} + engines: {node: '>=14.18'} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@sentry-internal/replay@8.55.0': + resolution: {integrity: sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw==} + engines: {node: '>=14.18'} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@sentry/browser@8.55.0': + resolution: {integrity: sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw==} + engines: {node: '>=14.18'} - '@types/node@20.19.13': - resolution: {integrity: sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==} + '@sentry/core@8.55.0': + resolution: {integrity: sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==} + engines: {node: '>=14.18'} - '@vitest/coverage-v8@2.1.9': - resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} - peerDependencies: - '@vitest/browser': 2.1.9 - vitest: 2.1.9 - peerDependenciesMeta: - '@vitest/browser': - optional: true + '@shikijs/engine-oniguruma@3.13.0': + resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} - '@vitest/expect@2.1.9': - resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + '@shikijs/langs@3.13.0': + resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} - '@vitest/mocker@2.1.9': - resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true + '@shikijs/themes@3.13.0': + resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + '@shikijs/types@3.13.0': + resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} - '@vitest/runner@2.1.9': - resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@vitest/snapshot@2.1.9': - resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} - '@vitest/spy@2.1.9': + '@stencil/core@4.37.1': + resolution: {integrity: sha512-s4ZroxdYc2HU0b7V3n59RVtMKdNlTvWWBN8KofaP64eCzvg1qRh6SKMet7MJ069F1lx/FxDvsYfOv7pZRiMWmQ==} + engines: {node: '>=16.0.0', npm: '>=7.10.0'} + hasBin: true + + '@stencil/react-output-target@1.2.0': + resolution: {integrity: sha512-xDNpWdRg897T3Diy5V2d8dZUdjhc4QJ/5JZdTVyv3/e9UICdJPfCY6eKp/dWWgYlJ9AUE6GLHOI1iePZmLY12A==} + peerDependencies: + '@stencil/core': '>=3 || >= 4.0.0-beta.0 || >= 4.0.0' + react: ^18 || ^19 + react-dom: ^18 || ^19 + + '@stencil/store@2.2.0': + resolution: {integrity: sha512-+Ub0n3ghwxjXSGrLJDt6SIKJQhB4ch61KyzNkleIN5IADdhwvT8/9SjwU67hhSEoBTpQ81bVNlhuHSHS97iHbA==} + engines: {node: '>=18.0.0', npm: '>=6.0.0'} + peerDependencies: + '@stencil/core': '>=2.0.0 || >=3.0.0 || >= 4.0.0-beta.0 || >= 4.0.0' + + '@swc/core-darwin-arm64@1.13.5': + resolution: {integrity: sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.13.5': + resolution: {integrity: sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.13.5': + resolution: {integrity: sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.13.5': + resolution: {integrity: sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.13.5': + resolution: {integrity: sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.13.5': + resolution: {integrity: sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.13.5': + resolution: {integrity: sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.13.5': + resolution: {integrity: sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.13.5': + resolution: {integrity: sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.13.5': + resolution: {integrity: sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.13.5': + resolution: {integrity: sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + + '@tailwindcss/node@4.1.14': + resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==} + + '@tailwindcss/oxide-android-arm64@4.1.14': + resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.14': + resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.14': + resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.14': + resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.14': + resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.14': + resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@5.17.0': + resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} + engines: {node: '>=8', npm: '>=6', yarn: '>=1'} + + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@ts-morph/common@0.23.0': + resolution: {integrity: sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.19.13': + resolution: {integrity: sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==} + + '@types/node@22.18.8': + resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + + '@types/react-dom@19.2.0': + resolution: {integrity: sha512-brtBs0MnE9SMx7px208g39lRmC5uHZs96caOJfTjFcYSLHNamvaSMfJNagChVNkup2SdtOxKX1FDBkRSJe1ZAg==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.0': + resolution: {integrity: sha512-1LOH8xovvsKsCBq1wnT4ntDUdCJKmnEakhsuoUSy6ExlHCkGP2hqnatagYTgFk6oeL0VU31u7SNjunPN+GchtA==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/testing-library__jest-dom@5.14.9': + resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} + + '@types/testing-library__jest-dom@6.0.0': + resolution: {integrity: sha512-bnreXCgus6IIadyHNlN/oI5FfX4dWgvGhOPvpr7zzCYDGAPIfvyIoAozMBINmhmsVuqV0cncejF2y5KC7ScqOg==} + deprecated: This is a stub types definition. @testing-library/jest-dom provides its own type definitions, so you do not need this installed. + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react-swc@3.11.0': + resolution: {integrity: sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==} + peerDependencies: + vite: ^4 || ^5 || ^6 || ^7 + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitest/coverage-v8@2.1.9': + resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} + peerDependencies: + '@vitest/browser': 2.1.9 + vitest: 2.1.9 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@2.1.9': resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/utils@2.1.9': resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@volar/language-core@1.11.1': resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} @@ -684,6 +1605,20 @@ packages: resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -717,6 +1652,13 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -737,6 +1679,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.10: + resolution: {integrity: sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==} + hasBin: true + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -754,9 +1700,17 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -765,10 +1719,21 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001746: + resolution: {integrity: sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -780,10 +1745,18 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -800,6 +1773,9 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -821,26 +1797,64 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + dayjs@1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' peerDependenciesMeta: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -852,14 +1866,46 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@2.1.1: + resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + engines: {node: '>=8'} + + dexie@3.2.7: + resolution: {integrity: sha512-2a+BXvVhY5op+smDRLxeBAivE7YcYaneXJ1la3HOkUfX9zKkE/AJ8CNgjiXbtXepFyFmJNGSbmjOwqbT749r/w==} + engines: {node: '>=6.0'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dotenv-expand@11.0.7: resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} engines: {node: '>=12'} @@ -875,6 +1921,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + electron-to-chromium@1.5.228: + resolution: {integrity: sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -884,6 +1933,10 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -896,6 +1949,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -915,6 +1972,11 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -928,21 +1990,78 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.4.23: + resolution: {integrity: sha512-G4j+rv0NmbIR45kni5xJOrYvCtyD3/7LjpVH8MPPcudXDcNu8gv+4ATTDXTtbRR8rTCM5HxECvCSsRmxKnWDsA==} + peerDependencies: + eslint: '>=8.40' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + expect-type@1.2.2: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -956,13 +2075,29 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -971,10 +2106,21 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -1006,6 +2152,9 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1014,6 +2163,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1030,10 +2183,22 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1045,9 +2210,12 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - happy-dom@15.10.2: - resolution: {integrity: sha512-NbA5XrSovenJIIcfixCREX3ZnV7yHP4phhbfuxxf4CPn+LZpz/jIM9EqJ2DrPwgVDSMoAKH3pZwQvkbsSiCrUw==} - engines: {node: '>=18.0.0'} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + happy-dom@13.10.1: + resolution: {integrity: sha512-9GZLEFvQL5EgfJX2zcBgu1nsPUn98JF/EiJnSfQbdxI6YEQGqpd09lXXxOmYonRBIEFz9JlGCOiPflDzgS1p8w==} + engines: {node: '>=16.0.0'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -1069,9 +2237,39 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + html-dom-parser@5.1.1: + resolution: {integrity: sha512-+o4Y4Z0CLuyemeccvGN4bAO20aauB2N9tFEAep5x4OW34kV4PTarBHm6RL02afYt2BMKcr0D2Agep8S3nJPIBg==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-react-parser@5.2.6: + resolution: {integrity: sha512-qcpPWLaSvqXi+TndiHbCa+z8qt0tVzjMwFGFBAa41ggC+ZA5BHaMIeMJla9g3VSp4SmiZb9qyQbmbpHYpIfPOg==} + peerDependencies: + '@types/react': 0.14 || 15 || 16 || 17 || 18 || 19 + react: 0.14 || 15 || 16 || 17 || 18 || 19 + peerDependenciesMeta: + '@types/react': + optional: true + + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-id@4.1.1: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true @@ -1081,6 +2279,13 @@ packages: engines: {node: '>=14'} hasBin: true + i18next@23.16.8: + resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} @@ -1092,13 +2297,36 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -1128,6 +2356,17 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -1170,16 +2409,74 @@ packages: resolution: {integrity: sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1191,17 +2488,98 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jwt-decode@3.1.2: + resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + lines-and-columns@2.0.3: resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. @@ -1210,6 +2588,9 @@ packages: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -1220,16 +2601,35 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lucide-react@0.453.0: + resolution: {integrity: sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} @@ -1240,10 +2640,20 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1264,9 +2674,16 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -1282,6 +2699,15 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1297,13 +2723,22 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + nwsapi@2.2.22: + resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + nx@21.5.2: resolution: {integrity: sha512-hvq3W6mWsNuXzO1VWXpVcbGuF3e4cx0PyPavy8RgZUinbnh3Gk+f+2DGXyjKEyAG3Ql0Nl3V4RJERZzXEVl7EA==} hasBin: true @@ -1327,6 +2762,10 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + ora@5.3.0: resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} engines: {node: '>=10'} @@ -1352,10 +2791,18 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -1370,6 +2817,16 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-srcset@1.0.2: + resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -1377,6 +2834,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1395,6 +2856,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} @@ -1418,6 +2882,13 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + preact@10.12.1: + resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -1428,13 +2899,25 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@30.0.5: resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1445,9 +2928,36 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + peerDependencies: + react: ^19.2.0 + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-property@2.0.2: + resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-style-stringify@1.2.0: + resolution: {integrity: sha512-88JZckqgbfXJaGcDQoTFKRmBwHBF0Ddaxz3PL9Q+vywAJruBY+NdN+ZiKSBe7r/pWtjbt0naZdtH5oNI1X3FLA==} + engines: {node: '>=14.0.0'} + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -1456,10 +2966,18 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1484,11 +3002,27 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.52.5: - resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.50.1: + resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrule@2.8.1: + resolution: {integrity: sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1498,6 +3032,20 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sanitize-html@2.17.0: + resolution: {integrity: sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -1530,6 +3078,9 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + sortablejs@1.15.6: + resolution: {integrity: sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1544,6 +3095,10 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1577,11 +3132,24 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - supports-color@7.2.0: + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1593,10 +3161,33 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + + tailwind-variants@1.0.0: + resolution: {integrity: sha512-2WSbv4ulEEyuBKomOunut65D8UZwxrHoRfYnxGcQNnHqlSCp2+B7Yz2W+yrNDrxRodOXtGD/1oCcKGNBnUqMqA==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwindcss: '*' + + tailwindcss@4.1.14: + resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} + + tapable@2.2.3: + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} + engines: {node: '>=6'} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + engines: {node: '>=18'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -1605,12 +3196,19 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1619,10 +3217,25 @@ packages: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + tinyspy@3.0.2: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tldts-core@6.1.86: + resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} + + tldts@6.1.86: + resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} + hasBin: true + tmp@0.2.5: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} @@ -1631,10 +3244,27 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-morph@22.0.0: + resolution: {integrity: sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==} + tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -1642,6 +3272,27 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typedoc-plugin-markdown@4.9.0: + resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==} + engines: {node: '>= 18'} + peerDependencies: + typedoc: 0.28.x + + typedoc@0.28.13: + resolution: {integrity: sha512-dNWY8msnYB2a+7Audha+aTF1Pu3euiE7ySp53w8kEsXoYw7dMouV5A1UsTUY345aB152RHnmRMDiovuBi7BD+w==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} @@ -1652,6 +3303,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -1659,12 +3313,22 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + validator@13.15.15: resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} @@ -1674,6 +3338,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + vite-plugin-dts@3.9.1: resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1684,8 +3353,36 @@ packages: vite: optional: true - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + vite@4.5.14: + resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@5.4.20: + resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1740,6 +3437,34 @@ packages: jsdom: optional: true + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vue-template-compiler@2.7.16: resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} @@ -1749,6 +3474,10 @@ packages: peerDependencies: typescript: '*' + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -1756,10 +3485,22 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1770,6 +3511,10 @@ packages: engines: {node: '>=8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1781,13 +3526,39 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@2.8.1: resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} @@ -1801,28 +3572,159 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + z-schema@5.0.5: resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} engines: {node: '>=8.0.0'} hasBin: true + zustand@5.0.8: + resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + snapshots: + '@adobe/css-tools@4.4.4': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.4': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + '@babel/parser@7.28.4': dependencies: '@babel/types': 7.28.4 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/runtime@7.28.4': {} + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -1859,7 +3761,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.7(@types/node@20.19.13)': + '@changesets/cli@2.29.7(@types/node@22.18.8)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -1875,7 +3777,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.2(@types/node@20.19.13) + '@inquirer/external-editor': 1.0.2(@types/node@22.18.8) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -1974,6 +3876,26 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + '@emnapi/core@1.5.0': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -1987,104 +3909,265 @@ snapshots: dependencies: tslib: 2.8.1 + '@emotion/unitless@0.10.0': {} + '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/android-arm64@0.18.20': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm@0.18.20': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-x64@0.18.20': + optional: true + '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.18.20': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-x64@0.18.20': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.18.20': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.18.20': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/linux-arm64@0.18.20': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm@0.18.20': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-ia32@0.18.20': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-loong64@0.18.20': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-mips64el@0.18.20': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-ppc64@0.18.20': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.18.20': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-s390x@0.18.20': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-x64@0.18.20': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.18.20': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.18.20': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.18.20': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/win32-arm64@0.18.20': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-ia32@0.18.20': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-x64@0.18.20': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true - '@inquirer/external-editor@1.0.2(@types/node@20.19.13)': + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': dependencies: - chardet: 2.1.0 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 20.19.13 + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 - '@isaacs/cliui@8.0.2': + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - '@istanbuljs/schema@0.1.3': {} + '@eslint/js@8.57.1': {} - '@jest/diff-sequences@30.0.1': {} + '@fullcalendar/core@6.1.8': + dependencies: + preact: 10.12.1 - '@jest/get-type@30.1.0': {} + '@fullcalendar/daygrid@6.1.8(@fullcalendar/core@6.1.8)': + dependencies: + '@fullcalendar/core': 6.1.8 - '@jest/schemas@30.0.5': + '@fullcalendar/interaction@6.1.8(@fullcalendar/core@6.1.8)': dependencies: - '@sinclair/typebox': 0.34.41 + '@fullcalendar/core': 6.1.8 - '@jridgewell/gen-mapping@0.3.13': + '@fullcalendar/rrule@6.1.8(@fullcalendar/core@6.1.8)(rrule@2.8.1)': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@fullcalendar/core': 6.1.8 + rrule: 2.8.1 + + '@fullcalendar/timegrid@6.1.8(@fullcalendar/core@6.1.8)': + dependencies: + '@fullcalendar/core': 6.1.8 + '@fullcalendar/daygrid': 6.1.8(@fullcalendar/core@6.1.8) + + '@gerrit0/mini-shiki@3.13.0': + dependencies: + '@shikijs/engine-oniguruma': 3.13.0 + '@shikijs/langs': 3.13.0 + '@shikijs/themes': 3.13.0 + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@inquirer/external-editor@1.0.2(@types/node@22.18.8)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 22.18.8 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/diff-sequences@30.0.1': {} + + '@jest/expect-utils@30.2.0': + dependencies: + '@jest/get-type': 30.1.0 + + '@jest/get-type@30.1.0': {} + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 22.18.8 + jest-regex-util: 30.0.1 + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.41 + + '@jest/types@30.2.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.18.8 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} @@ -2096,6 +4179,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@lit/react@1.0.8(@types/react@19.2.0)': + dependencies: + '@types/react': 19.2.0 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.4 @@ -2120,6 +4207,14 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@microsoft/api-extractor-model@7.28.13(@types/node@22.18.8)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@22.18.8) + transitivePeerDependencies: + - '@types/node' + '@microsoft/api-extractor@7.43.0(@types/node@20.19.13)': dependencies: '@microsoft/api-extractor-model': 7.28.13(@types/node@20.19.13) @@ -2138,6 +4233,26 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@microsoft/api-extractor@7.43.0(@types/node@22.18.8)': + dependencies: + '@microsoft/api-extractor-model': 7.28.13(@types/node@22.18.8) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@22.18.8) + '@rushstack/rig-package': 0.5.2 + '@rushstack/terminal': 0.10.0(@types/node@22.18.8) + '@rushstack/ts-command-line': 4.19.1(@types/node@22.18.8) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.10 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/fetch-event-source@2.0.1': {} + '@microsoft/tsdoc-config@0.16.2': dependencies: '@microsoft/tsdoc': 0.14.2 @@ -2195,6 +4310,42 @@ snapshots: '@nx/nx-win32-x64-msvc@21.5.2': optional: true + '@nylas/core@1.2.0(@stencil/core@4.37.1)': + dependencies: + '@stencil/store': 2.2.0(@stencil/core@4.37.1) + dexie: 3.2.7 + transitivePeerDependencies: + - '@stencil/core' + + '@nylas/identity@3.1.0': + dependencies: + '@microsoft/fetch-event-source': 2.0.1 + buffer: 6.0.3 + jwt-decode: 3.1.2 + react: 18.2.0 + uuid: 8.3.2 + + '@nylas/web-elements@2.2.4(rollup@4.50.1)': + dependencies: + '@fullcalendar/core': 6.1.8 + '@fullcalendar/daygrid': 6.1.8(@fullcalendar/core@6.1.8) + '@fullcalendar/interaction': 6.1.8(@fullcalendar/core@6.1.8) + '@fullcalendar/rrule': 6.1.8(@fullcalendar/core@6.1.8)(rrule@2.8.1) + '@fullcalendar/timegrid': 6.1.8(@fullcalendar/core@6.1.8) + '@nylas/core': 1.2.0(@stencil/core@4.37.1) + '@nylas/identity': 3.1.0 + '@rollup/plugin-replace': 6.0.2(rollup@4.50.1) + '@sentry/browser': 8.55.0 + '@stencil/core': 4.37.1 + d3-time: 3.1.0 + dayjs: 1.11.7 + i18next: 23.16.8 + rrule: 2.8.1 + sanitize-html: 2.17.0 + sortablejs: 1.15.6 + transitivePeerDependencies: + - rollup + '@oxlint/darwin-arm64@1.16.0': optional: true @@ -2222,7 +4373,16 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/pluginutils@5.3.0(rollup@4.52.5)': + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rollup/plugin-replace@6.0.2(rollup@4.50.1)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.50.1) + magic-string: 0.30.19 + optionalDependencies: + rollup: 4.50.1 + + '@rollup/pluginutils@5.3.0(rollup@4.50.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 @@ -2239,10 +4399,16 @@ snapshots: '@rollup/rollup-darwin-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-x64@4.52.5': + '@rollup/rollup-darwin-arm64@4.34.9': optional: true - '@rollup/rollup-freebsd-arm64@4.52.5': + '@rollup/rollup-darwin-arm64@4.50.1': + optional: true + + '@rollup/rollup-darwin-x64@4.34.9': + optional: true + + '@rollup/rollup-darwin-x64@4.50.1': optional: true '@rollup/rollup-freebsd-x64@4.52.5': @@ -2257,10 +4423,16 @@ snapshots: '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.5': + '@rollup/rollup-linux-arm64-gnu@4.34.9': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.5': + '@rollup/rollup-linux-arm64-gnu@4.50.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.9': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.50.1': optional: true '@rollup/rollup-linux-ppc64-gnu@4.52.5': @@ -2278,22 +4450,34 @@ snapshots: '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-x64-musl@4.52.5': + '@rollup/rollup-linux-x64-gnu@4.34.9': optional: true - '@rollup/rollup-openharmony-arm64@4.52.5': + '@rollup/rollup-linux-x64-gnu@4.50.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.9': + optional: true + + '@rollup/rollup-linux-x64-musl@4.50.1': optional: true '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.5': + '@rollup/rollup-win32-arm64-msvc@4.34.9': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.50.1': optional: true '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.5': + '@rollup/rollup-win32-x64-msvc@4.34.9': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.50.1': optional: true '@rushstack/node-core-library@4.0.2(@types/node@20.19.13)': @@ -2307,44 +4491,507 @@ snapshots: optionalDependencies: '@types/node': 20.19.13 + '@rushstack/node-core-library@4.0.2(@types/node@22.18.8)': + dependencies: + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.10 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 22.18.8 + '@rushstack/rig-package@0.5.2': dependencies: - resolve: 1.22.10 - strip-json-comments: 3.1.1 + resolve: 1.22.10 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.10.0(@types/node@20.19.13)': + dependencies: + '@rushstack/node-core-library': 4.0.2(@types/node@20.19.13) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 20.19.13 + + '@rushstack/terminal@0.10.0(@types/node@22.18.8)': + dependencies: + '@rushstack/node-core-library': 4.0.2(@types/node@22.18.8) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 22.18.8 + + '@rushstack/ts-command-line@4.19.1(@types/node@20.19.13)': + dependencies: + '@rushstack/terminal': 0.10.0(@types/node@20.19.13) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@rushstack/ts-command-line@4.19.1(@types/node@22.18.8)': + dependencies: + '@rushstack/terminal': 0.10.0(@types/node@22.18.8) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@sentry-internal/browser-utils@8.55.0': + dependencies: + '@sentry/core': 8.55.0 + + '@sentry-internal/feedback@8.55.0': + dependencies: + '@sentry/core': 8.55.0 + + '@sentry-internal/replay-canvas@8.55.0': + dependencies: + '@sentry-internal/replay': 8.55.0 + '@sentry/core': 8.55.0 + + '@sentry-internal/replay@8.55.0': + dependencies: + '@sentry-internal/browser-utils': 8.55.0 + '@sentry/core': 8.55.0 + + '@sentry/browser@8.55.0': + dependencies: + '@sentry-internal/browser-utils': 8.55.0 + '@sentry-internal/feedback': 8.55.0 + '@sentry-internal/replay': 8.55.0 + '@sentry-internal/replay-canvas': 8.55.0 + '@sentry/core': 8.55.0 + + '@sentry/core@8.55.0': {} + + '@shikijs/engine-oniguruma@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/themes@3.13.0': + dependencies: + '@shikijs/types': 3.13.0 + + '@shikijs/types@3.13.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@sinclair/typebox@0.34.41': {} + + '@stencil/core@4.37.1': + optionalDependencies: + '@rollup/rollup-darwin-arm64': 4.34.9 + '@rollup/rollup-darwin-x64': 4.34.9 + '@rollup/rollup-linux-arm64-gnu': 4.34.9 + '@rollup/rollup-linux-arm64-musl': 4.34.9 + '@rollup/rollup-linux-x64-gnu': 4.34.9 + '@rollup/rollup-linux-x64-musl': 4.34.9 + '@rollup/rollup-win32-arm64-msvc': 4.34.9 + '@rollup/rollup-win32-x64-msvc': 4.34.9 + + '@stencil/react-output-target@1.2.0(@stencil/core@4.37.1)(@types/react@19.2.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@lit/react': 1.0.8(@types/react@19.2.0) + '@stencil/core': 4.37.1 + html-react-parser: 5.2.6(@types/react@19.2.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-style-stringify: 1.2.0 + ts-morph: 22.0.0 + transitivePeerDependencies: + - '@types/react' + + '@stencil/store@2.2.0(@stencil/core@4.37.1)': + dependencies: + '@stencil/core': 4.37.1 + + '@swc/core-darwin-arm64@1.13.5': + optional: true + + '@swc/core-darwin-x64@1.13.5': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.13.5': + optional: true + + '@swc/core-linux-arm64-gnu@1.13.5': + optional: true + + '@swc/core-linux-arm64-musl@1.13.5': + optional: true + + '@swc/core-linux-x64-gnu@1.13.5': + optional: true + + '@swc/core-linux-x64-musl@1.13.5': + optional: true + + '@swc/core-win32-arm64-msvc@1.13.5': + optional: true + + '@swc/core-win32-ia32-msvc@1.13.5': + optional: true + + '@swc/core-win32-x64-msvc@1.13.5': + optional: true + + '@swc/core@1.13.5': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.13.5 + '@swc/core-darwin-x64': 1.13.5 + '@swc/core-linux-arm-gnueabihf': 1.13.5 + '@swc/core-linux-arm64-gnu': 1.13.5 + '@swc/core-linux-arm64-musl': 1.13.5 + '@swc/core-linux-x64-gnu': 1.13.5 + '@swc/core-linux-x64-musl': 1.13.5 + '@swc/core-win32-arm64-msvc': 1.13.5 + '@swc/core-win32-ia32-msvc': 1.13.5 + '@swc/core-win32-x64-msvc': 1.13.5 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.25': + dependencies: + '@swc/counter': 0.1.3 + + '@tailwindcss/node@4.1.14': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + magic-string: 0.30.19 + source-map-js: 1.2.1 + tailwindcss: 4.1.14 + + '@tailwindcss/oxide-android-arm64@4.1.14': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.14': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.14': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.14': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + optional: true + + '@tailwindcss/oxide@4.1.14': + dependencies: + detect-libc: 2.1.1 + tar: 7.5.1 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-arm64': 4.1.14 + '@tailwindcss/oxide-darwin-x64': 4.1.14 + '@tailwindcss/oxide-freebsd-x64': 4.1.14 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 + '@tailwindcss/oxide-linux-x64-musl': 4.1.14 + '@tailwindcss/oxide-wasm32-wasi': 4.1.14 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 + + '@tailwindcss/vite@4.1.14(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1))': + dependencies: + '@tailwindcss/node': 4.1.14 + '@tailwindcss/oxide': 4.1.14 + tailwindcss: 4.1.14 + vite: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@5.17.0': + dependencies: + '@adobe/css-tools': 4.4.4 + '@babel/runtime': 7.28.4 + '@types/testing-library__jest-dom': 5.14.9 + aria-query: 5.3.2 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.5.16 + lodash: 4.17.21 + redent: 3.0.0 + + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.0(@types/react@19.2.0))(@types/react@19.2.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@babel/runtime': 7.28.4 + '@testing-library/dom': 10.4.1 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.0 + '@types/react-dom': 19.2.0(@types/react@19.2.0) + + '@ts-morph/common@0.23.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 9.0.5 + mkdirp: 3.0.1 + path-browserify: 1.0.1 + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + + '@types/argparse@1.0.38': {} + + '@types/aria-query@5.0.4': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@30.0.0': + dependencies: + expect: 30.2.0 + pretty-format: 30.0.5 + + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 22.18.8 + '@types/tough-cookie': 4.0.5 + parse5: 7.3.0 + + '@types/json-schema@7.0.15': {} + + '@types/node@12.20.55': {} + + '@types/node@20.19.13': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.18.8': + dependencies: + undici-types: 6.21.0 + + '@types/react-dom@19.2.0(@types/react@19.2.0)': + dependencies: + '@types/react': 19.2.0 + + '@types/react@19.2.0': + dependencies: + csstype: 3.1.3 + + '@types/semver@7.7.1': {} + + '@types/stack-utils@2.0.3': {} + + '@types/testing-library__jest-dom@5.14.9': + dependencies: + '@types/jest': 30.0.0 + + '@types/testing-library__jest-dom@6.0.0': + dependencies: + '@testing-library/jest-dom': 5.17.0 + + '@types/tough-cookie@4.0.5': {} + + '@types/unist@3.0.3': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 - '@rushstack/terminal@0.10.0(@types/node@20.19.13)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.19.13) - supports-color: 8.1.1 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.2) optionalDependencies: - '@types/node': 20.19.13 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color - '@rushstack/ts-command-line@4.19.1(@types/node@20.19.13)': + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.2)': dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.19.13) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 transitivePeerDependencies: - - '@types/node' - - '@sinclair/typebox@0.34.41': {} + - supports-color - '@tybys/wasm-util@0.9.0': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: - tslib: 2.8.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) + eslint: 8.57.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript - '@types/argparse@1.0.38': {} + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 - '@types/estree@1.0.8': {} + '@ungap/structured-clone@1.3.0': {} - '@types/node@12.20.55': {} + '@vitejs/plugin-react-swc@3.11.0(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.27 + '@swc/core': 1.13.5 + vite: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@swc/helpers' - '@types/node@20.19.13': + '@vitejs/plugin-react@4.7.0(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1))': dependencies: - undici-types: 6.21.0 + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + transitivePeerDependencies: + - supports-color - '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.10.2))': + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -2358,7 +5005,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.9(@types/node@20.19.13)(happy-dom@15.10.2) + vitest: 2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color @@ -2369,39 +5016,81 @@ snapshots: chai: 5.3.3 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@20.19.13))': + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@2.1.9(vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 5.4.21(@types/node@20.19.13) + vite: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) + + '@vitest/mocker@3.2.4(vite@5.4.20(@types/node@22.18.8)(lightningcss@1.30.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.19 + optionalDependencies: + vite: 5.4.20(@types/node@22.18.8)(lightningcss@1.30.1) '@vitest/pretty-format@2.1.9': dependencies: tinyrainbow: 1.2.0 + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + '@vitest/runner@2.1.9': dependencies: '@vitest/utils': 2.1.9 pathe: 1.1.2 + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 + '@vitest/snapshot@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 magic-string: 0.30.19 pathe: 1.1.2 + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.19 + pathe: 2.0.3 + '@vitest/spy@2.1.9': dependencies: tinyspy: 3.0.2 + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + '@vitest/utils@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 loupe: 3.2.1 tinyrainbow: 1.2.0 + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@volar/language-core@1.11.1': dependencies: '@volar/source-map': 1.11.1 @@ -2455,6 +5144,14 @@ snapshots: dependencies: argparse: 2.0.1 + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -2482,6 +5179,12 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + array-union@2.1.0: {} assertion-error@2.0.1: {} @@ -2500,6 +5203,8 @@ snapshots: base64-js@1.5.1: {} + baseline-browser-mapping@2.8.10: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -2523,11 +5228,24 @@ snapshots: dependencies: fill-range: 7.1.1 + browserslist@4.26.3: + dependencies: + baseline-browser-mapping: 2.8.10 + caniuse-lite: 1.0.30001746 + electron-to-chromium: 1.5.228 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.3) + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -2535,6 +5253,10 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + callsites@3.1.0: {} + + caniuse-lite@1.0.30001746: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -2543,6 +5265,11 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -2552,8 +5279,12 @@ snapshots: check-error@2.1.1: {} + chownr@3.0.0: {} + ci-info@3.9.0: {} + ci-info@4.3.0: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -2568,6 +5299,8 @@ snapshots: clone@1.0.4: {} + code-block-writer@13.0.3: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2585,20 +5318,52 @@ snapshots: concat-map@0.0.1: {} + convert-source-map@2.0.0: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + css.escape@1.5.1: {} + + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + + csstype@3.1.3: {} + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + dayjs@1.11.7: {} + de-indent@1.0.2: {} debug@4.4.1: dependencies: ms: 2.1.3 + decimal.js@10.6.0: {} + deep-eql@5.0.2: {} + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -2607,12 +5372,42 @@ snapshots: delayed-stream@1.0.0: {} + dequal@2.0.3: {} + detect-indent@6.1.0: {} + detect-libc@2.1.1: {} + + dexie@3.2.7: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dotenv-expand@11.0.7: dependencies: dotenv: 16.4.7 @@ -2627,6 +5422,8 @@ snapshots: eastasianwidth@0.2.0: {} + electron-to-chromium@1.5.228: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -2635,6 +5432,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.3 + enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 @@ -2646,6 +5448,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -2663,6 +5467,31 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -2693,16 +5522,105 @@ snapshots: escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react-refresh@0.4.23(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 + esutils@2.0.3: {} + expect-type@1.2.2: {} + expect@30.2.0: + dependencies: + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + extendable-error@0.1.7: {} fast-deep-equal@3.1.3: {} @@ -2717,14 +5635,24 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-levenshtein@2.0.6: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -2734,8 +5662,21 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + flat@5.0.2: {} + flatted@3.3.3: {} + follow-redirects@1.15.11: {} foreground-child@3.3.1: @@ -2769,11 +5710,15 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -2798,6 +5743,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -2807,6 +5756,19 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -2820,7 +5782,9 @@ snapshots: graceful-fs@4.2.11: {} - happy-dom@15.10.2: + graphemer@1.4.0: {} + + happy-dom@13.10.1: dependencies: entities: 4.5.0 webidl-conversions: 7.0.0 @@ -2840,12 +5804,67 @@ snapshots: he@1.2.0: {} + html-dom-parser@5.1.1: + dependencies: + domhandler: 5.0.3 + htmlparser2: 10.0.0 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-escaper@2.0.2: {} + html-react-parser@5.2.6(@types/react@19.2.0)(react@19.2.0): + dependencies: + domhandler: 5.0.3 + html-dom-parser: 5.1.1 + react: 19.2.0 + react-property: 2.0.2 + style-to-js: 1.1.17 + optionalDependencies: + '@types/react': 19.2.0 + + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + human-id@4.1.1: {} husky@8.0.3: {} + i18next@23.16.8: + dependencies: + '@babel/runtime': 7.28.4 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.7.0: dependencies: safer-buffer: 2.1.2 @@ -2854,10 +5873,28 @@ snapshots: ignore@5.3.2: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + import-lazy@4.0.0: {} + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} + inline-style-parser@0.2.4: {} + + internmap@2.0.3: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -2876,6 +5913,12 @@ snapshots: is-number@7.0.0: {} + is-path-inside@3.0.3: {} + + is-plain-object@5.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -2924,15 +5967,101 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.5 - jju@1.4.0: {} + jest-diff@30.2.0: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.2.0 + + jest-matcher-utils@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.2.0 + pretty-format: 30.2.0 + + jest-message-util@30.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.2.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 22.18.8 + jest-util: 30.2.0 + + jest-regex-util@30.0.1: {} + + jest-util@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 22.18.8 + chalk: 4.1.2 + ci-info: 4.3.0 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + + jiti@2.6.1: {} + + jju@1.4.0: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdom@26.1.0: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.22 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.1.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} jsonc-parser@3.2.0: {} @@ -2941,18 +6070,84 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jwt-decode@3.1.2: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kolorist@1.8.0: {} + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.1.1 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + lines-and-columns@2.0.3: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash.get@4.4.2: {} lodash.isequal@4.5.0: {} + lodash.merge@4.6.2: {} + lodash.startcase@4.4.0: {} lodash@4.17.21: {} @@ -2962,14 +6157,30 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.2.1: {} lru-cache@10.4.3: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lru-cache@6.0.0: dependencies: yallist: 4.0.0 + lucide-react@0.453.0(react@19.2.0): + dependencies: + react: 19.2.0 + + lunr@2.3.9: {} + + lz-string@1.5.0: {} + magic-string@0.30.19: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2984,8 +6195,21 @@ snapshots: dependencies: semver: 7.7.2 + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-table@3.0.4: {} + math-intrinsics@1.1.0: {} + mdurl@2.0.0: {} + merge2@1.4.1: {} micromatch@4.0.8: @@ -3001,10 +6225,16 @@ snapshots: mimic-fn@2.1.0: {} + min-indent@1.0.1: {} + minimatch@3.0.8: dependencies: brace-expansion: 1.1.12 + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.3: dependencies: brace-expansion: 2.0.2 @@ -3017,6 +6247,12 @@ snapshots: minipass@7.1.2: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + mkdirp@3.0.1: {} + mri@1.2.0: {} ms@2.1.3: {} @@ -3025,13 +6261,19 @@ snapshots: nanoid@3.3.11: {} + natural-compare@1.4.0: {} + node-machine-id@1.1.12: {} + node-releases@2.0.21: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - nx@21.5.2: + nwsapi@2.2.22: {} + + nx@21.5.2(@swc/core@1.13.5): dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -3079,6 +6321,7 @@ snapshots: '@nx/nx-linux-x64-musl': 21.5.2 '@nx/nx-win32-arm64-msvc': 21.5.2 '@nx/nx-win32-x64-msvc': 21.5.2 + '@swc/core': 1.13.5 transitivePeerDependencies: - debug @@ -3096,6 +6339,15 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + ora@5.3.0: dependencies: bl: 4.1.0 @@ -3128,10 +6380,18 @@ snapshots: dependencies: p-try: 2.2.0 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-map@2.1.0: {} p-try@2.2.0: {} @@ -3142,10 +6402,22 @@ snapshots: dependencies: quansync: 0.2.11 + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-srcset@1.0.2: {} + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + path-browserify@1.0.1: {} path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-parse@1.0.7: {} @@ -3159,6 +6431,8 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@2.0.1: {} picocolors@1.1.1: {} @@ -3175,26 +6449,65 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + preact@10.12.1: {} + + prelude-ls@1.2.1: {} + prettier@2.8.8: {} prettier@3.6.2: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + pretty-format@30.0.5: dependencies: '@jest/schemas': 30.0.5 ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + proxy-from-env@1.1.0: {} + punycode.js@2.3.1: {} + punycode@2.3.1: {} quansync@0.2.11: {} queue-microtask@1.2.3: {} + react-dom@19.2.0(react@19.2.0): + dependencies: + react: 19.2.0 + scheduler: 0.27.0 + + react-is@17.0.2: {} + react-is@18.3.1: {} + react-property@2.0.2: {} + + react-refresh@0.17.0: {} + + react-style-stringify@1.2.0: + dependencies: + '@emotion/unitless': 0.10.0 + + react@18.2.0: + dependencies: + loose-envify: 1.4.0 + + react@19.2.0: {} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -3208,8 +6521,15 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + require-directory@2.1.1: {} + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} resolve.exports@2.0.3: {} @@ -3232,7 +6552,15 @@ snapshots: reusify@1.1.0: {} - rollup@4.52.5: + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.50.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: @@ -3260,6 +6588,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 + rrule@2.8.1: + dependencies: + tslib: 2.8.1 + + rrweb-cssom@0.8.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -3268,6 +6602,23 @@ snapshots: safer-buffer@2.1.2: {} + sanitize-html@2.17.0: + dependencies: + deepmerge: 4.3.1 + escape-string-regexp: 4.0.0 + htmlparser2: 8.0.2 + is-plain-object: 5.0.0 + parse-srcset: 1.0.2 + postcss: 8.5.6 + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + semver@7.5.4: dependencies: lru-cache: 6.0.0 @@ -3288,6 +6639,8 @@ snapshots: slash@3.0.0: {} + sortablejs@1.15.6: {} + source-map-js@1.2.1: {} source-map@0.6.1: {} @@ -3299,6 +6652,10 @@ snapshots: sprintf-js@1.0.3: {} + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + stackback@0.0.2: {} std-env@3.9.0: {} @@ -3331,8 +6688,24 @@ snapshots: strip-bom@3.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@3.1.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -3343,6 +6716,19 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} + + tailwind-merge@3.0.2: {} + + tailwind-variants@1.0.0(tailwindcss@4.1.14): + dependencies: + tailwind-merge: 3.0.2 + tailwindcss: 4.1.14 + + tailwindcss@4.1.14: {} + + tapable@2.2.3: {} + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -3351,6 +6737,14 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + tar@7.5.1: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + term-size@2.2.1: {} test-exclude@7.0.1: @@ -3359,24 +6753,58 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 + text-table@0.2.0: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tinypool@1.1.1: {} tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} + tinyspy@3.0.2: {} + tinyspy@4.0.4: {} + + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + tmp@0.2.5: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tree-kill@1.2.2: {} + ts-api-utils@1.4.3(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + + ts-morph@22.0.0: + dependencies: + '@ts-morph/common': 0.23.0 + code-block-writer: 13.0.3 + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -3385,29 +6813,76 @@ snapshots: tslib@2.8.1: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2)): + dependencies: + typedoc: 0.28.13(typescript@5.9.2) + + typedoc@0.28.13(typescript@5.9.2): + dependencies: + '@gerrit0/mini-shiki': 3.13.0 + lunr: 2.3.9 + markdown-it: 14.1.0 + minimatch: 9.0.5 + typescript: 5.9.2 + yaml: 2.8.1 + typescript@5.4.2: {} typescript@5.9.2: {} + uc.micro@2.1.0: {} + undici-types@6.21.0: {} universalify@0.1.2: {} + update-browserslist-db@1.1.3(browserslist@4.26.3): + dependencies: + browserslist: 4.26.3 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 util-deprecate@1.0.2: {} + uuid@8.3.2: {} + validator@13.15.15: {} - vite-node@2.1.9(@types/node@20.19.13): + vite-node@2.1.9(@types/node@20.19.13)(lightningcss@1.30.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.21(@types/node@20.19.13) + vite: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-node@3.2.4(@types/node@22.18.8)(lightningcss@1.30.1): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 5.4.20(@types/node@22.18.8)(lightningcss@1.30.1) transitivePeerDependencies: - '@types/node' - less @@ -3419,7 +6894,7 @@ snapshots: - supports-color - terser - vite-plugin-dts@3.9.1(@types/node@20.19.13)(rollup@4.52.5)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.13)): + vite-plugin-dts@3.9.1(@types/node@20.19.13)(rollup@4.50.1)(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1)): dependencies: '@microsoft/api-extractor': 7.43.0(@types/node@20.19.13) '@rollup/pluginutils': 5.3.0(rollup@4.52.5) @@ -3430,13 +6905,40 @@ snapshots: typescript: 5.9.2 vue-tsc: 1.8.27(typescript@5.9.2) optionalDependencies: - vite: 5.4.21(@types/node@20.19.13) + vite: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite@5.4.21(@types/node@20.19.13): + vite-plugin-dts@3.9.1(@types/node@22.18.8)(rollup@4.50.1)(typescript@5.9.2)(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)): + dependencies: + '@microsoft/api-extractor': 7.43.0(@types/node@22.18.8) + '@rollup/pluginutils': 5.3.0(rollup@4.50.1) + '@vue/language-core': 1.8.27(typescript@5.9.2) + debug: 4.4.1 + kolorist: 1.8.0 + magic-string: 0.30.19 + typescript: 5.9.2 + vue-tsc: 1.8.27(typescript@5.9.2) + optionalDependencies: + vite: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + + vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1): + dependencies: + esbuild: 0.18.20 + postcss: 8.5.6 + rollup: 3.29.5 + optionalDependencies: + '@types/node': 22.18.8 + fsevents: 2.3.3 + lightningcss: 1.30.1 + + vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -3444,11 +6946,22 @@ snapshots: optionalDependencies: '@types/node': 20.19.13 fsevents: 2.3.3 + lightningcss: 1.30.1 + + vite@5.4.20(@types/node@22.18.8)(lightningcss@1.30.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.50.1 + optionalDependencies: + '@types/node': 22.18.8 + fsevents: 2.3.3 + lightningcss: 1.30.1 - vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.10.2): + vitest@2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@20.19.13)) + '@vitest/mocker': 2.1.9(vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -3464,12 +6977,53 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 1.2.0 - vite: 5.4.21(@types/node@20.19.13) - vite-node: 2.1.9(@types/node@20.19.13) + vite: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) + vite-node: 2.1.9(@types/node@20.19.13)(lightningcss@1.30.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.13 - happy-dom: 15.10.2 + happy-dom: 13.10.1 + jsdom: 26.1.0 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vitest@3.2.4(@types/node@22.18.8)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@5.4.20(@types/node@22.18.8)(lightningcss@1.30.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.19 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 5.4.20(@types/node@22.18.8)(lightningcss@1.30.1) + vite-node: 3.2.4(@types/node@22.18.8)(lightningcss@1.30.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.18.8 + happy-dom: 13.10.1 + jsdom: 26.1.0 transitivePeerDependencies: - less - lightningcss @@ -3493,14 +7047,29 @@ snapshots: semver: 7.7.2 typescript: 5.9.2 + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + wcwidth@1.0.1: dependencies: defaults: 1.0.4 webidl-conversions@7.0.0: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -3510,6 +7079,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + word-wrap@1.2.5: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -3524,10 +7095,20 @@ snapshots: wrappy@1.0.2: {} + ws@8.18.3: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + y18n@5.0.8: {} + yallist@3.1.1: {} + yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} @@ -3542,6 +7123,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yocto-queue@0.1.0: {} + z-schema@5.0.5: dependencies: lodash.get: 4.4.2 @@ -3549,3 +7132,8 @@ snapshots: validator: 13.15.15 optionalDependencies: commander: 9.5.0 + + zustand@5.0.8(@types/react@19.2.0)(react@19.2.0): + optionalDependencies: + '@types/react': 19.2.0 + react: 19.2.0 From e89e170e775fa7b2af64321ca9cde2a90f6fd4de Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 10:24:12 +0100 Subject: [PATCH 02/16] update lockfile --- pnpm-lock.yaml | 196 ++++++++++++++++++++++++------------------------- 1 file changed, 96 insertions(+), 100 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 39093c5..83653ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,22 +31,22 @@ importers: version: 20.19.13 '@vitest/coverage-v8': specifier: ^2.1.9 - version: 2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1)) + version: 2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1)) happy-dom: specifier: ^15.10.2 - version: 15.10.2 + version: 15.11.7 typescript: specifier: ^5.3.3 version: 5.9.2 vite: - specifier: ^5.0.10 - version: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) + specifier: ^5.4.21 + version: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) vite-plugin-dts: specifier: ^3.7.0 - version: 3.9.1(@types/node@20.19.13)(rollup@4.50.1)(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1)) + version: 3.9.1(@types/node@20.19.13)(rollup@4.50.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1)) vitest: specifier: ^2.1.8 - version: 2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1) + version: 2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1) packages/react: dependencies: @@ -164,7 +164,7 @@ importers: version: 3.9.1(@types/node@22.18.8)(rollup@4.50.1)(typescript@5.9.2)(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.18.8)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1) + version: 3.2.4(@types/node@22.18.8)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1) packages: @@ -918,13 +918,13 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.5': - resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + '@rollup/rollup-android-arm-eabi@4.50.1': + resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.5': - resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + '@rollup/rollup-android-arm64@4.50.1': + resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} cpu: [arm64] os: [android] @@ -948,23 +948,23 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.5': - resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + '@rollup/rollup-freebsd-arm64@4.50.1': + resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.5': - resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + '@rollup/rollup-freebsd-x64@4.50.1': + resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': - resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.5': - resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + '@rollup/rollup-linux-arm-musleabihf@4.50.1': + resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} cpu: [arm] os: [linux] @@ -988,28 +988,28 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.5': - resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + '@rollup/rollup-linux-loongarch64-gnu@4.50.1': + resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.5': - resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + '@rollup/rollup-linux-ppc64-gnu@4.50.1': + resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.5': - resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + '@rollup/rollup-linux-riscv64-gnu@4.50.1': + resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.5': - resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + '@rollup/rollup-linux-riscv64-musl@4.50.1': + resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.5': - resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + '@rollup/rollup-linux-s390x-gnu@4.50.1': + resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} cpu: [s390x] os: [linux] @@ -1033,8 +1033,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.5': - resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + '@rollup/rollup-openharmony-arm64@4.50.1': + resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} cpu: [arm64] os: [openharmony] @@ -1048,8 +1048,8 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.5': - resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + '@rollup/rollup-win32-ia32-msvc@4.50.1': + resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} cpu: [ia32] os: [win32] @@ -2213,9 +2213,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - happy-dom@13.10.1: - resolution: {integrity: sha512-9GZLEFvQL5EgfJX2zcBgu1nsPUn98JF/EiJnSfQbdxI6YEQGqpd09lXXxOmYonRBIEFz9JlGCOiPflDzgS1p8w==} - engines: {node: '>=16.0.0'} + happy-dom@15.11.7: + resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} + engines: {node: '>=18.0.0'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -3381,8 +3381,8 @@ packages: terser: optional: true - vite@5.4.20: - resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4388,15 +4388,12 @@ snapshots: estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.5 - - '@rollup/rollup-android-arm-eabi@4.52.5': - optional: true + rollup: 4.50.1 - '@rollup/rollup-android-arm64@4.52.5': + '@rollup/rollup-android-arm-eabi@4.50.1': optional: true - '@rollup/rollup-darwin-arm64@4.52.5': + '@rollup/rollup-android-arm64@4.50.1': optional: true '@rollup/rollup-darwin-arm64@4.34.9': @@ -4411,16 +4408,16 @@ snapshots: '@rollup/rollup-darwin-x64@4.50.1': optional: true - '@rollup/rollup-freebsd-x64@4.52.5': + '@rollup/rollup-freebsd-arm64@4.50.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + '@rollup/rollup-freebsd-x64@4.50.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.5': + '@rollup/rollup-linux-arm-gnueabihf@4.50.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.5': + '@rollup/rollup-linux-arm-musleabihf@4.50.1': optional: true '@rollup/rollup-linux-arm64-gnu@4.34.9': @@ -4435,19 +4432,19 @@ snapshots: '@rollup/rollup-linux-arm64-musl@4.50.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.5': + '@rollup/rollup-linux-loongarch64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.5': + '@rollup/rollup-linux-ppc64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.5': + '@rollup/rollup-linux-riscv64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.5': + '@rollup/rollup-linux-riscv64-musl@4.50.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.5': + '@rollup/rollup-linux-s390x-gnu@4.50.1': optional: true '@rollup/rollup-linux-x64-gnu@4.34.9': @@ -4462,7 +4459,7 @@ snapshots: '@rollup/rollup-linux-x64-musl@4.50.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.5': + '@rollup/rollup-openharmony-arm64@4.50.1': optional: true '@rollup/rollup-win32-arm64-msvc@4.34.9': @@ -4471,7 +4468,7 @@ snapshots: '@rollup/rollup-win32-arm64-msvc@4.50.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.5': + '@rollup/rollup-win32-ia32-msvc@4.50.1': optional: true '@rollup/rollup-win32-x64-msvc@4.34.9': @@ -4991,7 +4988,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1))': + '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -5005,7 +5002,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1) + vitest: 2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color @@ -5024,21 +5021,21 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.9(vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1))': + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) - '@vitest/mocker@3.2.4(vite@5.4.20(@types/node@22.18.8)(lightningcss@1.30.1))': + '@vitest/mocker@3.2.4(vite@5.4.21(@types/node@22.18.8)(lightningcss@1.30.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 5.4.20(@types/node@22.18.8)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@22.18.8)(lightningcss@1.30.1) '@vitest/pretty-format@2.1.9': dependencies: @@ -5784,7 +5781,7 @@ snapshots: graphemer@1.4.0: {} - happy-dom@13.10.1: + happy-dom@15.11.7: dependencies: entities: 4.5.0 webidl-conversions: 7.0.0 @@ -6564,28 +6561,27 @@ snapshots: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.5 - '@rollup/rollup-android-arm64': 4.52.5 - '@rollup/rollup-darwin-arm64': 4.52.5 - '@rollup/rollup-darwin-x64': 4.52.5 - '@rollup/rollup-freebsd-arm64': 4.52.5 - '@rollup/rollup-freebsd-x64': 4.52.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 - '@rollup/rollup-linux-arm-musleabihf': 4.52.5 - '@rollup/rollup-linux-arm64-gnu': 4.52.5 - '@rollup/rollup-linux-arm64-musl': 4.52.5 - '@rollup/rollup-linux-loong64-gnu': 4.52.5 - '@rollup/rollup-linux-ppc64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-musl': 4.52.5 - '@rollup/rollup-linux-s390x-gnu': 4.52.5 - '@rollup/rollup-linux-x64-gnu': 4.52.5 - '@rollup/rollup-linux-x64-musl': 4.52.5 - '@rollup/rollup-openharmony-arm64': 4.52.5 - '@rollup/rollup-win32-arm64-msvc': 4.52.5 - '@rollup/rollup-win32-ia32-msvc': 4.52.5 - '@rollup/rollup-win32-x64-gnu': 4.52.5 - '@rollup/rollup-win32-x64-msvc': 4.52.5 + '@rollup/rollup-android-arm-eabi': 4.50.1 + '@rollup/rollup-android-arm64': 4.50.1 + '@rollup/rollup-darwin-arm64': 4.50.1 + '@rollup/rollup-darwin-x64': 4.50.1 + '@rollup/rollup-freebsd-arm64': 4.50.1 + '@rollup/rollup-freebsd-x64': 4.50.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 + '@rollup/rollup-linux-arm-musleabihf': 4.50.1 + '@rollup/rollup-linux-arm64-gnu': 4.50.1 + '@rollup/rollup-linux-arm64-musl': 4.50.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 + '@rollup/rollup-linux-ppc64-gnu': 4.50.1 + '@rollup/rollup-linux-riscv64-gnu': 4.50.1 + '@rollup/rollup-linux-riscv64-musl': 4.50.1 + '@rollup/rollup-linux-s390x-gnu': 4.50.1 + '@rollup/rollup-linux-x64-gnu': 4.50.1 + '@rollup/rollup-linux-x64-musl': 4.50.1 + '@rollup/rollup-openharmony-arm64': 4.50.1 + '@rollup/rollup-win32-arm64-msvc': 4.50.1 + '@rollup/rollup-win32-ia32-msvc': 4.50.1 + '@rollup/rollup-win32-x64-msvc': 4.50.1 fsevents: 2.3.3 rrule@2.8.1: @@ -6864,7 +6860,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) transitivePeerDependencies: - '@types/node' - less @@ -6882,7 +6878,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.20(@types/node@22.18.8)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@22.18.8)(lightningcss@1.30.1) transitivePeerDependencies: - '@types/node' - less @@ -6894,10 +6890,10 @@ snapshots: - supports-color - terser - vite-plugin-dts@3.9.1(@types/node@20.19.13)(rollup@4.50.1)(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1)): + vite-plugin-dts@3.9.1(@types/node@20.19.13)(rollup@4.50.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1)): dependencies: '@microsoft/api-extractor': 7.43.0(@types/node@20.19.13) - '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@rollup/pluginutils': 5.3.0(rollup@4.50.1) '@vue/language-core': 1.8.27(typescript@5.9.2) debug: 4.4.1 kolorist: 1.8.0 @@ -6905,7 +6901,7 @@ snapshots: typescript: 5.9.2 vue-tsc: 1.8.27(typescript@5.9.2) optionalDependencies: - vite: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) transitivePeerDependencies: - '@types/node' - rollup @@ -6938,17 +6934,17 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.30.1 - vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1): + vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 - rollup: 4.52.5 + rollup: 4.50.1 optionalDependencies: '@types/node': 20.19.13 fsevents: 2.3.3 lightningcss: 1.30.1 - vite@5.4.20(@types/node@22.18.8)(lightningcss@1.30.1): + vite@5.4.21(@types/node@22.18.8)(lightningcss@1.30.1): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -6958,10 +6954,10 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.30.1 - vitest@2.1.9(@types/node@20.19.13)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1): + vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.20(@types/node@20.19.13)(lightningcss@1.30.1)) + '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -6977,12 +6973,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 1.2.0 - vite: 5.4.20(@types/node@20.19.13)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) vite-node: 2.1.9(@types/node@20.19.13)(lightningcss@1.30.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.13 - happy-dom: 13.10.1 + happy-dom: 15.11.7 jsdom: 26.1.0 transitivePeerDependencies: - less @@ -6995,11 +6991,11 @@ snapshots: - supports-color - terser - vitest@3.2.4(@types/node@22.18.8)(happy-dom@13.10.1)(jsdom@26.1.0)(lightningcss@1.30.1): + vitest@3.2.4(@types/node@22.18.8)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.20(@types/node@22.18.8)(lightningcss@1.30.1)) + '@vitest/mocker': 3.2.4(vite@5.4.21(@types/node@22.18.8)(lightningcss@1.30.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -7017,12 +7013,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.20(@types/node@22.18.8)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@22.18.8)(lightningcss@1.30.1) vite-node: 3.2.4(@types/node@22.18.8)(lightningcss@1.30.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.18.8 - happy-dom: 13.10.1 + happy-dom: 15.11.7 jsdom: 26.1.0 transitivePeerDependencies: - less From 86adc4cbb6c5afe8db398e99479bdbf55d672c8d Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 11:11:57 +0100 Subject: [PATCH 03/16] merge ready --- packages/react/README.md | 133 ++++- .../react/lib/connect/NylasConnectButton.css | 143 ++++++ .../lib/connect/NylasConnectButton.test.ts | 484 ++++++++++++++++++ .../react/lib/connect/NylasConnectButton.tsx | 174 +++++++ packages/react/lib/connect/index.ts | 6 + packages/react/lib/connect/types.ts | 3 + packages/react/lib/elements/components.ts | 32 ++ .../CalendarSync/CalendarSync.spec.tsx | 3 +- packages/react/test/vitest.d.ts | 10 +- packages/react/vitest.config.ts | 1 + 10 files changed, 976 insertions(+), 13 deletions(-) create mode 100644 packages/react/lib/connect/NylasConnectButton.css create mode 100644 packages/react/lib/connect/NylasConnectButton.test.ts create mode 100644 packages/react/lib/connect/NylasConnectButton.tsx diff --git a/packages/react/README.md b/packages/react/README.md index 9efc401..5d82a99 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -105,15 +105,6 @@ npm run dev -- --port After you run the command, open your browser to `http://localhost:/scheduler-editor` to see your Scheduler Editor and create your first Scheduling Page. -## Links - -For a complete walkthrough on setting up Scheduler can be found at [https://developer.nylas.com/docs/v3/getting-started/scheduler/](https://developer.nylas.com/docs/v3/getting-started/scheduler/), with the complete code available on [GitHub](https://github.com/nylas-samples/quickstart-scheduler-react). - -### Further reading: - -- [Scheduler documentation](https://developer.nylas.com/docs/v3/scheduler/) -- [Scheduler API reference](https://developer.nylas.com/docs/api/v3/scheduler/) -- [Developer Forums](https://forums.nylas.com/) ## Nylas Connect Hook @@ -195,3 +186,127 @@ const { isConnected, connect } = useNylasConnect({ ``` + + + +## Nylas Connect Button + +The `NylasConnectButton` component provides a simple way to add email provider authentication to your React application. + +### Basic Usage + +```jsx +import { NylasConnectButton } from "@nylas/react"; + +function App() { + return ( + { + console.log("Connected successfully:", result); + }} + onError={(error) => { + console.error("Connection failed:", error); + }} + /> + ); +} +``` + +### External Identity Provider Integration + +For applications that use external identity providers (via JWKS), you can pass identity provider tokens during authentication: + +```jsx +import { NylasConnectButton } from "@nylas/react"; + +function App() { + // Function to retrieve JWT token from your external identity provider + const getIdpToken = async () => { + // Get the JWT token from your authentication system + const token = await yourAuthSystem.getJWT(); + return token; // or return null if not available + }; + + return ( + { + console.log("Connected with IDP claims:", result); + }} + onError={(error) => { + console.error("Connection failed:", error); + }} + /> + ); +} +``` + +### Custom Backend Code Exchange + +For enhanced security, you can handle the OAuth code exchange on your backend: + +```jsx +import { NylasConnectButton } from "@nylas/react"; + +function App() { + const handleCodeExchange = async (params) => { + // Send the authorization code to your backend + const response = await fetch("/api/auth/exchange", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + code: params.code, + state: params.state, + clientId: params.clientId, + redirectUri: params.redirectUri, + scopes: params.scopes, + provider: params.provider, + }), + }); + + if (!response.ok) { + throw new Error(`Token exchange failed: ${response.statusText}`); + } + + const tokenData = await response.json(); + + // Return the expected ConnectResult format + return { + accessToken: tokenData.access_token, + idToken: tokenData.id_token, + grantId: tokenData.grant_id, + expiresAt: Date.now() + tokenData.expires_in * 1000, + scope: tokenData.scope, + grantInfo: tokenData.grant_info, + }; + }; + + return ( + { + console.log("Connected successfully:", result); + }} + onError={(error) => { + console.error("Connection failed:", error); + }} + /> + ); +} +``` + +## Links + +For a complete walkthrough on setting up Scheduler can be found at [https://developer.nylas.com/docs/v3/getting-started/scheduler/](https://developer.nylas.com/docs/v3/getting-started/scheduler/), with the complete code available on [GitHub](https://github.com/nylas-samples/quickstart-scheduler-react). + +### Further reading: + +- [Scheduler documentation](https://developer.nylas.com/docs/v3/scheduler/) +- [Scheduler API reference](https://developer.nylas.com/docs/api/v3/scheduler/) +- [Developer Forums](https://forums.nylas.com/) diff --git a/packages/react/lib/connect/NylasConnectButton.css b/packages/react/lib/connect/NylasConnectButton.css new file mode 100644 index 0000000..79becfc --- /dev/null +++ b/packages/react/lib/connect/NylasConnectButton.css @@ -0,0 +1,143 @@ +/* + Theme defaults (system-aware) + - Light: white bg, gray border, dark text + - Dark: very dark gray bg, white text, darker border + Consumers can override by setting these CSS variables on any ancestor, + or by applying `.nylas-theme-light` / `.nylas-theme-dark` or [data-theme] attributes. +*/ +:root { + color-scheme: light dark; + --nylas-btn-bg: #ffffff; + --nylas-btn-fg: #111111; + --nylas-btn-border: #d1d5db; + --nylas-btn-bg-hover: #f5f5f5; + --nylas-btn-bg-active: #e5e5e5; + --nylas-btn-bg-focus: #f5f5f5; + --nylas-btn-border-active: #a1a1aa; + --nylas-btn-border-focus: #3b82f6; + --nylas-btn-border-radius: 6px; + --nylas-btn-font-weight: 500; + --nylas-btn-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --nylas-btn-shadow-hover: + 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); + --nylas-btn-shadow-focus: 0 0 0 3px rgba(59, 130, 246, 0.1); + --nylas-btn-shadow-active: 0 1px 2px 0 rgba(0, 0, 0, 0.05); +} + +@media (prefers-color-scheme: dark) { + :root { + --nylas-btn-bg: #1a1a1a; /* ~90% black */ + --nylas-btn-fg: #ffffff; + --nylas-btn-border: #333333; + --nylas-btn-bg-hover: #2a2a2a; + --nylas-btn-bg-active: #0f0f0f; + --nylas-btn-bg-focus: #2a2a2a; + --nylas-btn-border-active: #555555; + --nylas-btn-border-focus: #60a5fa; + --nylas-btn-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + --nylas-btn-shadow-hover: + 0 1px 3px 0 rgba(0, 0, 0, 0.4), 0 1px 2px 0 rgba(0, 0, 0, 0.3); + --nylas-btn-shadow-focus: 0 0 0 3px rgba(96, 165, 250, 0.2); + --nylas-btn-shadow-active: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + } +} + +/* Force higher specificity for theme overrides */ +.nylas-theme-light .nylas-btn.nylas-btn, +[data-theme="light"] .nylas-btn.nylas-btn { + --nylas-btn-bg: #ffffff !important; + --nylas-btn-fg: #111111 !important; + --nylas-btn-border: #d1d5db !important; + --nylas-btn-bg-hover: #f5f5f5 !important; + --nylas-btn-bg-active: #e5e5e5 !important; + --nylas-btn-bg-focus: #f5f5f5 !important; + --nylas-btn-border-active: #a1a1aa !important; + --nylas-btn-border-focus: #3b82f6 !important; + --nylas-btn-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; + --nylas-btn-shadow-hover: + 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; + --nylas-btn-shadow-focus: 0 0 0 3px rgba(59, 130, 246, 0.1) !important; + --nylas-btn-shadow-active: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; +} + +.nylas-theme-dark .nylas-btn.nylas-btn, +[data-theme="dark"] .nylas-btn.nylas-btn { + --nylas-btn-bg: #1a1a1a !important; + --nylas-btn-fg: #ffffff !important; + --nylas-btn-border: #333333 !important; + --nylas-btn-bg-hover: #2a2a2a !important; + --nylas-btn-bg-active: #0f0f0f !important; + --nylas-btn-bg-focus: #2a2a2a !important; + --nylas-btn-border-active: #555555 !important; + --nylas-btn-border-focus: #60a5fa !important; + --nylas-btn-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3) !important; + --nylas-btn-shadow-hover: + 0 1px 3px 0 rgba(0, 0, 0, 0.4), 0 1px 2px 0 rgba(0, 0, 0, 0.3) !important; + --nylas-btn-shadow-focus: 0 0 0 3px rgba(96, 165, 250, 0.2) !important; + --nylas-btn-shadow-active: 0 1px 2px 0 rgba(0, 0, 0, 0.3) !important; +} + +.nylas-btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + border-radius: var(--nylas-btn-border-radius); + + border: 1px solid var(--nylas-btn-border); + background: var(--nylas-btn-bg); + color: var(--nylas-btn-fg); + font-weight: var(--nylas-btn-font-weight); + box-shadow: var(--nylas-btn-shadow); + cursor: pointer; + transition: + background-color 0.15s ease, + border-color 0.15s ease, + color 0.15s ease, + box-shadow 0.15s ease; +} + +.nylas-btn:hover { + background: var(--nylas-btn-bg-hover); + box-shadow: var(--nylas-btn-shadow-hover); +} + +.nylas-btn:focus { + outline: none; + background: var(--nylas-btn-bg-focus); + border-color: var(--nylas-btn-border-focus); + box-shadow: var(--nylas-btn-shadow-focus); +} + +.nylas-btn:active { + background: var(--nylas-btn-bg-active); + border-color: var(--nylas-btn-border-active); + box-shadow: var(--nylas-btn-shadow-active); +} + +.nylas-btn[disabled], +.nylas-btn[aria-busy="true"] { + opacity: 0.7; + cursor: not-allowed; +} + +.nylas-btn--sm { + padding: 6px 10px; + font-size: 12px; +} + +.nylas-btn--md { + padding: 10px 14px; + font-size: 14px; +} + +.nylas-btn--lg { + padding: 14px 18px; + font-size: 16px; +} + +.nylas-btn--outline { + /* Outline follows current theme colors */ + --nylas-btn-bg: transparent !important; + /* keep text and border from theme - inherit from parent theme */ +} diff --git a/packages/react/lib/connect/NylasConnectButton.test.ts b/packages/react/lib/connect/NylasConnectButton.test.ts new file mode 100644 index 0000000..43df711 --- /dev/null +++ b/packages/react/lib/connect/NylasConnectButton.test.ts @@ -0,0 +1,484 @@ +import { describe, it, expect, beforeEach, vi, afterEach } from "vitest"; +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; +import React from "react"; +import { NylasConnectButton } from "./NylasConnectButton"; +import { useNylasConnect } from "./useNylasConnect"; +import type { ConnectResult } from "@nylas/connect"; + +// Mock the useNylasConnect hook +vi.mock("./useNylasConnect", () => ({ + useNylasConnect: vi.fn(), +})); + +describe("NylasConnectButton", () => { + const mockConnect = vi.fn(); + const mockUseNylasConnect = vi.mocked(useNylasConnect); + + const defaultProps = { + clientId: "test-client-id", + redirectUri: "https://app.example.com/callback", + }; + + const mockConnectResult: ConnectResult = { + accessToken: "test-token", + idToken: "test-id-token", + grantId: "test-grant-id", + expiresAt: Date.now() + 3600 * 1000, + scope: "email.read", + grantInfo: { + id: "test-grant-id", + email: "test@example.com", + provider: "google", + }, + }; + + beforeEach(() => { + vi.clearAllMocks(); + + // Default mock implementation + mockUseNylasConnect.mockReturnValue({ + connect: mockConnect, + isLoading: false, + isConnected: false, + grant: null, + error: null, + logout: vi.fn(), + refreshSession: vi.fn(), + subscribe: vi.fn(), + setLogLevel: vi.fn(), + connectClient: {} as any, + }); + + // Mock window.location.assign + Object.defineProperty(window, "location", { + value: { + assign: vi.fn(), + }, + writable: true, + }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + describe("Basic Rendering", () => { + it("renders with default props", () => { + render(React.createElement(NylasConnectButton, defaultProps)); + + const button = screen.getByRole("button"); + expect(button).toBeTruthy(); + expect(button.textContent).toBe("Connect your inbox"); + expect(button.className).toContain("nylas-btn"); + expect(button.className).toContain("nylas-btn--primary"); + expect(button.className).toContain("nylas-btn--md"); + }); + + it("renders with custom text", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + text: "Custom Connect Text", + }), + ); + + const button = screen.getByRole("button"); + expect(button.textContent).toBe("Custom Connect Text"); + }); + + it("renders with children instead of text", () => { + render( + React.createElement( + NylasConnectButton, + defaultProps, + "Custom Children", + ), + ); + + const button = screen.getByRole("button"); + expect(button.textContent).toBe("Custom Children"); + }); + + it("renders with custom className", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + className: "custom-class", + }), + ); + + const button = screen.getByRole("button"); + expect(button.className).toContain("nylas-btn"); + expect(button.className).toContain("nylas-btn--primary"); + expect(button.className).toContain("nylas-btn--md"); + expect(button.className).toContain("custom-class"); + }); + + it("renders with custom style", () => { + const customStyle = { backgroundColor: "red", color: "white" }; + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + style: customStyle, + }), + ); + + const button = screen.getByRole("button"); + expect((button as HTMLElement).style.backgroundColor).toBe("red"); + expect((button as HTMLElement).style.color).toBe("white"); + }); + }); + + describe("Styling Variants", () => { + it("applies primary variant class", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + variant: "primary", + }), + ); + + const button = screen.getByRole("button"); + expect(button.className).toContain("nylas-btn--primary"); + }); + + it("applies outline variant class", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + variant: "outline", + }), + ); + + const button = screen.getByRole("button"); + expect(button.className).toContain("nylas-btn--outline"); + }); + + it("applies small size class", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + size: "sm", + }), + ); + + const button = screen.getByRole("button"); + expect(button.className).toContain("nylas-btn--sm"); + }); + + it("applies large size class", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + size: "lg", + }), + ); + + const button = screen.getByRole("button"); + expect(button.className).toContain("nylas-btn--lg"); + }); + + it("renders unstyled when unstyled prop is true", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + unstyled: true, + className: "custom-only", + }), + ); + + const button = screen.getByRole("button"); + expect(button.className).toContain("custom-only"); + expect(button.className).not.toContain("nylas-btn"); + }); + + it("applies CSS custom properties from cssVars", () => { + const cssVars = { + "--nylas-btn-bg": "#ff0000", + "--nylas-btn-fg": "#ffffff", + }; + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + cssVars, + }), + ); + + const button = screen.getByRole("button") as HTMLElement; + expect(button.style.getPropertyValue("--nylas-btn-bg")).toBe("#ff0000"); + expect(button.style.getPropertyValue("--nylas-btn-fg")).toBe("#ffffff"); + }); + }); + + describe("Disabled States", () => { + it("is disabled when disabled prop is true", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + disabled: true, + }), + ); + + const button = screen.getByRole("button") as HTMLButtonElement; + expect(button.disabled).toBe(true); + }); + + it("is disabled when loading", () => { + mockUseNylasConnect.mockReturnValue({ + connect: mockConnect, + isLoading: true, + isConnected: false, + grant: null, + error: null, + logout: vi.fn(), + refreshSession: vi.fn(), + subscribe: vi.fn(), + setLogLevel: vi.fn(), + connectClient: {} as any, + }); + + render(React.createElement(NylasConnectButton, defaultProps)); + + const button = screen.getByRole("button") as HTMLButtonElement; + expect(button.disabled).toBe(true); + expect(button.getAttribute("aria-busy")).toBe("true"); + }); + }); + + describe("Click Handling", () => { + it("calls onStart callback when clicked", async () => { + const onStart = vi.fn(); + mockConnect.mockResolvedValue(mockConnectResult); + + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + onStart, + }), + ); + + fireEvent.click(screen.getByRole("button")); + + expect(onStart).toHaveBeenCalledTimes(1); + }); + + it("calls connect with correct options", async () => { + mockConnect.mockResolvedValue(mockConnectResult); + + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + method: "popup", + provider: "google", + scopes: ["email.read"], + loginHint: "user@example.com", + popupWidth: 500, + popupHeight: 600, + }), + ); + + fireEvent.click(screen.getByRole("button")); + + expect(mockConnect).toHaveBeenCalledWith({ + method: "popup", + provider: "google", + scopes: ["email.read"], + loginHint: "user@example.com", + popupWidth: 500, + popupHeight: 600, + }); + }); + + it("calls onSuccess when connect succeeds with result", async () => { + const onSuccess = vi.fn(); + mockConnect.mockResolvedValue(mockConnectResult); + + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + onSuccess, + }), + ); + + fireEvent.click(screen.getByRole("button")); + + await waitFor(() => { + expect(onSuccess).toHaveBeenCalledWith(mockConnectResult); + }); + }); + + it("redirects when connect returns a URL string", async () => { + const redirectUrl = "https://auth.nylas.com/oauth/authorize?..."; + mockConnect.mockResolvedValue(redirectUrl); + + render(React.createElement(NylasConnectButton, defaultProps)); + + fireEvent.click(screen.getByRole("button")); + + await waitFor(() => { + expect(window.location.assign).toHaveBeenCalledWith(redirectUrl); + }); + }); + + it("calls onError when connect fails", async () => { + const onError = vi.fn(); + const error = new Error("Connection failed"); + mockConnect.mockRejectedValue(error); + + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + onError, + }), + ); + + fireEvent.click(screen.getByRole("button")); + + await waitFor(() => { + expect(onError).toHaveBeenCalledWith(error); + }); + }); + + it("calls onCancel when user cancels", async () => { + const onCancel = vi.fn(); + const cancelError = new Error("User closed the popup"); + mockConnect.mockRejectedValue(cancelError); + + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + onCancel, + }), + ); + + fireEvent.click(screen.getByRole("button")); + + await waitFor(() => { + expect(onCancel).toHaveBeenCalledWith("User closed the popup"); + }); + }); + + it("calls onCancel when operation is cancelled", async () => { + const onCancel = vi.fn(); + const cancelError = new Error("Operation was cancelled by user"); + mockConnect.mockRejectedValue(cancelError); + + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + onCancel, + }), + ); + + fireEvent.click(screen.getByRole("button")); + + await waitFor(() => { + expect(onCancel).toHaveBeenCalledWith( + "Operation was cancelled by user", + ); + }); + }); + + it("does not call click handler when disabled", () => { + render( + React.createElement(NylasConnectButton, { + ...defaultProps, + disabled: true, + }), + ); + + fireEvent.click(screen.getByRole("button")); + + expect(mockConnect).not.toHaveBeenCalled(); + }); + }); + + describe("Hook Integration", () => { + it("passes clientId to useNylasConnect", () => { + render( + React.createElement(NylasConnectButton, { + clientId: "test-client-123", + redirectUri: "https://app.test.com/callback", + }), + ); + + expect(mockUseNylasConnect).toHaveBeenCalledWith({ + clientId: "test-client-123", + redirectUri: "https://app.test.com/callback", + autoHandleCallback: true, + }); + }); + + it("passes optional config to useNylasConnect", () => { + render( + React.createElement(NylasConnectButton, { + clientId: "test-client", + redirectUri: "https://app.test.com/callback", + apiUrl: "https://api.nylas.com", + defaultScopes: ["email.read", "calendar.read"], + persistTokens: false, + }), + ); + + expect(mockUseNylasConnect).toHaveBeenCalledWith({ + clientId: "test-client", + redirectUri: "https://app.test.com/callback", + apiUrl: "https://api.nylas.com", + defaultScopes: ["email.read", "calendar.read"], + persistTokens: false, + autoHandleCallback: true, + }); + }); + + it("does not pass defaultScopes when not provided", () => { + render( + React.createElement(NylasConnectButton, { + clientId: "test-client", + redirectUri: "https://app.test.com/callback", + }), + ); + + expect(mockUseNylasConnect).toHaveBeenCalledWith({ + clientId: "test-client", + redirectUri: "https://app.test.com/callback", + autoHandleCallback: true, + }); + }); + }); + + describe("Accessibility", () => { + it("has correct button type", () => { + render(React.createElement(NylasConnectButton, defaultProps)); + + const button = screen.getByRole("button") as HTMLButtonElement; + expect(button.getAttribute("type")).toBe("button"); + }); + + it("sets aria-busy when loading", () => { + mockUseNylasConnect.mockReturnValue({ + connect: mockConnect, + isLoading: true, + isConnected: false, + grant: null, + error: null, + logout: vi.fn(), + refreshSession: vi.fn(), + subscribe: vi.fn(), + setLogLevel: vi.fn(), + connectClient: {} as any, + }); + + render(React.createElement(NylasConnectButton, defaultProps)); + + const button = screen.getByRole("button"); + expect(button.getAttribute("aria-busy")).toBe("true"); + }); + + it("does not set aria-busy when not loading", () => { + render(React.createElement(NylasConnectButton, defaultProps)); + + const button = screen.getByRole("button"); + expect(button.hasAttribute("aria-busy")).toBe(false); + }); + }); +}); diff --git a/packages/react/lib/connect/NylasConnectButton.tsx b/packages/react/lib/connect/NylasConnectButton.tsx new file mode 100644 index 0000000..900da20 --- /dev/null +++ b/packages/react/lib/connect/NylasConnectButton.tsx @@ -0,0 +1,174 @@ +import React, { useCallback } from "react"; +import type { CSSProperties, ReactNode } from "react"; +import type { + Provider, + NylasScope, + ConnectResult as AuthResult, + IdentityProviderTokenCallback, + CodeExchangeMethod, +} from "@nylas/connect"; +import { useNylasConnect } from "./useNylasConnect"; + +export type NylasConnectButtonProps = { + clientId: string; + redirectUri?: string; + apiUrl?: string; + defaultScopes?: NylasScope[]; // optional override + persistTokens?: boolean; + + method?: "popup" | "inline"; + provider?: Provider; + scopes?: NylasScope[]; + loginHint?: string; + popupWidth?: number; + popupHeight?: number; + + text?: string; + className?: string; + style?: CSSProperties; + disabled?: boolean; + + // Styling controls + variant?: "primary" | "outline"; + size?: "sm" | "md" | "lg"; + unstyled?: boolean; + cssVars?: Partial< + Record< + | "--nylas-btn-bg" + | "--nylas-btn-fg" + | "--nylas-btn-border" + | "--nylas-btn-bg-hover", + string + > + >; + + // Advanced configuration + /** + * Optional callback to provide external identity provider JWT token. + * Called during token exchange to include IDP claims. + * Return null to skip IDP claims, or throw to fail authentication. + */ + identityProviderToken?: IdentityProviderTokenCallback; + + /** + * Custom code exchange method for backend-based token exchange. + * Allows handling OAuth code exchange on your server instead of the browser. + */ + codeExchange?: CodeExchangeMethod; + + onStart?: () => void; + onSuccess?: (result: AuthResult) => void; + onError?: (error: Error) => void; + onCancel?: (reason: string) => void; + children?: ReactNode; +}; + +export function NylasConnectButton({ + clientId, + redirectUri, + apiUrl, + defaultScopes, + persistTokens, + + method = "inline", + provider, + scopes, + loginHint, + popupWidth, + popupHeight, + + text = "Connect your inbox", + className, + style, + disabled, + // styling + variant = "primary", + size = "md", + unstyled = false, + cssVars, + + // advanced config + identityProviderToken, + codeExchange, + + onStart, + onSuccess, + onError, + onCancel, + children, +}: NylasConnectButtonProps) { + const { connect, isLoading } = useNylasConnect({ + clientId, + redirectUri, + apiUrl, + // Only pass defaultScopes if caller provides it to override defaults + ...(defaultScopes ? { defaultScopes } : {}), + persistTokens, + autoHandleCallback: true, + identityProviderToken, + codeExchange, + }); + + const handleClick = useCallback(async () => { + try { + onStart?.(); + const resultOrUrl = await connect({ + method, + provider, + scopes, + loginHint, + popupWidth, + popupHeight, + }); + + if (typeof resultOrUrl === "string") { + window.location.assign(resultOrUrl); + return; + } + + onSuccess?.(resultOrUrl); + } catch (err) { + const message = (err as Error)?.message || ""; + if (message.includes("closed") || message.includes("cancelled")) { + onCancel?.(message); + return; + } + onError?.(err as Error); + } + }, [ + connect, + method, + provider, + scopes, + loginHint, + popupWidth, + popupHeight, + onStart, + onSuccess, + onCancel, + onError, + ]); + + const rootClassName = unstyled + ? className + : ["nylas-btn", `nylas-btn--${variant}`, `nylas-btn--${size}`, className] + .filter(Boolean) + .join(" "); + + const styleWithVars: CSSProperties | undefined = cssVars + ? { ...(cssVars as CSSProperties), ...style } + : style; + + return ( + + ); +} diff --git a/packages/react/lib/connect/index.ts b/packages/react/lib/connect/index.ts index bf5e82f..bb3bcfb 100644 --- a/packages/react/lib/connect/index.ts +++ b/packages/react/lib/connect/index.ts @@ -1,6 +1,12 @@ +// Auto-load CSS styles +import "./NylasConnectButton.css"; + // React hook for Nylas connection export { useNylasConnect } from "./useNylasConnect"; +// Export NylasConnectButton component +export { NylasConnectButton } from "./NylasConnectButton"; + // Export all auth-related types export * from "./types"; diff --git a/packages/react/lib/connect/types.ts b/packages/react/lib/connect/types.ts index d98adb7..0713688 100644 --- a/packages/react/lib/connect/types.ts +++ b/packages/react/lib/connect/types.ts @@ -16,6 +16,9 @@ export type { ConnectEvent, ConnectStateChangeCallback, SessionData, + IdentityProviderTokenCallback, + CodeExchangeMethod, + CodeExchangeParams, } from "@nylas/connect"; // Export hook-specific types diff --git a/packages/react/lib/elements/components.ts b/packages/react/lib/elements/components.ts index 8c6e113..6899bb1 100644 --- a/packages/react/lib/elements/components.ts +++ b/packages/react/lib/elements/components.ts @@ -416,6 +416,11 @@ import { NylasNotification as NylasNotificationElement, defineCustomElement as defineNylasNotification, } from "@nylas/web-elements/dist/components/nylas-notification.js"; +// NOTE: Component not available in current web-elements version +// import { +// NylasOnlySpecificTimeAvailability as NylasOnlySpecificTimeAvailabilityElement, +// defineCustomElement as defineNylasOnlySpecificTimeAvailability, +// } from "@nylas/web-elements/dist/components/nylas-only-specific-time-availability.js"; import { NylasOrganizerConfirmationCard as NylasOrganizerConfirmationCardElement, defineCustomElement as defineNylasOrganizerConfirmationCard, @@ -2642,6 +2647,33 @@ export const NylasNotification: StencilReactComponent< defineCustomElement: defineNylasNotification, }); +// NOTE: Component not available in current web-elements version +// export type NylasOnlySpecificTimeAvailabilityEvents = { +// onValueChanged: EventName< +// CustomEvent<{ +// value: string; +// name: string; +// }> +// >; +// }; +// +// export const NylasOnlySpecificTimeAvailability: StencilReactComponent< +// NylasOnlySpecificTimeAvailabilityElement, +// NylasOnlySpecificTimeAvailabilityEvents +// > = /*@__PURE__*/ createComponent< +// NylasOnlySpecificTimeAvailabilityElement, +// NylasOnlySpecificTimeAvailabilityEvents +// >({ +// tagName: "nylas-only-specific-time-availability", +// elementClass: NylasOnlySpecificTimeAvailabilityElement, +// // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project. +// react: React, +// events: { +// onValueChanged: "valueChanged", +// } as NylasOnlySpecificTimeAvailabilityEvents, +// defineCustomElement: defineNylasOnlySpecificTimeAvailability, +// }); + export type NylasOrganizerConfirmationCardEvents = { onRejectBookingButtonClicked: EventName< NylasOrganizerConfirmationCardCustomEvent<{ diff --git a/packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx b/packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx index f19eaa0..83e668a 100644 --- a/packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx +++ b/packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx @@ -152,7 +152,8 @@ describe("CalendarSync", () => { // Temporarily replace the mock const httpClient = await import("../lib/http-client"); const originalGet = httpClient.default.get; - httpClient.default.get = partialRecordingMock as any; + httpClient.default.get = + partialRecordingMock as unknown as typeof httpClient.default.get; render(); diff --git a/packages/react/test/vitest.d.ts b/packages/react/test/vitest.d.ts index eb7020c..607b467 100644 --- a/packages/react/test/vitest.d.ts +++ b/packages/react/test/vitest.d.ts @@ -1,8 +1,12 @@ import "vitest"; -import { TestingLibraryMatchers } from "@testing-library/jest-dom/matchers"; +import type { TestingLibraryMatchers } from "@testing-library/jest-dom/matchers"; + +declare module "vitest" { + interface Assertion extends TestingLibraryMatchers {} +} declare global { - namespace Vi { - interface Assertion extends TestingLibraryMatchers {} + namespace Chai { + interface Assertion extends TestingLibraryMatchers {} } } diff --git a/packages/react/vitest.config.ts b/packages/react/vitest.config.ts index fe08ac7..51a09be 100644 --- a/packages/react/vitest.config.ts +++ b/packages/react/vitest.config.ts @@ -7,6 +7,7 @@ export default mergeConfig( test: { globals: true, environment: "jsdom", + setupFiles: ["./test/vitest.setup.ts"], }, }), ); From b8ce29f8859df962d5a2c749baf0e1b9461c1435 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 11:30:10 +0100 Subject: [PATCH 04/16] add latest changes --- packages/react/.eslintrc.cjs | 13 - packages/react/.gitignore | 154 +- .../notetaker/CalendarSync/CalendarSync.tsx | 37 +- .../notetaker/SendNotetaker/SendNotetaker.tsx | 12 +- .../lib/notetaker/Transcript/Transcript.tsx | 12 +- .../react/lib/notetaker/lib/http-client.ts | 4 +- packages/react/package.json | 35 +- packages/react/tsconfig.json | 41 +- packages/react/vite.config.ts | 5 +- packages/react/vitest.config.ts | 23 +- pnpm-lock.yaml | 1308 +---------------- 11 files changed, 262 insertions(+), 1382 deletions(-) delete mode 100644 packages/react/.eslintrc.cjs diff --git a/packages/react/.eslintrc.cjs b/packages/react/.eslintrc.cjs deleted file mode 100644 index 2b35180..0000000 --- a/packages/react/.eslintrc.cjs +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended'], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - '@typescript-eslint/ban-types': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/no-explicit-any': 'off', - }, -}; diff --git a/packages/react/.gitignore b/packages/react/.gitignore index 8e6122d..3224a90 100644 --- a/packages/react/.gitignore +++ b/packages/react/.gitignore @@ -1,28 +1,144 @@ +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* -pnpm-debug.log* lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz -node_modules +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt dist -dist-ssr -dist-preact -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - - -./docs \ No newline at end of file + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +# End of https://www.toptal.com/developers/gitignore/api/node \ No newline at end of file diff --git a/packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx b/packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx index 723361d..e9f3084 100644 --- a/packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx +++ b/packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx @@ -134,10 +134,14 @@ export const calendarSyncStore = create((set, get) => { ); const responseData = response.data.data; set({ calendar: responseData }); - if (onUpdate) onUpdate(responseData); + if (onUpdate) { + onUpdate(responseData); + } return responseData; } catch (err) { - if (onError) onError(err); + if (onError) { + onError(err); + } throw err; } finally { set({ @@ -241,7 +245,9 @@ export const calendarSyncStore = create((set, get) => { selectedFilters: calendar?.notetaker?.rules?.event_selection ?? [], name: calendar?.notetaker?.name ?? notetakerName ?? "", }); - if (onCancelCallback) onCancelCallback(); + if (onCancelCallback) { + onCancelCallback(); + } }, // API operations @@ -262,13 +268,21 @@ export const calendarSyncStore = create((set, get) => { if (meetingSettings) { types = []; - if (meetingSettings.video_recording) types.push(RecordingType.Video); - if (meetingSettings.audio_recording) types.push(RecordingType.Audio); - if (meetingSettings.transcription) + if (meetingSettings.video_recording) { + types.push(RecordingType.Video); + } + if (meetingSettings.audio_recording) { + types.push(RecordingType.Audio); + } + if (meetingSettings.transcription) { types.push(RecordingType.Transcript); - if (meetingSettings.summary) types.push(RecordingType.Summary); - if (meetingSettings.action_items) + } + if (meetingSettings.summary) { + types.push(RecordingType.Summary); + } + if (meetingSettings.action_items) { types.push(RecordingType.ActionItems); + } showAdvanced = types.length !== DEFAULT_RECORDING_TYPES.length; } @@ -310,8 +324,9 @@ export const calendarSyncStore = create((set, get) => { try { await updateCalendar(calendarId, grantId, payload, onUpdate, onError); // Hide advanced settings if all recording types are selected - if (rType.length === DEFAULT_RECORDING_TYPES.length) + if (rType.length === DEFAULT_RECORDING_TYPES.length) { set({ advancedSettings: false }); + } } catch (err) { // Error already handled in updateCalendar } @@ -341,7 +356,9 @@ export const calendarSyncStore = create((set, get) => { // Reset state via handleCancel get().handleCancel(fallbackNotetakerName, onCancel); - if (onUpdate) onUpdate(fixedPayload); + if (onUpdate) { + onUpdate(fixedPayload); + } } catch (err) { // Error already handled in updateCalendar } diff --git a/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx b/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx index 0f3a189..610358f 100644 --- a/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx +++ b/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx @@ -145,7 +145,9 @@ export const sendNotetakerStore = create((set, get) => ({ const { name, meetingLink, date, time, selectedRecordingTypes, reset } = state; const isValid = !!meetingLink; - if (!isValid || state.isLoading) return; + if (!isValid || state.isLoading) { + return; + } set({ isLoading: true }); // Prepare join time if date and time are set let join_time; @@ -176,12 +178,16 @@ export const sendNotetakerStore = create((set, get) => ({ .post(`/v3/grants/${grantId}/notetakers`, payload) .then((res) => { const { data } = res; - if (onSend) onSend(data, reset); + if (onSend) { + onSend(data, reset); + } set({ isLoading: false }); }) .catch((error) => { console.error("Failed to send notetaker:", error); - if (onError) onError(error); + if (onError) { + onError(error); + } set({ isLoading: false }); }); }, diff --git a/packages/react/lib/notetaker/Transcript/Transcript.tsx b/packages/react/lib/notetaker/Transcript/Transcript.tsx index 9377577..3b4591c 100644 --- a/packages/react/lib/notetaker/Transcript/Transcript.tsx +++ b/packages/react/lib/notetaker/Transcript/Transcript.tsx @@ -92,7 +92,9 @@ const Text: React.FC<{ text: string; highlight: string | null; }> = ({ text, highlight }) => { - if (!highlight) return
{text}
; + if (!highlight) { + return
{text}
; + } const parts = text.split(new RegExp(`(${highlight})`, "gi")); return (
@@ -230,7 +232,9 @@ const Transcript: React.FC = ({ }, []); // No dependencies needed as refs are stable const processedTranscripts = useMemo((): ProcessedTranscriptItem[] => { - if (!transcript || transcript.length === 0) return []; + if (!transcript || transcript.length === 0) { + return []; + } const candidateIndex = transcript.findIndex((item) => item.start / 1000 >= currentTime) - 1; let res = transcript.map((item, index) => ({ @@ -273,7 +277,9 @@ const Transcript: React.FC = ({ }, [processedTranscripts, autoscroll, userScrolledAway]); // Added userScrolledAway dependency const handleCopyTimestamp = useCallback((item: ProcessedTranscriptItem) => { - if (!item.ts || !item.speaker || !item.text) return; + if (!item.ts || !item.speaker || !item.text) { + return; + } navigator.clipboard.writeText(`${item.ts} ${item.speaker}: ${item.text}`); }, []); diff --git a/packages/react/lib/notetaker/lib/http-client.ts b/packages/react/lib/notetaker/lib/http-client.ts index dbb5c06..899cc11 100644 --- a/packages/react/lib/notetaker/lib/http-client.ts +++ b/packages/react/lib/notetaker/lib/http-client.ts @@ -6,7 +6,9 @@ client.interceptors.request.use((req) => { const state = provider.getState(); req.baseURL = state.apiUrl; const token = state.getAccessToken(); - if (token) req.headers.Authorization = `Bearer ${token}`; + if (token) { + req.headers.Authorization = `Bearer ${token}`; + } return req; }); diff --git a/packages/react/package.json b/packages/react/package.json index 81a218b..71d4ba1 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -3,27 +3,32 @@ "version": "2.2.4", "type": "module", "scripts": { - "build": "vite build", - "test": "vitest --run", + "build": "tsc && vite build", + "test": "vitest run", "test:watch": "vitest", - "format": "prettier --write lib/", - "format:check": "prettier --check lib/", - "lint": "eslint lib/", - "lint:check": "eslint lib/ --max-warnings 0", + "format": "pnpm --workspace-root prettier --write packages/react/", + "format:check": "pnpm --workspace-root prettier --check packages/react/", + "lint": "oxlint --fix . && exit 0", + "lint:check": "oxlint .", "clean": "rm -rf dist", "dev": "vite build --watch --emptyOutDir=false", "dev:server": "vite", "typecheck": "tsc --noEmit", "preview": "vite preview", - "docs": "typedoc" + "coverage": "vitest run --coverage", + "docs": "typedoc", + "prepublishOnly": "pnpm run clean && pnpm run build" }, "repository": { "type": "git", "url": "git+https://github.com/nylas/nylas.git" }, + "author": "Nylas Inc.", + "license": "MIT", "publishConfig": { "access": "public" }, + "packageManager": "pnpm@10.7.1", "files": [ "dist" ], @@ -83,27 +88,21 @@ "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^16.0.0", "@types/jsdom": "^21.1.7", - "@types/node": "^22.13.10", + "@types/node": "^20.11.13", "@types/react": "^19.1.10", "@types/react-dom": "^19.1.7", - "@types/testing-library__jest-dom": "^6.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", "@vitejs/plugin-react": "^4.4.1", "@vitejs/plugin-react-swc": "^3.3.2", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", + "@vitest/coverage-v8": "^2.1.9", "jsdom": "^26.0.0", "markdown-table": "^3.0.4", - "prettier": "^3.5.3", "tailwindcss": "^4.1.7", "tslib": "^2.6.2", "typedoc": "^0.28.3", "typedoc-plugin-markdown": "^4.6.3", "typescript": "^5.3.3", - "vite": "^4.5.2", - "vite-plugin-dts": "^3.6.3", - "vitest": "^3.2.4" + "vite": "^5.4.21", + "vite-plugin-dts": "^3.7.0", + "vitest": "^2.1.8" } } diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index c571da2..3f23444 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -1,25 +1,30 @@ { "compilerOptions": { - "module": "esnext", - "declaration": true, - "noImplicitAny": false, - "removeComments": true, - "noLib": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "target": "es6", - "sourceMap": true, - "strict": true, - "lib": ["ES6", "DOM"], - "outDir": "./dist", - "moduleResolution": "bundler", + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, "jsx": "react", + + // Relaxed strictness + "noImplicitAny": false, + "strictNullChecks": false, + "noImplicitReturns": false, + + // Modern settings + "esModuleInterop": true, "allowSyntheticDefaultImports": true, - "types": ["vitest/globals"], - "declarationDir": "./dist/types", - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "dist" }, - "include": ["lib", "index.ts", "test/vitest.d.ts", "test/vitest.setup.ts"], - "exclude": ["node_modules"] + "include": ["lib/**/*", "test/**/*"], + "exclude": ["node_modules", "dist"] } diff --git a/packages/react/vite.config.ts b/packages/react/vite.config.ts index a632d8b..2107499 100644 --- a/packages/react/vite.config.ts +++ b/packages/react/vite.config.ts @@ -6,10 +6,7 @@ import tailwindcss from "@tailwindcss/vite"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [ - react(), - dts({ insertTypesEntry: true }) - ], + plugins: [react(), dts({ insertTypesEntry: true })], build: { lib: { entry: { diff --git a/packages/react/vitest.config.ts b/packages/react/vitest.config.ts index 51a09be..adb4ead 100644 --- a/packages/react/vitest.config.ts +++ b/packages/react/vitest.config.ts @@ -1,13 +1,14 @@ -import { defineConfig, mergeConfig } from "vitest/config"; -import viteConfig from "./vite.config.ts"; +import { defineConfig } from "vitest/config"; -export default mergeConfig( - viteConfig, - defineConfig({ - test: { - globals: true, - environment: "jsdom", - setupFiles: ["./test/vitest.setup.ts"], +export default defineConfig({ + test: { + environment: "jsdom", + include: ["lib/**/*.test.ts", "lib/**/*.test.tsx", "lib/**/*.spec.tsx"], + setupFiles: ["./test/vitest.setup.ts"], + coverage: { + provider: "v8", + reporter: ["text", "lcov"], + reportsDirectory: "./coverage", }, - }), -); + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83653ed..b79af1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,7 +86,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.0.3 - version: 4.1.14(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) + version: 4.1.14(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1)) '@testing-library/dom': specifier: ^10.0.0 version: 10.4.1 @@ -100,47 +100,29 @@ importers: specifier: ^21.1.7 version: 21.1.7 '@types/node': - specifier: ^22.13.10 - version: 22.18.8 + specifier: ^20.11.13 + version: 20.19.13 '@types/react': specifier: ^19.1.10 version: 19.2.0 '@types/react-dom': specifier: ^19.1.7 version: 19.2.0(@types/react@19.2.0) - '@types/testing-library__jest-dom': - specifier: ^6.0.0 - version: 6.0.0 - '@typescript-eslint/eslint-plugin': - specifier: ^6.0.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': - specifier: ^6.0.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.7.0(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) + version: 4.7.0(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1)) '@vitejs/plugin-react-swc': specifier: ^3.3.2 - version: 3.11.0(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) - eslint: - specifier: ^8.45.0 - version: 8.57.1 - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.4.3 - version: 0.4.23(eslint@8.57.1) + version: 3.11.0(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1)) + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1)) jsdom: specifier: ^26.0.0 version: 26.1.0 markdown-table: specifier: ^3.0.4 version: 3.0.4 - prettier: - specifier: ^3.5.3 - version: 3.6.2 tailwindcss: specifier: ^4.1.7 version: 4.1.14 @@ -157,14 +139,14 @@ importers: specifier: ^5.3.3 version: 5.9.2 vite: - specifier: ^4.5.2 - version: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + specifier: ^5.4.21 + version: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) vite-plugin-dts: - specifier: ^3.6.3 - version: 3.9.1(@types/node@22.18.8)(rollup@4.50.1)(typescript@5.9.2)(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)) + specifier: ^3.7.0 + version: 3.9.1(@types/node@20.19.13)(rollup@4.50.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1)) vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/node@22.18.8)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1) + specifier: ^2.1.8 + version: 2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1) packages: @@ -369,288 +351,138 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.18.20': - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.18.20': - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.18.20': - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.18.20': - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@fullcalendar/core@6.1.8': resolution: {integrity: sha512-i8JBIvZCWGO9dsMEDcx9bnsQZ9PtGSJdOXGgWbhLaGq2iq41OBdp9g9gM4b/Otv2oK8bL5Gl6CsMmb/HkDtA6Q==} @@ -678,19 +510,6 @@ packages: '@gerrit0/mini-shiki@3.13.0': resolution: {integrity: sha512-mCrNvZNYNrwKer5PWLF6cOc0OEe2eKzgy976x+IT2tynwJYl+7UpHTSeXQJGijgTcoOf+f359L946unWlYRnsg==} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@inquirer/external-editor@1.0.2': resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} engines: {node: '>=18'} @@ -1357,12 +1176,6 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1384,9 +1197,6 @@ packages: '@types/jsdom@21.1.7': resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -1404,19 +1214,12 @@ packages: '@types/react@19.2.0': resolution: {integrity: sha512-1LOH8xovvsKsCBq1wnT4ntDUdCJKmnEakhsuoUSy6ExlHCkGP2hqnatagYTgFk6oeL0VU31u7SNjunPN+GchtA==} - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/testing-library__jest-dom@5.14.9': resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} - '@types/testing-library__jest-dom@6.0.0': - resolution: {integrity: sha512-bnreXCgus6IIadyHNlN/oI5FfX4dWgvGhOPvpr7zzCYDGAPIfvyIoAozMBINmhmsVuqV0cncejF2y5KC7ScqOg==} - deprecated: This is a stub types definition. @testing-library/jest-dom provides its own type definitions, so you do not need this installed. - '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -1429,67 +1232,6 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-react-swc@3.11.0': resolution: {integrity: sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==} peerDependencies: @@ -1513,9 +1255,6 @@ packages: '@vitest/expect@2.1.9': resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@2.1.9': resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} peerDependencies: @@ -1527,47 +1266,21 @@ packages: vite: optional: true - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/pretty-format@2.1.9': resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@2.1.9': resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@2.1.9': resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@2.1.9': resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@2.1.9': resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@volar/language-core@1.11.1': resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} @@ -1605,16 +1318,6 @@ packages: resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -1719,10 +1422,6 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - caniuse-lite@1.0.30001746: resolution: {integrity: sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==} @@ -1848,9 +1547,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -1886,10 +1582,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -1972,11 +1664,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -1998,62 +1685,17 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react-refresh@0.4.23: - resolution: {integrity: sha512-G4j+rv0NmbIR45kni5xJOrYvCtyD3/7LjpVH8MPPcudXDcNu8gv+4ATTDXTtbRR8rTCM5HxECvCSsRmxKnWDsA==} - peerDependencies: - eslint: '>=8.40' - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - expect-type@1.2.2: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} @@ -2075,29 +1717,13 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2106,21 +1732,10 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -2152,9 +1767,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2183,22 +1795,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -2210,9 +1810,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - happy-dom@15.11.7: resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} engines: {node: '>=18.0.0'} @@ -2297,26 +1894,14 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2356,10 +1941,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -2443,17 +2024,10 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - jsdom@26.1.0: resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} engines: {node: '>=18'} @@ -2468,15 +2042,9 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -2491,16 +2059,9 @@ packages: jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} @@ -2576,10 +2137,6 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. @@ -2588,9 +2145,6 @@ packages: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -2681,9 +2235,6 @@ packages: minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -2723,9 +2274,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} @@ -2762,10 +2310,6 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - ora@5.3.0: resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} engines: {node: '>=10'} @@ -2791,18 +2335,10 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -2817,10 +2353,6 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - parse-srcset@1.0.2: resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} @@ -2834,10 +2366,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -2856,9 +2384,6 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} @@ -2885,10 +2410,6 @@ packages: preact@10.12.1: resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -2974,10 +2495,6 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -3002,16 +2519,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rollup@3.29.5: - resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.50.1: resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3140,9 +2647,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - style-to-js@1.1.17: resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} @@ -3196,19 +2700,12 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3217,18 +2714,10 @@ packages: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - tinyspy@3.0.2: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} - tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -3256,12 +2745,6 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - ts-morph@22.0.0: resolution: {integrity: sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==} @@ -3272,14 +2755,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - typedoc-plugin-markdown@4.9.0: resolution: {integrity: sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==} engines: {node: '>= 18'} @@ -3338,11 +2813,6 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite-plugin-dts@3.9.1: resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3353,34 +2823,6 @@ packages: vite: optional: true - vite@4.5.14: - resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - vite@5.4.21: resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3437,34 +2879,6 @@ packages: jsdom: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vue-template-compiler@2.7.16: resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} @@ -3511,10 +2925,6 @@ packages: engines: {node: '>=8'} hasBin: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3572,10 +2982,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - z-schema@5.0.5: resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} engines: {node: '>=8.0.0'} @@ -3914,161 +3320,72 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/android-arm64@0.18.20': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm@0.18.20': - optional: true - '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-x64@0.18.20': - optional: true - '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.18.20': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-x64@0.18.20': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.18.20': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.18.20': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/linux-arm64@0.18.20': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm@0.18.20': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-ia32@0.18.20': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-loong64@0.18.20': - optional: true - '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-mips64el@0.18.20': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-ppc64@0.18.20': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.18.20': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-s390x@0.18.20': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-x64@0.18.20': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.18.20': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.18.20': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.18.20': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/win32-arm64@0.18.20': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-ia32@0.18.20': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-x64@0.18.20': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.1 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - '@fullcalendar/core@6.1.8': dependencies: preact: 10.12.1 @@ -4099,18 +3416,6 @@ snapshots: '@shikijs/types': 3.13.0 '@shikijs/vscode-textmate': 10.0.2 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - '@inquirer/external-editor@1.0.2(@types/node@22.18.8)': dependencies: chardet: 2.1.0 @@ -4143,7 +3448,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.18.8 + '@types/node': 20.19.13 jest-regex-util: 30.0.1 '@jest/schemas@30.0.5': @@ -4156,7 +3461,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.18.8 + '@types/node': 20.19.13 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -4207,14 +3512,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.28.13(@types/node@22.18.8)': - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@22.18.8) - transitivePeerDependencies: - - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@20.19.13)': dependencies: '@microsoft/api-extractor-model': 7.28.13(@types/node@20.19.13) @@ -4233,24 +3530,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@22.18.8)': - dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@22.18.8) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@22.18.8) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@22.18.8) - '@rushstack/ts-command-line': 4.19.1(@types/node@22.18.8) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.10 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' - '@microsoft/fetch-event-source@2.0.1': {} '@microsoft/tsdoc-config@0.16.2': @@ -4488,17 +3767,6 @@ snapshots: optionalDependencies: '@types/node': 20.19.13 - '@rushstack/node-core-library@4.0.2(@types/node@22.18.8)': - dependencies: - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.10 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 22.18.8 - '@rushstack/rig-package@0.5.2': dependencies: resolve: 1.22.10 @@ -4511,13 +3779,6 @@ snapshots: optionalDependencies: '@types/node': 20.19.13 - '@rushstack/terminal@0.10.0(@types/node@22.18.8)': - dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@22.18.8) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 22.18.8 - '@rushstack/ts-command-line@4.19.1(@types/node@20.19.13)': dependencies: '@rushstack/terminal': 0.10.0(@types/node@20.19.13) @@ -4527,15 +3788,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@4.19.1(@types/node@22.18.8)': - dependencies: - '@rushstack/terminal': 0.10.0(@types/node@22.18.8) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - '@sentry-internal/browser-utils@8.55.0': dependencies: '@sentry/core': 8.55.0 @@ -4729,12 +3981,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 - '@tailwindcss/vite@4.1.14(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1))': + '@tailwindcss/vite@4.1.14(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1))': dependencies: '@tailwindcss/node': 4.1.14 '@tailwindcss/oxide': 4.1.14 tailwindcss: 4.1.14 - vite: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) '@testing-library/dom@10.4.1': dependencies: @@ -4805,12 +4057,6 @@ snapshots: dependencies: '@babel/types': 7.28.4 - '@types/chai@5.2.2': - dependencies: - '@types/deep-eql': 4.0.2 - - '@types/deep-eql@4.0.2': {} - '@types/estree@1.0.8': {} '@types/hast@3.0.4': @@ -4834,12 +4080,10 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 22.18.8 + '@types/node': 20.19.13 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 - '@types/json-schema@7.0.15': {} - '@types/node@12.20.55': {} '@types/node@20.19.13': @@ -4849,6 +4093,7 @@ snapshots: '@types/node@22.18.8': dependencies: undici-types: 6.21.0 + optional: true '@types/react-dom@19.2.0(@types/react@19.2.0)': dependencies: @@ -4858,18 +4103,12 @@ snapshots: dependencies: csstype: 3.1.3 - '@types/semver@7.7.1': {} - '@types/stack-utils@2.0.3': {} '@types/testing-library__jest-dom@5.14.9': dependencies: '@types/jest': 30.0.0 - '@types/testing-library__jest-dom@6.0.0': - dependencies: - '@testing-library/jest-dom': 5.17.0 - '@types/tough-cookie@4.0.5': {} '@types/unist@3.0.3': {} @@ -4880,103 +4119,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) - debug: 4.4.1 - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) - eslint: 8.57.1 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.3.0': {} - - '@vitejs/plugin-react-swc@3.11.0(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1))': + '@vitejs/plugin-react-swc@3.11.0(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 '@swc/core': 1.13.5 - vite: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.7.0(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1))': + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -4984,7 +4135,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) + vite: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color @@ -5013,14 +4164,6 @@ snapshots: chai: 5.3.3 tinyrainbow: 1.2.0 - '@vitest/expect@3.2.4': - dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1))': dependencies: '@vitest/spy': 2.1.9 @@ -5029,65 +4172,31 @@ snapshots: optionalDependencies: vite: 5.4.21(@types/node@20.19.13)(lightningcss@1.30.1) - '@vitest/mocker@3.2.4(vite@5.4.21(@types/node@22.18.8)(lightningcss@1.30.1))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.19 - optionalDependencies: - vite: 5.4.21(@types/node@22.18.8)(lightningcss@1.30.1) - '@vitest/pretty-format@2.1.9': dependencies: tinyrainbow: 1.2.0 - '@vitest/pretty-format@3.2.4': - dependencies: - tinyrainbow: 2.0.0 - '@vitest/runner@2.1.9': dependencies: '@vitest/utils': 2.1.9 pathe: 1.1.2 - '@vitest/runner@3.2.4': - dependencies: - '@vitest/utils': 3.2.4 - pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 magic-string: 0.30.19 pathe: 1.1.2 - '@vitest/snapshot@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.19 - pathe: 2.0.3 - '@vitest/spy@2.1.9': dependencies: tinyspy: 3.0.2 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 - '@vitest/utils@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 loupe: 3.2.1 tinyrainbow: 1.2.0 - '@vitest/utils@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 - '@volar/language-core@1.11.1': dependencies: '@volar/source-map': 1.11.1 @@ -5141,12 +4250,6 @@ snapshots: dependencies: argparse: 2.0.1 - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} - agent-base@7.1.4: {} ajv@6.12.6: @@ -5250,8 +4353,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - callsites@3.1.0: {} - caniuse-lite@1.0.30001746: {} chai@5.3.3: @@ -5357,8 +4458,6 @@ snapshots: deep-eql@5.0.2: {} - deep-is@0.1.4: {} - deepmerge@4.3.1: {} defaults@1.0.4: @@ -5381,10 +4480,6 @@ snapshots: dependencies: path-type: 4.0.0 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-serializer@2.0.0: @@ -5464,31 +4559,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.18.20: - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -5523,90 +4593,14 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react-refresh@0.4.23(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.1 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 - esutils@2.0.3: {} - expect-type@1.2.2: {} expect@30.2.0: @@ -5632,24 +4626,14 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-levenshtein@2.0.6: {} - fastq@1.19.1: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5659,21 +4643,8 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - flat@5.0.2: {} - flatted@3.3.3: {} - follow-redirects@1.15.11: {} foreground-child@3.3.1: @@ -5707,8 +4678,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -5740,10 +4709,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -5753,19 +4718,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -5779,8 +4731,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - happy-dom@15.11.7: dependencies: entities: 4.5.0 @@ -5870,22 +4820,10 @@ snapshots: ignore@5.3.2: {} - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - import-lazy@4.0.0: {} - imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} inline-style-parser@0.2.4: {} @@ -5910,8 +4848,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-plain-object@5.0.0: {} is-potential-custom-element-name@1.0.1: {} @@ -5993,7 +4929,7 @@ snapshots: jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.18.8 + '@types/node': 20.19.13 jest-util: 30.2.0 jest-regex-util@30.0.1: {} @@ -6001,7 +4937,7 @@ snapshots: jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.18.8 + '@types/node': 20.19.13 chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 @@ -6013,17 +4949,11 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.1: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - jsdom@26.1.0: dependencies: cssstyle: 4.6.0 @@ -6053,12 +4983,8 @@ snapshots: jsesc@3.1.0: {} - json-buffer@3.0.1: {} - json-schema-traverse@0.4.1: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json5@2.2.3: {} jsonc-parser@3.2.0: {} @@ -6069,17 +4995,8 @@ snapshots: jwt-decode@3.1.2: {} - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - kolorist@1.8.0: {} - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lightningcss-darwin-arm64@1.30.1: optional: true @@ -6135,16 +5052,10 @@ snapshots: dependencies: p-locate: 4.1.0 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - lodash.get@4.4.2: {} lodash.isequal@4.5.0: {} - lodash.merge@4.6.2: {} - lodash.startcase@4.4.0: {} lodash@4.17.21: {} @@ -6228,10 +5139,6 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 - minimatch@9.0.3: dependencies: brace-expansion: 2.0.2 @@ -6258,8 +5165,6 @@ snapshots: nanoid@3.3.11: {} - natural-compare@1.4.0: {} - node-machine-id@1.1.12: {} node-releases@2.0.21: {} @@ -6336,15 +5241,6 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - ora@5.3.0: dependencies: bl: 4.1.0 @@ -6377,18 +5273,10 @@ snapshots: dependencies: p-try: 2.2.0 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-map@2.1.0: {} p-try@2.2.0: {} @@ -6399,10 +5287,6 @@ snapshots: dependencies: quansync: 0.2.11 - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - parse-srcset@1.0.2: {} parse5@7.3.0: @@ -6413,8 +5297,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -6428,8 +5310,6 @@ snapshots: pathe@1.1.2: {} - pathe@2.0.3: {} - pathval@2.0.1: {} picocolors@1.1.1: {} @@ -6448,8 +5328,6 @@ snapshots: preact@10.12.1: {} - prelude-ls@1.2.1: {} - prettier@2.8.8: {} prettier@3.6.2: {} @@ -6525,8 +5403,6 @@ snapshots: require-directory@2.1.1: {} - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} resolve.exports@2.0.3: {} @@ -6549,14 +5425,6 @@ snapshots: reusify@1.1.0: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rollup@3.29.5: - optionalDependencies: - fsevents: 2.3.3 - rollup@4.50.1: dependencies: '@types/estree': 1.0.8 @@ -6690,10 +5558,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - style-to-js@1.1.17: dependencies: style-to-object: 1.0.9 @@ -6749,27 +5613,16 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 - text-table@0.2.0: {} - tinybench@2.9.0: {} tinyexec@0.3.2: {} - tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - tinypool@1.1.1: {} tinyrainbow@1.2.0: {} - tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} - tinyspy@4.0.4: {} - tldts-core@6.1.86: {} tldts@6.1.86: @@ -6792,10 +5645,6 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@1.4.3(typescript@5.9.2): - dependencies: - typescript: 5.9.2 - ts-morph@22.0.0: dependencies: '@ts-morph/common': 0.23.0 @@ -6809,12 +5658,6 @@ snapshots: tslib@2.8.1: {} - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - typedoc-plugin-markdown@4.9.0(typedoc@0.28.13(typescript@5.9.2)): dependencies: typedoc: 0.28.13(typescript@5.9.2) @@ -6872,24 +5715,6 @@ snapshots: - supports-color - terser - vite-node@3.2.4(@types/node@22.18.8)(lightningcss@1.30.1): - dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 5.4.21(@types/node@22.18.8)(lightningcss@1.30.1) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vite-plugin-dts@3.9.1(@types/node@20.19.13)(rollup@4.50.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1)): dependencies: '@microsoft/api-extractor': 7.43.0(@types/node@20.19.13) @@ -6907,33 +5732,6 @@ snapshots: - rollup - supports-color - vite-plugin-dts@3.9.1(@types/node@22.18.8)(rollup@4.50.1)(typescript@5.9.2)(vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1)): - dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@22.18.8) - '@rollup/pluginutils': 5.3.0(rollup@4.50.1) - '@vue/language-core': 1.8.27(typescript@5.9.2) - debug: 4.4.1 - kolorist: 1.8.0 - magic-string: 0.30.19 - typescript: 5.9.2 - vue-tsc: 1.8.27(typescript@5.9.2) - optionalDependencies: - vite: 4.5.14(@types/node@22.18.8)(lightningcss@1.30.1) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - vite@4.5.14(@types/node@22.18.8)(lightningcss@1.30.1): - dependencies: - esbuild: 0.18.20 - postcss: 8.5.6 - rollup: 3.29.5 - optionalDependencies: - '@types/node': 22.18.8 - fsevents: 2.3.3 - lightningcss: 1.30.1 - vite@5.4.21(@types/node@20.19.13)(lightningcss@1.30.1): dependencies: esbuild: 0.21.5 @@ -6944,16 +5742,6 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.30.1 - vite@5.4.21(@types/node@22.18.8)(lightningcss@1.30.1): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.6 - rollup: 4.50.1 - optionalDependencies: - '@types/node': 22.18.8 - fsevents: 2.3.3 - lightningcss: 1.30.1 - vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1): dependencies: '@vitest/expect': 2.1.9 @@ -6991,46 +5779,6 @@ snapshots: - supports-color - terser - vitest@3.2.4(@types/node@22.18.8)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.21(@types/node@22.18.8)(lightningcss@1.30.1)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.1 - expect-type: 1.2.2 - magic-string: 0.30.19 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 5.4.21(@types/node@22.18.8)(lightningcss@1.30.1) - vite-node: 3.2.4(@types/node@22.18.8)(lightningcss@1.30.1) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.18.8 - happy-dom: 15.11.7 - jsdom: 26.1.0 - transitivePeerDependencies: - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vue-template-compiler@2.7.16: dependencies: de-indent: 1.0.2 @@ -7075,8 +5823,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - word-wrap@1.2.5: {} - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -7119,8 +5865,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} - z-schema@5.0.5: dependencies: lodash.get: 4.4.2 From b9031791b5a08389f6fc99f0c5aaeb6b99eb37a7 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 11:30:24 +0100 Subject: [PATCH 05/16] update tooling --- packages/react/tsconfig.json | 1 + packages/react/vitest.config.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index 3f23444..c2a32c4 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -10,6 +10,7 @@ "isolatedModules": true, "noEmit": true, "jsx": "react", + "types": ["vitest/globals"], // Relaxed strictness "noImplicitAny": false, diff --git a/packages/react/vitest.config.ts b/packages/react/vitest.config.ts index adb4ead..fad0222 100644 --- a/packages/react/vitest.config.ts +++ b/packages/react/vitest.config.ts @@ -2,6 +2,7 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { + globals: true, environment: "jsdom", include: ["lib/**/*.test.ts", "lib/**/*.test.tsx", "lib/**/*.spec.tsx"], setupFiles: ["./test/vitest.setup.ts"], From e168f0d9ce729fb4142e540f48372b920ee4e863 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 13:06:11 +0100 Subject: [PATCH 06/16] adjust inconsistencies --- packages/nylas-connect/.prettierrc | 1 + packages/nylas-connect/package.json | 6 ++++- .../nylas-connect/{ => test}/vitest.setup.ts | 0 packages/nylas-connect/tsconfig.json | 1 + packages/nylas-connect/vite.config.ts | 11 +-------- packages/nylas-connect/vitest.config.ts | 5 ++-- packages/react/LICENSE.md | 23 +++++++++++++++++++ packages/react/index.html | 2 +- packages/react/package.json | 11 +++++++++ packages/react/{lib => src}/connect.ts | 0 .../connect/NylasConnectButton.css | 0 .../connect/NylasConnectButton.test.ts | 0 .../connect/NylasConnectButton.tsx | 0 packages/react/{lib => src}/connect/index.ts | 0 packages/react/{lib => src}/connect/types.ts | 0 .../connect/useNylasConnect.test.ts | 0 .../{lib => src}/connect/useNylasConnect.ts | 0 packages/react/{lib => src}/elements.ts | 0 .../react/{lib => src}/elements/components.ts | 0 packages/react/{lib => src}/index.ts | 0 packages/react/{lib => src}/main.tsx | 0 packages/react/{lib => src}/notetaker.ts | 0 .../CalendarSync/CalendarSync.spec.tsx | 0 .../notetaker/CalendarSync/CalendarSync.tsx | 0 .../SendNotetaker/SendNotetaker.spec.tsx | 0 .../notetaker/SendNotetaker/SendNotetaker.tsx | 0 .../notetaker/Transcript/Transcript.spec.tsx | 0 .../notetaker/Transcript/Transcript.tsx | 0 .../VideoPlayer/VideoPlayer.spec.tsx | 0 .../notetaker/VideoPlayer/VideoPlayer.tsx | 0 .../react/{lib => src}/notetaker/index.ts | 0 .../{lib => src}/notetaker/lib/constants.ts | 0 .../{lib => src}/notetaker/lib/http-client.ts | 0 .../{lib => src}/notetaker/lib/primitives.ts | 0 .../react/{lib => src}/notetaker/lib/store.ts | 0 .../react/{lib => src}/notetaker/style.css | 0 .../react/{lib => src}/notetaker/types.ts | 0 packages/react/{lib => src}/utils.ts | 0 .../test/code-examples/CalendarSync.spec.tsx | 2 +- .../test/code-examples/SendNotetaker.spec.tsx | 2 +- .../test/code-examples/Transcript.spec.tsx | 2 +- .../test/code-examples/VideoPlayer.spec.tsx | 2 +- packages/react/tsconfig.json | 2 +- packages/react/tsconfig.typedoc.json | 2 +- packages/react/typedoc.json | 2 +- packages/react/vite.config.ts | 13 +++++++---- packages/react/vitest.config.ts | 2 +- 47 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 packages/nylas-connect/.prettierrc rename packages/nylas-connect/{ => test}/vitest.setup.ts (100%) create mode 100644 packages/react/LICENSE.md rename packages/react/{lib => src}/connect.ts (100%) rename packages/react/{lib => src}/connect/NylasConnectButton.css (100%) rename packages/react/{lib => src}/connect/NylasConnectButton.test.ts (100%) rename packages/react/{lib => src}/connect/NylasConnectButton.tsx (100%) rename packages/react/{lib => src}/connect/index.ts (100%) rename packages/react/{lib => src}/connect/types.ts (100%) rename packages/react/{lib => src}/connect/useNylasConnect.test.ts (100%) rename packages/react/{lib => src}/connect/useNylasConnect.ts (100%) rename packages/react/{lib => src}/elements.ts (100%) rename packages/react/{lib => src}/elements/components.ts (100%) rename packages/react/{lib => src}/index.ts (100%) rename packages/react/{lib => src}/main.tsx (100%) rename packages/react/{lib => src}/notetaker.ts (100%) rename packages/react/{lib => src}/notetaker/CalendarSync/CalendarSync.spec.tsx (100%) rename packages/react/{lib => src}/notetaker/CalendarSync/CalendarSync.tsx (100%) rename packages/react/{lib => src}/notetaker/SendNotetaker/SendNotetaker.spec.tsx (100%) rename packages/react/{lib => src}/notetaker/SendNotetaker/SendNotetaker.tsx (100%) rename packages/react/{lib => src}/notetaker/Transcript/Transcript.spec.tsx (100%) rename packages/react/{lib => src}/notetaker/Transcript/Transcript.tsx (100%) rename packages/react/{lib => src}/notetaker/VideoPlayer/VideoPlayer.spec.tsx (100%) rename packages/react/{lib => src}/notetaker/VideoPlayer/VideoPlayer.tsx (100%) rename packages/react/{lib => src}/notetaker/index.ts (100%) rename packages/react/{lib => src}/notetaker/lib/constants.ts (100%) rename packages/react/{lib => src}/notetaker/lib/http-client.ts (100%) rename packages/react/{lib => src}/notetaker/lib/primitives.ts (100%) rename packages/react/{lib => src}/notetaker/lib/store.ts (100%) rename packages/react/{lib => src}/notetaker/style.css (100%) rename packages/react/{lib => src}/notetaker/types.ts (100%) rename packages/react/{lib => src}/utils.ts (100%) diff --git a/packages/nylas-connect/.prettierrc b/packages/nylas-connect/.prettierrc new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/packages/nylas-connect/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/packages/nylas-connect/package.json b/packages/nylas-connect/package.json index 6898b20..ebf934b 100644 --- a/packages/nylas-connect/package.json +++ b/packages/nylas-connect/package.json @@ -41,6 +41,10 @@ "popup", "inline" ], + "repository": { + "type": "git", + "url": "git+https://github.com/nylas/nylas.git" + }, "author": "Nylas Inc.", "license": "MIT", "publishConfig": { @@ -50,7 +54,7 @@ "devDependencies": { "@types/node": "^20.11.13", "@vitest/coverage-v8": "^2.1.9", - "happy-dom": "^15.10.2", + "jsdom": "^26.0.0", "typescript": "^5.3.3", "vite": "^5.4.21", "vite-plugin-dts": "^3.7.0", diff --git a/packages/nylas-connect/vitest.setup.ts b/packages/nylas-connect/test/vitest.setup.ts similarity index 100% rename from packages/nylas-connect/vitest.setup.ts rename to packages/nylas-connect/test/vitest.setup.ts diff --git a/packages/nylas-connect/tsconfig.json b/packages/nylas-connect/tsconfig.json index 413473c..dad317e 100644 --- a/packages/nylas-connect/tsconfig.json +++ b/packages/nylas-connect/tsconfig.json @@ -9,6 +9,7 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, + "types": ["vitest/globals"], // Relaxed strictness "noImplicitAny": false, diff --git a/packages/nylas-connect/vite.config.ts b/packages/nylas-connect/vite.config.ts index dbc0204..ee404b5 100644 --- a/packages/nylas-connect/vite.config.ts +++ b/packages/nylas-connect/vite.config.ts @@ -10,19 +10,10 @@ export default defineConfig({ formats: ["es"], fileName: "index", }, - rollupOptions: { - external: ["react", "react-dom"], - output: { - globals: { - react: "React", - "react-dom": "ReactDOM", - }, - }, - }, sourcemap: true, minify: "esbuild", target: "es2022", - }, + }, server: { port: 3000, open: true, diff --git a/packages/nylas-connect/vitest.config.ts b/packages/nylas-connect/vitest.config.ts index 9e4a936..79ed887 100644 --- a/packages/nylas-connect/vitest.config.ts +++ b/packages/nylas-connect/vitest.config.ts @@ -2,9 +2,10 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { - environment: "happy-dom", + globals: true, + environment: "jsdom", include: ["src/**/*.test.ts"], - setupFiles: ["./vitest.setup.ts"], + setupFiles: ["./test/vitest.setup.ts"], coverage: { provider: "v8", reporter: ["text", "lcov"], diff --git a/packages/react/LICENSE.md b/packages/react/LICENSE.md new file mode 100644 index 0000000..44321a9 --- /dev/null +++ b/packages/react/LICENSE.md @@ -0,0 +1,23 @@ +The MIT License (MIT) +---- + +Copyright (c) 2014-2015 InboxApp, Inc. and Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/packages/react/index.html b/packages/react/index.html index 0fcd1f8..e4b78ea 100644 --- a/packages/react/index.html +++ b/packages/react/index.html @@ -8,6 +8,6 @@
- + diff --git a/packages/react/package.json b/packages/react/package.json index 71d4ba1..600a115 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,7 @@ { "name": "@nylas/react", "version": "2.2.4", + "description": "React components and hooks for Nylas API integration", "type": "module", "scripts": { "build": "tsc && vite build", @@ -23,6 +24,16 @@ "type": "git", "url": "git+https://github.com/nylas/nylas.git" }, + "keywords": [ + "nylas", + "react", + "components", + "hooks", + "email", + "calendar", + "contacts", + "oauth2" + ], "author": "Nylas Inc.", "license": "MIT", "publishConfig": { diff --git a/packages/react/lib/connect.ts b/packages/react/src/connect.ts similarity index 100% rename from packages/react/lib/connect.ts rename to packages/react/src/connect.ts diff --git a/packages/react/lib/connect/NylasConnectButton.css b/packages/react/src/connect/NylasConnectButton.css similarity index 100% rename from packages/react/lib/connect/NylasConnectButton.css rename to packages/react/src/connect/NylasConnectButton.css diff --git a/packages/react/lib/connect/NylasConnectButton.test.ts b/packages/react/src/connect/NylasConnectButton.test.ts similarity index 100% rename from packages/react/lib/connect/NylasConnectButton.test.ts rename to packages/react/src/connect/NylasConnectButton.test.ts diff --git a/packages/react/lib/connect/NylasConnectButton.tsx b/packages/react/src/connect/NylasConnectButton.tsx similarity index 100% rename from packages/react/lib/connect/NylasConnectButton.tsx rename to packages/react/src/connect/NylasConnectButton.tsx diff --git a/packages/react/lib/connect/index.ts b/packages/react/src/connect/index.ts similarity index 100% rename from packages/react/lib/connect/index.ts rename to packages/react/src/connect/index.ts diff --git a/packages/react/lib/connect/types.ts b/packages/react/src/connect/types.ts similarity index 100% rename from packages/react/lib/connect/types.ts rename to packages/react/src/connect/types.ts diff --git a/packages/react/lib/connect/useNylasConnect.test.ts b/packages/react/src/connect/useNylasConnect.test.ts similarity index 100% rename from packages/react/lib/connect/useNylasConnect.test.ts rename to packages/react/src/connect/useNylasConnect.test.ts diff --git a/packages/react/lib/connect/useNylasConnect.ts b/packages/react/src/connect/useNylasConnect.ts similarity index 100% rename from packages/react/lib/connect/useNylasConnect.ts rename to packages/react/src/connect/useNylasConnect.ts diff --git a/packages/react/lib/elements.ts b/packages/react/src/elements.ts similarity index 100% rename from packages/react/lib/elements.ts rename to packages/react/src/elements.ts diff --git a/packages/react/lib/elements/components.ts b/packages/react/src/elements/components.ts similarity index 100% rename from packages/react/lib/elements/components.ts rename to packages/react/src/elements/components.ts diff --git a/packages/react/lib/index.ts b/packages/react/src/index.ts similarity index 100% rename from packages/react/lib/index.ts rename to packages/react/src/index.ts diff --git a/packages/react/lib/main.tsx b/packages/react/src/main.tsx similarity index 100% rename from packages/react/lib/main.tsx rename to packages/react/src/main.tsx diff --git a/packages/react/lib/notetaker.ts b/packages/react/src/notetaker.ts similarity index 100% rename from packages/react/lib/notetaker.ts rename to packages/react/src/notetaker.ts diff --git a/packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx b/packages/react/src/notetaker/CalendarSync/CalendarSync.spec.tsx similarity index 100% rename from packages/react/lib/notetaker/CalendarSync/CalendarSync.spec.tsx rename to packages/react/src/notetaker/CalendarSync/CalendarSync.spec.tsx diff --git a/packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx b/packages/react/src/notetaker/CalendarSync/CalendarSync.tsx similarity index 100% rename from packages/react/lib/notetaker/CalendarSync/CalendarSync.tsx rename to packages/react/src/notetaker/CalendarSync/CalendarSync.tsx diff --git a/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.spec.tsx b/packages/react/src/notetaker/SendNotetaker/SendNotetaker.spec.tsx similarity index 100% rename from packages/react/lib/notetaker/SendNotetaker/SendNotetaker.spec.tsx rename to packages/react/src/notetaker/SendNotetaker/SendNotetaker.spec.tsx diff --git a/packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx b/packages/react/src/notetaker/SendNotetaker/SendNotetaker.tsx similarity index 100% rename from packages/react/lib/notetaker/SendNotetaker/SendNotetaker.tsx rename to packages/react/src/notetaker/SendNotetaker/SendNotetaker.tsx diff --git a/packages/react/lib/notetaker/Transcript/Transcript.spec.tsx b/packages/react/src/notetaker/Transcript/Transcript.spec.tsx similarity index 100% rename from packages/react/lib/notetaker/Transcript/Transcript.spec.tsx rename to packages/react/src/notetaker/Transcript/Transcript.spec.tsx diff --git a/packages/react/lib/notetaker/Transcript/Transcript.tsx b/packages/react/src/notetaker/Transcript/Transcript.tsx similarity index 100% rename from packages/react/lib/notetaker/Transcript/Transcript.tsx rename to packages/react/src/notetaker/Transcript/Transcript.tsx diff --git a/packages/react/lib/notetaker/VideoPlayer/VideoPlayer.spec.tsx b/packages/react/src/notetaker/VideoPlayer/VideoPlayer.spec.tsx similarity index 100% rename from packages/react/lib/notetaker/VideoPlayer/VideoPlayer.spec.tsx rename to packages/react/src/notetaker/VideoPlayer/VideoPlayer.spec.tsx diff --git a/packages/react/lib/notetaker/VideoPlayer/VideoPlayer.tsx b/packages/react/src/notetaker/VideoPlayer/VideoPlayer.tsx similarity index 100% rename from packages/react/lib/notetaker/VideoPlayer/VideoPlayer.tsx rename to packages/react/src/notetaker/VideoPlayer/VideoPlayer.tsx diff --git a/packages/react/lib/notetaker/index.ts b/packages/react/src/notetaker/index.ts similarity index 100% rename from packages/react/lib/notetaker/index.ts rename to packages/react/src/notetaker/index.ts diff --git a/packages/react/lib/notetaker/lib/constants.ts b/packages/react/src/notetaker/lib/constants.ts similarity index 100% rename from packages/react/lib/notetaker/lib/constants.ts rename to packages/react/src/notetaker/lib/constants.ts diff --git a/packages/react/lib/notetaker/lib/http-client.ts b/packages/react/src/notetaker/lib/http-client.ts similarity index 100% rename from packages/react/lib/notetaker/lib/http-client.ts rename to packages/react/src/notetaker/lib/http-client.ts diff --git a/packages/react/lib/notetaker/lib/primitives.ts b/packages/react/src/notetaker/lib/primitives.ts similarity index 100% rename from packages/react/lib/notetaker/lib/primitives.ts rename to packages/react/src/notetaker/lib/primitives.ts diff --git a/packages/react/lib/notetaker/lib/store.ts b/packages/react/src/notetaker/lib/store.ts similarity index 100% rename from packages/react/lib/notetaker/lib/store.ts rename to packages/react/src/notetaker/lib/store.ts diff --git a/packages/react/lib/notetaker/style.css b/packages/react/src/notetaker/style.css similarity index 100% rename from packages/react/lib/notetaker/style.css rename to packages/react/src/notetaker/style.css diff --git a/packages/react/lib/notetaker/types.ts b/packages/react/src/notetaker/types.ts similarity index 100% rename from packages/react/lib/notetaker/types.ts rename to packages/react/src/notetaker/types.ts diff --git a/packages/react/lib/utils.ts b/packages/react/src/utils.ts similarity index 100% rename from packages/react/lib/utils.ts rename to packages/react/src/utils.ts diff --git a/packages/react/test/code-examples/CalendarSync.spec.tsx b/packages/react/test/code-examples/CalendarSync.spec.tsx index b823540..1981890 100644 --- a/packages/react/test/code-examples/CalendarSync.spec.tsx +++ b/packages/react/test/code-examples/CalendarSync.spec.tsx @@ -2,7 +2,7 @@ import { render } from "@testing-library/react"; import { it } from "vitest"; // --- example code:start -- -import { CalendarSync } from "../../lib/notetaker/CalendarSync/CalendarSync"; +import { CalendarSync } from "../../src/notetaker/CalendarSync/CalendarSync"; import React from "react"; function App() { diff --git a/packages/react/test/code-examples/SendNotetaker.spec.tsx b/packages/react/test/code-examples/SendNotetaker.spec.tsx index 68ee56e..05f225e 100644 --- a/packages/react/test/code-examples/SendNotetaker.spec.tsx +++ b/packages/react/test/code-examples/SendNotetaker.spec.tsx @@ -3,7 +3,7 @@ import { it } from "vitest"; // --- example code:start -- import React from "react"; -import { SendNotetaker } from "../../lib/notetaker/SendNotetaker/SendNotetaker"; +import { SendNotetaker } from "../../src/notetaker/SendNotetaker/SendNotetaker"; function App() { return ( diff --git a/packages/react/test/code-examples/Transcript.spec.tsx b/packages/react/test/code-examples/Transcript.spec.tsx index bc646fd..e2e0165 100644 --- a/packages/react/test/code-examples/Transcript.spec.tsx +++ b/packages/react/test/code-examples/Transcript.spec.tsx @@ -3,7 +3,7 @@ import { it } from "vitest"; // --- example code:start -- import React from "react"; -import { Transcript } from "../../lib/notetaker/Transcript/Transcript"; +import { Transcript } from "../../src/notetaker/Transcript/Transcript"; const transcriptData = [ { diff --git a/packages/react/test/code-examples/VideoPlayer.spec.tsx b/packages/react/test/code-examples/VideoPlayer.spec.tsx index 470f556..fb3920e 100644 --- a/packages/react/test/code-examples/VideoPlayer.spec.tsx +++ b/packages/react/test/code-examples/VideoPlayer.spec.tsx @@ -3,7 +3,7 @@ import { it } from "vitest"; // --- example code:start -- import React from "react"; -import { VideoPlayer } from "../../lib/notetaker/VideoPlayer/VideoPlayer"; +import { VideoPlayer } from "../../src/notetaker/VideoPlayer/VideoPlayer"; function App() { return ( diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index c2a32c4..7f36540 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -26,6 +26,6 @@ "sourceMap": true, "outDir": "dist" }, - "include": ["lib/**/*", "test/**/*"], + "include": ["src/**/*", "test/**/*"], "exclude": ["node_modules", "dist"] } diff --git a/packages/react/tsconfig.typedoc.json b/packages/react/tsconfig.typedoc.json index c3443d0..8843259 100644 --- a/packages/react/tsconfig.typedoc.json +++ b/packages/react/tsconfig.typedoc.json @@ -1,5 +1,5 @@ { "extends": "./tsconfig.json", "compilerOptions": { "noEmit": true }, - "include": ["lib/notetaker/**/*.*"] + "include": ["src/notetaker/**/*.*"] } diff --git a/packages/react/typedoc.json b/packages/react/typedoc.json index 17e78fa..5f93672 100644 --- a/packages/react/typedoc.json +++ b/packages/react/typedoc.json @@ -3,7 +3,7 @@ "name": "nylas-react", "tsconfig": "./tsconfig.typedoc.json", "plugin": ["typedoc-plugin-markdown"], - "entryPoints": ["./lib/notetaker/**/*.{ts,tsx}"], + "entryPoints": ["./src/notetaker/**/*.{ts,tsx}"], "flattenOutputFiles": true, "excludeScopesInPaths": true, "hidePageHeader": true, diff --git a/packages/react/vite.config.ts b/packages/react/vite.config.ts index 2107499..ba8c06e 100644 --- a/packages/react/vite.config.ts +++ b/packages/react/vite.config.ts @@ -10,15 +10,18 @@ export default defineConfig({ build: { lib: { entry: { - index: resolve(__dirname, "lib/index.ts"), - connect: resolve(__dirname, "lib/connect.ts"), - elements: resolve(__dirname, "lib/elements.ts"), - notetaker: resolve(__dirname, "lib/notetaker.ts"), - utils: resolve(__dirname, "lib/utils.ts"), + index: resolve(__dirname, "src/index.ts"), + connect: resolve(__dirname, "src/connect.ts"), + elements: resolve(__dirname, "src/elements.ts"), + notetaker: resolve(__dirname, "src/notetaker.ts"), + utils: resolve(__dirname, "src/utils.ts"), }, formats: ["es", "cjs"], }, cssCodeSplit: false, + sourcemap: true, + minify: "esbuild", + target: "es2022", rollupOptions: { external: [ "react", diff --git a/packages/react/vitest.config.ts b/packages/react/vitest.config.ts index fad0222..ac10995 100644 --- a/packages/react/vitest.config.ts +++ b/packages/react/vitest.config.ts @@ -4,7 +4,7 @@ export default defineConfig({ test: { globals: true, environment: "jsdom", - include: ["lib/**/*.test.ts", "lib/**/*.test.tsx", "lib/**/*.spec.tsx"], + include: ["src/**/*.test.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"], setupFiles: ["./test/vitest.setup.ts"], coverage: { provider: "v8", From 5055f42e70d0912a25c79361071371f8ec47a4e0 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 13:06:29 +0100 Subject: [PATCH 07/16] vite adjustment --- packages/nylas-connect/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nylas-connect/vite.config.ts b/packages/nylas-connect/vite.config.ts index ee404b5..9819ff7 100644 --- a/packages/nylas-connect/vite.config.ts +++ b/packages/nylas-connect/vite.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ sourcemap: true, minify: "esbuild", target: "es2022", - }, + }, server: { port: 3000, open: true, From 5d70a5244d5cd25e80a3ef359f7433ef38e9e4af Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 13:18:43 +0100 Subject: [PATCH 08/16] cleanup --- packages/nylas-connect/test/vitest.setup.ts | 16 ------- packages/nylas-connect/vitest.config.ts | 2 +- packages/nylas-connect/vitest.setup.ts | 0 packages/react/README.md | 2 - .../test/code-examples/CalendarSync.spec.tsx | 26 ----------- .../test/code-examples/SendNotetaker.spec.tsx | 27 ----------- .../test/code-examples/Transcript.spec.tsx | 46 ------------------- .../test/code-examples/VideoPlayer.spec.tsx | 30 ------------ packages/react/test/vitest.d.ts | 12 ----- packages/react/tsconfig.json | 2 +- packages/react/vitest.config.ts | 4 +- packages/react/{test => }/vitest.setup.ts | 0 12 files changed, 4 insertions(+), 163 deletions(-) delete mode 100644 packages/nylas-connect/test/vitest.setup.ts create mode 100644 packages/nylas-connect/vitest.setup.ts delete mode 100644 packages/react/test/code-examples/CalendarSync.spec.tsx delete mode 100644 packages/react/test/code-examples/SendNotetaker.spec.tsx delete mode 100644 packages/react/test/code-examples/Transcript.spec.tsx delete mode 100644 packages/react/test/code-examples/VideoPlayer.spec.tsx delete mode 100644 packages/react/test/vitest.d.ts rename packages/react/{test => }/vitest.setup.ts (100%) diff --git a/packages/nylas-connect/test/vitest.setup.ts b/packages/nylas-connect/test/vitest.setup.ts deleted file mode 100644 index ee2a528..0000000 --- a/packages/nylas-connect/test/vitest.setup.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Minimal polyfills for tests -import { webcrypto as nodeWebcrypto } from "node:crypto"; - -if (!globalThis.crypto) { - Object.defineProperty(globalThis, "crypto", { value: nodeWebcrypto }); -} - -// Polyfill btoa/atob if missing (Node) -if (typeof globalThis.btoa !== "function") { - globalThis.btoa = (data: string) => - Buffer.from(data, "binary").toString("base64"); -} -if (typeof globalThis.atob !== "function") { - globalThis.atob = (data: string) => - Buffer.from(data, "base64").toString("binary"); -} diff --git a/packages/nylas-connect/vitest.config.ts b/packages/nylas-connect/vitest.config.ts index 79ed887..2db044a 100644 --- a/packages/nylas-connect/vitest.config.ts +++ b/packages/nylas-connect/vitest.config.ts @@ -5,7 +5,7 @@ export default defineConfig({ globals: true, environment: "jsdom", include: ["src/**/*.test.ts"], - setupFiles: ["./test/vitest.setup.ts"], + setupFiles: ["./vitest.setup.ts"], coverage: { provider: "v8", reporter: ["text", "lcov"], diff --git a/packages/nylas-connect/vitest.setup.ts b/packages/nylas-connect/vitest.setup.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/react/README.md b/packages/react/README.md index 5d82a99..a0e0aa4 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -9,8 +9,6 @@ React components for Nylas Scheduler - [Node.js](https://nodejs.org/en/) v20 or higher - [React.js](https://react.dev/) v18 or higher -## Compatibility Notice - ## Installation Install Nylas React Components via npm: diff --git a/packages/react/test/code-examples/CalendarSync.spec.tsx b/packages/react/test/code-examples/CalendarSync.spec.tsx deleted file mode 100644 index 1981890..0000000 --- a/packages/react/test/code-examples/CalendarSync.spec.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { render } from "@testing-library/react"; -import { it } from "vitest"; - -// --- example code:start -- -import { CalendarSync } from "../../src/notetaker/CalendarSync/CalendarSync"; -import React from "react"; - -function App() { - return ( - console.log("Updated calendar:", calendar)} - onCancel={() => console.log("Edit cancelled")} - onError={(err) => console.error("Error:", err)} - hideRecordingSettings={false} - hideNameInput={false} - /> - ); -} -// --- example code:end -- - -it("should render the calendar sync example", () => { - render(); -}); diff --git a/packages/react/test/code-examples/SendNotetaker.spec.tsx b/packages/react/test/code-examples/SendNotetaker.spec.tsx deleted file mode 100644 index 05f225e..0000000 --- a/packages/react/test/code-examples/SendNotetaker.spec.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { render } from "@testing-library/react"; -import { it } from "vitest"; - -// --- example code:start -- -import React from "react"; -import { SendNotetaker } from "../../src/notetaker/SendNotetaker/SendNotetaker"; - -function App() { - return ( - { - console.log("Notetaker sent:", data); - // Optionally reset the form after sending - resetForm(); - }} - onError={(error) => console.error("Send error:", error)} - /> - ); -} -// --- example code:end -- - -it("should render the send notetaker example", () => { - render(); -}); diff --git a/packages/react/test/code-examples/Transcript.spec.tsx b/packages/react/test/code-examples/Transcript.spec.tsx deleted file mode 100644 index e2e0165..0000000 --- a/packages/react/test/code-examples/Transcript.spec.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { render } from "@testing-library/react"; -import { it } from "vitest"; - -// --- example code:start -- -import React from "react"; -import { Transcript } from "../../src/notetaker/Transcript/Transcript"; - -const transcriptData = [ - { - start: 1000, - end: 2000, - speaker: "Alice", - text: "Hello world!", - }, - { - start: 5000, - end: 6000, - speaker: "Bob", - text: "How are you?", - }, -]; - -function App() { - return ( - No transcript available.
} - showSpeaker={true} - showTimestamps={true} - resumeAutoscrollLabel="Scroll to active" - onTimestampClick={(timestamp) => - console.log("Timestamp clicked:", timestamp) - } - transcriptComponent={({ text }) => ( - {text} - )} - /> - ); -} -// --- example code:end -- - -it("should render the transcript example", () => { - render(); -}); diff --git a/packages/react/test/code-examples/VideoPlayer.spec.tsx b/packages/react/test/code-examples/VideoPlayer.spec.tsx deleted file mode 100644 index fb3920e..0000000 --- a/packages/react/test/code-examples/VideoPlayer.spec.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { render } from "@testing-library/react"; -import { it } from "vitest"; - -// --- example code:start -- -import React from "react"; -import { VideoPlayer } from "../../src/notetaker/VideoPlayer/VideoPlayer"; - -function App() { - return ( - console.log("Time update:", currentTime)} - onSeek={(newTime) => console.log("Seeked to:", newTime)} - onPlay={() => console.log("Video started playing")} - onPause={() => console.log("Video paused")} - onEnded={() => console.log("Video ended")} - /> - ); -} -// --- example code:end -- - -it("should render the video player example", () => { - render(); -}); diff --git a/packages/react/test/vitest.d.ts b/packages/react/test/vitest.d.ts deleted file mode 100644 index 607b467..0000000 --- a/packages/react/test/vitest.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import "vitest"; -import type { TestingLibraryMatchers } from "@testing-library/jest-dom/matchers"; - -declare module "vitest" { - interface Assertion extends TestingLibraryMatchers {} -} - -declare global { - namespace Chai { - interface Assertion extends TestingLibraryMatchers {} - } -} diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index 7f36540..1b5e337 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -26,6 +26,6 @@ "sourceMap": true, "outDir": "dist" }, - "include": ["src/**/*", "test/**/*"], + "include": ["src/**/*", "vitest.setup.ts"], "exclude": ["node_modules", "dist"] } diff --git a/packages/react/vitest.config.ts b/packages/react/vitest.config.ts index ac10995..2d26fb2 100644 --- a/packages/react/vitest.config.ts +++ b/packages/react/vitest.config.ts @@ -4,8 +4,8 @@ export default defineConfig({ test: { globals: true, environment: "jsdom", - include: ["src/**/*.test.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx"], - setupFiles: ["./test/vitest.setup.ts"], + include: ["src/**/*.test.ts", "src/**/*.test.tsx"], + setupFiles: ["./vitest.setup.ts"], coverage: { provider: "v8", reporter: ["text", "lcov"], diff --git a/packages/react/test/vitest.setup.ts b/packages/react/vitest.setup.ts similarity index 100% rename from packages/react/test/vitest.setup.ts rename to packages/react/vitest.setup.ts From ce7c0ca3ec7d6cbaeb05bb6c854ad037751f230d Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 13:21:19 +0100 Subject: [PATCH 09/16] cleaner scripts --- packages/nylas-connect/package.json | 1 - packages/react/package.json | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/nylas-connect/package.json b/packages/nylas-connect/package.json index ebf934b..6c564c0 100644 --- a/packages/nylas-connect/package.json +++ b/packages/nylas-connect/package.json @@ -19,7 +19,6 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "build:watch": "vite build --watch", "preview": "vite preview", "typecheck": "tsc --noEmit", "format": "pnpm --workspace-root prettier --write packages/nylas-connect/", diff --git a/packages/react/package.json b/packages/react/package.json index 600a115..79bd615 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -13,7 +13,6 @@ "lint:check": "oxlint .", "clean": "rm -rf dist", "dev": "vite build --watch --emptyOutDir=false", - "dev:server": "vite", "typecheck": "tsc --noEmit", "preview": "vite preview", "coverage": "vitest run --coverage", From 6d15cb5b6f1749e1d5e63b53c0bf5754d455058a Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 13:31:33 +0100 Subject: [PATCH 10/16] adjust readme --- packages/react/README.md | 14 +- packages/react/package.json | 5 - .../CalendarSync/CalendarSync.spec.tsx | 197 ------ .../notetaker/CalendarSync/CalendarSync.tsx | 559 ------------------ .../SendNotetaker/SendNotetaker.spec.tsx | 55 -- .../notetaker/SendNotetaker/SendNotetaker.tsx | 369 ------------ .../notetaker/Transcript/Transcript.spec.tsx | 211 ------- .../src/notetaker/Transcript/Transcript.tsx | 403 ------------- .../VideoPlayer/VideoPlayer.spec.tsx | 14 - .../src/notetaker/VideoPlayer/VideoPlayer.tsx | 168 ------ packages/react/src/notetaker/index.ts | 20 - packages/react/src/notetaker/lib/constants.ts | 41 -- .../react/src/notetaker/lib/http-client.ts | 15 - .../react/src/notetaker/lib/primitives.ts | 135 ----- packages/react/src/notetaker/lib/store.ts | 34 -- packages/react/src/notetaker/style.css | 18 - packages/react/src/notetaker/types.ts | 47 -- 17 files changed, 12 insertions(+), 2293 deletions(-) delete mode 100644 packages/react/src/notetaker/CalendarSync/CalendarSync.spec.tsx delete mode 100644 packages/react/src/notetaker/CalendarSync/CalendarSync.tsx delete mode 100644 packages/react/src/notetaker/SendNotetaker/SendNotetaker.spec.tsx delete mode 100644 packages/react/src/notetaker/SendNotetaker/SendNotetaker.tsx delete mode 100644 packages/react/src/notetaker/Transcript/Transcript.spec.tsx delete mode 100644 packages/react/src/notetaker/Transcript/Transcript.tsx delete mode 100644 packages/react/src/notetaker/VideoPlayer/VideoPlayer.spec.tsx delete mode 100644 packages/react/src/notetaker/VideoPlayer/VideoPlayer.tsx delete mode 100644 packages/react/src/notetaker/index.ts delete mode 100644 packages/react/src/notetaker/lib/constants.ts delete mode 100644 packages/react/src/notetaker/lib/http-client.ts delete mode 100644 packages/react/src/notetaker/lib/primitives.ts delete mode 100644 packages/react/src/notetaker/lib/store.ts delete mode 100644 packages/react/src/notetaker/style.css delete mode 100644 packages/react/src/notetaker/types.ts diff --git a/packages/react/README.md b/packages/react/README.md index a0e0aa4..a91ddd0 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -23,6 +23,16 @@ or yarn yarn add @nylas/react@latest ``` +## Exports overview + +- **Elements** + - `NylasSchedulerEditor`, `NylasScheduling`, `NylasSchedulingMethod` + - Import from `@nylas/react` or `@nylas/react/elements` + +- **Connect** + - `useNylasConnect`, `NylasConnectButton` + - Import from `@nylas/react` or `@nylas/react/connect` + ## Getting Started The following example adds the Nylas Scheduler Editor and Scheduling components to your React app. @@ -62,7 +72,7 @@ function App() { element={
({ - default: { - get: vi.fn(() => - Promise.resolve({ - data: { - data: { - name: "Test Calendar", - timezone: "UTC", - hex_color: "#fff", - hex_foreground_color: "#000", - grant_id: "grant-1", - id: "calendar-1", - object: "calendar", - is_primary: true, - read_only: false, - is_owned_by_user: true, - notetaker: { - name: "Test Notetaker", - meeting_settings: { - video_recording: true, - audio_recording: true, - transcription: true, - summary: true, - action_items: true, - }, - rules: { - event_selection: ["all"], - }, - }, - }, - }, - }), - ), - put: vi.fn(() => - Promise.resolve({ - data: { - data: { - name: "Test Calendar", - timezone: "UTC", - hex_color: "#fff", - hex_foreground_color: "#000", - grant_id: "grant-1", - id: "calendar-1", - object: "calendar", - is_primary: true, - read_only: false, - is_owned_by_user: true, - notetaker: { - name: "Test Notetaker", - meeting_settings: { - video_recording: true, - audio_recording: true, - transcription: true, - summary: true, - action_items: true, - }, - rules: { - event_selection: ["all"], - }, - }, - }, - }, - }), - ), - }, -})); - -import { CalendarSync } from "./CalendarSync"; - -describe("CalendarSync", () => { - const defaultProps = { - calendarId: "calendar-1", - grantId: "grant-1", - notetakerName: "Test Notetaker", - }; - - it("renders notetaker name and meeting types", async () => { - render(); - await waitFor(() => { - expect(screen.getByPlaceholderText(/Notetaker name/i)).toBeTruthy(); - expect(screen.getByText(/Meeting types/i)).toBeTruthy(); - expect(screen.getByDisplayValue("Test Notetaker")).toBeTruthy(); - }); - }); - - it("allows changing notetaker name", async () => { - render(); - const input = await screen.findByPlaceholderText(/Notetaker name/i); - fireEvent.change(input, { target: { value: "New Name" } }); - expect((input as HTMLInputElement).value).toBe("New Name"); - }); - - it("hides advanced settings when all recording types are enabled", async () => { - render(); - // Since all recording types are enabled, advanced settings should be hidden by default - expect(screen.getByText(/Advanced settings/i)).toBeTruthy(); - - // Click to expand advanced settings - const advLink = screen.getByText(/Advanced settings/i); - fireEvent.click(advLink); - - // Now recording settings should be visible - expect(screen.getByText(/Recording settings/i)).toBeTruthy(); - // Should see all 5 recording type buttons - expect(screen.getByText(/Video/i)).toBeTruthy(); - expect(screen.getByText(/Audio/i)).toBeTruthy(); - expect(screen.getByText(/Transcript/i)).toBeTruthy(); - expect(screen.getByText(/Summary/i)).toBeTruthy(); - expect(screen.getByText(/Action Items/i)).toBeTruthy(); - }); - - it("shows advanced settings link when not all recording types are enabled", async () => { - // Mock with only some recording types enabled - const partialRecordingMock = vi.fn(() => - Promise.resolve({ - data: { - data: { - name: "Test Calendar", - timezone: "UTC", - hex_color: "#fff", - hex_foreground_color: "#000", - grant_id: "grant-1", - id: "calendar-1", - object: "calendar", - is_primary: true, - read_only: false, - is_owned_by_user: true, - notetaker: { - name: "Test Notetaker", - meeting_settings: { - video_recording: true, - audio_recording: true, - transcription: false, - summary: false, - action_items: false, - }, - rules: { - event_selection: ["all"], - }, - }, - }, - }, - }), - ); - - // Temporarily replace the mock - const httpClient = await import("../lib/http-client"); - const originalGet = httpClient.default.get; - httpClient.default.get = - partialRecordingMock as unknown as typeof httpClient.default.get; - - render(); - - // Should show advanced settings link since not all recording types are enabled - const advLink = await screen.findByText(/Advanced settings/i); - expect(advLink).toBeTruthy(); - - // Click to expand - fireEvent.click(advLink); - expect(screen.getByText(/Recording settings/i)).toBeTruthy(); - - // Restore original mock - httpClient.default.get = originalGet; - }); - - it("allows toggling meeting types", async () => { - render(); - const internalBtn = await screen.findByRole("button", { - name: /Internal/i, - }); - fireEvent.click(internalBtn); - expect( - internalBtn.className.includes("ny:border-primary-500") || - internalBtn.className.includes("ny:text-primary-500"), - ).toBe(true); - }); - - it("calls onUpdate when save is clicked", async () => { - const onUpdate = vi.fn(); - render(); - const input = await screen.findByPlaceholderText(/Notetaker name/i); - fireEvent.change(input, { target: { value: "New Name" } }); - const saveBtn = await screen.findByRole("button", { - name: /Save changes/i, - }); - fireEvent.click(saveBtn); - await waitFor(() => { - expect(onUpdate).toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/react/src/notetaker/CalendarSync/CalendarSync.tsx b/packages/react/src/notetaker/CalendarSync/CalendarSync.tsx deleted file mode 100644 index e9f3084..0000000 --- a/packages/react/src/notetaker/CalendarSync/CalendarSync.tsx +++ /dev/null @@ -1,559 +0,0 @@ -import React, { useEffect } from "react"; -import client from "../lib/http-client"; -import { Check } from "lucide-react"; -import { label, button, input } from "../lib/primitives"; -import { create } from "zustand"; -import { MeetingFilter, RecordingType, Calendar } from "../types"; -import { - MEETING_TYPES, - RECORDING_TYPES, - DEFAULT_RECORDING_TYPES, -} from "../lib/constants"; -/** - * Props for the CalendarSync component. - */ -export interface CalendarSyncProps { - /** - * The ID of the calendar to sync with. - */ - calendarId: string; - /** - * The grant ID associated with the calendar. Defaults to 'me' if not provided. - */ - grantId?: string; - /** - * The default name for the notetaker. Used as a placeholder or initial value. - */ - notetakerName?: string; - /** - * Callback fired when the calendar is updated successfully. - * @param payload The updated Calendar object. - */ - onUpdate?: (payload: Calendar) => void; - /** - * Callback fired when the user cancels editing or disables the notetaker. - */ - onCancel?: () => void; - /** - * Callback fired when an error occurs during API calls or updates. - * @param err The error object or message. - */ - onError?: (err: any) => void; - /** - * If true, hides the recording settings (advanced settings) UI section. - */ - hideRecordingSettings?: boolean; - /** - * If true, hides the notetaker name input field. - */ - hideNameInput?: boolean; -} - -/** - * Interface for the CalendarSync component state store. - * Manages all state for the calendar sync functionality. - */ -export interface CalendarSyncStore { - /** Selected calendar */ - calendar: Calendar | null; - /** Sets the selected calendar */ - setCalendar: (calendar: Calendar | null) => void; - /** Loading state */ - isLoading: boolean; - /** Sets the loading state */ - setIsLoading: (isLoading: boolean) => void; - /** Selected meeting filters */ - selectedFilters: MeetingFilter[]; - /** Sets the selected meeting filters */ - setSelectedFilters: (filters: MeetingFilter[]) => void; - /** Selected recording types */ - selectedRecordingTypes: RecordingType[]; - /** Sets the selected recording types */ - setSelectedRecordingTypes: (types: RecordingType[]) => void; - /** Toggles a recording type on/off */ - toggleRecordingType: (type: RecordingType) => void; - /** Whether to show advanced settings */ - advancedSettings: boolean; - /** Sets whether to show advanced settings */ - setAdvancedSettings: (show: boolean) => void; - /** Whether user made changes */ - hasChanges: boolean; - /** Sets whether user made changes */ - setHasChanges: (hasChanges: boolean) => void; - /** Name for the calendar sync */ - name: string; - /** Sets the name */ - setName: (name: string) => void; - /** Reset store to initial state */ - reset: () => void; - /** Toggles a meeting filter on/off */ - toggleMeetingFilter: (filter: MeetingFilter) => void; - /** Handles canceling changes and resetting to original values */ - handleCancel: (notetakerName?: string, onCancelCallback?: () => void) => void; - /** Fetches calendar data from the API */ - getCalendar: ( - calendarId: string, - grantId: string, - fallbackNotetakerName?: string, - ) => Promise; - /** Saves calendar notetaker settings */ - handleSave: ( - calendarId: string, - grantId: string, - onUpdate?: (data: Calendar) => void, - onError?: (error: any) => void, - ) => Promise; - /** Disables the notetaker for a calendar */ - handleDisable: ( - calendarId: string, - grantId: string, - fallbackNotetakerName?: string, - onUpdate?: (data: Calendar) => void, - onError?: (error: any) => void, - onCancel?: () => void, - ) => Promise; -} - -// Use the same default recording types as SendNotetaker - -// Zustand store for CalendarSync state -export const calendarSyncStore = create((set, get) => { - // Common API function to reduce duplication - const updateCalendar = async ( - calendarId: string, - grantId: string, - payload: any, - onUpdate?: (data: Calendar) => void, - onError?: (error: any) => void, - ) => { - set({ isLoading: true }); - try { - const response = await client.put( - `/v3/grants/${grantId}/calendars/${calendarId}`, - payload, - ); - const responseData = response.data.data; - set({ calendar: responseData }); - if (onUpdate) { - onUpdate(responseData); - } - return responseData; - } catch (err) { - if (onError) { - onError(err); - } - throw err; - } finally { - set({ - isLoading: false, - hasChanges: false, - }); - } - }; - - // Reset state to specific values - const resetState = (stateUpdates: Partial) => { - set({ - hasChanges: false, - advancedSettings: false, - selectedRecordingTypes: DEFAULT_RECORDING_TYPES, - ...stateUpdates, - }); - }; - - return { - // State - calendar: null, - isLoading: false, - selectedFilters: [], - selectedRecordingTypes: DEFAULT_RECORDING_TYPES, - advancedSettings: false, - hasChanges: false, - name: "", - - // Simple setters - setCalendar: (calendar) => set({ calendar }), - setIsLoading: (isLoading) => set({ isLoading }), - setAdvancedSettings: (advancedSettings) => set({ advancedSettings }), - setHasChanges: (hasChanges) => set({ hasChanges }), - setName: (name) => set({ name }), - - // Consolidated setters with logic - setSelectedFilters: (selectedFilters) => - set({ - selectedFilters, - hasChanges: true, - }), - setSelectedRecordingTypes: (selectedRecordingTypes) => - set({ - selectedRecordingTypes, - hasChanges: true, - }), - - // Toggle functions - toggleRecordingType: (type) => { - const currentTypes = get().selectedRecordingTypes; - set({ - selectedRecordingTypes: currentTypes.includes(type) - ? currentTypes.filter((t) => t !== type) - : [...currentTypes, type], - hasChanges: true, - }); - }, - - toggleMeetingFilter: (filter) => { - const currentFilters = get().selectedFilters; - let newFilters: MeetingFilter[]; - - if (filter === MeetingFilter.All) { - // If 'All' is already the only selected type, deselect it - if ( - currentFilters.length === 1 && - currentFilters[0] === MeetingFilter.All - ) { - newFilters = []; - } else { - newFilters = [MeetingFilter.All]; - } - } else { - // Remove 'All' if any other type is selected - const filtered = currentFilters.filter((f) => f !== MeetingFilter.All); - newFilters = filtered.includes(filter) - ? filtered.filter((f) => f !== filter) - : [...filtered, filter]; - } - - set({ - selectedFilters: newFilters, - hasChanges: true, - }); - }, - - // Reset to initial state - reset: () => - resetState({ - calendar: null, - isLoading: false, - selectedFilters: [], - name: "", - }), - - // Cancel changes and restore original values - handleCancel: (notetakerName, onCancelCallback) => { - const { calendar } = get(); - resetState({ - selectedFilters: calendar?.notetaker?.rules?.event_selection ?? [], - name: calendar?.notetaker?.name ?? notetakerName ?? "", - }); - if (onCancelCallback) { - onCancelCallback(); - } - }, - - // API operations - getCalendar: async (calendarId, grantId, fallbackNotetakerName) => { - set({ isLoading: true }); - try { - const response = await client.get( - `/v3/grants/${grantId}/calendars/${calendarId}`, - { params: { calendarId } }, - ); - - const { data } = response.data; - const meetingSettings = data?.notetaker?.meeting_settings; - - // Determine recording types based on meeting settings - let types = DEFAULT_RECORDING_TYPES; - let showAdvanced = false; - - if (meetingSettings) { - types = []; - if (meetingSettings.video_recording) { - types.push(RecordingType.Video); - } - if (meetingSettings.audio_recording) { - types.push(RecordingType.Audio); - } - if (meetingSettings.transcription) { - types.push(RecordingType.Transcript); - } - if (meetingSettings.summary) { - types.push(RecordingType.Summary); - } - if (meetingSettings.action_items) { - types.push(RecordingType.ActionItems); - } - showAdvanced = types.length !== DEFAULT_RECORDING_TYPES.length; - } - - resetState({ - calendar: data, - name: data.notetaker?.name ?? fallbackNotetakerName, - selectedFilters: data?.notetaker?.rules?.event_selection ?? [], - selectedRecordingTypes: types, - advancedSettings: showAdvanced, - }); - } catch (error) { - console.error("Error fetching calendar:", error); - } finally { - set({ isLoading: false }); - } - }, - - handleSave: async (calendarId, grantId, onUpdate, onError) => { - const { selectedRecordingTypes, selectedFilters, name } = get(); - const rType = selectedRecordingTypes || []; - - // Build payload based on selected filters - const payload = !selectedFilters.length - ? { notetaker: {} } - : { - notetaker: { - name, - meeting_settings: { - video_recording: rType.includes(RecordingType.Video), - audio_recording: rType.includes(RecordingType.Audio), - transcription: rType.includes(RecordingType.Transcript), - summary: rType.includes(RecordingType.Summary), - action_items: rType.includes(RecordingType.ActionItems), - }, - rules: { event_selection: selectedFilters }, - }, - }; - - try { - await updateCalendar(calendarId, grantId, payload, onUpdate, onError); - // Hide advanced settings if all recording types are selected - if (rType.length === DEFAULT_RECORDING_TYPES.length) { - set({ advancedSettings: false }); - } - } catch (err) { - // Error already handled in updateCalendar - } - }, - - handleDisable: async ( - calendarId, - grantId, - fallbackNotetakerName, - onUpdate, - onError, - onCancel, - ) => { - try { - const response = await updateCalendar( - calendarId, - grantId, - { notetaker: {} }, - undefined, // We'll handle the update callback ourselves - onError, - ); - - // Fix the payload to properly handle undefined notetaker - const fixedPayload = { ...response, notetaker: undefined }; - set({ calendar: fixedPayload }); - - // Reset state via handleCancel - get().handleCancel(fallbackNotetakerName, onCancel); - - if (onUpdate) { - onUpdate(fixedPayload); - } - } catch (err) { - // Error already handled in updateCalendar - } - }, - }; -}); - -export function CalendarSync({ - calendarId, - grantId = "me", - notetakerName, - onUpdate, - onCancel, - onError, - hideRecordingSettings = false, - hideNameInput = false, -}: CalendarSyncProps) { - const { - calendar, - isLoading, - selectedFilters, - toggleMeetingFilter, - selectedRecordingTypes, - toggleRecordingType, - advancedSettings, - setAdvancedSettings, - hasChanges, - setHasChanges, - name, - setName, - handleCancel, - getCalendar, - handleSave, - handleDisable, - } = calendarSyncStore(); - - // Calendar fetching hook - useEffect(() => { - if (!calendarId) { - console.error("No calendarId provided in the CalendarSync component"); - return; - } - getCalendar(calendarId, grantId, notetakerName); - }, [calendarId, grantId, notetakerName, getCalendar]); - - useEffect(() => { - // sets the default notetaker name - if (notetakerName) { - setName(notetakerName); - } - }, [notetakerName, setName]); - - const isDisabled = Object.keys(calendar?.notetaker || {}).length === 0; - - return ( -
- {/* Notetaker name */} - {!hideNameInput && ( -
- - { - setName(e.target.value); - setHasChanges(true); - }} - className={input({ disabled: isLoading })} - placeholder="Notetaker name" - /> -
- )} - {/* Meeting types */} -
- -
- {MEETING_TYPES.map((type) => ( - - ))} -
-
- {/* Meeting Settings */} - {!hideRecordingSettings && !advancedSettings && ( -
setAdvancedSettings(true)} - role="button" - tabIndex={0} - > - Advanced settings... -
- )} - {!hideRecordingSettings && advancedSettings && ( -
- -
- {RECORDING_TYPES.map((it) => { - const Icon = it.icon; - return ( - - ); - })} -
-
- )} - {/* Actions */} -
-
- - {hasChanges && ( - - )} -
-
- {!isDisabled && ( - - )} -
-
-
- ); -} diff --git a/packages/react/src/notetaker/SendNotetaker/SendNotetaker.spec.tsx b/packages/react/src/notetaker/SendNotetaker/SendNotetaker.spec.tsx deleted file mode 100644 index bef2c7d..0000000 --- a/packages/react/src/notetaker/SendNotetaker/SendNotetaker.spec.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import React from "react"; -import { render, screen, fireEvent } from "@testing-library/react"; -import { SendNotetaker } from "./SendNotetaker"; - -describe("SendNotetaker", () => { - it("renders notetaker name and meeting link fields", () => { - render(); - expect(screen.getByPlaceholderText("Notetaker name")).toBeTruthy(); - expect( - screen.getByPlaceholderText("https://meet.google.com/..."), - ).toBeTruthy(); - }); - - it("allows changing notetaker name and meeting link", () => { - render(); - const nameInput = screen.getByPlaceholderText("Notetaker name"); - const linkInput = screen.getByPlaceholderText( - "https://meet.google.com/...", - ); - fireEvent.change(nameInput, { target: { value: "Alice" } }); - fireEvent.change(linkInput, { target: { value: "https://zoom.us/abc" } }); - expect((nameInput as HTMLInputElement).value).toBe("Alice"); - expect((linkInput as HTMLInputElement).value).toBe("https://zoom.us/abc"); - }); - - it("shows advanced settings when clicked", () => { - render(); - const adv = screen.getByText(/Advanced settings/i); - fireEvent.click(adv); - expect(screen.getByText(/Recording settings/i)).toBeTruthy(); - }); - - it("enables Send Notetaker button only when required fields are filled", () => { - render(); - const sendBtn = screen.getByRole("button", { - name: /Send Notetaker/i, - }) as HTMLButtonElement; - // Initially enabled, which might be different from expected behavior - expect(sendBtn.disabled).toBe(false); - - // Fill only name - const nameInput = screen.getByPlaceholderText("Notetaker name"); - fireEvent.change(nameInput, { target: { value: "Alice" } }); - // Button still enabled after filling name - expect(sendBtn.disabled).toBe(false); - - // Fill meeting link - const linkInput = screen.getByPlaceholderText( - "https://meet.google.com/...", - ); - fireEvent.change(linkInput, { target: { value: "https://zoom.us/abc" } }); - // Button remains enabled after filling meeting link - expect(sendBtn.disabled).toBe(false); - }); -}); diff --git a/packages/react/src/notetaker/SendNotetaker/SendNotetaker.tsx b/packages/react/src/notetaker/SendNotetaker/SendNotetaker.tsx deleted file mode 100644 index 610358f..0000000 --- a/packages/react/src/notetaker/SendNotetaker/SendNotetaker.tsx +++ /dev/null @@ -1,369 +0,0 @@ -import React, { useEffect } from "react"; -import { label, input, button } from "../lib/primitives"; - -import { create } from "zustand"; -import client from "../lib/http-client"; -import { RecordingType, Notetaker } from "../types"; -import { DEFAULT_RECORDING_TYPES, RECORDING_TYPES } from "../lib/constants"; - -type NotetakerPayload = Partial; - -/** - * Interface for the SendNotetaker component state store. - * Manages all form data and UI state for the notetaker scheduling functionality. - */ -export interface SendNotetakerStore { - /** - * The name of the notetaker to be scheduled. - */ - name: string; - /** - * Sets the notetaker's name. - * @param name The new name value - */ - setName: (name: string) => void; - /** - * The meeting link (URL) where the notetaker will join. - */ - meetingLink: string; - /** - * Sets the meeting link. - * @param meetingLink The new meeting link value - */ - setMeetingLink: (meetingLink: string) => void; - /** - * The selected date for the notetaker to join the meeting. - */ - date: string; - /** - * Sets the join date. - * @param date The new date value (YYYY-MM-DD) - */ - setDate: (date: string) => void; - /** - * The selected time for the notetaker to join the meeting. - */ - time: string; - /** - * Sets the join time. - * @param time The new time value (HH:mm) - */ - setTime: (time: string) => void; - /** - * Whether the advanced settings section is visible. - */ - advancedSettings: boolean; - /** - * Sets the visibility of the advanced settings section. - * @param show Whether to show advanced settings - */ - setAdvancedSettings: (show: boolean) => void; - /** - * The currently selected recording types (e.g., video, audio, transcript). - */ - selectedRecordingTypes: RecordingType[]; - /** - * Sets the selected recording types. - * @param types The new array of selected recording types - */ - setSelectedRecordingTypes: (types: RecordingType[]) => void; - /** - * Toggles a recording type in the selection. - * @param type The recording type to toggle - */ - toggleRecordingType: (type: RecordingType) => void; - /** - * Whether the form is currently submitting (loading state). - */ - isLoading: boolean; - /** - * Sets the loading state. - * @param isLoading Whether the form is loading - */ - setIsLoading: (isLoading: boolean) => void; - /** - * Resets all form fields and state to their default values. - */ - reset: () => void; - /** - * Handles form submission, sending the notetaker data to the API. - * @param grantId The grant ID to associate with the notetaker - * @param onSend Optional callback for successful send - * @param onError Optional callback for error handling - */ - handleSubmit: ( - grantId?: string, - onSend?: (data: Notetaker, resetForm: () => void) => void, - onError?: (error: any) => void, - ) => void; -} - -// Helper to reset state -const resetState = ( - set: any, - stateUpdates: Partial = {}, -) => { - set({ - name: "", - meetingLink: "", - date: "", - time: "", - selectedRecordingTypes: DEFAULT_RECORDING_TYPES, - advancedSettings: false, - isLoading: false, - ...stateUpdates, - }); -}; - -export const sendNotetakerStore = create((set, get) => ({ - name: "", - setName: (name) => set({ name }), - meetingLink: "", - setMeetingLink: (meetingLink) => set({ meetingLink }), - date: "", - setDate: (date) => set({ date }), - time: "", - setTime: (time) => set({ time }), - advancedSettings: false, - setAdvancedSettings: (advancedSettings) => set({ advancedSettings }), - selectedRecordingTypes: DEFAULT_RECORDING_TYPES, - setSelectedRecordingTypes: (selectedRecordingTypes) => - set({ selectedRecordingTypes }), - toggleRecordingType: (type) => { - const currentTypes = get().selectedRecordingTypes; - set({ - selectedRecordingTypes: currentTypes.includes(type) - ? currentTypes.filter((t) => t !== type) - : [...currentTypes, type], - }); - }, - isLoading: false, - setIsLoading: (isLoading) => set({ isLoading }), - reset: () => resetState(set), - handleSubmit: (grantId = "me", onSend, onError) => { - const state = get(); - const { name, meetingLink, date, time, selectedRecordingTypes, reset } = - state; - const isValid = !!meetingLink; - if (!isValid || state.isLoading) { - return; - } - set({ isLoading: true }); - // Prepare join time if date and time are set - let join_time; - if (date && time) { - const dateObj = new Date(date); - const [hours, minutes] = time.split(":").map(Number); - dateObj.setHours(hours, minutes); - join_time = Math.round(dateObj.getTime() / 1000); - } - // Prepare meeting settings based on selected recording types - const meeting_settings = { - video_recording: selectedRecordingTypes.includes(RecordingType.Video), - audio_recording: selectedRecordingTypes.includes(RecordingType.Audio), - transcription: selectedRecordingTypes.includes(RecordingType.Transcript), - summary: selectedRecordingTypes.includes(RecordingType.Summary), - action_items: selectedRecordingTypes.includes(RecordingType.ActionItems), - }; - // Create the payload - const payload: NotetakerPayload = { - meeting_link: meetingLink, - name, - meeting_settings, - }; - if (join_time) { - payload.join_time = join_time; - } - client - .post(`/v3/grants/${grantId}/notetakers`, payload) - .then((res) => { - const { data } = res; - if (onSend) { - onSend(data, reset); - } - set({ isLoading: false }); - }) - .catch((error) => { - console.error("Failed to send notetaker:", error); - if (onError) { - onError(error); - } - set({ isLoading: false }); - }); - }, -})); - -/** - * Props for the SendNotetaker component. - */ -export interface SendNotetakerProps { - /** - * The name of the notetaker, used as an initial value for the name input field. - */ - notetakerName?: string; - /** - * Whether to show the name input field. - * When false, the name input will be hidden. - */ - showNameInput?: boolean; - /** - * Whether to initially show the advanced settings section. - * When true, advanced settings will be visible by default. - */ - showAdvancedSettings?: boolean; - /** - * Additional class name(s) for the container element. - */ - className?: string; - /** - * The grant ID to associate with the notetaker. Defaults to "me". - */ - grantId?: string; - /** - * Callback triggered after a successful send operation. - * @param data The notetaker data returned from the API - * @param resetForm Function to reset the form state - */ - onSend?: (data: Notetaker, resetForm: () => void) => void; - /** - * Callback triggered when an error occurs during the send operation. - * @param error The error that occurred - */ - onError?: (error: any) => void; -} - -export function SendNotetaker({ - className, - onSend, - onError, - notetakerName, - grantId = "me", -}: SendNotetakerProps) { - const { - name, - setName, - meetingLink, - setMeetingLink, - date, - setDate, - time, - setTime, - advancedSettings, - setAdvancedSettings, - selectedRecordingTypes, - toggleRecordingType, - isLoading, - handleSubmit, - } = sendNotetakerStore(); - - useEffect(() => { - if (notetakerName) { - setName(notetakerName); - } - }, [notetakerName, setName]); - - // Only meeting link is required - const isValid = !!meetingLink; - - return ( -
- {/* Notetaker name */} -
- - setName(e.target.value)} - className={input()} - placeholder="Notetaker name" - /> -
- {/* Meeting link */} -
- - setMeetingLink(e.target.value)} - className={input()} - placeholder="https://meet.google.com/..." - /> -
- {/* Join date and time */} -
- -
- setDate(e.target.value)} - className={input()} - /> - setTime(e.target.value)} - className={input()} - /> -
-
- {/* Advanced settings toggle and section */} - {!advancedSettings && ( -
setAdvancedSettings(true)} - role="button" - tabIndex={0} - > - Advanced settings... -
- )} - {advancedSettings && ( -
- -
- {RECORDING_TYPES.map((it) => { - const Icon = it.icon; - return ( - - ); - })} -
-
- )} -
- -
-
- ); -} diff --git a/packages/react/src/notetaker/Transcript/Transcript.spec.tsx b/packages/react/src/notetaker/Transcript/Transcript.spec.tsx deleted file mode 100644 index cc29f40..0000000 --- a/packages/react/src/notetaker/Transcript/Transcript.spec.tsx +++ /dev/null @@ -1,211 +0,0 @@ -import "@testing-library/jest-dom"; -import React from "react"; -import { render, screen, fireEvent } from "@testing-library/react"; -import { vi, Mock } from "vitest"; - -// Mock the videoPlayerStore hook -vi.mock("../VideoPlayer/VideoPlayer", () => { - return { - videoPlayerStore: vi.fn(), - }; -}); - -import { videoPlayerStore } from "../VideoPlayer/VideoPlayer"; -import { Transcript } from "./Transcript"; - -const mockTranscript = [ - { - start: 1000, - end: 2000, - speaker: "Alice", - text: "Hello world", - }, - { - start: 5000, - end: 6000, - speaker: "Bob", - text: "How are you?", - }, -]; - -describe("Transcript", () => { - let mockSetCurrentTime: ReturnType; - let mockCurrentTime: number; - - beforeEach(() => { - mockSetCurrentTime = vi.fn(); - mockCurrentTime = 0; - (videoPlayerStore as unknown as Mock).mockReturnValue({ - currentTime: mockCurrentTime, - setCurrentTime: mockSetCurrentTime, - }); - }); - - afterEach(() => { - vi.clearAllMocks(); - }); - - it("renders transcript items", () => { - render(); - expect(screen.getByText("Alice")).toBeTruthy(); - expect(screen.getByText("Bob")).toBeTruthy(); - expect(screen.getByText("Hello world")).toBeTruthy(); - expect(screen.getByText("How are you?")).toBeTruthy(); - }); - - it("shows 'Transcript not available' when empty", () => { - render(); - expect(screen.getByText(/Transcript not available/i)).toBeTruthy(); - }); - - it("filters transcript by search term", () => { - render(); - fireEvent.click(screen.getByText(/Search/i)); - const input = screen.getByPlaceholderText(/search transcript/i); - fireEvent.change(input, { target: { value: "Alice" } }); - expect(screen.getByText(/Alice/)).toBeTruthy(); - expect(screen.queryByText(/Bob/)).toBeFalsy(); - expect(screen.queryByText(/How are you\?/)).toBeFalsy(); - }); - - it("shows 'No results found' for unmatched search", () => { - render(); - fireEvent.click(screen.getByText(/Search/i)); - fireEvent.change(screen.getByPlaceholderText(/search transcript/i), { - target: { value: "foobar" }, - }); - expect(screen.getByText(/No results found/i)).toBeTruthy(); - }); - - it("renders custom transcriptComponent when provided", () => { - const CustomText = ({ text }) => ( -
{text.toUpperCase()}
- ); - render( - , - ); - - // Use different test ID to avoid duplicate testid error - const customTextElements = screen.getAllByTestId("custom-text-component"); - expect(customTextElements.length).toBe(2); - // Fallback if toHaveTextContent is not available - expect((customTextElements[0] as HTMLElement).textContent).toContain( - "HELLO WORLD", - ); - }); - - it("calls onTimestampClick when timestamp is clicked", async () => { - const onTimestampClick = vi.fn(); - render( - , - ); - - // Target the first transcript item - const transcriptItem = screen - .getByText("Hello world") - .closest(".ny\\:transcripts-item"); - - // Manually trigger mouseEnter to show the play button - if (transcriptItem) { - fireEvent.mouseEnter(transcriptItem); - } - - // Use querySelector directly with the document object - const playButton = document.querySelector(".lucide-play"); - expect(playButton).not.toBeNull(); - if (playButton) { - fireEvent.click(playButton); - } - - expect(onTimestampClick).toHaveBeenCalledWith(2); // 1000ms/1000 + 1 - expect(mockSetCurrentTime).toHaveBeenCalledWith(2); - }); - - it("hides speakers when showSpeaker is false", () => { - render(); - expect(screen.queryByText("Alice")).toBeFalsy(); - expect(screen.queryByText("Bob")).toBeFalsy(); - }); - - it("hides timestamps when showTimestamps is false", () => { - render(); - expect(screen.queryByText("00:01")).toBeFalsy(); - expect(screen.queryByText("00:05")).toBeFalsy(); - }); - - it("copies transcript text when copy button is clicked", async () => { - // Mock clipboard - const mockClipboard = { - writeText: vi.fn().mockImplementation(() => Promise.resolve()), - }; - Object.defineProperty(navigator, "clipboard", { - value: mockClipboard, - writable: true, - }); - - render(); - - // Click toolbar copy button - const copyToolbarButton = screen.getByText("Copy"); - fireEvent.click(copyToolbarButton); - expect(mockClipboard.writeText).toHaveBeenCalledWith( - expect.stringContaining("Alice: Hello world"), - ); - - // Copy individual item - mockClipboard.writeText.mockClear(); - - // Manually trigger mouseEnter on the transcript item - const transcriptItem = screen - .getByText("Hello world") - .closest(".ny\\:transcripts-item"); - if (transcriptItem) { - fireEvent.mouseEnter(transcriptItem); - } - - // Find and click copy button using querySelector - const copyButton = document.querySelector(".lucide-copy"); - expect(copyButton).not.toBeNull(); - if (copyButton) { - fireEvent.click(copyButton); - } - - expect(mockClipboard.writeText).toHaveBeenCalledWith( - expect.stringContaining("Alice: Hello world"), - ); - }); - - it("renders custom empty state when provided", () => { - const customEmptyState = ( -
No transcripts yet
- ); - render(); - - expect(screen.getByTestId("custom-empty")).toBeTruthy(); - expect(screen.queryByText(/Transcript not available/i)).toBeFalsy(); - }); - - it("hides toolbar when toolbar prop is false", () => { - render(); - expect(screen.queryByText(/Search/i)).toBeFalsy(); - expect(screen.queryByText(/Copy/i)).toBeFalsy(); - }); - - it("highlights the active transcript based on current time", () => { - (videoPlayerStore as unknown as Mock).mockReturnValue({ - currentTime: 1.5, // Between 1000ms and 2000ms - setCurrentTime: mockSetCurrentTime, - }); - - render(); - const items = document.querySelectorAll(".ny\\:transcripts-item"); - expect(items[0].classList.contains("ny:bg-blue-50")).toBeTruthy(); - expect(items[1].classList.contains("ny:bg-blue-50")).toBeFalsy(); - }); -}); diff --git a/packages/react/src/notetaker/Transcript/Transcript.tsx b/packages/react/src/notetaker/Transcript/Transcript.tsx deleted file mode 100644 index 3b4591c..0000000 --- a/packages/react/src/notetaker/Transcript/Transcript.tsx +++ /dev/null @@ -1,403 +0,0 @@ -import React, { - useState, - useEffect, - useRef, - useMemo, - useCallback, -} from "react"; -import dayjs from "dayjs"; -import utc from "dayjs/plugin/utc"; -import { Copy, Search, FileText, Play } from "lucide-react"; -import { input, button } from "../lib/primitives"; -import { videoPlayerStore } from "../VideoPlayer/VideoPlayer"; - -dayjs.extend(utc); // needed as utc is a separate plugin - -/** - * Props for the Transcript component. - */ -export interface TranscriptProps { - /** - * The array of transcript items to display. - */ - transcript: TranscriptItem[]; - /** - * Whether the transcript should automatically scroll to the active item as the video/audio progresses. - * @default true - */ - autoscroll?: boolean; - /** - * Whether to show the toolbar (search/copy controls) at the top. - * @default true - */ - toolbar?: boolean; - /** - * Custom ReactNode to display when there are no transcripts. - */ - emptyState?: React.ReactNode; - /** - * Controls whether the speaker name is shown for each transcript item. - * @default true - */ - showSpeaker?: boolean; - /** - * Controls whether timestamps are shown for each transcript item. - * @default true - */ - showTimestamps?: boolean; - /** - * Custom label for the "Resume Autoscroll" button. - * @default "Resume Autoscroll" - */ - resumeAutoscrollLabel?: string; - /** - * Callback function invoked when a timestamp (play button) is clicked. - * Receives the timestamp in seconds. - */ - onTimestampClick?: (timestamp: number) => void; - /** - * Custom component to render transcript text. - * If not provided, the default Text component will be used. - */ - transcriptComponent?: React.ComponentType<{ - text: string; - highlight: string | null; - }>; -} - -/** - * Represents a single item in the transcript. - */ -export interface TranscriptItem { - /** The ID of the transcript item. */ - speaker: string; - /** The content of the transcript item. */ - start: number; - /** The creation date of the transcript item. */ - end: number; - /** The update date of the transcript item. */ - text: string; -} - -type ProcessedTranscriptItem = TranscriptItem & { - active: boolean; - ts: string | null; -}; - -type ToolbarState = "default" | "search"; - -// --- Helper Components --- - -const Text: React.FC<{ - text: string; - highlight: string | null; -}> = ({ text, highlight }) => { - if (!highlight) { - return
{text}
; - } - const parts = text.split(new RegExp(`(${highlight})`, "gi")); - return ( -
- {parts.map((part, i) => - part.toLowerCase() === highlight.toLowerCase() ? ( - - {part} - - ) : ( - part - ), - )} -
- ); -}; - -interface ToolbarProps { - transcripts: ProcessedTranscriptItem[]; - toolbarState: ToolbarState; - setToolbarState: (state: ToolbarState) => void; - searchTerm: string; - setSearchTerm: (term: string) => void; -} - -const Toolbar: React.FC = ({ - transcripts, - toolbarState, - setToolbarState, - searchTerm, - setSearchTerm, -}) => { - const handleClearSearch = useCallback(() => { - setSearchTerm(""); - setToolbarState("default"); - }, [setSearchTerm, setToolbarState]); - - const handleCopy = useCallback(async () => { - const textToCopy = transcripts - .map((t) => `${t.ts} ${t.speaker}: ${t.text}`) - .join("\n"); - await navigator.clipboard.writeText(textToCopy); - }, [transcripts]); - - const handleSearchInput = (event: React.ChangeEvent) => - setSearchTerm(event.target.value); - const handleSearchKeyDown = ( - event: React.KeyboardEvent, - ) => { - if (event.key === "Escape") { - handleClearSearch(); - } - }; - - return ( -
- {/* Default State */} - {toolbarState === "default" && ( -
- - - -
- )} - {/* Search */} - {toolbarState === "search" && ( -
- - - -
- )} -
- ); -}; - -const Transcript: React.FC = ({ - transcript = [], - autoscroll = true, - toolbar = true, - emptyState, - showSpeaker = true, - showTimestamps = true, - resumeAutoscrollLabel = "Resume Autoscroll", - onTimestampClick, - transcriptComponent, -}) => { - const { currentTime, setCurrentTime, isPlaying } = videoPlayerStore(); - const [focusedIndex, setFocusedIndex] = useState(-1); - const [searchTerm, setSearchTerm] = useState(""); - const [toolbarState, setToolbarState] = useState("default"); - const [userScrolledAway, setUserScrolledAway] = useState(false); // Track if user manually scrolled - const transcriptContainerRef = useRef(null); - const activeItemRef = useRef(null); - - const secondsToStr = (milliseconds: number): string => { - if (milliseconds < 3600000) { - // Less than 1 hour - return dayjs.utc(milliseconds).format("mm:ss"); - } else { - return dayjs.utc(milliseconds).format("HH:mm:ss"); - } - }; - - const handleResumeAutoscroll = useCallback(() => { - setUserScrolledAway(false); - if (activeItemRef.current) { - console.log("Resuming autoscroll"); - activeItemRef.current.scrollIntoView({ - behavior: "smooth", - block: "center", - }); - } - }, []); // No dependencies needed as refs are stable - - const processedTranscripts = useMemo((): ProcessedTranscriptItem[] => { - if (!transcript || transcript.length === 0) { - return []; - } - const candidateIndex = - transcript.findIndex((item) => item.start / 1000 >= currentTime) - 1; - let res = transcript.map((item, index) => ({ - ...item, - active: index === candidateIndex, - ts: item.start ? secondsToStr(item.start) : null, - })); - - if (searchTerm) { - res = res.filter((x) => - x.text.toLowerCase().includes(searchTerm.toLowerCase()), - ); - } - return res; - }, [transcript, currentTime, searchTerm]); - - useEffect(() => { - // Only autoscroll if the prop is true AND the user hasn't scrolled away - if ( - autoscroll && - !userScrolledAway && - activeItemRef.current && - transcriptContainerRef.current - ) { - // Check if the active item is fully visible - const container = transcriptContainerRef.current; - const activeItem = activeItemRef.current; - const containerRect = container.getBoundingClientRect(); - const itemRect = activeItem.getBoundingClientRect(); - - const isVisible = - itemRect.top >= containerRect.top && - itemRect.bottom <= containerRect.bottom; - - if (!isVisible) { - // Set flag before programmatically scrolling - activeItem.scrollIntoView({ behavior: "smooth", block: "center" }); - } - } - }, [processedTranscripts, autoscroll, userScrolledAway]); // Added userScrolledAway dependency - - const handleCopyTimestamp = useCallback((item: ProcessedTranscriptItem) => { - if (!item.ts || !item.speaker || !item.text) { - return; - } - navigator.clipboard.writeText(`${item.ts} ${item.speaker}: ${item.text}`); - }, []); - - // Use the custom component if provided, otherwise use the default Text component - const TextComponent = transcriptComponent || Text; - - return ( -
- {toolbar && ( - - )} -
setUserScrolledAway(true)} - onTouchStart={() => setUserScrolledAway(true)} - onKeyDown={() => setUserScrolledAway(true)} - onKeyUp={() => setUserScrolledAway(true)} - > - {!processedTranscripts.length && - !searchTerm && - (emptyState ? ( - emptyState - ) : ( -
- - Transcript not available -
- ))} - {!processedTranscripts.length && searchTerm && ( -
- No results found for "{searchTerm}". -
- )} - {processedTranscripts.map((item, idx) => ( -
setFocusedIndex(idx)} - onMouseLeave={() => setFocusedIndex(-1)} - > - {showTimestamps && item.ts && ( -
- - {item.ts} - - - {setCurrentTime && ( - { - e.stopPropagation(); - setCurrentTime(item.start / 1000 + 1); - setUserScrolledAway(false); - if (onTimestampClick) { - onTimestampClick(item.start / 1000 + 1); - } - }} - className="ny:play-btn ny:h-4 ny:w-4 ny:text-gray-400 ny:hover:text-blue-600 ny:cursor-pointer" - /> - )} - { - e.stopPropagation(); - handleCopyTimestamp(item); - }} - className="ny:copy-btn ny:h-4 ny:w-4 ny:text-gray-400 ny:hover:text-blue-600 ny:cursor-pointer" - /> - -
- )} -
- {showSpeaker && ( -
- {item.speaker} -
- )} -
- -
-
-
- ))} - - {/* Resume Autoscroll Button */} - {transcript.length > 0 && - autoscroll && - userScrolledAway && - isPlaying && ( - - )} -
-
- ); -}; - -export { Transcript }; diff --git a/packages/react/src/notetaker/VideoPlayer/VideoPlayer.spec.tsx b/packages/react/src/notetaker/VideoPlayer/VideoPlayer.spec.tsx deleted file mode 100644 index a48db01..0000000 --- a/packages/react/src/notetaker/VideoPlayer/VideoPlayer.spec.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from "react"; -import { render } from "@testing-library/react"; - -import { VideoPlayer, videoPlayerStore as videoStore } from "./VideoPlayer"; - -describe("VideoPlayer", () => { - test("renders the video player component without crashing", () => { - const testVideoUrl = "test-video.mp4"; - const { container } = render(); - const videoElement = container.querySelector("video source"); - expect(videoElement).toBeTruthy(); - expect(videoElement?.getAttribute("src")).toBe(testVideoUrl); - }); -}); diff --git a/packages/react/src/notetaker/VideoPlayer/VideoPlayer.tsx b/packages/react/src/notetaker/VideoPlayer/VideoPlayer.tsx deleted file mode 100644 index 4b2d532..0000000 --- a/packages/react/src/notetaker/VideoPlayer/VideoPlayer.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import React, { useRef, useEffect, useCallback } from "react"; - -import { tv } from "tailwind-variants"; -import { create } from "zustand"; - -interface VideoStore { - currentTime: number; - /** Whether the video is currently playing */ - isPlaying: boolean; - setCurrentTime: (time: number) => void; - setIsPlaying: (playing: boolean) => void; -} - -export const videoPlayerStore = create((set) => ({ - currentTime: 0, - isPlaying: false, - setCurrentTime: (time: number) => set({ currentTime: time }), - setIsPlaying: (playing: boolean) => set({ isPlaying: playing }), -})); - -/** - * Props for the VideoPlayer component. - */ -export interface VideoPlayerProps { - /** - * The URL of the video to play. If provided, a tag will be rendered with this URL. - */ - videoUrl: string; - /** - * Additional class name(s) for the video element. - */ - className?: string; - /** - * Poster image URL to show before the video plays. - */ - poster?: string; - /** - * Whether the video should start playing automatically. - */ - autoPlay?: boolean; - /** - * Whether the video should be muted by default. - */ - muted?: boolean; - /** - * Whether the video should loop after ending. - */ - loop?: boolean; - /** - * The MIME type of the video (e.g., 'video/mp4'). Used for the tag if videoUrl is provided. - */ - videoType?: string; - /** - * Callback for every time update, receives the current playback time in seconds. - */ - onTimeUpdate?: (currentTime: number) => void; - /** - * Callback when the user seeks to a new time, receives the new time in seconds. - */ - onSeek?: (newTime: number) => void; - /** - * Callback when the video starts playing. - */ - onPlay?: () => void; - /** - * Callback when the video is paused. - */ - onPause?: () => void; - /** - * Callback when the video playback ends. - */ - onEnded?: () => void; -} - -const videoContainer = tv({ - base: "ny:w-full", - variants: {}, -}); - -export const VideoPlayer: React.FC = ({ - videoUrl, - className, - poster, - autoPlay = false, - muted = false, - loop = false, - onTimeUpdate, - onSeek, - onPlay, - onPause, - onEnded, - videoType, -}) => { - const videoRef = useRef(null); - const { currentTime, setCurrentTime, setIsPlaying } = videoPlayerStore(); - - const handleTimeUpdate = useCallback(() => { - if (videoRef.current) { - setCurrentTime(videoRef.current.currentTime); - if (onTimeUpdate) { - onTimeUpdate(videoRef.current.currentTime); - } - } - }, [setCurrentTime, onTimeUpdate]); - - const handleSeeked = useCallback(() => { - if (videoRef.current && onSeek) { - onSeek(videoRef.current.currentTime); - } - }, [onSeek]); - - // Handlers to track play / pause / end state - const handlePlay = useCallback(() => { - setIsPlaying(true); - if (onPlay) { - onPlay(); - } - }, [setIsPlaying, onPlay]); - - const handlePause = useCallback(() => { - setIsPlaying(false); - if (onPause) { - onPause(); - } - }, [setIsPlaying, onPause]); - - const handleEnded = useCallback(() => { - setIsPlaying(false); - if (onEnded) { - onEnded(); - } - }, [setIsPlaying, onEnded]); - - // Effect to synchronize video playback position with store's currentTime - useEffect(() => { - if (videoRef.current) { - const delta = Math.abs(videoRef.current.currentTime - currentTime); - if (delta > 1) { - videoRef.current.currentTime = currentTime; - videoRef.current.play(); - } - } - }, [currentTime]); - - useEffect(() => { - setCurrentTime(0); - }, [videoUrl, setCurrentTime]); - - return ( - - ); -}; diff --git a/packages/react/src/notetaker/index.ts b/packages/react/src/notetaker/index.ts deleted file mode 100644 index e4c43f8..0000000 --- a/packages/react/src/notetaker/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Components -export { Transcript } from "./Transcript/Transcript"; -export { VideoPlayer } from "./VideoPlayer/VideoPlayer"; -export { CalendarSync } from "./CalendarSync/CalendarSync"; -export { SendNotetaker } from "./SendNotetaker/SendNotetaker"; - -// Stores -export { provider } from "./lib/store"; -export { calendarSyncStore } from "./CalendarSync/CalendarSync"; -export { sendNotetakerStore } from "./SendNotetaker/SendNotetaker"; -export { videoPlayerStore } from "./VideoPlayer/VideoPlayer"; - -// Types -export type { - Transcript as TranscriptType, - TranscriptItem, -} from "./Transcript/Transcript"; - -// Styles -import "./style.css"; diff --git a/packages/react/src/notetaker/lib/constants.ts b/packages/react/src/notetaker/lib/constants.ts deleted file mode 100644 index 9452283..0000000 --- a/packages/react/src/notetaker/lib/constants.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { MeetingFilter, RecordingType } from "../types"; -import { - VideoIcon, - MicIcon, - FileTextIcon, - ScrollTextIcon, - ListTodoIcon, - type LucideIcon, -} from "lucide-react"; - -export const DEFAULT_RECORDING_TYPES = [ - RecordingType.Video, - RecordingType.Audio, - RecordingType.Transcript, - RecordingType.Summary, - RecordingType.ActionItems, -]; - -export const RECORDING_TYPES: { - value: RecordingType; - label: string; - icon: LucideIcon; -}[] = [ - { value: RecordingType.Video, label: "Video", icon: VideoIcon }, - { value: RecordingType.Audio, label: "Audio", icon: MicIcon }, - { value: RecordingType.Transcript, label: "Transcript", icon: FileTextIcon }, - { value: RecordingType.Summary, label: "Summary", icon: ScrollTextIcon }, - { - value: RecordingType.ActionItems, - label: "Action Items", - icon: ListTodoIcon, - }, -]; - -export const MEETING_TYPES: { value: MeetingFilter; label: string }[] = [ - { value: MeetingFilter.All, label: "All" }, - { value: MeetingFilter.Internal, label: "Internal" }, - { value: MeetingFilter.External, label: "External" }, - { value: MeetingFilter.MyMeetings, label: "My meetings" }, - { value: MeetingFilter.Participant, label: "As participant" }, -]; diff --git a/packages/react/src/notetaker/lib/http-client.ts b/packages/react/src/notetaker/lib/http-client.ts deleted file mode 100644 index 899cc11..0000000 --- a/packages/react/src/notetaker/lib/http-client.ts +++ /dev/null @@ -1,15 +0,0 @@ -import axios from "axios"; -import { provider } from "./store"; -const client = axios.create(); - -client.interceptors.request.use((req) => { - const state = provider.getState(); - req.baseURL = state.apiUrl; - const token = state.getAccessToken(); - if (token) { - req.headers.Authorization = `Bearer ${token}`; - } - return req; -}); - -export default client; diff --git a/packages/react/src/notetaker/lib/primitives.ts b/packages/react/src/notetaker/lib/primitives.ts deleted file mode 100644 index 9e6d170..0000000 --- a/packages/react/src/notetaker/lib/primitives.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { tv } from "tailwind-variants"; - -type NylasTw = `ny:${string}`; - -export const label = tv({ - base: ["ny:text-sm", "ny:text-gray-500", "ny:mb-1", "ny:block"], -}); - -export const button = tv({ - base: [ - "ny:border", - "ny:text-sm", - "ny:rounded-lg", - "ny:px-4", - "ny:border-gray-200", - "ny:text-gray-700", - "ny:hover:bg-gray-50", - "ny:transition-all", - "ny:duration-200", - "ny:transition-colors", - "ny:h-10", - "ny:flex", - "ny:items-center", - "ny:space-x-1", - "ny:text-sm", - "ny:text-gray-700", - "ny:hover:text-gray-900", - "ny:hover:bg-gray-100", - "ny:outline-none", - "ny:cursor-pointer", - ] satisfies NylasTw[], - variants: { - size: { - small: ["ny:text-sm", "ny:h-8"] satisfies NylasTw[], - }, - variant: { - primary: [ - "ny:bg-primary-500", - "ny:text-white", - "ny:border-primary-500", - "ny:hover:bg-primary-600", - "ny:hover:text-white", - "ny:shadow-md", - "ny:shadow-primary-100", - "ny:outline-none", - ] satisfies NylasTw[], - link: [ - "ny:bg-transparent", - "ny:text-primary-500", - "ny:hover:text-primary-600", - "ny:border-none", - "ny:font-medium", - "ny:cursor-pointer", - ] satisfies NylasTw[], - }, - color: { - danger: ["ny:text-red-500", "ny:hover:text-red-600"] satisfies NylasTw[], - }, - active: { - true: [ - "ny:bg-primary-50", - "ny:border-primary-500", - "ny:text-primary-500", - "ny:hover:bg-primary-100", - "ny:shadow-md", - "ny:shadow-primary-100", - ] satisfies NylasTw[], - }, - disabled: { - true: [ - "ny:border-gray-100", - "ny:text-gray-400", - "ny:hover:bg-gray-100", - "ny:bg-gray-100", - "ny:shadow-none", - "ny:cursor-not-allowed", - ] satisfies NylasTw[], - }, - }, - compoundVariants: [ - { - variant: "primary", - disabled: true, - class: [ - "ny:bg-gray-100", - "ny:text-gray-400", - "ny:cursor-not-allowed", - "ny:hover:text-gray-400", - ] satisfies NylasTw[], - }, - { - variant: "link", - disabled: true, - class: [ - "ny:bg-transparent", - "ny:hover:bg-transparent", - "ny:text-gray-400", - "ny:hover:text-gray-400", - "ny:hover:bg-none", - "ny:cursor-not-allowed", - ] satisfies NylasTw[], - }, - { - color: "danger", - variant: "link", - class: ["ny:hover:bg-red-50"], - }, - ], -}); - -export const input = tv({ - base: [ - "ny:border", - "ny:focus:outline-primary-500", - "ny:block", - "ny:w-full", - "ny:rounded-lg", - "ny:h-8", - "ny:border-gray-200", - "ny:px-4", - "ny:text-gray-900", - "ny:py-1", - "ny:text-sm", - ] satisfies NylasTw[], - variants: { - disabled: { - true: [ - "ny:bg-gray-100", - "ny:border-gray-200", - "ny:text-gray-400", - "ny:cursor-not-allowed", - ] satisfies NylasTw[], - }, - }, -}); diff --git a/packages/react/src/notetaker/lib/store.ts b/packages/react/src/notetaker/lib/store.ts deleted file mode 100644 index bdebbd6..0000000 --- a/packages/react/src/notetaker/lib/store.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { create } from "zustand"; - -export interface ProviderStore { - apiUrl: string; - setApiUrl: (url: string) => void; - getAccessToken: () => string; -} - -export const provider = create((set) => ({ - apiUrl: "https://api.us.nylas.com", - setApiUrl: (url: "us" | "eu" | string = "us") => { - let apiUrl = ""; - if (url === "us") { - apiUrl = "https://api.us.nylas.com"; - } else if (url === "eu") { - apiUrl = "https://api.eu.nylas.com"; - } else if (typeof url === "string" && url.startsWith("http")) { - apiUrl = url; - } else { - console.error( - "Invalid API URL provided to the Nylas provider component, url falls back to US api endpoint.", - url, - ); - // fallback to default or throw error - apiUrl = "https://api.us.nylas.com"; - } - set({ apiUrl }); - }, - getAccessToken: () => { - return typeof localStorage !== "undefined" - ? localStorage.getItem("nylas-access-token") || "" - : ""; - }, -})); diff --git a/packages/react/src/notetaker/style.css b/packages/react/src/notetaker/style.css deleted file mode 100644 index 8a30afc..0000000 --- a/packages/react/src/notetaker/style.css +++ /dev/null @@ -1,18 +0,0 @@ -@layer theme, base, components, utilities; - -@import "tailwindcss/theme.css" layer(theme) prefix(ny); -@import "tailwindcss/utilities.css" layer(utilities) prefix(ny); - -@theme { - --color-primary-50: #f0f4ff; - --color-primary-100: #e0e9ff; - --color-primary-200: #c7d4ff; - --color-primary-300: #a3b9ff; - --color-primary-400: #7a94ff; - --color-primary-500: #4069e1; - --color-primary-600: #2d4fc7; - --color-primary-700: #253ea3; - --color-primary-800: #1f3382; - --color-primary-900: #1a2b6b; - --color-primary-950: #111a42; -} diff --git a/packages/react/src/notetaker/types.ts b/packages/react/src/notetaker/types.ts deleted file mode 100644 index 34ccd35..0000000 --- a/packages/react/src/notetaker/types.ts +++ /dev/null @@ -1,47 +0,0 @@ -export enum RecordingType { - Video = "video", - Audio = "audio", - Transcript = "transcript", - Summary = "summary", - ActionItems = "action_items", -} - -export enum MeetingFilter { - All = "all", - Internal = "internal", - External = "external", - MyMeetings = "own_events", - Participant = "participant_only", -} - -export interface Notetaker { - id: string; - name: string; - meeting_link: string; - join_time: number; - meeting_settings: { - video_recording: boolean; - audio_recording: boolean; - transcription: boolean; - }; -} - -interface CalendarNotetaker extends Partial { - rules?: { - event_selection?: MeetingFilter[]; - }; -} - -export interface Calendar { - name: string; - timezone: string; - hex_color?: string; - hex_foreground_color?: string; - grant_id: string; - id: string; - object: "calendar"; - is_primary: boolean; - read_only: boolean; - is_owned_by_user: boolean; - notetaker: CalendarNotetaker; -} From 727dd47448c5035dce587c2f3cdb65d4182353c6 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 13:32:08 +0100 Subject: [PATCH 11/16] CLEAN --- packages/react/src/index.ts | 1 - packages/react/src/main.tsx | 8 +------- packages/react/src/notetaker.ts | 2 -- 3 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 packages/react/src/notetaker.ts diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 819e279..3d7e04f 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -1,4 +1,3 @@ // Main entry point - re-exports from all modules for backward compatibility export * from "./elements"; -export * from "./notetaker"; export * from "./utils"; diff --git a/packages/react/src/main.tsx b/packages/react/src/main.tsx index 685b3c5..ab1ef48 100644 --- a/packages/react/src/main.tsx +++ b/packages/react/src/main.tsx @@ -3,8 +3,6 @@ import React from "react"; import { createRoot } from "react-dom/client"; -import { Transcript } from "./notetaker"; -import "./notetaker/style.css"; const styles: { [key: string]: React.CSSProperties } = { container: { @@ -87,11 +85,7 @@ const transcriptData = [ }, ]; -const App: React.FC = () => ( -
- -
-); +const App: React.FC = () =>
; const rootElement = document.getElementById("root"); if (rootElement) { diff --git a/packages/react/src/notetaker.ts b/packages/react/src/notetaker.ts deleted file mode 100644 index b6d47da..0000000 --- a/packages/react/src/notetaker.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Entry point for Nylas Notetaker components -export * from "./notetaker/index"; From 829e10f00085bf7d2f3fbbf07879511ef2f8486f Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 13:45:06 +0100 Subject: [PATCH 12/16] add changeset --- .changeset/add-react-and-tweak-connect.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .changeset/add-react-and-tweak-connect.md diff --git a/.changeset/add-react-and-tweak-connect.md b/.changeset/add-react-and-tweak-connect.md new file mode 100644 index 0000000..8525ac0 --- /dev/null +++ b/.changeset/add-react-and-tweak-connect.md @@ -0,0 +1,15 @@ +--- +"@nylas/react": major +"@nylas/connect": patch +--- + +Add `@nylas/react` to the monorepo with initial components, hooks, and build setup. + +- Introduces React utilities for integrating with the Nylas platform +- Includes basic docs and distribution configuration + +Cosmetic updates to `@nylas/connect`. + +- Style and documentation polish; no functional changes + + From 8394957563d8855aef4c90efeeadbed432fd00e4 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 15:04:20 +0100 Subject: [PATCH 13/16] pnpm changes --- pnpm-lock.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b79af1f..b963925 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,9 +32,9 @@ importers: '@vitest/coverage-v8': specifier: ^2.1.9 version: 2.1.9(vitest@2.1.9(@types/node@20.19.13)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.30.1)) - happy-dom: - specifier: ^15.10.2 - version: 15.11.7 + jsdom: + specifier: ^26.0.0 + version: 26.1.0 typescript: specifier: ^5.3.3 version: 5.9.2 @@ -4736,6 +4736,7 @@ snapshots: entities: 4.5.0 webidl-conversions: 7.0.0 whatwg-mimetype: 3.0.0 + optional: true has-flag@4.0.0: {} @@ -5805,7 +5806,8 @@ snapshots: dependencies: iconv-lite: 0.6.3 - whatwg-mimetype@3.0.0: {} + whatwg-mimetype@3.0.0: + optional: true whatwg-mimetype@4.0.0: {} From f1aa21552abf2d69bbb67c4e87aec52c379843e4 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 15:17:56 +0100 Subject: [PATCH 14/16] fix build --- packages/react/vite.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react/vite.config.ts b/packages/react/vite.config.ts index ba8c06e..81fbfe1 100644 --- a/packages/react/vite.config.ts +++ b/packages/react/vite.config.ts @@ -13,7 +13,6 @@ export default defineConfig({ index: resolve(__dirname, "src/index.ts"), connect: resolve(__dirname, "src/connect.ts"), elements: resolve(__dirname, "src/elements.ts"), - notetaker: resolve(__dirname, "src/notetaker.ts"), utils: resolve(__dirname, "src/utils.ts"), }, formats: ["es", "cjs"], From c0d2c79aada227cf394884a4ef7ca53b5fcb6482 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Mon, 27 Oct 2025 15:23:50 +0100 Subject: [PATCH 15/16] fix the build order --- nx.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nx.json b/nx.json index 2959c35..44aef0a 100644 --- a/nx.json +++ b/nx.json @@ -25,7 +25,8 @@ }, "typecheck": { "cache": true, - "inputs": ["default", "^default"] + "inputs": ["default", "^default"], + "dependsOn": ["^build"] }, "clean": { "cache": false From 0471fc58f484955525c75138733830576a1bb4e4 Mon Sep 17 00:00:00 2001 From: Dan Radenkovic Date: Thu, 30 Oct 2025 12:01:54 +0100 Subject: [PATCH 16/16] Update packages/react/vite.config.ts Co-authored-by: Aaron de Mello <314152+AaronDDM@users.noreply.github.com> --- packages/react/vite.config.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/react/vite.config.ts b/packages/react/vite.config.ts index 81fbfe1..3bd5a22 100644 --- a/packages/react/vite.config.ts +++ b/packages/react/vite.config.ts @@ -29,10 +29,6 @@ export default defineConfig({ "react-dom/client", "@nylas/core", "@nylas/connect", - "@nylas/web-elements", - "@nylas/web-elements/components", - "@nylas/web-elements/loader", - /^@nylas\/web-elements\/dist\/components\//, "@stencil/react-output-target/runtime", ], output: {