@mantine/spotlight 9.1.1 → 9.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"Spotlight.cjs","names":["spotlightStore","defaultSpotlightFilter","limitActions","isActionsGroup","SpotlightAction","SpotlightActionsGroup","SpotlightRoot","SpotlightSearch","SpotlightActionsList","SpotlightEmpty","classes","SpotlightFooter","spotlight"],"sources":["../src/Spotlight.tsx"],"sourcesContent":["import {\n factory,\n Factory,\n getDefaultZIndex,\n ScrollAreaAutosizeProps,\n useProps,\n} from '@mantine/core';\nimport { useUncontrolled } from '@mantine/hooks';\nimport { defaultSpotlightFilter } from './default-spotlight-filter';\nimport { isActionsGroup } from './is-actions-group';\nimport { limitActions } from './limit-actions';\nimport { spotlight, spotlightStore } from './spotlight.store';\nimport {\n SpotlightAction,\n SpotlightActionProps,\n type SpotlightActionStylesNames,\n} from './SpotlightAction';\nimport {\n SpotlightActionsGroup,\n type SpotlightActionsGroupProps,\n type SpotlightActionsGroupStylesNames,\n} from './SpotlightActionsGroup';\nimport {\n SpotlightActionsList,\n type SpotlightActionsListProps,\n type SpotlightActionsListStylesNames,\n} from './SpotlightActionsList';\nimport {\n SpotlightEmpty,\n type SpotlightEmptyProps,\n type SpotlightEmptyStylesNames,\n} from './SpotlightEmpty';\nimport {\n SpotlightFooter,\n type SpotlightFooterProps,\n type SpotlightFooterStylesNames,\n} from './SpotlightFooter';\nimport { SpotlightRoot, SpotlightRootProps, SpotlightRootStylesNames } from './SpotlightRoot';\nimport {\n SpotlightSearch,\n SpotlightSearchProps,\n type SpotlightSearchStylesNames,\n} from './SpotlightSearch';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightFilterFunction = (\n query: string,\n actions: SpotlightActions[]\n) => SpotlightActions[];\n\nexport interface SpotlightActionData extends SpotlightActionProps {\n id: string;\n group?: string;\n}\n\nexport interface SpotlightActionGroupData {\n group: string;\n actions: SpotlightActionData[];\n}\n\nexport type SpotlightActions = SpotlightActionData | SpotlightActionGroupData;\n\nexport type SpotlightStylesNames = SpotlightRootStylesNames;\n\nexport interface SpotlightProps extends SpotlightRootProps {\n /** Props passed down to the `Spotlight.Search` */\n searchProps?: SpotlightSearchProps;\n\n /** Actions data, passed down to `Spotlight.Action` component */\n actions: SpotlightActions[];\n\n /** Function to filter actions data based on search query, by default actions are filtered by title, description and keywords */\n filter?: SpotlightFilterFunction;\n\n /** Message displayed when none of the actions match given `filter` */\n nothingFound?: React.ReactNode;\n\n /** Determines whether search query should be highlighted in action label @default false */\n highlightQuery?: boolean;\n\n /** Maximum number of actions displayed at a time @default Infinity */\n limit?: number;\n\n /** Props passed down to the `ScrollArea` component */\n scrollAreaProps?: Partial<ScrollAreaAutosizeProps>;\n}\n\nexport type SpotlightFactory = Factory<{\n props: SpotlightProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightStylesNames;\n staticComponents: {\n Search: typeof SpotlightSearch;\n ActionsList: typeof SpotlightActionsList;\n Action: typeof SpotlightAction;\n Empty: typeof SpotlightEmpty;\n Footer: typeof SpotlightFooter;\n ActionsGroup: typeof SpotlightActionsGroup;\n Root: typeof SpotlightRoot;\n open: typeof spotlight.open;\n close: typeof spotlight.close;\n toggle: typeof spotlight.toggle;\n };\n}>;\n\nconst defaultProps = {\n size: 600,\n yOffset: 80,\n limit: Infinity,\n zIndex: getDefaultZIndex('max'),\n overlayProps: { backgroundOpacity: 0.35, blur: 7 },\n transitionProps: { duration: 200, transition: 'pop' },\n store: spotlightStore,\n filter: defaultSpotlightFilter,\n clearQueryOnClose: true,\n closeOnActionTrigger: true,\n shortcut: 'mod + K',\n} satisfies Partial<SpotlightProps>;\n\nexport const Spotlight = factory<SpotlightFactory>((_props) => {\n const props = useProps('Spotlight', defaultProps, _props);\n const {\n searchProps,\n filter,\n query,\n onQueryChange,\n actions,\n nothingFound,\n highlightQuery,\n limit,\n scrollAreaProps,\n ...others\n } = props;\n\n const [_query, setQuery] = useUncontrolled({\n value: query,\n defaultValue: '',\n finalValue: '',\n onChange: onQueryChange,\n });\n\n const filteredActions = limitActions(filter(_query, actions), limit).map((item) => {\n if (isActionsGroup(item)) {\n const items = item.actions.map(({ id, ...actionData }) => (\n <SpotlightAction key={id} highlightQuery={highlightQuery} {...actionData} />\n ));\n\n return (\n <SpotlightActionsGroup key={item.group} label={item.group}>\n {items}\n </SpotlightActionsGroup>\n );\n }\n\n return <SpotlightAction key={item.id} highlightQuery={highlightQuery} {...item} />;\n });\n\n return (\n <SpotlightRoot {...others} query={_query} onQueryChange={setQuery}>\n <SpotlightSearch {...searchProps} />\n {filteredActions.length > 0 && (\n <SpotlightActionsList {...(scrollAreaProps as any)}>{filteredActions}</SpotlightActionsList>\n )}\n {filteredActions.length === 0 && nothingFound && (\n <SpotlightEmpty>{nothingFound}</SpotlightEmpty>\n )}\n </SpotlightRoot>\n );\n});\n\nSpotlight.classes = classes;\nSpotlight.displayName = '@mantine/spotlight/Spotlight';\nSpotlight.Search = SpotlightSearch;\nSpotlight.ActionsList = SpotlightActionsList;\nSpotlight.Action = SpotlightAction;\nSpotlight.Empty = SpotlightEmpty;\nSpotlight.ActionsGroup = SpotlightActionsGroup;\nSpotlight.Footer = SpotlightFooter;\nSpotlight.Root = SpotlightRoot;\nSpotlight.open = spotlight.open;\nSpotlight.close = spotlight.close;\nSpotlight.toggle = spotlight.toggle;\n\nexport namespace Spotlight {\n export type Props = SpotlightProps;\n export type StylesNames = SpotlightStylesNames;\n export type Factory = SpotlightFactory;\n export type FilterFunction = SpotlightFilterFunction;\n export type ActionData = SpotlightActionData;\n export type ActionGroupData = SpotlightActionGroupData;\n\n export namespace Action {\n export type Props = SpotlightActionProps;\n export type StylesNames = SpotlightActionStylesNames;\n }\n\n export namespace ActionsGroup {\n export type Props = SpotlightActionsGroupProps;\n export type StylesNames = SpotlightActionsGroupStylesNames;\n }\n\n export namespace ActionsList {\n export type Props = SpotlightActionsListProps;\n export type StylesNames = SpotlightActionsListStylesNames;\n }\n\n export namespace Empty {\n export type Props = SpotlightEmptyProps;\n export type StylesNames = SpotlightEmptyStylesNames;\n }\n\n export namespace Footer {\n export type Props = SpotlightFooterProps;\n export type StylesNames = SpotlightFooterStylesNames;\n }\n\n export namespace Search {\n export type Props = SpotlightSearchProps;\n export type StylesNames = SpotlightSearchStylesNames;\n }\n\n export namespace Root {\n export type Props = SpotlightRootProps;\n export type StylesNames = SpotlightRootStylesNames;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyGA,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,OAAO;CACP,SAAA,GAAA,cAAA,kBAAyB,MAAM;CAC/B,cAAc;EAAE,mBAAmB;EAAM,MAAM;EAAG;CAClD,iBAAiB;EAAE,UAAU;EAAK,YAAY;EAAO;CACrD,OAAOA,wBAAAA;CACP,QAAQC,iCAAAA;CACR,mBAAmB;CACnB,sBAAsB;CACtB,UAAU;CACX;AAED,MAAa,aAAA,GAAA,cAAA,UAAuC,WAAW;CAE7D,MAAM,EACJ,aACA,QACA,OACA,eACA,SACA,cACA,gBACA,OACA,iBACA,GAAG,YAAA,GAAA,cAAA,UAXkB,aAAa,cAAc,OAAO;CAczD,MAAM,CAAC,QAAQ,aAAA,GAAA,eAAA,iBAA4B;EACzC,OAAO;EACP,cAAc;EACd,YAAY;EACZ,UAAU;EACX,CAAC;CAEF,MAAM,kBAAkBC,sBAAAA,aAAa,OAAO,QAAQ,QAAQ,EAAE,MAAM,CAAC,KAAK,SAAS;AACjF,MAAIC,yBAAAA,eAAe,KAAK,EAAE;GACxB,MAAM,QAAQ,KAAK,QAAQ,KAAK,EAAE,IAAI,GAAG,iBACvC,iBAAA,GAAA,kBAAA,KAACC,wBAAAA,iBAAD;IAA0C;IAAgB,GAAI;IAAc,EAAtD,GAAsD,CAC5E;AAEF,UACE,iBAAA,GAAA,kBAAA,KAACC,8BAAAA,uBAAD;IAAwC,OAAO,KAAK;cACjD;IACqB,EAFI,KAAK,MAET;;AAI5B,SAAO,iBAAA,GAAA,kBAAA,KAACD,wBAAAA,iBAAD;GAA+C;GAAgB,GAAI;GAAQ,EAArD,KAAK,GAAgD;GAClF;AAEF,QACE,iBAAA,GAAA,kBAAA,MAACE,sBAAAA,eAAD;EAAe,GAAI;EAAQ,OAAO;EAAQ,eAAe;YAAzD;GACE,iBAAA,GAAA,kBAAA,KAACC,wBAAAA,iBAAD,EAAiB,GAAI,aAAe,CAAA;GACnC,gBAAgB,SAAS,KACxB,iBAAA,GAAA,kBAAA,KAACC,6BAAAA,sBAAD;IAAsB,GAAK;cAA0B;IAAuC,CAAA;GAE7F,gBAAgB,WAAW,KAAK,gBAC/B,iBAAA,GAAA,kBAAA,KAACC,uBAAAA,gBAAD,EAAA,UAAiB,cAA8B,CAAA;GAEnC;;EAElB;AAEF,UAAU,UAAUC,yBAAAA;AACpB,UAAU,cAAc;AACxB,UAAU,SAASH,wBAAAA;AACnB,UAAU,cAAcC,6BAAAA;AACxB,UAAU,SAASJ,wBAAAA;AACnB,UAAU,QAAQK,uBAAAA;AAClB,UAAU,eAAeJ,8BAAAA;AACzB,UAAU,SAASM,wBAAAA;AACnB,UAAU,OAAOL,sBAAAA;AACjB,UAAU,OAAOM,wBAAAA,UAAU;AAC3B,UAAU,QAAQA,wBAAAA,UAAU;AAC5B,UAAU,SAASA,wBAAAA,UAAU"}
1
+ {"version":3,"file":"Spotlight.cjs","names":["spotlightStore","defaultSpotlightFilter","limitActions","isActionsGroup","SpotlightAction","SpotlightActionsGroup","SpotlightRoot","SpotlightSearch","SpotlightActionsList","SpotlightEmpty","classes","SpotlightFooter","spotlight"],"sources":["../src/Spotlight.tsx"],"sourcesContent":["import {\n factory,\n Factory,\n getDefaultZIndex,\n ScrollAreaAutosizeProps,\n useProps,\n} from '@mantine/core';\nimport { useUncontrolled } from '@mantine/hooks';\nimport { defaultSpotlightFilter } from './default-spotlight-filter';\nimport { isActionsGroup } from './is-actions-group';\nimport { limitActions } from './limit-actions';\nimport { spotlight, spotlightStore } from './spotlight.store';\nimport {\n SpotlightAction,\n SpotlightActionProps,\n type SpotlightActionStylesNames,\n} from './SpotlightAction';\nimport {\n SpotlightActionsGroup,\n type SpotlightActionsGroupProps,\n type SpotlightActionsGroupStylesNames,\n} from './SpotlightActionsGroup';\nimport {\n SpotlightActionsList,\n type SpotlightActionsListProps,\n type SpotlightActionsListStylesNames,\n} from './SpotlightActionsList';\nimport {\n SpotlightEmpty,\n type SpotlightEmptyProps,\n type SpotlightEmptyStylesNames,\n} from './SpotlightEmpty';\nimport {\n SpotlightFooter,\n type SpotlightFooterProps,\n type SpotlightFooterStylesNames,\n} from './SpotlightFooter';\nimport { SpotlightRoot, SpotlightRootProps, SpotlightRootStylesNames } from './SpotlightRoot';\nimport {\n SpotlightSearch,\n SpotlightSearchProps,\n type SpotlightSearchStylesNames,\n} from './SpotlightSearch';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightFilterFunction = (\n query: string,\n actions: SpotlightActions[]\n) => SpotlightActions[];\n\nexport interface SpotlightActionData extends SpotlightActionProps {\n id: string;\n group?: string;\n}\n\nexport interface SpotlightActionGroupData {\n group: string;\n actions: SpotlightActionData[];\n}\n\nexport type SpotlightActions = SpotlightActionData | SpotlightActionGroupData;\n\nexport type SpotlightStylesNames = SpotlightRootStylesNames;\n\nexport interface SpotlightProps extends SpotlightRootProps {\n /** Props passed down to the `Spotlight.Search` */\n searchProps?: SpotlightSearchProps;\n\n /** Actions data, passed down to `Spotlight.Action` component */\n actions: SpotlightActions[];\n\n /** Function to filter actions data based on search query, by default actions are filtered by title, description and keywords */\n filter?: SpotlightFilterFunction;\n\n /** Message displayed when none of the actions match given `filter` */\n nothingFound?: React.ReactNode;\n\n /** Determines whether search query should be highlighted in action label @default false */\n highlightQuery?: boolean;\n\n /** Maximum number of actions displayed at a time @default Infinity */\n limit?: number;\n\n /** Props passed down to the `ScrollArea` component */\n scrollAreaProps?: Partial<ScrollAreaAutosizeProps>;\n}\n\nexport type SpotlightFactory = Factory<{\n props: SpotlightProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightStylesNames;\n staticComponents: {\n Search: typeof SpotlightSearch;\n ActionsList: typeof SpotlightActionsList;\n Action: typeof SpotlightAction;\n Empty: typeof SpotlightEmpty;\n Footer: typeof SpotlightFooter;\n ActionsGroup: typeof SpotlightActionsGroup;\n Root: typeof SpotlightRoot;\n open: typeof spotlight.open;\n close: typeof spotlight.close;\n toggle: typeof spotlight.toggle;\n };\n}>;\n\nconst defaultProps = {\n size: 600,\n yOffset: 80,\n limit: Infinity,\n zIndex: getDefaultZIndex('max'),\n overlayProps: { backgroundOpacity: 0.35, blur: 7 },\n transitionProps: { duration: 200, transition: 'pop' },\n store: spotlightStore,\n filter: defaultSpotlightFilter,\n clearQueryOnClose: true,\n closeOnActionTrigger: true,\n shortcut: 'mod + K',\n} satisfies Partial<SpotlightProps>;\n\nexport const Spotlight = factory<SpotlightFactory>((_props) => {\n const props = useProps('Spotlight', defaultProps, _props);\n const {\n searchProps,\n filter,\n query,\n onQueryChange,\n actions,\n nothingFound,\n highlightQuery,\n limit,\n scrollAreaProps,\n ...others\n } = props;\n\n const [_query, setQuery] = useUncontrolled({\n value: query,\n defaultValue: '',\n finalValue: '',\n onChange: onQueryChange,\n });\n\n const filteredActions = limitActions(filter(_query, actions), limit).map((item) => {\n if (isActionsGroup(item)) {\n const items = item.actions.map(({ id, ...actionData }) => (\n <SpotlightAction key={id} highlightQuery={highlightQuery} {...actionData} />\n ));\n\n return (\n <SpotlightActionsGroup key={item.group} label={item.group}>\n {items}\n </SpotlightActionsGroup>\n );\n }\n\n return <SpotlightAction key={item.id} highlightQuery={highlightQuery} {...item} />;\n });\n\n return (\n <SpotlightRoot {...others} query={_query} onQueryChange={setQuery}>\n <SpotlightSearch {...searchProps} />\n {filteredActions.length > 0 && (\n <SpotlightActionsList {...(scrollAreaProps as any)}>{filteredActions}</SpotlightActionsList>\n )}\n {filteredActions.length === 0 && nothingFound && (\n <SpotlightEmpty>{nothingFound}</SpotlightEmpty>\n )}\n </SpotlightRoot>\n );\n});\n\nSpotlight.classes = classes;\nSpotlight.displayName = '@mantine/spotlight/Spotlight';\nSpotlight.Search = SpotlightSearch;\nSpotlight.ActionsList = SpotlightActionsList;\nSpotlight.Action = SpotlightAction;\nSpotlight.Empty = SpotlightEmpty;\nSpotlight.ActionsGroup = SpotlightActionsGroup;\nSpotlight.Footer = SpotlightFooter;\nSpotlight.Root = SpotlightRoot;\nSpotlight.open = spotlight.open;\nSpotlight.close = spotlight.close;\nSpotlight.toggle = spotlight.toggle;\n\nexport namespace Spotlight {\n export type Props = SpotlightProps;\n export type StylesNames = SpotlightStylesNames;\n export type Factory = SpotlightFactory;\n export type FilterFunction = SpotlightFilterFunction;\n export type ActionData = SpotlightActionData;\n export type ActionGroupData = SpotlightActionGroupData;\n\n export namespace Action {\n export type Props = SpotlightActionProps;\n export type StylesNames = SpotlightActionStylesNames;\n }\n\n export namespace ActionsGroup {\n export type Props = SpotlightActionsGroupProps;\n export type StylesNames = SpotlightActionsGroupStylesNames;\n }\n\n export namespace ActionsList {\n export type Props = SpotlightActionsListProps;\n export type StylesNames = SpotlightActionsListStylesNames;\n }\n\n export namespace Empty {\n export type Props = SpotlightEmptyProps;\n export type StylesNames = SpotlightEmptyStylesNames;\n }\n\n export namespace Footer {\n export type Props = SpotlightFooterProps;\n export type StylesNames = SpotlightFooterStylesNames;\n }\n\n export namespace Search {\n export type Props = SpotlightSearchProps;\n export type StylesNames = SpotlightSearchStylesNames;\n }\n\n export namespace Root {\n export type Props = SpotlightRootProps;\n export type StylesNames = SpotlightRootStylesNames;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyGA,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,OAAO;CACP,SAAA,GAAA,cAAA,kBAAyB,KAAK;CAC9B,cAAc;EAAE,mBAAmB;EAAM,MAAM;CAAE;CACjD,iBAAiB;EAAE,UAAU;EAAK,YAAY;CAAM;CACpD,OAAOA,wBAAAA;CACP,QAAQC,iCAAAA;CACR,mBAAmB;CACnB,sBAAsB;CACtB,UAAU;AACZ;AAEA,MAAa,aAAA,GAAA,cAAA,UAAuC,WAAW;CAE7D,MAAM,EACJ,aACA,QACA,OACA,eACA,SACA,cACA,gBACA,OACA,iBACA,GAAG,YAAA,GAAA,cAAA,UAXkB,aAAa,cAAc,MAY1C;CAER,MAAM,CAAC,QAAQ,aAAA,GAAA,eAAA,iBAA4B;EACzC,OAAO;EACP,cAAc;EACd,YAAY;EACZ,UAAU;CACZ,CAAC;CAED,MAAM,kBAAkBC,sBAAAA,aAAa,OAAO,QAAQ,OAAO,GAAG,KAAK,EAAE,KAAK,SAAS;EACjF,IAAIC,yBAAAA,eAAe,IAAI,GAAG;GACxB,MAAM,QAAQ,KAAK,QAAQ,KAAK,EAAE,IAAI,GAAG,iBACvC,iBAAA,GAAA,kBAAA,KAACC,wBAAAA,iBAAD;IAA0C;IAAgB,GAAI;GAAa,GAArD,EAAqD,CAC5E;GAED,OACE,iBAAA,GAAA,kBAAA,KAACC,8BAAAA,uBAAD;IAAwC,OAAO,KAAK;cACjD;GACoB,GAFK,KAAK,KAEV;EAE3B;EAEA,OAAO,iBAAA,GAAA,kBAAA,KAACD,wBAAAA,iBAAD;GAA+C;GAAgB,GAAI;EAAO,GAApD,KAAK,EAA+C;CACnF,CAAC;CAED,OACE,iBAAA,GAAA,kBAAA,MAACE,sBAAAA,eAAD;EAAe,GAAI;EAAQ,OAAO;EAAQ,eAAe;YAAzD;GACE,iBAAA,GAAA,kBAAA,KAACC,wBAAAA,iBAAD,EAAiB,GAAI,YAAc,CAAA;GAClC,gBAAgB,SAAS,KACxB,iBAAA,GAAA,kBAAA,KAACC,6BAAAA,sBAAD;IAAsB,GAAK;cAA0B;GAAsC,CAAA;GAE5F,gBAAgB,WAAW,KAAK,gBAC/B,iBAAA,GAAA,kBAAA,KAACC,uBAAAA,gBAAD,EAAA,UAAiB,aAA6B,CAAA;EAEnC;;AAEnB,CAAC;AAED,UAAU,UAAUC,yBAAAA;AACpB,UAAU,cAAc;AACxB,UAAU,SAASH,wBAAAA;AACnB,UAAU,cAAcC,6BAAAA;AACxB,UAAU,SAASJ,wBAAAA;AACnB,UAAU,QAAQK,uBAAAA;AAClB,UAAU,eAAeJ,8BAAAA;AACzB,UAAU,SAASM,wBAAAA;AACnB,UAAU,OAAOL,sBAAAA;AACjB,UAAU,OAAOM,wBAAAA,UAAU;AAC3B,UAAU,QAAQA,wBAAAA,UAAU;AAC5B,UAAU,SAASA,wBAAAA,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"Spotlight.context.cjs","names":[],"sources":["../src/Spotlight.context.ts"],"sourcesContent":["import { createSafeContext, GetStylesApi } from '@mantine/core';\nimport { SpotlightStore } from './spotlight.store';\nimport type { SpotlightRootFactory } from './SpotlightRoot';\n\ninterface SpotlightContextValue {\n query: string;\n setQuery: (query: string) => void;\n getStyles: GetStylesApi<SpotlightRootFactory>;\n store: SpotlightStore;\n closeOnActionTrigger: boolean | undefined;\n}\n\nexport const [SpotlightProvider, useSpotlightContext] = createSafeContext<SpotlightContextValue>(\n 'Spotlight component was not found in tree'\n);\n"],"mappings":";;AAYA,MAAa,CAAC,mBAAmB,wBAAA,4BAAA,mBAC/B,4CACD"}
1
+ {"version":3,"file":"Spotlight.context.cjs","names":[],"sources":["../src/Spotlight.context.ts"],"sourcesContent":["import { createSafeContext, GetStylesApi } from '@mantine/core';\nimport { SpotlightStore } from './spotlight.store';\nimport type { SpotlightRootFactory } from './SpotlightRoot';\n\ninterface SpotlightContextValue {\n query: string;\n setQuery: (query: string) => void;\n getStyles: GetStylesApi<SpotlightRootFactory>;\n store: SpotlightStore;\n closeOnActionTrigger: boolean | undefined;\n}\n\nexport const [SpotlightProvider, useSpotlightContext] = createSafeContext<SpotlightContextValue>(\n 'Spotlight component was not found in tree'\n);\n"],"mappings":";;AAYA,MAAa,CAAC,mBAAmB,wBAAA,0BAAA,EAAA,mBAC/B,2CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightAction.cjs","names":["useSpotlightContext","Highlight","UnstyledButton","Box","classes"],"sources":["../src/SpotlightAction.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n Highlight,\n MantineColor,\n UnstyledButton,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionStylesNames =\n | 'action'\n | 'actionLabel'\n | 'actionDescription'\n | 'actionSection'\n | 'actionBody';\n\nexport interface SpotlightActionProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionFactory>, ElementProps<'button'> {\n /** Action label, pass string to use in default filter */\n label?: string;\n\n /** Action description, pass string to use in default filter */\n description?: string;\n\n /** Section displayed on the left side of the label, for example, icon */\n leftSection?: React.ReactNode;\n\n /** Section displayed on the right side of the label, for example, hotkey */\n rightSection?: React.ReactNode;\n\n /** Children override default action elements, if passed, label, description and sections are hidden */\n children?: React.ReactNode;\n\n /** Determines whether left and right sections should have dimmed styles @default true */\n dimmedSections?: boolean;\n\n /** Determines whether search query should be highlighted in action label @default false */\n highlightQuery?: boolean;\n\n /** Key of `theme.colors` of any valid CSS color that will be used to highlight search query @default 'yellow' */\n highlightColor?: MantineColor;\n\n /** Determines whether the spotlight should be closed when action is triggered, overrides `closeOnActionTrigger` prop set on `Spotlight` */\n closeSpotlightOnTrigger?: boolean;\n\n /** Keywords that are used for default filtering, not displayed anywhere, can be a string: \"react,router,javascript\" or an array: ['react', 'router', 'javascript'] */\n keywords?: string | string[];\n}\n\nexport type SpotlightActionFactory = Factory<{\n props: SpotlightActionProps;\n ref: HTMLButtonElement;\n stylesNames: SpotlightActionStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n dimmedSections: true,\n highlightQuery: false,\n} satisfies Partial<SpotlightActionProps>;\n\nexport const SpotlightAction = factory<SpotlightActionFactory>((_props) => {\n const props = useProps('SpotlightAction', defaultProps, _props);\n const {\n className,\n style,\n classNames,\n styles,\n id,\n description,\n label,\n leftSection,\n rightSection,\n children,\n dimmedSections,\n highlightQuery,\n highlightColor,\n closeSpotlightOnTrigger,\n onClick,\n onMouseDown,\n keywords,\n vars,\n ...others\n } = props;\n\n const ctx = useSpotlightContext();\n\n const stylesApi = { classNames, styles };\n\n const labelNode =\n highlightQuery && typeof label === 'string' ? (\n <Highlight\n component=\"span\"\n highlight={ctx.query}\n color={highlightColor}\n {...ctx.getStyles('actionLabel', stylesApi)}\n >\n {label}\n </Highlight>\n ) : (\n <span {...ctx.getStyles('actionLabel', stylesApi)}>{label}</span>\n );\n\n return (\n <UnstyledButton\n data-action\n {...ctx.getStyles('action', { className, style, ...stylesApi })}\n {...others}\n onMouseDown={(event) => {\n event.preventDefault();\n onMouseDown?.(event);\n }}\n onClick={(event) => {\n onClick?.(event);\n if (closeSpotlightOnTrigger ?? ctx.closeOnActionTrigger) {\n spotlightActions.close(ctx.store);\n }\n }}\n tabIndex={-1}\n >\n {children || (\n <>\n {leftSection && (\n <Box\n component=\"span\"\n mod={{ position: 'left', dimmed: dimmedSections }}\n {...ctx.getStyles('actionSection', stylesApi)}\n >\n {leftSection}\n </Box>\n )}\n\n <span {...ctx.getStyles('actionBody', stylesApi)}>\n {labelNode}\n <span {...ctx.getStyles('actionDescription', stylesApi)}>{description}</span>\n </span>\n\n {rightSection && (\n <Box\n component=\"span\"\n mod={{ position: 'right', dimmed: dimmedSections }}\n {...ctx.getStyles('actionSection', stylesApi)}\n >\n {rightSection}\n </Box>\n )}\n </>\n )}\n </UnstyledButton>\n );\n});\n\nSpotlightAction.classes = classes;\nSpotlightAction.displayName = '@mantine/spotlight/SpotlightAction';\n"],"mappings":";;;;;;;AA+DA,MAAM,eAAe;CACnB,gBAAgB;CAChB,gBAAgB;CACjB;AAED,MAAa,mBAAA,GAAA,cAAA,UAAmD,WAAW;CAEzE,MAAM,EACJ,WACA,OACA,YACA,QACA,IACA,aACA,OACA,aACA,cACA,UACA,gBACA,gBACA,gBACA,yBACA,SACA,aACA,UACA,MACA,GAAG,YAAA,GAAA,cAAA,UApBkB,mBAAmB,cAAc,OAAO;CAuB/D,MAAM,MAAMA,0BAAAA,qBAAqB;CAEjC,MAAM,YAAY;EAAE;EAAY;EAAQ;CAExC,MAAM,YACJ,kBAAkB,OAAO,UAAU,WACjC,iBAAA,GAAA,kBAAA,KAACC,cAAAA,WAAD;EACE,WAAU;EACV,WAAW,IAAI;EACf,OAAO;EACP,GAAI,IAAI,UAAU,eAAe,UAAU;YAE1C;EACS,CAAA,GAEZ,iBAAA,GAAA,kBAAA,KAAC,QAAD;EAAM,GAAI,IAAI,UAAU,eAAe,UAAU;YAAG;EAAa,CAAA;AAGrE,QACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,gBAAD;EACE,eAAA;EACA,GAAI,IAAI,UAAU,UAAU;GAAE;GAAW;GAAO,GAAG;GAAW,CAAC;EAC/D,GAAI;EACJ,cAAc,UAAU;AACtB,SAAM,gBAAgB;AACtB,iBAAc,MAAM;;EAEtB,UAAU,UAAU;AAClB,aAAU,MAAM;AAChB,OAAI,2BAA2B,IAAI,qBACjC,yBAAA,iBAAiB,MAAM,IAAI,MAAM;;EAGrC,UAAU;YAET,YACC,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA;GACG,eACC,iBAAA,GAAA,kBAAA,KAACC,cAAAA,KAAD;IACE,WAAU;IACV,KAAK;KAAE,UAAU;KAAQ,QAAQ;KAAgB;IACjD,GAAI,IAAI,UAAU,iBAAiB,UAAU;cAE5C;IACG,CAAA;GAGR,iBAAA,GAAA,kBAAA,MAAC,QAAD;IAAM,GAAI,IAAI,UAAU,cAAc,UAAU;cAAhD,CACG,WACD,iBAAA,GAAA,kBAAA,KAAC,QAAD;KAAM,GAAI,IAAI,UAAU,qBAAqB,UAAU;eAAG;KAAmB,CAAA,CACxE;;GAEN,gBACC,iBAAA,GAAA,kBAAA,KAACA,cAAAA,KAAD;IACE,WAAU;IACV,KAAK;KAAE,UAAU;KAAS,QAAQ;KAAgB;IAClD,GAAI,IAAI,UAAU,iBAAiB,UAAU;cAE5C;IACG,CAAA;GAEP,EAAA,CAAA;EAEU,CAAA;EAEnB;AAEF,gBAAgB,UAAUC,yBAAAA;AAC1B,gBAAgB,cAAc"}
1
+ {"version":3,"file":"SpotlightAction.cjs","names":["useSpotlightContext","Highlight","UnstyledButton","Box","classes"],"sources":["../src/SpotlightAction.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n Highlight,\n MantineColor,\n UnstyledButton,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionStylesNames =\n | 'action'\n | 'actionLabel'\n | 'actionDescription'\n | 'actionSection'\n | 'actionBody';\n\nexport interface SpotlightActionProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionFactory>, ElementProps<'button'> {\n /** Action label, pass string to use in default filter */\n label?: string;\n\n /** Action description, pass string to use in default filter */\n description?: string;\n\n /** Section displayed on the left side of the label, for example, icon */\n leftSection?: React.ReactNode;\n\n /** Section displayed on the right side of the label, for example, hotkey */\n rightSection?: React.ReactNode;\n\n /** Children override default action elements, if passed, label, description and sections are hidden */\n children?: React.ReactNode;\n\n /** Determines whether left and right sections should have dimmed styles @default true */\n dimmedSections?: boolean;\n\n /** Determines whether search query should be highlighted in action label @default false */\n highlightQuery?: boolean;\n\n /** Key of `theme.colors` of any valid CSS color that will be used to highlight search query @default 'yellow' */\n highlightColor?: MantineColor;\n\n /** Determines whether the spotlight should be closed when action is triggered, overrides `closeOnActionTrigger` prop set on `Spotlight` */\n closeSpotlightOnTrigger?: boolean;\n\n /** Keywords that are used for default filtering, not displayed anywhere, can be a string: \"react,router,javascript\" or an array: ['react', 'router', 'javascript'] */\n keywords?: string | string[];\n}\n\nexport type SpotlightActionFactory = Factory<{\n props: SpotlightActionProps;\n ref: HTMLButtonElement;\n stylesNames: SpotlightActionStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n dimmedSections: true,\n highlightQuery: false,\n} satisfies Partial<SpotlightActionProps>;\n\nexport const SpotlightAction = factory<SpotlightActionFactory>((_props) => {\n const props = useProps('SpotlightAction', defaultProps, _props);\n const {\n className,\n style,\n classNames,\n styles,\n id,\n description,\n label,\n leftSection,\n rightSection,\n children,\n dimmedSections,\n highlightQuery,\n highlightColor,\n closeSpotlightOnTrigger,\n onClick,\n onMouseDown,\n keywords,\n vars,\n ...others\n } = props;\n\n const ctx = useSpotlightContext();\n\n const stylesApi = { classNames, styles };\n\n const labelNode =\n highlightQuery && typeof label === 'string' ? (\n <Highlight\n component=\"span\"\n highlight={ctx.query}\n color={highlightColor}\n {...ctx.getStyles('actionLabel', stylesApi)}\n >\n {label}\n </Highlight>\n ) : (\n <span {...ctx.getStyles('actionLabel', stylesApi)}>{label}</span>\n );\n\n return (\n <UnstyledButton\n data-action\n {...ctx.getStyles('action', { className, style, ...stylesApi })}\n {...others}\n onMouseDown={(event) => {\n event.preventDefault();\n onMouseDown?.(event);\n }}\n onClick={(event) => {\n onClick?.(event);\n if (closeSpotlightOnTrigger ?? ctx.closeOnActionTrigger) {\n spotlightActions.close(ctx.store);\n }\n }}\n tabIndex={-1}\n >\n {children || (\n <>\n {leftSection && (\n <Box\n component=\"span\"\n mod={{ position: 'left', dimmed: dimmedSections }}\n {...ctx.getStyles('actionSection', stylesApi)}\n >\n {leftSection}\n </Box>\n )}\n\n <span {...ctx.getStyles('actionBody', stylesApi)}>\n {labelNode}\n <span {...ctx.getStyles('actionDescription', stylesApi)}>{description}</span>\n </span>\n\n {rightSection && (\n <Box\n component=\"span\"\n mod={{ position: 'right', dimmed: dimmedSections }}\n {...ctx.getStyles('actionSection', stylesApi)}\n >\n {rightSection}\n </Box>\n )}\n </>\n )}\n </UnstyledButton>\n );\n});\n\nSpotlightAction.classes = classes;\nSpotlightAction.displayName = '@mantine/spotlight/SpotlightAction';\n"],"mappings":";;;;;;;AA+DA,MAAM,eAAe;CACnB,gBAAgB;CAChB,gBAAgB;AAClB;AAEA,MAAa,mBAAA,GAAA,cAAA,UAAmD,WAAW;CAEzE,MAAM,EACJ,WACA,OACA,YACA,QACA,IACA,aACA,OACA,aACA,cACA,UACA,gBACA,gBACA,gBACA,yBACA,SACA,aACA,UACA,MACA,GAAG,YAAA,GAAA,cAAA,UApBkB,mBAAmB,cAAc,MAqBhD;CAER,MAAM,MAAMA,0BAAAA,oBAAoB;CAEhC,MAAM,YAAY;EAAE;EAAY;CAAO;CAEvC,MAAM,YACJ,kBAAkB,OAAO,UAAU,WACjC,iBAAA,GAAA,kBAAA,KAACC,cAAAA,WAAD;EACE,WAAU;EACV,WAAW,IAAI;EACf,OAAO;EACP,GAAI,IAAI,UAAU,eAAe,SAAS;YAEzC;CACQ,CAAA,IAEX,iBAAA,GAAA,kBAAA,KAAC,QAAD;EAAM,GAAI,IAAI,UAAU,eAAe,SAAS;YAAI;CAAY,CAAA;CAGpE,OACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,gBAAD;EACE,eAAA;EACA,GAAI,IAAI,UAAU,UAAU;GAAE;GAAW;GAAO,GAAG;EAAU,CAAC;EAC9D,GAAI;EACJ,cAAc,UAAU;GACtB,MAAM,eAAe;GACrB,cAAc,KAAK;EACrB;EACA,UAAU,UAAU;GAClB,UAAU,KAAK;GACf,IAAI,2BAA2B,IAAI,sBACjC,wBAAA,iBAAiB,MAAM,IAAI,KAAK;EAEpC;EACA,UAAU;YAET,YACC,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA;GACG,eACC,iBAAA,GAAA,kBAAA,KAACC,cAAAA,KAAD;IACE,WAAU;IACV,KAAK;KAAE,UAAU;KAAQ,QAAQ;IAAe;IAChD,GAAI,IAAI,UAAU,iBAAiB,SAAS;cAE3C;GACE,CAAA;GAGP,iBAAA,GAAA,kBAAA,MAAC,QAAD;IAAM,GAAI,IAAI,UAAU,cAAc,SAAS;cAA/C,CACG,WACD,iBAAA,GAAA,kBAAA,KAAC,QAAD;KAAM,GAAI,IAAI,UAAU,qBAAqB,SAAS;eAAI;IAAkB,CAAA,CACxE;;GAEL,gBACC,iBAAA,GAAA,kBAAA,KAACA,cAAAA,KAAD;IACE,WAAU;IACV,KAAK;KAAE,UAAU;KAAS,QAAQ;IAAe;IACjD,GAAI,IAAI,UAAU,iBAAiB,SAAS;cAE3C;GACE,CAAA;EAEP,EAAA,CAAA;CAEU,CAAA;AAEpB,CAAC;AAED,gBAAgB,UAAUC,yBAAAA;AAC1B,gBAAgB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightActionsGroup.cjs","names":["Box","useSpotlightContext","classes"],"sources":["../src/SpotlightActionsGroup.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionsGroupStylesNames = 'actionsGroup';\n\nexport interface SpotlightActionsGroupProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionsGroupFactory>, ElementProps<'div'> {\n /** `Spotlight.Action` components */\n children?: React.ReactNode;\n\n /** Group label */\n label?: string;\n}\n\nexport type SpotlightActionsGroupFactory = Factory<{\n props: SpotlightActionsGroupProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightActionsGroupStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightActionsGroup = factory<SpotlightActionsGroupFactory>((props) => {\n const { className, style, styles, classNames, label, children, ...others } = useProps(\n 'SpotlightActionsGroup',\n null,\n props\n );\n\n const ctx = useSpotlightContext();\n\n return (\n <Box\n {...ctx.getStyles('actionsGroup', { className, style, classNames, styles })}\n {...others}\n __vars={{\n '--spotlight-label': `'${label?.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`,\n }}\n >\n {children}\n </Box>\n );\n});\n\nSpotlightActionsGroup.classes = classes;\nSpotlightActionsGroup.displayName = '@mantine/core/SpotlightActionsGroup';\n"],"mappings":";;;;;;AA8BA,MAAa,yBAAA,GAAA,cAAA,UAA+D,UAAU;CACpF,MAAM,EAAE,WAAW,OAAO,QAAQ,YAAY,OAAO,UAAU,GAAG,YAAA,GAAA,cAAA,UAChE,yBACA,MACA,MACD;AAID,QACE,iBAAA,GAAA,kBAAA,KAACA,cAAAA,KAAD;EACE,GAJQC,0BAAAA,qBAAqB,CAIrB,UAAU,gBAAgB;GAAE;GAAW;GAAO;GAAY;GAAQ,CAAC;EAC3E,GAAI;EACJ,QAAQ,EACN,qBAAqB,IAAI,OAAO,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM,CAAC,IAC7E;EAEA;EACG,CAAA;EAER;AAEF,sBAAsB,UAAUC,yBAAAA;AAChC,sBAAsB,cAAc"}
1
+ {"version":3,"file":"SpotlightActionsGroup.cjs","names":["Box","useSpotlightContext","classes"],"sources":["../src/SpotlightActionsGroup.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionsGroupStylesNames = 'actionsGroup';\n\nexport interface SpotlightActionsGroupProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionsGroupFactory>, ElementProps<'div'> {\n /** `Spotlight.Action` components */\n children?: React.ReactNode;\n\n /** Group label */\n label?: string;\n}\n\nexport type SpotlightActionsGroupFactory = Factory<{\n props: SpotlightActionsGroupProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightActionsGroupStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightActionsGroup = factory<SpotlightActionsGroupFactory>((props) => {\n const { className, style, styles, classNames, label, children, ...others } = useProps(\n 'SpotlightActionsGroup',\n null,\n props\n );\n\n const ctx = useSpotlightContext();\n\n return (\n <Box\n {...ctx.getStyles('actionsGroup', { className, style, classNames, styles })}\n {...others}\n __vars={{\n '--spotlight-label': `'${label?.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`,\n }}\n >\n {children}\n </Box>\n );\n});\n\nSpotlightActionsGroup.classes = classes;\nSpotlightActionsGroup.displayName = '@mantine/core/SpotlightActionsGroup';\n"],"mappings":";;;;;;AA8BA,MAAa,yBAAA,GAAA,cAAA,UAA+D,UAAU;CACpF,MAAM,EAAE,WAAW,OAAO,QAAQ,YAAY,OAAO,UAAU,GAAG,YAAA,GAAA,cAAA,UAChE,yBACA,MACA,KACF;CAIA,OACE,iBAAA,GAAA,kBAAA,KAACA,cAAAA,KAAD;EACE,GAJQC,0BAAAA,oBAIF,EAAE,UAAU,gBAAgB;GAAE;GAAW;GAAO;GAAY;EAAO,CAAC;EAC1E,GAAI;EACJ,QAAQ,EACN,qBAAqB,IAAI,OAAO,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE,GAC9E;EAEC;CACE,CAAA;AAET,CAAC;AAED,sBAAsB,UAAUC,yBAAAA;AAChC,sBAAsB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightActionsList.cjs","names":["useSpotlightContext","spotlightActions","ScrollArea","classes"],"sources":["../src/SpotlightActionsList.tsx"],"sourcesContent":["import { useEffect, useId } from 'react';\nimport {\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n ScrollArea,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionsListStylesNames = 'actionsList' | 'actionsListInner';\n\nexport interface SpotlightActionsListProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionsListFactory>, ElementProps<'div'> {}\n\nexport type SpotlightActionsListFactory = Factory<{\n props: SpotlightActionsListProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightActionsListStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightActionsList = factory<SpotlightActionsListFactory>((props) => {\n const { className, style, id, children, vars, classNames, styles, ...others } = useProps(\n 'SpotlightActionsList',\n null,\n props\n );\n const ctx = useSpotlightContext();\n const generatedId = `mantine-${useId().replace(/:/g, '')}`;\n const listId = id || generatedId;\n\n useEffect(() => {\n spotlightActions.setListId(listId, ctx.store);\n return () => spotlightActions.setListId('', ctx.store);\n }, []);\n\n return (\n <ScrollArea.Autosize\n {...ctx.getStyles('actionsList', { className, style, classNames, styles })}\n type=\"scroll\"\n scrollbarSize=\"var(--spotlight-actions-list-padding)\"\n offsetScrollbars=\"y\"\n id={listId}\n {...others}\n >\n {children}\n </ScrollArea.Autosize>\n );\n});\n\nSpotlightActionsList.classes = classes;\nSpotlightActionsList.displayName = '@mantine/spotlight/SpotlightActionsList';\n"],"mappings":";;;;;;;;AA0BA,MAAa,wBAAA,GAAA,cAAA,UAA6D,UAAU;CAClF,MAAM,EAAE,WAAW,OAAO,IAAI,UAAU,MAAM,YAAY,QAAQ,GAAG,YAAA,GAAA,cAAA,UACnE,wBACA,MACA,MACD;CACD,MAAM,MAAMA,0BAAAA,qBAAqB;CACjC,MAAM,cAAc,YAAA,GAAA,MAAA,QAAkB,CAAC,QAAQ,MAAM,GAAG;CACxD,MAAM,SAAS,MAAM;AAErB,EAAA,GAAA,MAAA,iBAAgB;AACd,0BAAA,iBAAiB,UAAU,QAAQ,IAAI,MAAM;AAC7C,eAAaC,wBAAAA,iBAAiB,UAAU,IAAI,IAAI,MAAM;IACrD,EAAE,CAAC;AAEN,QACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,WAAW,UAAZ;EACE,GAAI,IAAI,UAAU,eAAe;GAAE;GAAW;GAAO;GAAY;GAAQ,CAAC;EAC1E,MAAK;EACL,eAAc;EACd,kBAAiB;EACjB,IAAI;EACJ,GAAI;EAEH;EACmB,CAAA;EAExB;AAEF,qBAAqB,UAAUC,yBAAAA;AAC/B,qBAAqB,cAAc"}
1
+ {"version":3,"file":"SpotlightActionsList.cjs","names":["useSpotlightContext","spotlightActions","ScrollArea","classes"],"sources":["../src/SpotlightActionsList.tsx"],"sourcesContent":["import { useEffect, useId } from 'react';\nimport {\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n ScrollArea,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionsListStylesNames = 'actionsList' | 'actionsListInner';\n\nexport interface SpotlightActionsListProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionsListFactory>, ElementProps<'div'> {}\n\nexport type SpotlightActionsListFactory = Factory<{\n props: SpotlightActionsListProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightActionsListStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightActionsList = factory<SpotlightActionsListFactory>((props) => {\n const { className, style, id, children, vars, classNames, styles, ...others } = useProps(\n 'SpotlightActionsList',\n null,\n props\n );\n const ctx = useSpotlightContext();\n const generatedId = `mantine-${useId().replace(/:/g, '')}`;\n const listId = id || generatedId;\n\n useEffect(() => {\n spotlightActions.setListId(listId, ctx.store);\n return () => spotlightActions.setListId('', ctx.store);\n }, []);\n\n return (\n <ScrollArea.Autosize\n {...ctx.getStyles('actionsList', { className, style, classNames, styles })}\n type=\"scroll\"\n scrollbarSize=\"var(--spotlight-actions-list-padding)\"\n offsetScrollbars=\"y\"\n id={listId}\n {...others}\n >\n {children}\n </ScrollArea.Autosize>\n );\n});\n\nSpotlightActionsList.classes = classes;\nSpotlightActionsList.displayName = '@mantine/spotlight/SpotlightActionsList';\n"],"mappings":";;;;;;;;AA0BA,MAAa,wBAAA,GAAA,cAAA,UAA6D,UAAU;CAClF,MAAM,EAAE,WAAW,OAAO,IAAI,UAAU,MAAM,YAAY,QAAQ,GAAG,YAAA,GAAA,cAAA,UACnE,wBACA,MACA,KACF;CACA,MAAM,MAAMA,0BAAAA,oBAAoB;CAChC,MAAM,cAAc,YAAA,GAAA,MAAA,OAAiB,EAAE,QAAQ,MAAM,EAAE;CACvD,MAAM,SAAS,MAAM;CAErB,CAAA,GAAA,MAAA,iBAAgB;EACd,wBAAA,iBAAiB,UAAU,QAAQ,IAAI,KAAK;EAC5C,aAAaC,wBAAAA,iBAAiB,UAAU,IAAI,IAAI,KAAK;CACvD,GAAG,CAAC,CAAC;CAEL,OACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,WAAW,UAAZ;EACE,GAAI,IAAI,UAAU,eAAe;GAAE;GAAW;GAAO;GAAY;EAAO,CAAC;EACzE,MAAK;EACL,eAAc;EACd,kBAAiB;EACjB,IAAI;EACJ,GAAI;EAEH;CACkB,CAAA;AAEzB,CAAC;AAED,qBAAqB,UAAUC,yBAAAA;AAC/B,qBAAqB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightEmpty.cjs","names":["Box","useSpotlightContext","classes"],"sources":["../src/SpotlightEmpty.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightEmptyStylesNames = 'empty';\n\nexport interface SpotlightEmptyProps\n extends BoxProps, CompoundStylesApiProps<SpotlightEmptyFactory>, ElementProps<'div'> {}\n\nexport type SpotlightEmptyFactory = Factory<{\n props: SpotlightEmptyProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightEmptyStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightEmpty = factory<SpotlightEmptyFactory>((props) => {\n const { className, style, classNames, styles, ...others } = useProps(\n 'SpotlightEmpty',\n null,\n props\n );\n\n const ctx = useSpotlightContext();\n\n return <Box {...ctx.getStyles('empty', { classNames, styles, className, style })} {...others} />;\n});\n\nSpotlightEmpty.classes = classes;\nSpotlightEmpty.displayName = '@mantine/spotlight/SpotlightEmpty';\n"],"mappings":";;;;;;AAwBA,MAAa,kBAAA,GAAA,cAAA,UAAiD,UAAU;CACtE,MAAM,EAAE,WAAW,OAAO,YAAY,QAAQ,GAAG,YAAA,GAAA,cAAA,UAC/C,kBACA,MACA,MACD;AAID,QAAO,iBAAA,GAAA,kBAAA,KAACA,cAAAA,KAAD;EAAK,GAFAC,0BAAAA,qBAAqB,CAEb,UAAU,SAAS;GAAE;GAAY;GAAQ;GAAW;GAAO,CAAC;EAAE,GAAI;EAAU,CAAA;EAChG;AAEF,eAAe,UAAUC,yBAAAA;AACzB,eAAe,cAAc"}
1
+ {"version":3,"file":"SpotlightEmpty.cjs","names":["Box","useSpotlightContext","classes"],"sources":["../src/SpotlightEmpty.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightEmptyStylesNames = 'empty';\n\nexport interface SpotlightEmptyProps\n extends BoxProps, CompoundStylesApiProps<SpotlightEmptyFactory>, ElementProps<'div'> {}\n\nexport type SpotlightEmptyFactory = Factory<{\n props: SpotlightEmptyProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightEmptyStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightEmpty = factory<SpotlightEmptyFactory>((props) => {\n const { className, style, classNames, styles, ...others } = useProps(\n 'SpotlightEmpty',\n null,\n props\n );\n\n const ctx = useSpotlightContext();\n\n return <Box {...ctx.getStyles('empty', { classNames, styles, className, style })} {...others} />;\n});\n\nSpotlightEmpty.classes = classes;\nSpotlightEmpty.displayName = '@mantine/spotlight/SpotlightEmpty';\n"],"mappings":";;;;;;AAwBA,MAAa,kBAAA,GAAA,cAAA,UAAiD,UAAU;CACtE,MAAM,EAAE,WAAW,OAAO,YAAY,QAAQ,GAAG,YAAA,GAAA,cAAA,UAC/C,kBACA,MACA,KACF;CAIA,OAAO,iBAAA,GAAA,kBAAA,KAACA,cAAAA,KAAD;EAAK,GAFAC,0BAAAA,oBAEM,EAAE,UAAU,SAAS;GAAE;GAAY;GAAQ;GAAW;EAAM,CAAC;EAAG,GAAI;CAAS,CAAA;AACjG,CAAC;AAED,eAAe,UAAUC,yBAAAA;AACzB,eAAe,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightFooter.cjs","names":["Box","useSpotlightContext","classes"],"sources":["../src/SpotlightFooter.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightFooterStylesNames = 'footer';\n\nexport interface SpotlightFooterProps\n extends BoxProps, CompoundStylesApiProps<SpotlightFooterFactory>, ElementProps<'div'> {}\n\nexport type SpotlightFooterFactory = Factory<{\n props: SpotlightFooterProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightFooterStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightFooter = factory<SpotlightFooterFactory>((props) => {\n const { className, style, classNames, styles, ...others } = useProps(\n 'SpotlightFooter',\n null,\n props\n );\n const ctx = useSpotlightContext();\n return <Box {...ctx.getStyles('footer', { className, classNames, style, styles })} {...others} />;\n});\n\nSpotlightFooter.classes = classes;\nSpotlightFooter.displayName = '@mantine/spotlight/SpotlightFooter';\n"],"mappings":";;;;;;AAwBA,MAAa,mBAAA,GAAA,cAAA,UAAmD,UAAU;CACxE,MAAM,EAAE,WAAW,OAAO,YAAY,QAAQ,GAAG,YAAA,GAAA,cAAA,UAC/C,mBACA,MACA,MACD;AAED,QAAO,iBAAA,GAAA,kBAAA,KAACA,cAAAA,KAAD;EAAK,GADAC,0BAAAA,qBAAqB,CACb,UAAU,UAAU;GAAE;GAAW;GAAY;GAAO;GAAQ,CAAC;EAAE,GAAI;EAAU,CAAA;EACjG;AAEF,gBAAgB,UAAUC,yBAAAA;AAC1B,gBAAgB,cAAc"}
1
+ {"version":3,"file":"SpotlightFooter.cjs","names":["Box","useSpotlightContext","classes"],"sources":["../src/SpotlightFooter.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightFooterStylesNames = 'footer';\n\nexport interface SpotlightFooterProps\n extends BoxProps, CompoundStylesApiProps<SpotlightFooterFactory>, ElementProps<'div'> {}\n\nexport type SpotlightFooterFactory = Factory<{\n props: SpotlightFooterProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightFooterStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightFooter = factory<SpotlightFooterFactory>((props) => {\n const { className, style, classNames, styles, ...others } = useProps(\n 'SpotlightFooter',\n null,\n props\n );\n const ctx = useSpotlightContext();\n return <Box {...ctx.getStyles('footer', { className, classNames, style, styles })} {...others} />;\n});\n\nSpotlightFooter.classes = classes;\nSpotlightFooter.displayName = '@mantine/spotlight/SpotlightFooter';\n"],"mappings":";;;;;;AAwBA,MAAa,mBAAA,GAAA,cAAA,UAAmD,UAAU;CACxE,MAAM,EAAE,WAAW,OAAO,YAAY,QAAQ,GAAG,YAAA,GAAA,cAAA,UAC/C,mBACA,MACA,KACF;CAEA,OAAO,iBAAA,GAAA,kBAAA,KAACA,cAAAA,KAAD;EAAK,GADAC,0BAAAA,oBACM,EAAE,UAAU,UAAU;GAAE;GAAW;GAAY;GAAO;EAAO,CAAC;EAAG,GAAI;CAAS,CAAA;AAClG,CAAC;AAED,gBAAgB,UAAUC,yBAAAA;AAC1B,gBAAgB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightRoot.cjs","names":["spotlightStore","useSpotlight","getHotkeys","SpotlightProvider","Modal","spotlightActions","classes"],"sources":["../src/SpotlightRoot.tsx"],"sourcesContent":["import {\n factory,\n Factory,\n getDefaultZIndex,\n Modal,\n ModalProps,\n ModalStylesNames,\n rem,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDidUpdate, useHotkeys } from '@mantine/hooks';\nimport { getHotkeys } from './get-hotkeys';\nimport { SpotlightProvider } from './Spotlight.context';\nimport { spotlightActions, SpotlightStore, spotlightStore, useSpotlight } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightRootStylesNames =\n | ModalStylesNames\n | 'search'\n | 'actionsList'\n | 'action'\n | 'empty'\n | 'footer'\n | 'actionBody'\n | 'actionLabel'\n | 'actionDescription'\n | 'actionSection'\n | 'actionsGroup';\n\nexport interface SpotlightRootProps\n extends\n StylesApiProps<SpotlightRootFactory>,\n Omit<\n ModalProps,\n | 'styles'\n | 'classNames'\n | 'vars'\n | 'variant'\n | 'opened'\n | 'onClose'\n | 'closeButtonProps'\n | 'withCloseButton'\n > {\n /** Spotlight store, can be used to create multiple instances of spotlight */\n store?: SpotlightStore;\n\n /** Controlled Spotlight search query */\n query?: string;\n\n /** Called when query changes */\n onQueryChange?: (query: string) => void;\n\n /** Determines whether the search query should be cleared when the spotlight is closed @default true */\n clearQueryOnClose?: boolean;\n\n /** Keyboard shortcut or a list of shortcuts to trigger spotlight @default 'mod + K' */\n shortcut?: string | string[] | null;\n\n /** A list of tags which when focused will be ignored by shortcut @default ['input', 'textarea', 'select'] */\n tagsToIgnore?: string[];\n\n /** Determines whether shortcut should trigger based in contentEditable @default false */\n triggerOnContentEditable?: boolean;\n\n /** If set, spotlight will not be rendered */\n disabled?: boolean;\n\n /** Called when spotlight opens */\n onSpotlightOpen?: () => void;\n\n /** Called when spotlight closes */\n onSpotlightClose?: () => void;\n\n /** Forces opened state, useful for tests */\n forceOpened?: boolean;\n\n /** Determines whether spotlight should be closed when one of the actions is triggered @default true */\n closeOnActionTrigger?: boolean;\n\n /** Spotlight content max-height. Ignored unless `scrollable` prop is set. @default 400 */\n maxHeight?: React.CSSProperties['maxHeight'];\n\n /** Determines whether the actions list should be scrollable. If not set, `maxHeight` is ignored @default false */\n scrollable?: boolean;\n}\n\nexport type SpotlightRootFactory = Factory<{\n props: SpotlightRootProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightRootStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n size: 600,\n yOffset: 80,\n zIndex: getDefaultZIndex('max'),\n overlayProps: { backgroundOpacity: 0.35, blur: 7 },\n transitionProps: { duration: 200, transition: 'pop' },\n store: spotlightStore,\n clearQueryOnClose: true,\n closeOnActionTrigger: true,\n shortcut: 'mod + K',\n maxHeight: 400,\n} satisfies Partial<SpotlightRootProps>;\n\nexport const SpotlightRoot = factory<SpotlightRootFactory>((_props) => {\n const props = useProps('SpotlightRoot', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n store,\n children,\n query,\n onQueryChange,\n transitionProps,\n clearQueryOnClose,\n shortcut,\n tagsToIgnore,\n triggerOnContentEditable,\n disabled,\n onSpotlightOpen,\n onSpotlightClose,\n forceOpened,\n closeOnActionTrigger,\n maxHeight,\n scrollable,\n attributes,\n ...others\n } = props;\n\n const { opened, query: storeQuery } = useSpotlight(store);\n const _query = typeof query === 'string' ? query : storeQuery;\n const setQuery = (q: string) => {\n onQueryChange?.(q);\n spotlightActions.setQuery(q, store);\n };\n\n const getStyles = useStyles<SpotlightRootFactory>({\n name: 'Spotlight',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<SpotlightRootFactory>({\n classNames,\n styles,\n props,\n });\n\n useHotkeys(getHotkeys(shortcut, store), tagsToIgnore, triggerOnContentEditable);\n\n useDidUpdate(() => {\n opened ? onSpotlightOpen?.() : onSpotlightClose?.();\n }, [opened]);\n\n if (disabled) {\n return null;\n }\n\n return (\n <SpotlightProvider\n value={{\n getStyles,\n query: _query,\n setQuery,\n store,\n closeOnActionTrigger,\n }}\n >\n <Modal\n {...others}\n withCloseButton={false}\n opened={opened || !!forceOpened}\n padding={0}\n onClose={() => spotlightActions.close(store)}\n className={className}\n style={style}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n attributes={attributes}\n transitionProps={{\n ...transitionProps,\n onExited: () => {\n clearQueryOnClose && setQuery('');\n spotlightActions.clearSpotlightState({ clearQuery: clearQueryOnClose }, store);\n transitionProps?.onExited?.();\n },\n }}\n __vars={{ '--spotlight-max-height': scrollable ? rem(maxHeight) : undefined }}\n __staticSelector=\"Spotlight\"\n data-scrollable={scrollable || undefined}\n >\n {children}\n </Modal>\n </SpotlightProvider>\n );\n});\n\nSpotlightRoot.classes = classes;\nSpotlightRoot.displayName = '@mantine/spotlight/SpotlightRoot';\n"],"mappings":";;;;;;;;;AAgGA,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,SAAA,GAAA,cAAA,kBAAyB,MAAM;CAC/B,cAAc;EAAE,mBAAmB;EAAM,MAAM;EAAG;CAClD,iBAAiB;EAAE,UAAU;EAAK,YAAY;EAAO;CACrD,OAAOA,wBAAAA;CACP,mBAAmB;CACnB,sBAAsB;CACtB,UAAU;CACV,WAAW;CACZ;AAED,MAAa,iBAAA,GAAA,cAAA,UAA+C,WAAW;CACrE,MAAM,SAAA,GAAA,cAAA,UAAiB,iBAAiB,cAAc,OAAO;CAC7D,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,OACA,UACA,OACA,eACA,iBACA,mBACA,UACA,cACA,0BACA,UACA,iBACA,kBACA,aACA,sBACA,WACA,YACA,YACA,GAAG,WACD;CAEJ,MAAM,EAAE,QAAQ,OAAO,eAAeC,wBAAAA,aAAa,MAAM;CACzD,MAAM,SAAS,OAAO,UAAU,WAAW,QAAQ;CACnD,MAAM,YAAY,MAAc;AAC9B,kBAAgB,EAAE;AAClB,0BAAA,iBAAiB,SAAS,GAAG,MAAM;;CAGrC,MAAM,aAAA,GAAA,cAAA,WAA4C;EAChD,MAAM;EACN,SAAA,yBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,EAAE,oBAAoB,oBAAA,GAAA,cAAA,sBAA8D;EACxF;EACA;EACA;EACD,CAAC;AAEF,EAAA,GAAA,eAAA,YAAWC,oBAAAA,WAAW,UAAU,MAAM,EAAE,cAAc,yBAAyB;AAE/E,EAAA,GAAA,eAAA,oBAAmB;AACjB,WAAS,mBAAmB,GAAG,oBAAoB;IAClD,CAAC,OAAO,CAAC;AAEZ,KAAI,SACF,QAAO;AAGT,QACE,iBAAA,GAAA,kBAAA,KAACC,0BAAAA,mBAAD;EACE,OAAO;GACL;GACA,OAAO;GACP;GACA;GACA;GACD;YAED,iBAAA,GAAA,kBAAA,KAACC,cAAAA,OAAD;GACE,GAAI;GACJ,iBAAiB;GACjB,QAAQ,UAAU,CAAC,CAAC;GACpB,SAAS;GACT,eAAeC,wBAAAA,iBAAiB,MAAM,MAAM;GACjC;GACJ;GACP,YAAY;GACZ,QAAQ;GACI;GACZ,iBAAiB;IACf,GAAG;IACH,gBAAgB;AACd,0BAAqB,SAAS,GAAG;AACjC,6BAAA,iBAAiB,oBAAoB,EAAE,YAAY,mBAAmB,EAAE,MAAM;AAC9E,sBAAiB,YAAY;;IAEhC;GACD,QAAQ,EAAE,0BAA0B,cAAA,GAAA,cAAA,KAAiB,UAAU,GAAG,KAAA,GAAW;GAC7E,kBAAiB;GACjB,mBAAiB,cAAc,KAAA;GAE9B;GACK,CAAA;EACU,CAAA;EAEtB;AAEF,cAAc,UAAUC,yBAAAA;AACxB,cAAc,cAAc"}
1
+ {"version":3,"file":"SpotlightRoot.cjs","names":["spotlightStore","useSpotlight","getHotkeys","SpotlightProvider","Modal","spotlightActions","classes"],"sources":["../src/SpotlightRoot.tsx"],"sourcesContent":["import {\n factory,\n Factory,\n getDefaultZIndex,\n Modal,\n ModalProps,\n ModalStylesNames,\n rem,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDidUpdate, useHotkeys } from '@mantine/hooks';\nimport { getHotkeys } from './get-hotkeys';\nimport { SpotlightProvider } from './Spotlight.context';\nimport { spotlightActions, SpotlightStore, spotlightStore, useSpotlight } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightRootStylesNames =\n | ModalStylesNames\n | 'search'\n | 'actionsList'\n | 'action'\n | 'empty'\n | 'footer'\n | 'actionBody'\n | 'actionLabel'\n | 'actionDescription'\n | 'actionSection'\n | 'actionsGroup';\n\nexport interface SpotlightRootProps\n extends\n StylesApiProps<SpotlightRootFactory>,\n Omit<\n ModalProps,\n | 'styles'\n | 'classNames'\n | 'vars'\n | 'variant'\n | 'opened'\n | 'onClose'\n | 'closeButtonProps'\n | 'withCloseButton'\n > {\n /** Spotlight store, can be used to create multiple instances of spotlight */\n store?: SpotlightStore;\n\n /** Controlled Spotlight search query */\n query?: string;\n\n /** Called when query changes */\n onQueryChange?: (query: string) => void;\n\n /** Determines whether the search query should be cleared when the spotlight is closed @default true */\n clearQueryOnClose?: boolean;\n\n /** Keyboard shortcut or a list of shortcuts to trigger spotlight @default 'mod + K' */\n shortcut?: string | string[] | null;\n\n /** A list of tags which when focused will be ignored by shortcut @default ['input', 'textarea', 'select'] */\n tagsToIgnore?: string[];\n\n /** Determines whether shortcut should trigger based in contentEditable @default false */\n triggerOnContentEditable?: boolean;\n\n /** If set, spotlight will not be rendered */\n disabled?: boolean;\n\n /** Called when spotlight opens */\n onSpotlightOpen?: () => void;\n\n /** Called when spotlight closes */\n onSpotlightClose?: () => void;\n\n /** Forces opened state, useful for tests */\n forceOpened?: boolean;\n\n /** Determines whether spotlight should be closed when one of the actions is triggered @default true */\n closeOnActionTrigger?: boolean;\n\n /** Spotlight content max-height. Ignored unless `scrollable` prop is set. @default 400 */\n maxHeight?: React.CSSProperties['maxHeight'];\n\n /** Determines whether the actions list should be scrollable. If not set, `maxHeight` is ignored @default false */\n scrollable?: boolean;\n}\n\nexport type SpotlightRootFactory = Factory<{\n props: SpotlightRootProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightRootStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n size: 600,\n yOffset: 80,\n zIndex: getDefaultZIndex('max'),\n overlayProps: { backgroundOpacity: 0.35, blur: 7 },\n transitionProps: { duration: 200, transition: 'pop' },\n store: spotlightStore,\n clearQueryOnClose: true,\n closeOnActionTrigger: true,\n shortcut: 'mod + K',\n maxHeight: 400,\n} satisfies Partial<SpotlightRootProps>;\n\nexport const SpotlightRoot = factory<SpotlightRootFactory>((_props) => {\n const props = useProps('SpotlightRoot', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n store,\n children,\n query,\n onQueryChange,\n transitionProps,\n clearQueryOnClose,\n shortcut,\n tagsToIgnore,\n triggerOnContentEditable,\n disabled,\n onSpotlightOpen,\n onSpotlightClose,\n forceOpened,\n closeOnActionTrigger,\n maxHeight,\n scrollable,\n attributes,\n ...others\n } = props;\n\n const { opened, query: storeQuery } = useSpotlight(store);\n const _query = typeof query === 'string' ? query : storeQuery;\n const setQuery = (q: string) => {\n onQueryChange?.(q);\n spotlightActions.setQuery(q, store);\n };\n\n const getStyles = useStyles<SpotlightRootFactory>({\n name: 'Spotlight',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<SpotlightRootFactory>({\n classNames,\n styles,\n props,\n });\n\n useHotkeys(getHotkeys(shortcut, store), tagsToIgnore, triggerOnContentEditable);\n\n useDidUpdate(() => {\n opened ? onSpotlightOpen?.() : onSpotlightClose?.();\n }, [opened]);\n\n if (disabled) {\n return null;\n }\n\n return (\n <SpotlightProvider\n value={{\n getStyles,\n query: _query,\n setQuery,\n store,\n closeOnActionTrigger,\n }}\n >\n <Modal\n {...others}\n withCloseButton={false}\n opened={opened || !!forceOpened}\n padding={0}\n onClose={() => spotlightActions.close(store)}\n className={className}\n style={style}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n attributes={attributes}\n transitionProps={{\n ...transitionProps,\n onExited: () => {\n clearQueryOnClose && setQuery('');\n spotlightActions.clearSpotlightState({ clearQuery: clearQueryOnClose }, store);\n transitionProps?.onExited?.();\n },\n }}\n __vars={{ '--spotlight-max-height': scrollable ? rem(maxHeight) : undefined }}\n __staticSelector=\"Spotlight\"\n data-scrollable={scrollable || undefined}\n >\n {children}\n </Modal>\n </SpotlightProvider>\n );\n});\n\nSpotlightRoot.classes = classes;\nSpotlightRoot.displayName = '@mantine/spotlight/SpotlightRoot';\n"],"mappings":";;;;;;;;;AAgGA,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,SAAA,GAAA,cAAA,kBAAyB,KAAK;CAC9B,cAAc;EAAE,mBAAmB;EAAM,MAAM;CAAE;CACjD,iBAAiB;EAAE,UAAU;EAAK,YAAY;CAAM;CACpD,OAAOA,wBAAAA;CACP,mBAAmB;CACnB,sBAAsB;CACtB,UAAU;CACV,WAAW;AACb;AAEA,MAAa,iBAAA,GAAA,cAAA,UAA+C,WAAW;CACrE,MAAM,SAAA,GAAA,cAAA,UAAiB,iBAAiB,cAAc,MAAM;CAC5D,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,OACA,UACA,OACA,eACA,iBACA,mBACA,UACA,cACA,0BACA,UACA,iBACA,kBACA,aACA,sBACA,WACA,YACA,YACA,GAAG,WACD;CAEJ,MAAM,EAAE,QAAQ,OAAO,eAAeC,wBAAAA,aAAa,KAAK;CACxD,MAAM,SAAS,OAAO,UAAU,WAAW,QAAQ;CACnD,MAAM,YAAY,MAAc;EAC9B,gBAAgB,CAAC;EACjB,wBAAA,iBAAiB,SAAS,GAAG,KAAK;CACpC;CAEA,MAAM,aAAA,GAAA,cAAA,WAA4C;EAChD,MAAM;EACN,SAAA,yBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,oBAAoB,oBAAA,GAAA,cAAA,sBAA8D;EACxF;EACA;EACA;CACF,CAAC;CAED,CAAA,GAAA,eAAA,YAAWC,oBAAAA,WAAW,UAAU,KAAK,GAAG,cAAc,wBAAwB;CAE9E,CAAA,GAAA,eAAA,oBAAmB;EACjB,SAAS,kBAAkB,IAAI,mBAAmB;CACpD,GAAG,CAAC,MAAM,CAAC;CAEX,IAAI,UACF,OAAO;CAGT,OACE,iBAAA,GAAA,kBAAA,KAACC,0BAAAA,mBAAD;EACE,OAAO;GACL;GACA,OAAO;GACP;GACA;GACA;EACF;YAEA,iBAAA,GAAA,kBAAA,KAACC,cAAAA,OAAD;GACE,GAAI;GACJ,iBAAiB;GACjB,QAAQ,UAAU,CAAC,CAAC;GACpB,SAAS;GACT,eAAeC,wBAAAA,iBAAiB,MAAM,KAAK;GAChC;GACJ;GACP,YAAY;GACZ,QAAQ;GACI;GACZ,iBAAiB;IACf,GAAG;IACH,gBAAgB;KACd,qBAAqB,SAAS,EAAE;KAChC,wBAAA,iBAAiB,oBAAoB,EAAE,YAAY,kBAAkB,GAAG,KAAK;KAC7E,iBAAiB,WAAW;IAC9B;GACF;GACA,QAAQ,EAAE,0BAA0B,cAAA,GAAA,cAAA,KAAiB,SAAS,IAAI,KAAA,EAAU;GAC5E,kBAAiB;GACjB,mBAAiB,cAAc,KAAA;GAE9B;EACI,CAAA;CACU,CAAA;AAEvB,CAAC;AAED,cAAc,UAAUC,yBAAAA;AACxB,cAAc,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightSearch.cjs","names":["useSpotlightContext","Input","classes"],"sources":["../src/SpotlightSearch.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n Input,\n InputProps,\n InputStylesNames,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightSearchStylesNames = InputStylesNames;\n\nexport interface SpotlightSearchProps\n extends\n BoxProps,\n Omit<InputProps, 'classNames' | 'styles' | 'vars' | 'variant'>,\n CompoundStylesApiProps<SpotlightSearchFactory>,\n ElementProps<'input', 'size'> {}\n\nexport type SpotlightSearchFactory = Factory<{\n props: SpotlightSearchProps;\n ref: HTMLInputElement;\n stylesNames: SpotlightSearchStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n size: 'lg',\n} satisfies Partial<SpotlightSearchProps>;\n\nexport const SpotlightSearch = factory<SpotlightSearchFactory>((props) => {\n const { classNames, styles, onKeyDown, onChange, vars, value, attributes, ...others } = useProps(\n 'SpotlightSearch',\n defaultProps,\n props\n );\n const ctx = useSpotlightContext();\n const inputStyles = ctx.getStyles('search');\n const [isComposing, setIsComposing] = useState(false); // IME\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (isComposing) {\n return;\n }\n\n if (event.nativeEvent.code === 'ArrowDown') {\n event.preventDefault();\n spotlightActions.selectNextAction(ctx.store);\n }\n\n if (event.nativeEvent.code === 'ArrowUp') {\n event.preventDefault();\n spotlightActions.selectPreviousAction(ctx.store);\n }\n\n if (event.nativeEvent.code === 'Enter' || event.nativeEvent.code === 'NumpadEnter') {\n event.preventDefault();\n spotlightActions.triggerSelectedAction(ctx.store);\n }\n };\n\n return (\n <Input\n {...inputStyles}\n classNames={[{ input: inputStyles.className }, classNames] as any}\n styles={[{ input: inputStyles.style }, styles] as any}\n {...others}\n value={value ?? ctx.query}\n onChange={(event) => {\n ctx.setQuery(event.currentTarget.value);\n onChange?.(event);\n }}\n onKeyDown={handleKeyDown}\n onCompositionStart={() => setIsComposing(true)}\n onCompositionEnd={() => setIsComposing(false)}\n />\n );\n});\n\nSpotlightSearch.classes = classes;\nSpotlightSearch.displayName = '@mantine/spotlight/SpotlightSearch';\n"],"mappings":";;;;;;;;AAgCA,MAAM,eAAe,EACnB,MAAM,MACP;AAED,MAAa,mBAAA,GAAA,cAAA,UAAmD,UAAU;CACxE,MAAM,EAAE,YAAY,QAAQ,WAAW,UAAU,MAAM,OAAO,YAAY,GAAG,YAAA,GAAA,cAAA,UAC3E,mBACA,cACA,MACD;CACD,MAAM,MAAMA,0BAAAA,qBAAqB;CACjC,MAAM,cAAc,IAAI,UAAU,SAAS;CAC3C,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAA2B,MAAM;CAErD,MAAM,iBAAiB,UAAiD;AACtE,cAAY,MAAM;AAClB,MAAI,YACF;AAGF,MAAI,MAAM,YAAY,SAAS,aAAa;AAC1C,SAAM,gBAAgB;AACtB,2BAAA,iBAAiB,iBAAiB,IAAI,MAAM;;AAG9C,MAAI,MAAM,YAAY,SAAS,WAAW;AACxC,SAAM,gBAAgB;AACtB,2BAAA,iBAAiB,qBAAqB,IAAI,MAAM;;AAGlD,MAAI,MAAM,YAAY,SAAS,WAAW,MAAM,YAAY,SAAS,eAAe;AAClF,SAAM,gBAAgB;AACtB,2BAAA,iBAAiB,sBAAsB,IAAI,MAAM;;;AAIrD,QACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,OAAD;EACE,GAAI;EACJ,YAAY,CAAC,EAAE,OAAO,YAAY,WAAW,EAAE,WAAW;EAC1D,QAAQ,CAAC,EAAE,OAAO,YAAY,OAAO,EAAE,OAAO;EAC9C,GAAI;EACJ,OAAO,SAAS,IAAI;EACpB,WAAW,UAAU;AACnB,OAAI,SAAS,MAAM,cAAc,MAAM;AACvC,cAAW,MAAM;;EAEnB,WAAW;EACX,0BAA0B,eAAe,KAAK;EAC9C,wBAAwB,eAAe,MAAM;EAC7C,CAAA;EAEJ;AAEF,gBAAgB,UAAUC,yBAAAA;AAC1B,gBAAgB,cAAc"}
1
+ {"version":3,"file":"SpotlightSearch.cjs","names":["useSpotlightContext","Input","classes"],"sources":["../src/SpotlightSearch.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n Input,\n InputProps,\n InputStylesNames,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightSearchStylesNames = InputStylesNames;\n\nexport interface SpotlightSearchProps\n extends\n BoxProps,\n Omit<InputProps, 'classNames' | 'styles' | 'vars' | 'variant'>,\n CompoundStylesApiProps<SpotlightSearchFactory>,\n ElementProps<'input', 'size'> {}\n\nexport type SpotlightSearchFactory = Factory<{\n props: SpotlightSearchProps;\n ref: HTMLInputElement;\n stylesNames: SpotlightSearchStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n size: 'lg',\n} satisfies Partial<SpotlightSearchProps>;\n\nexport const SpotlightSearch = factory<SpotlightSearchFactory>((props) => {\n const { classNames, styles, onKeyDown, onChange, vars, value, attributes, ...others } = useProps(\n 'SpotlightSearch',\n defaultProps,\n props\n );\n const ctx = useSpotlightContext();\n const inputStyles = ctx.getStyles('search');\n const [isComposing, setIsComposing] = useState(false); // IME\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (isComposing) {\n return;\n }\n\n if (event.nativeEvent.code === 'ArrowDown') {\n event.preventDefault();\n spotlightActions.selectNextAction(ctx.store);\n }\n\n if (event.nativeEvent.code === 'ArrowUp') {\n event.preventDefault();\n spotlightActions.selectPreviousAction(ctx.store);\n }\n\n if (event.nativeEvent.code === 'Enter' || event.nativeEvent.code === 'NumpadEnter') {\n event.preventDefault();\n spotlightActions.triggerSelectedAction(ctx.store);\n }\n };\n\n return (\n <Input\n {...inputStyles}\n classNames={[{ input: inputStyles.className }, classNames] as any}\n styles={[{ input: inputStyles.style }, styles] as any}\n {...others}\n value={value ?? ctx.query}\n onChange={(event) => {\n ctx.setQuery(event.currentTarget.value);\n onChange?.(event);\n }}\n onKeyDown={handleKeyDown}\n onCompositionStart={() => setIsComposing(true)}\n onCompositionEnd={() => setIsComposing(false)}\n />\n );\n});\n\nSpotlightSearch.classes = classes;\nSpotlightSearch.displayName = '@mantine/spotlight/SpotlightSearch';\n"],"mappings":";;;;;;;;AAgCA,MAAM,eAAe,EACnB,MAAM,KACR;AAEA,MAAa,mBAAA,GAAA,cAAA,UAAmD,UAAU;CACxE,MAAM,EAAE,YAAY,QAAQ,WAAW,UAAU,MAAM,OAAO,YAAY,GAAG,YAAA,GAAA,cAAA,UAC3E,mBACA,cACA,KACF;CACA,MAAM,MAAMA,0BAAAA,oBAAoB;CAChC,MAAM,cAAc,IAAI,UAAU,QAAQ;CAC1C,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAA2B,KAAK;CAEpD,MAAM,iBAAiB,UAAiD;EACtE,YAAY,KAAK;EACjB,IAAI,aACF;EAGF,IAAI,MAAM,YAAY,SAAS,aAAa;GAC1C,MAAM,eAAe;GACrB,wBAAA,iBAAiB,iBAAiB,IAAI,KAAK;EAC7C;EAEA,IAAI,MAAM,YAAY,SAAS,WAAW;GACxC,MAAM,eAAe;GACrB,wBAAA,iBAAiB,qBAAqB,IAAI,KAAK;EACjD;EAEA,IAAI,MAAM,YAAY,SAAS,WAAW,MAAM,YAAY,SAAS,eAAe;GAClF,MAAM,eAAe;GACrB,wBAAA,iBAAiB,sBAAsB,IAAI,KAAK;EAClD;CACF;CAEA,OACE,iBAAA,GAAA,kBAAA,KAACC,cAAAA,OAAD;EACE,GAAI;EACJ,YAAY,CAAC,EAAE,OAAO,YAAY,UAAU,GAAG,UAAU;EACzD,QAAQ,CAAC,EAAE,OAAO,YAAY,MAAM,GAAG,MAAM;EAC7C,GAAI;EACJ,OAAO,SAAS,IAAI;EACpB,WAAW,UAAU;GACnB,IAAI,SAAS,MAAM,cAAc,KAAK;GACtC,WAAW,KAAK;EAClB;EACA,WAAW;EACX,0BAA0B,eAAe,IAAI;EAC7C,wBAAwB,eAAe,KAAK;CAC7C,CAAA;AAEL,CAAC;AAED,gBAAgB,UAAUC,yBAAAA;AAC1B,gBAAgB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"default-spotlight-filter.cjs","names":[],"sources":["../src/default-spotlight-filter.ts"],"sourcesContent":["import type {\n SpotlightActionData,\n SpotlightActionGroupData,\n SpotlightActions,\n SpotlightFilterFunction,\n} from './Spotlight';\n\nfunction getKeywords(keywords: string | string[] | undefined) {\n if (Array.isArray(keywords)) {\n return keywords\n .map((keyword) => keyword.trim())\n .join(',')\n .toLowerCase()\n .trim();\n }\n\n if (typeof keywords === 'string') {\n return keywords.toLowerCase().trim();\n }\n\n return '';\n}\n\nfunction getFlatActions(data: SpotlightActions[]) {\n return data.reduce<SpotlightActionData[]>((acc, item) => {\n if ('actions' in item) {\n return [...acc, ...item.actions.map((action) => ({ ...action, group: item.group }))];\n }\n\n return [...acc, item];\n }, []);\n}\n\nfunction flatActionsToGroups(data: SpotlightActionData[]) {\n const groups: Record<string, { pushed: boolean; data: SpotlightActionGroupData }> = {};\n const result: SpotlightActions[] = [];\n\n data.forEach((action) => {\n if (action.group) {\n if (!groups[action.group]) {\n groups[action.group] = { pushed: false, data: { group: action.group, actions: [] } };\n }\n\n groups[action.group].data.actions.push(action);\n\n if (!groups[action.group].pushed) {\n groups[action.group].pushed = true;\n result.push(groups[action.group].data);\n }\n } else {\n result.push(action);\n }\n });\n\n return result;\n}\n\nexport const defaultSpotlightFilter: SpotlightFilterFunction = (_query, data) => {\n const query = _query.trim().toLowerCase();\n const priorityMatrix: SpotlightActionData[][] = [[], []];\n const flatActions = getFlatActions(data);\n flatActions.forEach((item) => {\n if (item.label?.toLowerCase().includes(query)) {\n priorityMatrix[0].push(item);\n } else if (\n item.description?.toLowerCase().includes(query) ||\n getKeywords(item.keywords).includes(query)\n ) {\n priorityMatrix[1].push(item);\n }\n });\n\n return flatActionsToGroups(priorityMatrix.flat());\n};\n"],"mappings":";;AAOA,SAAS,YAAY,UAAyC;AAC5D,KAAI,MAAM,QAAQ,SAAS,CACzB,QAAO,SACJ,KAAK,YAAY,QAAQ,MAAM,CAAC,CAChC,KAAK,IAAI,CACT,aAAa,CACb,MAAM;AAGX,KAAI,OAAO,aAAa,SACtB,QAAO,SAAS,aAAa,CAAC,MAAM;AAGtC,QAAO;;AAGT,SAAS,eAAe,MAA0B;AAChD,QAAO,KAAK,QAA+B,KAAK,SAAS;AACvD,MAAI,aAAa,KACf,QAAO,CAAC,GAAG,KAAK,GAAG,KAAK,QAAQ,KAAK,YAAY;GAAE,GAAG;GAAQ,OAAO,KAAK;GAAO,EAAE,CAAC;AAGtF,SAAO,CAAC,GAAG,KAAK,KAAK;IACpB,EAAE,CAAC;;AAGR,SAAS,oBAAoB,MAA6B;CACxD,MAAM,SAA8E,EAAE;CACtF,MAAM,SAA6B,EAAE;AAErC,MAAK,SAAS,WAAW;AACvB,MAAI,OAAO,OAAO;AAChB,OAAI,CAAC,OAAO,OAAO,OACjB,QAAO,OAAO,SAAS;IAAE,QAAQ;IAAO,MAAM;KAAE,OAAO,OAAO;KAAO,SAAS,EAAE;KAAE;IAAE;AAGtF,UAAO,OAAO,OAAO,KAAK,QAAQ,KAAK,OAAO;AAE9C,OAAI,CAAC,OAAO,OAAO,OAAO,QAAQ;AAChC,WAAO,OAAO,OAAO,SAAS;AAC9B,WAAO,KAAK,OAAO,OAAO,OAAO,KAAK;;QAGxC,QAAO,KAAK,OAAO;GAErB;AAEF,QAAO;;AAGT,MAAa,0BAAmD,QAAQ,SAAS;CAC/E,MAAM,QAAQ,OAAO,MAAM,CAAC,aAAa;CACzC,MAAM,iBAA0C,CAAC,EAAE,EAAE,EAAE,CAAC;AACpC,gBAAe,KAAK,CAC5B,SAAS,SAAS;AAC5B,MAAI,KAAK,OAAO,aAAa,CAAC,SAAS,MAAM,CAC3C,gBAAe,GAAG,KAAK,KAAK;WAE5B,KAAK,aAAa,aAAa,CAAC,SAAS,MAAM,IAC/C,YAAY,KAAK,SAAS,CAAC,SAAS,MAAM,CAE1C,gBAAe,GAAG,KAAK,KAAK;GAE9B;AAEF,QAAO,oBAAoB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"default-spotlight-filter.cjs","names":[],"sources":["../src/default-spotlight-filter.ts"],"sourcesContent":["import type {\n SpotlightActionData,\n SpotlightActionGroupData,\n SpotlightActions,\n SpotlightFilterFunction,\n} from './Spotlight';\n\nfunction getKeywords(keywords: string | string[] | undefined) {\n if (Array.isArray(keywords)) {\n return keywords\n .map((keyword) => keyword.trim())\n .join(',')\n .toLowerCase()\n .trim();\n }\n\n if (typeof keywords === 'string') {\n return keywords.toLowerCase().trim();\n }\n\n return '';\n}\n\nfunction getFlatActions(data: SpotlightActions[]) {\n return data.reduce<SpotlightActionData[]>((acc, item) => {\n if ('actions' in item) {\n return [...acc, ...item.actions.map((action) => ({ ...action, group: item.group }))];\n }\n\n return [...acc, item];\n }, []);\n}\n\nfunction flatActionsToGroups(data: SpotlightActionData[]) {\n const groups: Record<string, { pushed: boolean; data: SpotlightActionGroupData }> = {};\n const result: SpotlightActions[] = [];\n\n data.forEach((action) => {\n if (action.group) {\n if (!groups[action.group]) {\n groups[action.group] = { pushed: false, data: { group: action.group, actions: [] } };\n }\n\n groups[action.group].data.actions.push(action);\n\n if (!groups[action.group].pushed) {\n groups[action.group].pushed = true;\n result.push(groups[action.group].data);\n }\n } else {\n result.push(action);\n }\n });\n\n return result;\n}\n\nexport const defaultSpotlightFilter: SpotlightFilterFunction = (_query, data) => {\n const query = _query.trim().toLowerCase();\n const priorityMatrix: SpotlightActionData[][] = [[], []];\n const flatActions = getFlatActions(data);\n flatActions.forEach((item) => {\n if (item.label?.toLowerCase().includes(query)) {\n priorityMatrix[0].push(item);\n } else if (\n item.description?.toLowerCase().includes(query) ||\n getKeywords(item.keywords).includes(query)\n ) {\n priorityMatrix[1].push(item);\n }\n });\n\n return flatActionsToGroups(priorityMatrix.flat());\n};\n"],"mappings":";;AAOA,SAAS,YAAY,UAAyC;CAC5D,IAAI,MAAM,QAAQ,QAAQ,GACxB,OAAO,SACJ,KAAK,YAAY,QAAQ,KAAK,CAAC,EAC/B,KAAK,GAAG,EACR,YAAY,EACZ,KAAK;CAGV,IAAI,OAAO,aAAa,UACtB,OAAO,SAAS,YAAY,EAAE,KAAK;CAGrC,OAAO;AACT;AAEA,SAAS,eAAe,MAA0B;CAChD,OAAO,KAAK,QAA+B,KAAK,SAAS;EACvD,IAAI,aAAa,MACf,OAAO,CAAC,GAAG,KAAK,GAAG,KAAK,QAAQ,KAAK,YAAY;GAAE,GAAG;GAAQ,OAAO,KAAK;EAAM,EAAE,CAAC;EAGrF,OAAO,CAAC,GAAG,KAAK,IAAI;CACtB,GAAG,CAAC,CAAC;AACP;AAEA,SAAS,oBAAoB,MAA6B;CACxD,MAAM,SAA8E,CAAC;CACrF,MAAM,SAA6B,CAAC;CAEpC,KAAK,SAAS,WAAW;EACvB,IAAI,OAAO,OAAO;GAChB,IAAI,CAAC,OAAO,OAAO,QACjB,OAAO,OAAO,SAAS;IAAE,QAAQ;IAAO,MAAM;KAAE,OAAO,OAAO;KAAO,SAAS,CAAC;IAAE;GAAE;GAGrF,OAAO,OAAO,OAAO,KAAK,QAAQ,KAAK,MAAM;GAE7C,IAAI,CAAC,OAAO,OAAO,OAAO,QAAQ;IAChC,OAAO,OAAO,OAAO,SAAS;IAC9B,OAAO,KAAK,OAAO,OAAO,OAAO,IAAI;GACvC;EACF,OACE,OAAO,KAAK,MAAM;CAEtB,CAAC;CAED,OAAO;AACT;AAEA,MAAa,0BAAmD,QAAQ,SAAS;CAC/E,MAAM,QAAQ,OAAO,KAAK,EAAE,YAAY;CACxC,MAAM,iBAA0C,CAAC,CAAC,GAAG,CAAC,CAAC;CAEvD,eADmC,IACzB,EAAE,SAAS,SAAS;EAC5B,IAAI,KAAK,OAAO,YAAY,EAAE,SAAS,KAAK,GAC1C,eAAe,GAAG,KAAK,IAAI;OACtB,IACL,KAAK,aAAa,YAAY,EAAE,SAAS,KAAK,KAC9C,YAAY,KAAK,QAAQ,EAAE,SAAS,KAAK,GAEzC,eAAe,GAAG,KAAK,IAAI;CAE/B,CAAC;CAED,OAAO,oBAAoB,eAAe,KAAK,CAAC;AAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-hotkeys.cjs","names":["spotlightActions"],"sources":["../src/get-hotkeys.ts"],"sourcesContent":["import { HotkeyItem } from '@mantine/hooks';\nimport { spotlightActions, SpotlightStore } from './spotlight.store';\n\nexport function getHotkeys(\n hotkeys: string | string[] | null | undefined,\n store: SpotlightStore\n): HotkeyItem[] {\n if (!hotkeys) {\n return [];\n }\n\n const open = () => spotlightActions.open(store);\n\n if (Array.isArray(hotkeys)) {\n return hotkeys.map((hotkey) => [hotkey, open]);\n }\n\n return [[hotkeys, open]];\n}\n"],"mappings":";;;AAGA,SAAgB,WACd,SACA,OACc;AACd,KAAI,CAAC,QACH,QAAO,EAAE;CAGX,MAAM,aAAaA,wBAAAA,iBAAiB,KAAK,MAAM;AAE/C,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QAAQ,KAAK,WAAW,CAAC,QAAQ,KAAK,CAAC;AAGhD,QAAO,CAAC,CAAC,SAAS,KAAK,CAAC"}
1
+ {"version":3,"file":"get-hotkeys.cjs","names":["spotlightActions"],"sources":["../src/get-hotkeys.ts"],"sourcesContent":["import { HotkeyItem } from '@mantine/hooks';\nimport { spotlightActions, SpotlightStore } from './spotlight.store';\n\nexport function getHotkeys(\n hotkeys: string | string[] | null | undefined,\n store: SpotlightStore\n): HotkeyItem[] {\n if (!hotkeys) {\n return [];\n }\n\n const open = () => spotlightActions.open(store);\n\n if (Array.isArray(hotkeys)) {\n return hotkeys.map((hotkey) => [hotkey, open]);\n }\n\n return [[hotkeys, open]];\n}\n"],"mappings":";;;AAGA,SAAgB,WACd,SACA,OACc;CACd,IAAI,CAAC,SACH,OAAO,CAAC;CAGV,MAAM,aAAaA,wBAAAA,iBAAiB,KAAK,KAAK;CAE9C,IAAI,MAAM,QAAQ,OAAO,GACvB,OAAO,QAAQ,KAAK,WAAW,CAAC,QAAQ,IAAI,CAAC;CAG/C,OAAO,CAAC,CAAC,SAAS,IAAI,CAAC;AACzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-actions-group.cjs","names":[],"sources":["../src/is-actions-group.ts"],"sourcesContent":["import type { SpotlightActionData, SpotlightActionGroupData } from './Spotlight';\n\nexport function isActionsGroup(\n item: SpotlightActionData | SpotlightActionGroupData\n): item is SpotlightActionGroupData {\n const _item = item as SpotlightActionGroupData;\n return _item.group !== undefined && Array.isArray(_item.actions);\n}\n"],"mappings":";;AAEA,SAAgB,eACd,MACkC;CAClC,MAAM,QAAQ;AACd,QAAO,MAAM,UAAU,KAAA,KAAa,MAAM,QAAQ,MAAM,QAAQ"}
1
+ {"version":3,"file":"is-actions-group.cjs","names":[],"sources":["../src/is-actions-group.ts"],"sourcesContent":["import type { SpotlightActionData, SpotlightActionGroupData } from './Spotlight';\n\nexport function isActionsGroup(\n item: SpotlightActionData | SpotlightActionGroupData\n): item is SpotlightActionGroupData {\n const _item = item as SpotlightActionGroupData;\n return _item.group !== undefined && Array.isArray(_item.actions);\n}\n"],"mappings":";;AAEA,SAAgB,eACd,MACkC;CAClC,MAAM,QAAQ;CACd,OAAO,MAAM,UAAU,KAAA,KAAa,MAAM,QAAQ,MAAM,OAAO;AACjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"limit-actions.cjs","names":["isActionsGroup"],"sources":["../src/limit-actions.ts"],"sourcesContent":["import { isActionsGroup } from './is-actions-group';\nimport type { SpotlightActionData, SpotlightActions } from './Spotlight';\n\nexport function limitActions(actions: SpotlightActions[], limit: number) {\n if (!Array.isArray(actions)) {\n return [];\n }\n\n let count = 0;\n return actions.reduce<SpotlightActions[]>((acc, item) => {\n if (count >= limit) {\n return acc;\n }\n\n if (isActionsGroup(item)) {\n const groupActions = limitActions(item.actions, limit - count);\n acc.push({\n group: item.group,\n actions: groupActions as SpotlightActionData[],\n });\n count += groupActions.length;\n } else {\n acc.push(item);\n count += 1;\n }\n\n return acc;\n }, []);\n}\n"],"mappings":";;;AAGA,SAAgB,aAAa,SAA6B,OAAe;AACvE,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO,EAAE;CAGX,IAAI,QAAQ;AACZ,QAAO,QAAQ,QAA4B,KAAK,SAAS;AACvD,MAAI,SAAS,MACX,QAAO;AAGT,MAAIA,yBAAAA,eAAe,KAAK,EAAE;GACxB,MAAM,eAAe,aAAa,KAAK,SAAS,QAAQ,MAAM;AAC9D,OAAI,KAAK;IACP,OAAO,KAAK;IACZ,SAAS;IACV,CAAC;AACF,YAAS,aAAa;SACjB;AACL,OAAI,KAAK,KAAK;AACd,YAAS;;AAGX,SAAO;IACN,EAAE,CAAC"}
1
+ {"version":3,"file":"limit-actions.cjs","names":["isActionsGroup"],"sources":["../src/limit-actions.ts"],"sourcesContent":["import { isActionsGroup } from './is-actions-group';\nimport type { SpotlightActionData, SpotlightActions } from './Spotlight';\n\nexport function limitActions(actions: SpotlightActions[], limit: number) {\n if (!Array.isArray(actions)) {\n return [];\n }\n\n let count = 0;\n return actions.reduce<SpotlightActions[]>((acc, item) => {\n if (count >= limit) {\n return acc;\n }\n\n if (isActionsGroup(item)) {\n const groupActions = limitActions(item.actions, limit - count);\n acc.push({\n group: item.group,\n actions: groupActions as SpotlightActionData[],\n });\n count += groupActions.length;\n } else {\n acc.push(item);\n count += 1;\n }\n\n return acc;\n }, []);\n}\n"],"mappings":";;;AAGA,SAAgB,aAAa,SAA6B,OAAe;CACvE,IAAI,CAAC,MAAM,QAAQ,OAAO,GACxB,OAAO,CAAC;CAGV,IAAI,QAAQ;CACZ,OAAO,QAAQ,QAA4B,KAAK,SAAS;EACvD,IAAI,SAAS,OACX,OAAO;EAGT,IAAIA,yBAAAA,eAAe,IAAI,GAAG;GACxB,MAAM,eAAe,aAAa,KAAK,SAAS,QAAQ,KAAK;GAC7D,IAAI,KAAK;IACP,OAAO,KAAK;IACZ,SAAS;GACX,CAAC;GACD,SAAS,aAAa;EACxB,OAAO;GACL,IAAI,KAAK,IAAI;GACb,SAAS;EACX;EAEA,OAAO;CACT,GAAG,CAAC,CAAC;AACP"}
@@ -1 +1 @@
1
- {"version":3,"file":"spotlight.store.cjs","names":[],"sources":["../src/spotlight.store.ts"],"sourcesContent":["import { clamp } from '@mantine/hooks';\nimport { createStore, MantineStore, useStore } from '@mantine/store';\n\nexport interface SpotlightState {\n opened: boolean;\n selected: number;\n listId: string;\n query: string;\n empty: boolean;\n registeredActions: Set<string>;\n}\n\nexport type SpotlightStore = MantineStore<SpotlightState>;\n\nexport const createSpotlightStore = () =>\n createStore<SpotlightState>({\n opened: false,\n empty: false,\n selected: -1,\n listId: '',\n query: '',\n registeredActions: new Set(),\n });\n\nexport const useSpotlight = (store: SpotlightStore) => useStore(store);\n\nexport function updateSpotlightStateAction(\n update: (state: SpotlightState) => Partial<SpotlightState>,\n store: SpotlightStore\n) {\n const state = store.getState();\n store.setState({ ...state, ...update(store.getState()) });\n}\n\nexport function openSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ opened: true, selected: -1 }), store);\n}\n\nexport function closeSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ opened: false }), store);\n}\n\nexport function toggleSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(\n (state) => ({ opened: !state.opened, selected: state.opened ? state.selected : -1 }),\n store\n );\n}\n\nexport function setSelectedAction(index: number, store: SpotlightStore) {\n store.updateState((state) => ({ ...state, selected: index }));\n}\n\nexport function setListId(id: string, store: SpotlightStore) {\n store.updateState((state) => ({ ...state, listId: id }));\n}\n\nfunction findElementByQuerySelector<T extends HTMLElement>(\n selector: string,\n root: Document | Element | ShadowRoot = document\n): T | null {\n // Directly try to find the element in the current root.\n const element = root.querySelector<T>(selector);\n if (element) {\n return element;\n }\n\n // Iterate through all children of the current root.\n const children = root instanceof ShadowRoot ? root.host.children : root.children;\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n\n // Recursively search in the child's shadow root if it exists.\n if (child.shadowRoot) {\n const shadowElement = findElementByQuerySelector<T>(selector, child.shadowRoot);\n if (shadowElement) {\n return shadowElement;\n }\n }\n\n // Also, search recursively in the child itself if it does not have a shadow root or the element wasn't found in its shadow root.\n const nestedElement = findElementByQuerySelector<T>(selector, child);\n if (nestedElement) {\n return nestedElement;\n }\n }\n\n // Return null if the element isn't found in the current root or any of its shadow DOMs.\n return null;\n}\n\nexport function selectAction(index: number, store: SpotlightStore): number {\n const state = store.getState();\n const actionsList = state.listId ? findElementByQuerySelector(`#${state.listId}`) : null;\n const selected = actionsList?.querySelector<HTMLButtonElement>('[data-selected]');\n const actions = actionsList?.querySelectorAll<HTMLButtonElement>('[data-action]') ?? [];\n const nextIndex = index === -1 ? actions.length - 1 : index === actions.length ? 0 : index;\n\n const selectedIndex = clamp(nextIndex, 0, actions.length - 1);\n selected?.removeAttribute('data-selected');\n actions[selectedIndex]?.scrollIntoView({ block: 'nearest' });\n actions[selectedIndex]?.setAttribute('data-selected', 'true');\n setSelectedAction(selectedIndex, store);\n\n return selectedIndex;\n}\n\nexport function selectNextAction(store: SpotlightStore) {\n return selectAction(store.getState().selected + 1, store);\n}\n\nexport function selectPreviousAction(store: SpotlightStore) {\n return selectAction(store.getState().selected - 1, store);\n}\n\nexport function triggerSelectedAction(store: SpotlightStore) {\n const state = store.getState();\n const selected = state.listId\n ? findElementByQuerySelector<HTMLButtonElement>(`#${state.listId} [data-selected]`)\n : null;\n selected?.click();\n}\n\nexport function registerAction(id: string, store: SpotlightStore) {\n const state = store.getState();\n state.registeredActions.add(id);\n return () => {\n state.registeredActions.delete(id);\n };\n}\n\nexport function setQuery(query: string, store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ query }), store);\n Promise.resolve().then(() => {\n selectAction(0, store);\n updateSpotlightStateAction(\n (state) => ({\n empty: (state.query.trim().length > 0 && state.registeredActions.size === 0) || false,\n }),\n store\n );\n });\n}\n\nexport function clearSpotlightState(\n { clearQuery }: { clearQuery: boolean | undefined },\n store: SpotlightStore\n) {\n store.updateState((state) => ({\n ...state,\n selected: -1,\n query: clearQuery ? '' : state.query,\n empty: clearQuery ? false : state.empty,\n }));\n}\n\nexport const spotlightActions = {\n open: openSpotlightAction,\n close: closeSpotlightAction,\n toggle: toggleSpotlightAction,\n updateState: updateSpotlightStateAction,\n setSelectedAction,\n setListId,\n selectAction,\n selectNextAction,\n selectPreviousAction,\n triggerSelectedAction,\n registerAction,\n setQuery,\n clearSpotlightState,\n};\n\nexport function createSpotlight() {\n const store = createSpotlightStore();\n const actions = {\n open: () => openSpotlightAction(store),\n close: () => closeSpotlightAction(store),\n toggle: () => toggleSpotlightAction(store),\n };\n\n return [store, actions] as const;\n}\n\nexport const [spotlightStore, spotlight] = createSpotlight();\nexport const { open: openSpotlight, close: closeSpotlight, toggle: toggleSpotlight } = spotlight;\n"],"mappings":";;;;AAcA,MAAa,8BAAA,GAAA,eAAA,aACiB;CAC1B,QAAQ;CACR,OAAO;CACP,UAAU;CACV,QAAQ;CACR,OAAO;CACP,mCAAmB,IAAI,KAAK;CAC7B,CAAC;AAEJ,MAAa,gBAAgB,WAAA,GAAA,eAAA,UAAmC,MAAM;AAEtE,SAAgB,2BACd,QACA,OACA;CACA,MAAM,QAAQ,MAAM,UAAU;AAC9B,OAAM,SAAS;EAAE,GAAG;EAAO,GAAG,OAAO,MAAM,UAAU,CAAC;EAAE,CAAC;;AAG3D,SAAgB,oBAAoB,OAAuB;AACzD,mCAAkC;EAAE,QAAQ;EAAM,UAAU;EAAI,GAAG,MAAM;;AAG3E,SAAgB,qBAAqB,OAAuB;AAC1D,mCAAkC,EAAE,QAAQ,OAAO,GAAG,MAAM;;AAG9D,SAAgB,sBAAsB,OAAuB;AAC3D,6BACG,WAAW;EAAE,QAAQ,CAAC,MAAM;EAAQ,UAAU,MAAM,SAAS,MAAM,WAAW;EAAI,GACnF,MACD;;AAGH,SAAgB,kBAAkB,OAAe,OAAuB;AACtE,OAAM,aAAa,WAAW;EAAE,GAAG;EAAO,UAAU;EAAO,EAAE;;AAG/D,SAAgB,UAAU,IAAY,OAAuB;AAC3D,OAAM,aAAa,WAAW;EAAE,GAAG;EAAO,QAAQ;EAAI,EAAE;;AAG1D,SAAS,2BACP,UACA,OAAwC,UAC9B;CAEV,MAAM,UAAU,KAAK,cAAiB,SAAS;AAC/C,KAAI,QACF,QAAO;CAIT,MAAM,WAAW,gBAAgB,aAAa,KAAK,KAAK,WAAW,KAAK;AACxE,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;EAC3C,MAAM,QAAQ,SAAS;AAGvB,MAAI,MAAM,YAAY;GACpB,MAAM,gBAAgB,2BAA8B,UAAU,MAAM,WAAW;AAC/E,OAAI,cACF,QAAO;;EAKX,MAAM,gBAAgB,2BAA8B,UAAU,MAAM;AACpE,MAAI,cACF,QAAO;;AAKX,QAAO;;AAGT,SAAgB,aAAa,OAAe,OAA+B;CACzE,MAAM,QAAQ,MAAM,UAAU;CAC9B,MAAM,cAAc,MAAM,SAAS,2BAA2B,IAAI,MAAM,SAAS,GAAG;CACpF,MAAM,WAAW,aAAa,cAAiC,kBAAkB;CACjF,MAAM,UAAU,aAAa,iBAAoC,gBAAgB,IAAI,EAAE;CAGvF,MAAM,iBAAA,GAAA,eAAA,OAFY,UAAU,KAAK,QAAQ,SAAS,IAAI,UAAU,QAAQ,SAAS,IAAI,OAE9C,GAAG,QAAQ,SAAS,EAAE;AAC7D,WAAU,gBAAgB,gBAAgB;AAC1C,SAAQ,gBAAgB,eAAe,EAAE,OAAO,WAAW,CAAC;AAC5D,SAAQ,gBAAgB,aAAa,iBAAiB,OAAO;AAC7D,mBAAkB,eAAe,MAAM;AAEvC,QAAO;;AAGT,SAAgB,iBAAiB,OAAuB;AACtD,QAAO,aAAa,MAAM,UAAU,CAAC,WAAW,GAAG,MAAM;;AAG3D,SAAgB,qBAAqB,OAAuB;AAC1D,QAAO,aAAa,MAAM,UAAU,CAAC,WAAW,GAAG,MAAM;;AAG3D,SAAgB,sBAAsB,OAAuB;CAC3D,MAAM,QAAQ,MAAM,UAAU;AAI9B,EAHiB,MAAM,SACnB,2BAA8C,IAAI,MAAM,OAAO,kBAAkB,GACjF,OACM,OAAO;;AAGnB,SAAgB,eAAe,IAAY,OAAuB;CAChE,MAAM,QAAQ,MAAM,UAAU;AAC9B,OAAM,kBAAkB,IAAI,GAAG;AAC/B,cAAa;AACX,QAAM,kBAAkB,OAAO,GAAG;;;AAItC,SAAgB,SAAS,OAAe,OAAuB;AAC7D,mCAAkC,EAAE,OAAO,GAAG,MAAM;AACpD,SAAQ,SAAS,CAAC,WAAW;AAC3B,eAAa,GAAG,MAAM;AACtB,8BACG,WAAW,EACV,OAAQ,MAAM,MAAM,MAAM,CAAC,SAAS,KAAK,MAAM,kBAAkB,SAAS,KAAM,OACjF,GACD,MACD;GACD;;AAGJ,SAAgB,oBACd,EAAE,cACF,OACA;AACA,OAAM,aAAa,WAAW;EAC5B,GAAG;EACH,UAAU;EACV,OAAO,aAAa,KAAK,MAAM;EAC/B,OAAO,aAAa,QAAQ,MAAM;EACnC,EAAE;;AAGL,MAAa,mBAAmB;CAC9B,MAAM;CACN,OAAO;CACP,QAAQ;CACR,aAAa;CACb;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,kBAAkB;CAChC,MAAM,QAAQ,sBAAsB;AAOpC,QAAO,CAAC,OANQ;EACd,YAAY,oBAAoB,MAAM;EACtC,aAAa,qBAAqB,MAAM;EACxC,cAAc,sBAAsB,MAAM;EAC3C,CAEsB;;AAGzB,MAAa,CAAC,gBAAgB,aAAa,iBAAiB;AAC5D,MAAa,EAAE,MAAM,eAAe,OAAO,gBAAgB,QAAQ,oBAAoB"}
1
+ {"version":3,"file":"spotlight.store.cjs","names":[],"sources":["../src/spotlight.store.ts"],"sourcesContent":["import { clamp } from '@mantine/hooks';\nimport { createStore, MantineStore, useStore } from '@mantine/store';\n\nexport interface SpotlightState {\n opened: boolean;\n selected: number;\n listId: string;\n query: string;\n empty: boolean;\n registeredActions: Set<string>;\n}\n\nexport type SpotlightStore = MantineStore<SpotlightState>;\n\nexport const createSpotlightStore = () =>\n createStore<SpotlightState>({\n opened: false,\n empty: false,\n selected: -1,\n listId: '',\n query: '',\n registeredActions: new Set(),\n });\n\nexport const useSpotlight = (store: SpotlightStore) => useStore(store);\n\nexport function updateSpotlightStateAction(\n update: (state: SpotlightState) => Partial<SpotlightState>,\n store: SpotlightStore\n) {\n const state = store.getState();\n store.setState({ ...state, ...update(store.getState()) });\n}\n\nexport function openSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ opened: true, selected: -1 }), store);\n}\n\nexport function closeSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ opened: false }), store);\n}\n\nexport function toggleSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(\n (state) => ({ opened: !state.opened, selected: state.opened ? state.selected : -1 }),\n store\n );\n}\n\nexport function setSelectedAction(index: number, store: SpotlightStore) {\n store.updateState((state) => ({ ...state, selected: index }));\n}\n\nexport function setListId(id: string, store: SpotlightStore) {\n store.updateState((state) => ({ ...state, listId: id }));\n}\n\nfunction findElementByQuerySelector<T extends HTMLElement>(\n selector: string,\n root: Document | Element | ShadowRoot = document\n): T | null {\n // Directly try to find the element in the current root.\n const element = root.querySelector<T>(selector);\n if (element) {\n return element;\n }\n\n // Iterate through all children of the current root.\n const children = root instanceof ShadowRoot ? root.host.children : root.children;\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n\n // Recursively search in the child's shadow root if it exists.\n if (child.shadowRoot) {\n const shadowElement = findElementByQuerySelector<T>(selector, child.shadowRoot);\n if (shadowElement) {\n return shadowElement;\n }\n }\n\n // Also, search recursively in the child itself if it does not have a shadow root or the element wasn't found in its shadow root.\n const nestedElement = findElementByQuerySelector<T>(selector, child);\n if (nestedElement) {\n return nestedElement;\n }\n }\n\n // Return null if the element isn't found in the current root or any of its shadow DOMs.\n return null;\n}\n\nexport function selectAction(index: number, store: SpotlightStore): number {\n const state = store.getState();\n const actionsList = state.listId ? findElementByQuerySelector(`#${state.listId}`) : null;\n const selected = actionsList?.querySelector<HTMLButtonElement>('[data-selected]');\n const actions = actionsList?.querySelectorAll<HTMLButtonElement>('[data-action]') ?? [];\n const nextIndex = index === -1 ? actions.length - 1 : index === actions.length ? 0 : index;\n\n const selectedIndex = clamp(nextIndex, 0, actions.length - 1);\n selected?.removeAttribute('data-selected');\n actions[selectedIndex]?.scrollIntoView({ block: 'nearest' });\n actions[selectedIndex]?.setAttribute('data-selected', 'true');\n setSelectedAction(selectedIndex, store);\n\n return selectedIndex;\n}\n\nexport function selectNextAction(store: SpotlightStore) {\n return selectAction(store.getState().selected + 1, store);\n}\n\nexport function selectPreviousAction(store: SpotlightStore) {\n return selectAction(store.getState().selected - 1, store);\n}\n\nexport function triggerSelectedAction(store: SpotlightStore) {\n const state = store.getState();\n const selected = state.listId\n ? findElementByQuerySelector<HTMLButtonElement>(`#${state.listId} [data-selected]`)\n : null;\n selected?.click();\n}\n\nexport function registerAction(id: string, store: SpotlightStore) {\n const state = store.getState();\n state.registeredActions.add(id);\n return () => {\n state.registeredActions.delete(id);\n };\n}\n\nexport function setQuery(query: string, store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ query }), store);\n Promise.resolve().then(() => {\n selectAction(0, store);\n updateSpotlightStateAction(\n (state) => ({\n empty: (state.query.trim().length > 0 && state.registeredActions.size === 0) || false,\n }),\n store\n );\n });\n}\n\nexport function clearSpotlightState(\n { clearQuery }: { clearQuery: boolean | undefined },\n store: SpotlightStore\n) {\n store.updateState((state) => ({\n ...state,\n selected: -1,\n query: clearQuery ? '' : state.query,\n empty: clearQuery ? false : state.empty,\n }));\n}\n\nexport const spotlightActions = {\n open: openSpotlightAction,\n close: closeSpotlightAction,\n toggle: toggleSpotlightAction,\n updateState: updateSpotlightStateAction,\n setSelectedAction,\n setListId,\n selectAction,\n selectNextAction,\n selectPreviousAction,\n triggerSelectedAction,\n registerAction,\n setQuery,\n clearSpotlightState,\n};\n\nexport function createSpotlight() {\n const store = createSpotlightStore();\n const actions = {\n open: () => openSpotlightAction(store),\n close: () => closeSpotlightAction(store),\n toggle: () => toggleSpotlightAction(store),\n };\n\n return [store, actions] as const;\n}\n\nexport const [spotlightStore, spotlight] = createSpotlight();\nexport const { open: openSpotlight, close: closeSpotlight, toggle: toggleSpotlight } = spotlight;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Spotlight.context.mjs","names":[],"sources":["../src/Spotlight.context.ts"],"sourcesContent":["import { createSafeContext, GetStylesApi } from '@mantine/core';\nimport { SpotlightStore } from './spotlight.store';\nimport type { SpotlightRootFactory } from './SpotlightRoot';\n\ninterface SpotlightContextValue {\n query: string;\n setQuery: (query: string) => void;\n getStyles: GetStylesApi<SpotlightRootFactory>;\n store: SpotlightStore;\n closeOnActionTrigger: boolean | undefined;\n}\n\nexport const [SpotlightProvider, useSpotlightContext] = createSafeContext<SpotlightContextValue>(\n 'Spotlight component was not found in tree'\n);\n"],"mappings":";;;AAYA,MAAa,CAAC,mBAAmB,uBAAuB,kBACtD,4CACD"}
1
+ {"version":3,"file":"Spotlight.context.mjs","names":[],"sources":["../src/Spotlight.context.ts"],"sourcesContent":["import { createSafeContext, GetStylesApi } from '@mantine/core';\nimport { SpotlightStore } from './spotlight.store';\nimport type { SpotlightRootFactory } from './SpotlightRoot';\n\ninterface SpotlightContextValue {\n query: string;\n setQuery: (query: string) => void;\n getStyles: GetStylesApi<SpotlightRootFactory>;\n store: SpotlightStore;\n closeOnActionTrigger: boolean | undefined;\n}\n\nexport const [SpotlightProvider, useSpotlightContext] = createSafeContext<SpotlightContextValue>(\n 'Spotlight component was not found in tree'\n);\n"],"mappings":";;;AAYA,MAAa,CAAC,mBAAmB,uBAAuB,kBACtD,2CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"Spotlight.mjs","names":["classes"],"sources":["../src/Spotlight.tsx"],"sourcesContent":["import {\n factory,\n Factory,\n getDefaultZIndex,\n ScrollAreaAutosizeProps,\n useProps,\n} from '@mantine/core';\nimport { useUncontrolled } from '@mantine/hooks';\nimport { defaultSpotlightFilter } from './default-spotlight-filter';\nimport { isActionsGroup } from './is-actions-group';\nimport { limitActions } from './limit-actions';\nimport { spotlight, spotlightStore } from './spotlight.store';\nimport {\n SpotlightAction,\n SpotlightActionProps,\n type SpotlightActionStylesNames,\n} from './SpotlightAction';\nimport {\n SpotlightActionsGroup,\n type SpotlightActionsGroupProps,\n type SpotlightActionsGroupStylesNames,\n} from './SpotlightActionsGroup';\nimport {\n SpotlightActionsList,\n type SpotlightActionsListProps,\n type SpotlightActionsListStylesNames,\n} from './SpotlightActionsList';\nimport {\n SpotlightEmpty,\n type SpotlightEmptyProps,\n type SpotlightEmptyStylesNames,\n} from './SpotlightEmpty';\nimport {\n SpotlightFooter,\n type SpotlightFooterProps,\n type SpotlightFooterStylesNames,\n} from './SpotlightFooter';\nimport { SpotlightRoot, SpotlightRootProps, SpotlightRootStylesNames } from './SpotlightRoot';\nimport {\n SpotlightSearch,\n SpotlightSearchProps,\n type SpotlightSearchStylesNames,\n} from './SpotlightSearch';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightFilterFunction = (\n query: string,\n actions: SpotlightActions[]\n) => SpotlightActions[];\n\nexport interface SpotlightActionData extends SpotlightActionProps {\n id: string;\n group?: string;\n}\n\nexport interface SpotlightActionGroupData {\n group: string;\n actions: SpotlightActionData[];\n}\n\nexport type SpotlightActions = SpotlightActionData | SpotlightActionGroupData;\n\nexport type SpotlightStylesNames = SpotlightRootStylesNames;\n\nexport interface SpotlightProps extends SpotlightRootProps {\n /** Props passed down to the `Spotlight.Search` */\n searchProps?: SpotlightSearchProps;\n\n /** Actions data, passed down to `Spotlight.Action` component */\n actions: SpotlightActions[];\n\n /** Function to filter actions data based on search query, by default actions are filtered by title, description and keywords */\n filter?: SpotlightFilterFunction;\n\n /** Message displayed when none of the actions match given `filter` */\n nothingFound?: React.ReactNode;\n\n /** Determines whether search query should be highlighted in action label @default false */\n highlightQuery?: boolean;\n\n /** Maximum number of actions displayed at a time @default Infinity */\n limit?: number;\n\n /** Props passed down to the `ScrollArea` component */\n scrollAreaProps?: Partial<ScrollAreaAutosizeProps>;\n}\n\nexport type SpotlightFactory = Factory<{\n props: SpotlightProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightStylesNames;\n staticComponents: {\n Search: typeof SpotlightSearch;\n ActionsList: typeof SpotlightActionsList;\n Action: typeof SpotlightAction;\n Empty: typeof SpotlightEmpty;\n Footer: typeof SpotlightFooter;\n ActionsGroup: typeof SpotlightActionsGroup;\n Root: typeof SpotlightRoot;\n open: typeof spotlight.open;\n close: typeof spotlight.close;\n toggle: typeof spotlight.toggle;\n };\n}>;\n\nconst defaultProps = {\n size: 600,\n yOffset: 80,\n limit: Infinity,\n zIndex: getDefaultZIndex('max'),\n overlayProps: { backgroundOpacity: 0.35, blur: 7 },\n transitionProps: { duration: 200, transition: 'pop' },\n store: spotlightStore,\n filter: defaultSpotlightFilter,\n clearQueryOnClose: true,\n closeOnActionTrigger: true,\n shortcut: 'mod + K',\n} satisfies Partial<SpotlightProps>;\n\nexport const Spotlight = factory<SpotlightFactory>((_props) => {\n const props = useProps('Spotlight', defaultProps, _props);\n const {\n searchProps,\n filter,\n query,\n onQueryChange,\n actions,\n nothingFound,\n highlightQuery,\n limit,\n scrollAreaProps,\n ...others\n } = props;\n\n const [_query, setQuery] = useUncontrolled({\n value: query,\n defaultValue: '',\n finalValue: '',\n onChange: onQueryChange,\n });\n\n const filteredActions = limitActions(filter(_query, actions), limit).map((item) => {\n if (isActionsGroup(item)) {\n const items = item.actions.map(({ id, ...actionData }) => (\n <SpotlightAction key={id} highlightQuery={highlightQuery} {...actionData} />\n ));\n\n return (\n <SpotlightActionsGroup key={item.group} label={item.group}>\n {items}\n </SpotlightActionsGroup>\n );\n }\n\n return <SpotlightAction key={item.id} highlightQuery={highlightQuery} {...item} />;\n });\n\n return (\n <SpotlightRoot {...others} query={_query} onQueryChange={setQuery}>\n <SpotlightSearch {...searchProps} />\n {filteredActions.length > 0 && (\n <SpotlightActionsList {...(scrollAreaProps as any)}>{filteredActions}</SpotlightActionsList>\n )}\n {filteredActions.length === 0 && nothingFound && (\n <SpotlightEmpty>{nothingFound}</SpotlightEmpty>\n )}\n </SpotlightRoot>\n );\n});\n\nSpotlight.classes = classes;\nSpotlight.displayName = '@mantine/spotlight/Spotlight';\nSpotlight.Search = SpotlightSearch;\nSpotlight.ActionsList = SpotlightActionsList;\nSpotlight.Action = SpotlightAction;\nSpotlight.Empty = SpotlightEmpty;\nSpotlight.ActionsGroup = SpotlightActionsGroup;\nSpotlight.Footer = SpotlightFooter;\nSpotlight.Root = SpotlightRoot;\nSpotlight.open = spotlight.open;\nSpotlight.close = spotlight.close;\nSpotlight.toggle = spotlight.toggle;\n\nexport namespace Spotlight {\n export type Props = SpotlightProps;\n export type StylesNames = SpotlightStylesNames;\n export type Factory = SpotlightFactory;\n export type FilterFunction = SpotlightFilterFunction;\n export type ActionData = SpotlightActionData;\n export type ActionGroupData = SpotlightActionGroupData;\n\n export namespace Action {\n export type Props = SpotlightActionProps;\n export type StylesNames = SpotlightActionStylesNames;\n }\n\n export namespace ActionsGroup {\n export type Props = SpotlightActionsGroupProps;\n export type StylesNames = SpotlightActionsGroupStylesNames;\n }\n\n export namespace ActionsList {\n export type Props = SpotlightActionsListProps;\n export type StylesNames = SpotlightActionsListStylesNames;\n }\n\n export namespace Empty {\n export type Props = SpotlightEmptyProps;\n export type StylesNames = SpotlightEmptyStylesNames;\n }\n\n export namespace Footer {\n export type Props = SpotlightFooterProps;\n export type StylesNames = SpotlightFooterStylesNames;\n }\n\n export namespace Search {\n export type Props = SpotlightSearchProps;\n export type StylesNames = SpotlightSearchStylesNames;\n }\n\n export namespace Root {\n export type Props = SpotlightRootProps;\n export type StylesNames = SpotlightRootStylesNames;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyGA,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,OAAO;CACP,QAAQ,iBAAiB,MAAM;CAC/B,cAAc;EAAE,mBAAmB;EAAM,MAAM;EAAG;CAClD,iBAAiB;EAAE,UAAU;EAAK,YAAY;EAAO;CACrD,OAAO;CACP,QAAQ;CACR,mBAAmB;CACnB,sBAAsB;CACtB,UAAU;CACX;AAED,MAAa,YAAY,SAA2B,WAAW;CAE7D,MAAM,EACJ,aACA,QACA,OACA,eACA,SACA,cACA,gBACA,OACA,iBACA,GAAG,WAXS,SAAS,aAAa,cAAc,OAAO;CAczD,MAAM,CAAC,QAAQ,YAAY,gBAAgB;EACzC,OAAO;EACP,cAAc;EACd,YAAY;EACZ,UAAU;EACX,CAAC;CAEF,MAAM,kBAAkB,aAAa,OAAO,QAAQ,QAAQ,EAAE,MAAM,CAAC,KAAK,SAAS;AACjF,MAAI,eAAe,KAAK,EAAE;GACxB,MAAM,QAAQ,KAAK,QAAQ,KAAK,EAAE,IAAI,GAAG,iBACvC,oBAAC,iBAAD;IAA0C;IAAgB,GAAI;IAAc,EAAtD,GAAsD,CAC5E;AAEF,UACE,oBAAC,uBAAD;IAAwC,OAAO,KAAK;cACjD;IACqB,EAFI,KAAK,MAET;;AAI5B,SAAO,oBAAC,iBAAD;GAA+C;GAAgB,GAAI;GAAQ,EAArD,KAAK,GAAgD;GAClF;AAEF,QACE,qBAAC,eAAD;EAAe,GAAI;EAAQ,OAAO;EAAQ,eAAe;YAAzD;GACE,oBAAC,iBAAD,EAAiB,GAAI,aAAe,CAAA;GACnC,gBAAgB,SAAS,KACxB,oBAAC,sBAAD;IAAsB,GAAK;cAA0B;IAAuC,CAAA;GAE7F,gBAAgB,WAAW,KAAK,gBAC/B,oBAAC,gBAAD,EAAA,UAAiB,cAA8B,CAAA;GAEnC;;EAElB;AAEF,UAAU,UAAUA;AACpB,UAAU,cAAc;AACxB,UAAU,SAAS;AACnB,UAAU,cAAc;AACxB,UAAU,SAAS;AACnB,UAAU,QAAQ;AAClB,UAAU,eAAe;AACzB,UAAU,SAAS;AACnB,UAAU,OAAO;AACjB,UAAU,OAAO,UAAU;AAC3B,UAAU,QAAQ,UAAU;AAC5B,UAAU,SAAS,UAAU"}
1
+ {"version":3,"file":"Spotlight.mjs","names":["classes"],"sources":["../src/Spotlight.tsx"],"sourcesContent":["import {\n factory,\n Factory,\n getDefaultZIndex,\n ScrollAreaAutosizeProps,\n useProps,\n} from '@mantine/core';\nimport { useUncontrolled } from '@mantine/hooks';\nimport { defaultSpotlightFilter } from './default-spotlight-filter';\nimport { isActionsGroup } from './is-actions-group';\nimport { limitActions } from './limit-actions';\nimport { spotlight, spotlightStore } from './spotlight.store';\nimport {\n SpotlightAction,\n SpotlightActionProps,\n type SpotlightActionStylesNames,\n} from './SpotlightAction';\nimport {\n SpotlightActionsGroup,\n type SpotlightActionsGroupProps,\n type SpotlightActionsGroupStylesNames,\n} from './SpotlightActionsGroup';\nimport {\n SpotlightActionsList,\n type SpotlightActionsListProps,\n type SpotlightActionsListStylesNames,\n} from './SpotlightActionsList';\nimport {\n SpotlightEmpty,\n type SpotlightEmptyProps,\n type SpotlightEmptyStylesNames,\n} from './SpotlightEmpty';\nimport {\n SpotlightFooter,\n type SpotlightFooterProps,\n type SpotlightFooterStylesNames,\n} from './SpotlightFooter';\nimport { SpotlightRoot, SpotlightRootProps, SpotlightRootStylesNames } from './SpotlightRoot';\nimport {\n SpotlightSearch,\n SpotlightSearchProps,\n type SpotlightSearchStylesNames,\n} from './SpotlightSearch';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightFilterFunction = (\n query: string,\n actions: SpotlightActions[]\n) => SpotlightActions[];\n\nexport interface SpotlightActionData extends SpotlightActionProps {\n id: string;\n group?: string;\n}\n\nexport interface SpotlightActionGroupData {\n group: string;\n actions: SpotlightActionData[];\n}\n\nexport type SpotlightActions = SpotlightActionData | SpotlightActionGroupData;\n\nexport type SpotlightStylesNames = SpotlightRootStylesNames;\n\nexport interface SpotlightProps extends SpotlightRootProps {\n /** Props passed down to the `Spotlight.Search` */\n searchProps?: SpotlightSearchProps;\n\n /** Actions data, passed down to `Spotlight.Action` component */\n actions: SpotlightActions[];\n\n /** Function to filter actions data based on search query, by default actions are filtered by title, description and keywords */\n filter?: SpotlightFilterFunction;\n\n /** Message displayed when none of the actions match given `filter` */\n nothingFound?: React.ReactNode;\n\n /** Determines whether search query should be highlighted in action label @default false */\n highlightQuery?: boolean;\n\n /** Maximum number of actions displayed at a time @default Infinity */\n limit?: number;\n\n /** Props passed down to the `ScrollArea` component */\n scrollAreaProps?: Partial<ScrollAreaAutosizeProps>;\n}\n\nexport type SpotlightFactory = Factory<{\n props: SpotlightProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightStylesNames;\n staticComponents: {\n Search: typeof SpotlightSearch;\n ActionsList: typeof SpotlightActionsList;\n Action: typeof SpotlightAction;\n Empty: typeof SpotlightEmpty;\n Footer: typeof SpotlightFooter;\n ActionsGroup: typeof SpotlightActionsGroup;\n Root: typeof SpotlightRoot;\n open: typeof spotlight.open;\n close: typeof spotlight.close;\n toggle: typeof spotlight.toggle;\n };\n}>;\n\nconst defaultProps = {\n size: 600,\n yOffset: 80,\n limit: Infinity,\n zIndex: getDefaultZIndex('max'),\n overlayProps: { backgroundOpacity: 0.35, blur: 7 },\n transitionProps: { duration: 200, transition: 'pop' },\n store: spotlightStore,\n filter: defaultSpotlightFilter,\n clearQueryOnClose: true,\n closeOnActionTrigger: true,\n shortcut: 'mod + K',\n} satisfies Partial<SpotlightProps>;\n\nexport const Spotlight = factory<SpotlightFactory>((_props) => {\n const props = useProps('Spotlight', defaultProps, _props);\n const {\n searchProps,\n filter,\n query,\n onQueryChange,\n actions,\n nothingFound,\n highlightQuery,\n limit,\n scrollAreaProps,\n ...others\n } = props;\n\n const [_query, setQuery] = useUncontrolled({\n value: query,\n defaultValue: '',\n finalValue: '',\n onChange: onQueryChange,\n });\n\n const filteredActions = limitActions(filter(_query, actions), limit).map((item) => {\n if (isActionsGroup(item)) {\n const items = item.actions.map(({ id, ...actionData }) => (\n <SpotlightAction key={id} highlightQuery={highlightQuery} {...actionData} />\n ));\n\n return (\n <SpotlightActionsGroup key={item.group} label={item.group}>\n {items}\n </SpotlightActionsGroup>\n );\n }\n\n return <SpotlightAction key={item.id} highlightQuery={highlightQuery} {...item} />;\n });\n\n return (\n <SpotlightRoot {...others} query={_query} onQueryChange={setQuery}>\n <SpotlightSearch {...searchProps} />\n {filteredActions.length > 0 && (\n <SpotlightActionsList {...(scrollAreaProps as any)}>{filteredActions}</SpotlightActionsList>\n )}\n {filteredActions.length === 0 && nothingFound && (\n <SpotlightEmpty>{nothingFound}</SpotlightEmpty>\n )}\n </SpotlightRoot>\n );\n});\n\nSpotlight.classes = classes;\nSpotlight.displayName = '@mantine/spotlight/Spotlight';\nSpotlight.Search = SpotlightSearch;\nSpotlight.ActionsList = SpotlightActionsList;\nSpotlight.Action = SpotlightAction;\nSpotlight.Empty = SpotlightEmpty;\nSpotlight.ActionsGroup = SpotlightActionsGroup;\nSpotlight.Footer = SpotlightFooter;\nSpotlight.Root = SpotlightRoot;\nSpotlight.open = spotlight.open;\nSpotlight.close = spotlight.close;\nSpotlight.toggle = spotlight.toggle;\n\nexport namespace Spotlight {\n export type Props = SpotlightProps;\n export type StylesNames = SpotlightStylesNames;\n export type Factory = SpotlightFactory;\n export type FilterFunction = SpotlightFilterFunction;\n export type ActionData = SpotlightActionData;\n export type ActionGroupData = SpotlightActionGroupData;\n\n export namespace Action {\n export type Props = SpotlightActionProps;\n export type StylesNames = SpotlightActionStylesNames;\n }\n\n export namespace ActionsGroup {\n export type Props = SpotlightActionsGroupProps;\n export type StylesNames = SpotlightActionsGroupStylesNames;\n }\n\n export namespace ActionsList {\n export type Props = SpotlightActionsListProps;\n export type StylesNames = SpotlightActionsListStylesNames;\n }\n\n export namespace Empty {\n export type Props = SpotlightEmptyProps;\n export type StylesNames = SpotlightEmptyStylesNames;\n }\n\n export namespace Footer {\n export type Props = SpotlightFooterProps;\n export type StylesNames = SpotlightFooterStylesNames;\n }\n\n export namespace Search {\n export type Props = SpotlightSearchProps;\n export type StylesNames = SpotlightSearchStylesNames;\n }\n\n export namespace Root {\n export type Props = SpotlightRootProps;\n export type StylesNames = SpotlightRootStylesNames;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyGA,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,OAAO;CACP,QAAQ,iBAAiB,KAAK;CAC9B,cAAc;EAAE,mBAAmB;EAAM,MAAM;CAAE;CACjD,iBAAiB;EAAE,UAAU;EAAK,YAAY;CAAM;CACpD,OAAO;CACP,QAAQ;CACR,mBAAmB;CACnB,sBAAsB;CACtB,UAAU;AACZ;AAEA,MAAa,YAAY,SAA2B,WAAW;CAE7D,MAAM,EACJ,aACA,QACA,OACA,eACA,SACA,cACA,gBACA,OACA,iBACA,GAAG,WAXS,SAAS,aAAa,cAAc,MAY1C;CAER,MAAM,CAAC,QAAQ,YAAY,gBAAgB;EACzC,OAAO;EACP,cAAc;EACd,YAAY;EACZ,UAAU;CACZ,CAAC;CAED,MAAM,kBAAkB,aAAa,OAAO,QAAQ,OAAO,GAAG,KAAK,EAAE,KAAK,SAAS;EACjF,IAAI,eAAe,IAAI,GAAG;GACxB,MAAM,QAAQ,KAAK,QAAQ,KAAK,EAAE,IAAI,GAAG,iBACvC,oBAAC,iBAAD;IAA0C;IAAgB,GAAI;GAAa,GAArD,EAAqD,CAC5E;GAED,OACE,oBAAC,uBAAD;IAAwC,OAAO,KAAK;cACjD;GACoB,GAFK,KAAK,KAEV;EAE3B;EAEA,OAAO,oBAAC,iBAAD;GAA+C;GAAgB,GAAI;EAAO,GAApD,KAAK,EAA+C;CACnF,CAAC;CAED,OACE,qBAAC,eAAD;EAAe,GAAI;EAAQ,OAAO;EAAQ,eAAe;YAAzD;GACE,oBAAC,iBAAD,EAAiB,GAAI,YAAc,CAAA;GAClC,gBAAgB,SAAS,KACxB,oBAAC,sBAAD;IAAsB,GAAK;cAA0B;GAAsC,CAAA;GAE5F,gBAAgB,WAAW,KAAK,gBAC/B,oBAAC,gBAAD,EAAA,UAAiB,aAA6B,CAAA;EAEnC;;AAEnB,CAAC;AAED,UAAU,UAAUA;AACpB,UAAU,cAAc;AACxB,UAAU,SAAS;AACnB,UAAU,cAAc;AACxB,UAAU,SAAS;AACnB,UAAU,QAAQ;AAClB,UAAU,eAAe;AACzB,UAAU,SAAS;AACnB,UAAU,OAAO;AACjB,UAAU,OAAO,UAAU;AAC3B,UAAU,QAAQ,UAAU;AAC5B,UAAU,SAAS,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightAction.mjs","names":["classes"],"sources":["../src/SpotlightAction.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n Highlight,\n MantineColor,\n UnstyledButton,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionStylesNames =\n | 'action'\n | 'actionLabel'\n | 'actionDescription'\n | 'actionSection'\n | 'actionBody';\n\nexport interface SpotlightActionProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionFactory>, ElementProps<'button'> {\n /** Action label, pass string to use in default filter */\n label?: string;\n\n /** Action description, pass string to use in default filter */\n description?: string;\n\n /** Section displayed on the left side of the label, for example, icon */\n leftSection?: React.ReactNode;\n\n /** Section displayed on the right side of the label, for example, hotkey */\n rightSection?: React.ReactNode;\n\n /** Children override default action elements, if passed, label, description and sections are hidden */\n children?: React.ReactNode;\n\n /** Determines whether left and right sections should have dimmed styles @default true */\n dimmedSections?: boolean;\n\n /** Determines whether search query should be highlighted in action label @default false */\n highlightQuery?: boolean;\n\n /** Key of `theme.colors` of any valid CSS color that will be used to highlight search query @default 'yellow' */\n highlightColor?: MantineColor;\n\n /** Determines whether the spotlight should be closed when action is triggered, overrides `closeOnActionTrigger` prop set on `Spotlight` */\n closeSpotlightOnTrigger?: boolean;\n\n /** Keywords that are used for default filtering, not displayed anywhere, can be a string: \"react,router,javascript\" or an array: ['react', 'router', 'javascript'] */\n keywords?: string | string[];\n}\n\nexport type SpotlightActionFactory = Factory<{\n props: SpotlightActionProps;\n ref: HTMLButtonElement;\n stylesNames: SpotlightActionStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n dimmedSections: true,\n highlightQuery: false,\n} satisfies Partial<SpotlightActionProps>;\n\nexport const SpotlightAction = factory<SpotlightActionFactory>((_props) => {\n const props = useProps('SpotlightAction', defaultProps, _props);\n const {\n className,\n style,\n classNames,\n styles,\n id,\n description,\n label,\n leftSection,\n rightSection,\n children,\n dimmedSections,\n highlightQuery,\n highlightColor,\n closeSpotlightOnTrigger,\n onClick,\n onMouseDown,\n keywords,\n vars,\n ...others\n } = props;\n\n const ctx = useSpotlightContext();\n\n const stylesApi = { classNames, styles };\n\n const labelNode =\n highlightQuery && typeof label === 'string' ? (\n <Highlight\n component=\"span\"\n highlight={ctx.query}\n color={highlightColor}\n {...ctx.getStyles('actionLabel', stylesApi)}\n >\n {label}\n </Highlight>\n ) : (\n <span {...ctx.getStyles('actionLabel', stylesApi)}>{label}</span>\n );\n\n return (\n <UnstyledButton\n data-action\n {...ctx.getStyles('action', { className, style, ...stylesApi })}\n {...others}\n onMouseDown={(event) => {\n event.preventDefault();\n onMouseDown?.(event);\n }}\n onClick={(event) => {\n onClick?.(event);\n if (closeSpotlightOnTrigger ?? ctx.closeOnActionTrigger) {\n spotlightActions.close(ctx.store);\n }\n }}\n tabIndex={-1}\n >\n {children || (\n <>\n {leftSection && (\n <Box\n component=\"span\"\n mod={{ position: 'left', dimmed: dimmedSections }}\n {...ctx.getStyles('actionSection', stylesApi)}\n >\n {leftSection}\n </Box>\n )}\n\n <span {...ctx.getStyles('actionBody', stylesApi)}>\n {labelNode}\n <span {...ctx.getStyles('actionDescription', stylesApi)}>{description}</span>\n </span>\n\n {rightSection && (\n <Box\n component=\"span\"\n mod={{ position: 'right', dimmed: dimmedSections }}\n {...ctx.getStyles('actionSection', stylesApi)}\n >\n {rightSection}\n </Box>\n )}\n </>\n )}\n </UnstyledButton>\n );\n});\n\nSpotlightAction.classes = classes;\nSpotlightAction.displayName = '@mantine/spotlight/SpotlightAction';\n"],"mappings":";;;;;;;AA+DA,MAAM,eAAe;CACnB,gBAAgB;CAChB,gBAAgB;CACjB;AAED,MAAa,kBAAkB,SAAiC,WAAW;CAEzE,MAAM,EACJ,WACA,OACA,YACA,QACA,IACA,aACA,OACA,aACA,cACA,UACA,gBACA,gBACA,gBACA,yBACA,SACA,aACA,UACA,MACA,GAAG,WApBS,SAAS,mBAAmB,cAAc,OAAO;CAuB/D,MAAM,MAAM,qBAAqB;CAEjC,MAAM,YAAY;EAAE;EAAY;EAAQ;CAExC,MAAM,YACJ,kBAAkB,OAAO,UAAU,WACjC,oBAAC,WAAD;EACE,WAAU;EACV,WAAW,IAAI;EACf,OAAO;EACP,GAAI,IAAI,UAAU,eAAe,UAAU;YAE1C;EACS,CAAA,GAEZ,oBAAC,QAAD;EAAM,GAAI,IAAI,UAAU,eAAe,UAAU;YAAG;EAAa,CAAA;AAGrE,QACE,oBAAC,gBAAD;EACE,eAAA;EACA,GAAI,IAAI,UAAU,UAAU;GAAE;GAAW;GAAO,GAAG;GAAW,CAAC;EAC/D,GAAI;EACJ,cAAc,UAAU;AACtB,SAAM,gBAAgB;AACtB,iBAAc,MAAM;;EAEtB,UAAU,UAAU;AAClB,aAAU,MAAM;AAChB,OAAI,2BAA2B,IAAI,qBACjC,kBAAiB,MAAM,IAAI,MAAM;;EAGrC,UAAU;YAET,YACC,qBAAA,UAAA,EAAA,UAAA;GACG,eACC,oBAAC,KAAD;IACE,WAAU;IACV,KAAK;KAAE,UAAU;KAAQ,QAAQ;KAAgB;IACjD,GAAI,IAAI,UAAU,iBAAiB,UAAU;cAE5C;IACG,CAAA;GAGR,qBAAC,QAAD;IAAM,GAAI,IAAI,UAAU,cAAc,UAAU;cAAhD,CACG,WACD,oBAAC,QAAD;KAAM,GAAI,IAAI,UAAU,qBAAqB,UAAU;eAAG;KAAmB,CAAA,CACxE;;GAEN,gBACC,oBAAC,KAAD;IACE,WAAU;IACV,KAAK;KAAE,UAAU;KAAS,QAAQ;KAAgB;IAClD,GAAI,IAAI,UAAU,iBAAiB,UAAU;cAE5C;IACG,CAAA;GAEP,EAAA,CAAA;EAEU,CAAA;EAEnB;AAEF,gBAAgB,UAAUA;AAC1B,gBAAgB,cAAc"}
1
+ {"version":3,"file":"SpotlightAction.mjs","names":["classes"],"sources":["../src/SpotlightAction.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n Highlight,\n MantineColor,\n UnstyledButton,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionStylesNames =\n | 'action'\n | 'actionLabel'\n | 'actionDescription'\n | 'actionSection'\n | 'actionBody';\n\nexport interface SpotlightActionProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionFactory>, ElementProps<'button'> {\n /** Action label, pass string to use in default filter */\n label?: string;\n\n /** Action description, pass string to use in default filter */\n description?: string;\n\n /** Section displayed on the left side of the label, for example, icon */\n leftSection?: React.ReactNode;\n\n /** Section displayed on the right side of the label, for example, hotkey */\n rightSection?: React.ReactNode;\n\n /** Children override default action elements, if passed, label, description and sections are hidden */\n children?: React.ReactNode;\n\n /** Determines whether left and right sections should have dimmed styles @default true */\n dimmedSections?: boolean;\n\n /** Determines whether search query should be highlighted in action label @default false */\n highlightQuery?: boolean;\n\n /** Key of `theme.colors` of any valid CSS color that will be used to highlight search query @default 'yellow' */\n highlightColor?: MantineColor;\n\n /** Determines whether the spotlight should be closed when action is triggered, overrides `closeOnActionTrigger` prop set on `Spotlight` */\n closeSpotlightOnTrigger?: boolean;\n\n /** Keywords that are used for default filtering, not displayed anywhere, can be a string: \"react,router,javascript\" or an array: ['react', 'router', 'javascript'] */\n keywords?: string | string[];\n}\n\nexport type SpotlightActionFactory = Factory<{\n props: SpotlightActionProps;\n ref: HTMLButtonElement;\n stylesNames: SpotlightActionStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n dimmedSections: true,\n highlightQuery: false,\n} satisfies Partial<SpotlightActionProps>;\n\nexport const SpotlightAction = factory<SpotlightActionFactory>((_props) => {\n const props = useProps('SpotlightAction', defaultProps, _props);\n const {\n className,\n style,\n classNames,\n styles,\n id,\n description,\n label,\n leftSection,\n rightSection,\n children,\n dimmedSections,\n highlightQuery,\n highlightColor,\n closeSpotlightOnTrigger,\n onClick,\n onMouseDown,\n keywords,\n vars,\n ...others\n } = props;\n\n const ctx = useSpotlightContext();\n\n const stylesApi = { classNames, styles };\n\n const labelNode =\n highlightQuery && typeof label === 'string' ? (\n <Highlight\n component=\"span\"\n highlight={ctx.query}\n color={highlightColor}\n {...ctx.getStyles('actionLabel', stylesApi)}\n >\n {label}\n </Highlight>\n ) : (\n <span {...ctx.getStyles('actionLabel', stylesApi)}>{label}</span>\n );\n\n return (\n <UnstyledButton\n data-action\n {...ctx.getStyles('action', { className, style, ...stylesApi })}\n {...others}\n onMouseDown={(event) => {\n event.preventDefault();\n onMouseDown?.(event);\n }}\n onClick={(event) => {\n onClick?.(event);\n if (closeSpotlightOnTrigger ?? ctx.closeOnActionTrigger) {\n spotlightActions.close(ctx.store);\n }\n }}\n tabIndex={-1}\n >\n {children || (\n <>\n {leftSection && (\n <Box\n component=\"span\"\n mod={{ position: 'left', dimmed: dimmedSections }}\n {...ctx.getStyles('actionSection', stylesApi)}\n >\n {leftSection}\n </Box>\n )}\n\n <span {...ctx.getStyles('actionBody', stylesApi)}>\n {labelNode}\n <span {...ctx.getStyles('actionDescription', stylesApi)}>{description}</span>\n </span>\n\n {rightSection && (\n <Box\n component=\"span\"\n mod={{ position: 'right', dimmed: dimmedSections }}\n {...ctx.getStyles('actionSection', stylesApi)}\n >\n {rightSection}\n </Box>\n )}\n </>\n )}\n </UnstyledButton>\n );\n});\n\nSpotlightAction.classes = classes;\nSpotlightAction.displayName = '@mantine/spotlight/SpotlightAction';\n"],"mappings":";;;;;;;AA+DA,MAAM,eAAe;CACnB,gBAAgB;CAChB,gBAAgB;AAClB;AAEA,MAAa,kBAAkB,SAAiC,WAAW;CAEzE,MAAM,EACJ,WACA,OACA,YACA,QACA,IACA,aACA,OACA,aACA,cACA,UACA,gBACA,gBACA,gBACA,yBACA,SACA,aACA,UACA,MACA,GAAG,WApBS,SAAS,mBAAmB,cAAc,MAqBhD;CAER,MAAM,MAAM,oBAAoB;CAEhC,MAAM,YAAY;EAAE;EAAY;CAAO;CAEvC,MAAM,YACJ,kBAAkB,OAAO,UAAU,WACjC,oBAAC,WAAD;EACE,WAAU;EACV,WAAW,IAAI;EACf,OAAO;EACP,GAAI,IAAI,UAAU,eAAe,SAAS;YAEzC;CACQ,CAAA,IAEX,oBAAC,QAAD;EAAM,GAAI,IAAI,UAAU,eAAe,SAAS;YAAI;CAAY,CAAA;CAGpE,OACE,oBAAC,gBAAD;EACE,eAAA;EACA,GAAI,IAAI,UAAU,UAAU;GAAE;GAAW;GAAO,GAAG;EAAU,CAAC;EAC9D,GAAI;EACJ,cAAc,UAAU;GACtB,MAAM,eAAe;GACrB,cAAc,KAAK;EACrB;EACA,UAAU,UAAU;GAClB,UAAU,KAAK;GACf,IAAI,2BAA2B,IAAI,sBACjC,iBAAiB,MAAM,IAAI,KAAK;EAEpC;EACA,UAAU;YAET,YACC,qBAAA,UAAA,EAAA,UAAA;GACG,eACC,oBAAC,KAAD;IACE,WAAU;IACV,KAAK;KAAE,UAAU;KAAQ,QAAQ;IAAe;IAChD,GAAI,IAAI,UAAU,iBAAiB,SAAS;cAE3C;GACE,CAAA;GAGP,qBAAC,QAAD;IAAM,GAAI,IAAI,UAAU,cAAc,SAAS;cAA/C,CACG,WACD,oBAAC,QAAD;KAAM,GAAI,IAAI,UAAU,qBAAqB,SAAS;eAAI;IAAkB,CAAA,CACxE;;GAEL,gBACC,oBAAC,KAAD;IACE,WAAU;IACV,KAAK;KAAE,UAAU;KAAS,QAAQ;IAAe;IACjD,GAAI,IAAI,UAAU,iBAAiB,SAAS;cAE3C;GACE,CAAA;EAEP,EAAA,CAAA;CAEU,CAAA;AAEpB,CAAC;AAED,gBAAgB,UAAUA;AAC1B,gBAAgB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightActionsGroup.mjs","names":["classes"],"sources":["../src/SpotlightActionsGroup.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionsGroupStylesNames = 'actionsGroup';\n\nexport interface SpotlightActionsGroupProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionsGroupFactory>, ElementProps<'div'> {\n /** `Spotlight.Action` components */\n children?: React.ReactNode;\n\n /** Group label */\n label?: string;\n}\n\nexport type SpotlightActionsGroupFactory = Factory<{\n props: SpotlightActionsGroupProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightActionsGroupStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightActionsGroup = factory<SpotlightActionsGroupFactory>((props) => {\n const { className, style, styles, classNames, label, children, ...others } = useProps(\n 'SpotlightActionsGroup',\n null,\n props\n );\n\n const ctx = useSpotlightContext();\n\n return (\n <Box\n {...ctx.getStyles('actionsGroup', { className, style, classNames, styles })}\n {...others}\n __vars={{\n '--spotlight-label': `'${label?.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`,\n }}\n >\n {children}\n </Box>\n );\n});\n\nSpotlightActionsGroup.classes = classes;\nSpotlightActionsGroup.displayName = '@mantine/core/SpotlightActionsGroup';\n"],"mappings":";;;;;;AA8BA,MAAa,wBAAwB,SAAuC,UAAU;CACpF,MAAM,EAAE,WAAW,OAAO,QAAQ,YAAY,OAAO,UAAU,GAAG,WAAW,SAC3E,yBACA,MACA,MACD;AAID,QACE,oBAAC,KAAD;EACE,GAJQ,qBAAqB,CAIrB,UAAU,gBAAgB;GAAE;GAAW;GAAO;GAAY;GAAQ,CAAC;EAC3E,GAAI;EACJ,QAAQ,EACN,qBAAqB,IAAI,OAAO,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM,CAAC,IAC7E;EAEA;EACG,CAAA;EAER;AAEF,sBAAsB,UAAUA;AAChC,sBAAsB,cAAc"}
1
+ {"version":3,"file":"SpotlightActionsGroup.mjs","names":["classes"],"sources":["../src/SpotlightActionsGroup.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionsGroupStylesNames = 'actionsGroup';\n\nexport interface SpotlightActionsGroupProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionsGroupFactory>, ElementProps<'div'> {\n /** `Spotlight.Action` components */\n children?: React.ReactNode;\n\n /** Group label */\n label?: string;\n}\n\nexport type SpotlightActionsGroupFactory = Factory<{\n props: SpotlightActionsGroupProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightActionsGroupStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightActionsGroup = factory<SpotlightActionsGroupFactory>((props) => {\n const { className, style, styles, classNames, label, children, ...others } = useProps(\n 'SpotlightActionsGroup',\n null,\n props\n );\n\n const ctx = useSpotlightContext();\n\n return (\n <Box\n {...ctx.getStyles('actionsGroup', { className, style, classNames, styles })}\n {...others}\n __vars={{\n '--spotlight-label': `'${label?.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`,\n }}\n >\n {children}\n </Box>\n );\n});\n\nSpotlightActionsGroup.classes = classes;\nSpotlightActionsGroup.displayName = '@mantine/core/SpotlightActionsGroup';\n"],"mappings":";;;;;;AA8BA,MAAa,wBAAwB,SAAuC,UAAU;CACpF,MAAM,EAAE,WAAW,OAAO,QAAQ,YAAY,OAAO,UAAU,GAAG,WAAW,SAC3E,yBACA,MACA,KACF;CAIA,OACE,oBAAC,KAAD;EACE,GAJQ,oBAIF,EAAE,UAAU,gBAAgB;GAAE;GAAW;GAAO;GAAY;EAAO,CAAC;EAC1E,GAAI;EACJ,QAAQ,EACN,qBAAqB,IAAI,OAAO,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE,GAC9E;EAEC;CACE,CAAA;AAET,CAAC;AAED,sBAAsB,UAAUA;AAChC,sBAAsB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightActionsList.mjs","names":["classes"],"sources":["../src/SpotlightActionsList.tsx"],"sourcesContent":["import { useEffect, useId } from 'react';\nimport {\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n ScrollArea,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionsListStylesNames = 'actionsList' | 'actionsListInner';\n\nexport interface SpotlightActionsListProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionsListFactory>, ElementProps<'div'> {}\n\nexport type SpotlightActionsListFactory = Factory<{\n props: SpotlightActionsListProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightActionsListStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightActionsList = factory<SpotlightActionsListFactory>((props) => {\n const { className, style, id, children, vars, classNames, styles, ...others } = useProps(\n 'SpotlightActionsList',\n null,\n props\n );\n const ctx = useSpotlightContext();\n const generatedId = `mantine-${useId().replace(/:/g, '')}`;\n const listId = id || generatedId;\n\n useEffect(() => {\n spotlightActions.setListId(listId, ctx.store);\n return () => spotlightActions.setListId('', ctx.store);\n }, []);\n\n return (\n <ScrollArea.Autosize\n {...ctx.getStyles('actionsList', { className, style, classNames, styles })}\n type=\"scroll\"\n scrollbarSize=\"var(--spotlight-actions-list-padding)\"\n offsetScrollbars=\"y\"\n id={listId}\n {...others}\n >\n {children}\n </ScrollArea.Autosize>\n );\n});\n\nSpotlightActionsList.classes = classes;\nSpotlightActionsList.displayName = '@mantine/spotlight/SpotlightActionsList';\n"],"mappings":";;;;;;;;AA0BA,MAAa,uBAAuB,SAAsC,UAAU;CAClF,MAAM,EAAE,WAAW,OAAO,IAAI,UAAU,MAAM,YAAY,QAAQ,GAAG,WAAW,SAC9E,wBACA,MACA,MACD;CACD,MAAM,MAAM,qBAAqB;CACjC,MAAM,cAAc,WAAW,OAAO,CAAC,QAAQ,MAAM,GAAG;CACxD,MAAM,SAAS,MAAM;AAErB,iBAAgB;AACd,mBAAiB,UAAU,QAAQ,IAAI,MAAM;AAC7C,eAAa,iBAAiB,UAAU,IAAI,IAAI,MAAM;IACrD,EAAE,CAAC;AAEN,QACE,oBAAC,WAAW,UAAZ;EACE,GAAI,IAAI,UAAU,eAAe;GAAE;GAAW;GAAO;GAAY;GAAQ,CAAC;EAC1E,MAAK;EACL,eAAc;EACd,kBAAiB;EACjB,IAAI;EACJ,GAAI;EAEH;EACmB,CAAA;EAExB;AAEF,qBAAqB,UAAUA;AAC/B,qBAAqB,cAAc"}
1
+ {"version":3,"file":"SpotlightActionsList.mjs","names":["classes"],"sources":["../src/SpotlightActionsList.tsx"],"sourcesContent":["import { useEffect, useId } from 'react';\nimport {\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n ScrollArea,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightActionsListStylesNames = 'actionsList' | 'actionsListInner';\n\nexport interface SpotlightActionsListProps\n extends BoxProps, CompoundStylesApiProps<SpotlightActionsListFactory>, ElementProps<'div'> {}\n\nexport type SpotlightActionsListFactory = Factory<{\n props: SpotlightActionsListProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightActionsListStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightActionsList = factory<SpotlightActionsListFactory>((props) => {\n const { className, style, id, children, vars, classNames, styles, ...others } = useProps(\n 'SpotlightActionsList',\n null,\n props\n );\n const ctx = useSpotlightContext();\n const generatedId = `mantine-${useId().replace(/:/g, '')}`;\n const listId = id || generatedId;\n\n useEffect(() => {\n spotlightActions.setListId(listId, ctx.store);\n return () => spotlightActions.setListId('', ctx.store);\n }, []);\n\n return (\n <ScrollArea.Autosize\n {...ctx.getStyles('actionsList', { className, style, classNames, styles })}\n type=\"scroll\"\n scrollbarSize=\"var(--spotlight-actions-list-padding)\"\n offsetScrollbars=\"y\"\n id={listId}\n {...others}\n >\n {children}\n </ScrollArea.Autosize>\n );\n});\n\nSpotlightActionsList.classes = classes;\nSpotlightActionsList.displayName = '@mantine/spotlight/SpotlightActionsList';\n"],"mappings":";;;;;;;;AA0BA,MAAa,uBAAuB,SAAsC,UAAU;CAClF,MAAM,EAAE,WAAW,OAAO,IAAI,UAAU,MAAM,YAAY,QAAQ,GAAG,WAAW,SAC9E,wBACA,MACA,KACF;CACA,MAAM,MAAM,oBAAoB;CAChC,MAAM,cAAc,WAAW,MAAM,EAAE,QAAQ,MAAM,EAAE;CACvD,MAAM,SAAS,MAAM;CAErB,gBAAgB;EACd,iBAAiB,UAAU,QAAQ,IAAI,KAAK;EAC5C,aAAa,iBAAiB,UAAU,IAAI,IAAI,KAAK;CACvD,GAAG,CAAC,CAAC;CAEL,OACE,oBAAC,WAAW,UAAZ;EACE,GAAI,IAAI,UAAU,eAAe;GAAE;GAAW;GAAO;GAAY;EAAO,CAAC;EACzE,MAAK;EACL,eAAc;EACd,kBAAiB;EACjB,IAAI;EACJ,GAAI;EAEH;CACkB,CAAA;AAEzB,CAAC;AAED,qBAAqB,UAAUA;AAC/B,qBAAqB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightEmpty.mjs","names":["classes"],"sources":["../src/SpotlightEmpty.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightEmptyStylesNames = 'empty';\n\nexport interface SpotlightEmptyProps\n extends BoxProps, CompoundStylesApiProps<SpotlightEmptyFactory>, ElementProps<'div'> {}\n\nexport type SpotlightEmptyFactory = Factory<{\n props: SpotlightEmptyProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightEmptyStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightEmpty = factory<SpotlightEmptyFactory>((props) => {\n const { className, style, classNames, styles, ...others } = useProps(\n 'SpotlightEmpty',\n null,\n props\n );\n\n const ctx = useSpotlightContext();\n\n return <Box {...ctx.getStyles('empty', { classNames, styles, className, style })} {...others} />;\n});\n\nSpotlightEmpty.classes = classes;\nSpotlightEmpty.displayName = '@mantine/spotlight/SpotlightEmpty';\n"],"mappings":";;;;;;AAwBA,MAAa,iBAAiB,SAAgC,UAAU;CACtE,MAAM,EAAE,WAAW,OAAO,YAAY,QAAQ,GAAG,WAAW,SAC1D,kBACA,MACA,MACD;AAID,QAAO,oBAAC,KAAD;EAAK,GAFA,qBAAqB,CAEb,UAAU,SAAS;GAAE;GAAY;GAAQ;GAAW;GAAO,CAAC;EAAE,GAAI;EAAU,CAAA;EAChG;AAEF,eAAe,UAAUA;AACzB,eAAe,cAAc"}
1
+ {"version":3,"file":"SpotlightEmpty.mjs","names":["classes"],"sources":["../src/SpotlightEmpty.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightEmptyStylesNames = 'empty';\n\nexport interface SpotlightEmptyProps\n extends BoxProps, CompoundStylesApiProps<SpotlightEmptyFactory>, ElementProps<'div'> {}\n\nexport type SpotlightEmptyFactory = Factory<{\n props: SpotlightEmptyProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightEmptyStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightEmpty = factory<SpotlightEmptyFactory>((props) => {\n const { className, style, classNames, styles, ...others } = useProps(\n 'SpotlightEmpty',\n null,\n props\n );\n\n const ctx = useSpotlightContext();\n\n return <Box {...ctx.getStyles('empty', { classNames, styles, className, style })} {...others} />;\n});\n\nSpotlightEmpty.classes = classes;\nSpotlightEmpty.displayName = '@mantine/spotlight/SpotlightEmpty';\n"],"mappings":";;;;;;AAwBA,MAAa,iBAAiB,SAAgC,UAAU;CACtE,MAAM,EAAE,WAAW,OAAO,YAAY,QAAQ,GAAG,WAAW,SAC1D,kBACA,MACA,KACF;CAIA,OAAO,oBAAC,KAAD;EAAK,GAFA,oBAEM,EAAE,UAAU,SAAS;GAAE;GAAY;GAAQ;GAAW;EAAM,CAAC;EAAG,GAAI;CAAS,CAAA;AACjG,CAAC;AAED,eAAe,UAAUA;AACzB,eAAe,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightFooter.mjs","names":["classes"],"sources":["../src/SpotlightFooter.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightFooterStylesNames = 'footer';\n\nexport interface SpotlightFooterProps\n extends BoxProps, CompoundStylesApiProps<SpotlightFooterFactory>, ElementProps<'div'> {}\n\nexport type SpotlightFooterFactory = Factory<{\n props: SpotlightFooterProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightFooterStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightFooter = factory<SpotlightFooterFactory>((props) => {\n const { className, style, classNames, styles, ...others } = useProps(\n 'SpotlightFooter',\n null,\n props\n );\n const ctx = useSpotlightContext();\n return <Box {...ctx.getStyles('footer', { className, classNames, style, styles })} {...others} />;\n});\n\nSpotlightFooter.classes = classes;\nSpotlightFooter.displayName = '@mantine/spotlight/SpotlightFooter';\n"],"mappings":";;;;;;AAwBA,MAAa,kBAAkB,SAAiC,UAAU;CACxE,MAAM,EAAE,WAAW,OAAO,YAAY,QAAQ,GAAG,WAAW,SAC1D,mBACA,MACA,MACD;AAED,QAAO,oBAAC,KAAD;EAAK,GADA,qBAAqB,CACb,UAAU,UAAU;GAAE;GAAW;GAAY;GAAO;GAAQ,CAAC;EAAE,GAAI;EAAU,CAAA;EACjG;AAEF,gBAAgB,UAAUA;AAC1B,gBAAgB,cAAc"}
1
+ {"version":3,"file":"SpotlightFooter.mjs","names":["classes"],"sources":["../src/SpotlightFooter.tsx"],"sourcesContent":["import {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightFooterStylesNames = 'footer';\n\nexport interface SpotlightFooterProps\n extends BoxProps, CompoundStylesApiProps<SpotlightFooterFactory>, ElementProps<'div'> {}\n\nexport type SpotlightFooterFactory = Factory<{\n props: SpotlightFooterProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightFooterStylesNames;\n compound: true;\n}>;\n\nexport const SpotlightFooter = factory<SpotlightFooterFactory>((props) => {\n const { className, style, classNames, styles, ...others } = useProps(\n 'SpotlightFooter',\n null,\n props\n );\n const ctx = useSpotlightContext();\n return <Box {...ctx.getStyles('footer', { className, classNames, style, styles })} {...others} />;\n});\n\nSpotlightFooter.classes = classes;\nSpotlightFooter.displayName = '@mantine/spotlight/SpotlightFooter';\n"],"mappings":";;;;;;AAwBA,MAAa,kBAAkB,SAAiC,UAAU;CACxE,MAAM,EAAE,WAAW,OAAO,YAAY,QAAQ,GAAG,WAAW,SAC1D,mBACA,MACA,KACF;CAEA,OAAO,oBAAC,KAAD;EAAK,GADA,oBACM,EAAE,UAAU,UAAU;GAAE;GAAW;GAAY;GAAO;EAAO,CAAC;EAAG,GAAI;CAAS,CAAA;AAClG,CAAC;AAED,gBAAgB,UAAUA;AAC1B,gBAAgB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightRoot.mjs","names":["classes"],"sources":["../src/SpotlightRoot.tsx"],"sourcesContent":["import {\n factory,\n Factory,\n getDefaultZIndex,\n Modal,\n ModalProps,\n ModalStylesNames,\n rem,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDidUpdate, useHotkeys } from '@mantine/hooks';\nimport { getHotkeys } from './get-hotkeys';\nimport { SpotlightProvider } from './Spotlight.context';\nimport { spotlightActions, SpotlightStore, spotlightStore, useSpotlight } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightRootStylesNames =\n | ModalStylesNames\n | 'search'\n | 'actionsList'\n | 'action'\n | 'empty'\n | 'footer'\n | 'actionBody'\n | 'actionLabel'\n | 'actionDescription'\n | 'actionSection'\n | 'actionsGroup';\n\nexport interface SpotlightRootProps\n extends\n StylesApiProps<SpotlightRootFactory>,\n Omit<\n ModalProps,\n | 'styles'\n | 'classNames'\n | 'vars'\n | 'variant'\n | 'opened'\n | 'onClose'\n | 'closeButtonProps'\n | 'withCloseButton'\n > {\n /** Spotlight store, can be used to create multiple instances of spotlight */\n store?: SpotlightStore;\n\n /** Controlled Spotlight search query */\n query?: string;\n\n /** Called when query changes */\n onQueryChange?: (query: string) => void;\n\n /** Determines whether the search query should be cleared when the spotlight is closed @default true */\n clearQueryOnClose?: boolean;\n\n /** Keyboard shortcut or a list of shortcuts to trigger spotlight @default 'mod + K' */\n shortcut?: string | string[] | null;\n\n /** A list of tags which when focused will be ignored by shortcut @default ['input', 'textarea', 'select'] */\n tagsToIgnore?: string[];\n\n /** Determines whether shortcut should trigger based in contentEditable @default false */\n triggerOnContentEditable?: boolean;\n\n /** If set, spotlight will not be rendered */\n disabled?: boolean;\n\n /** Called when spotlight opens */\n onSpotlightOpen?: () => void;\n\n /** Called when spotlight closes */\n onSpotlightClose?: () => void;\n\n /** Forces opened state, useful for tests */\n forceOpened?: boolean;\n\n /** Determines whether spotlight should be closed when one of the actions is triggered @default true */\n closeOnActionTrigger?: boolean;\n\n /** Spotlight content max-height. Ignored unless `scrollable` prop is set. @default 400 */\n maxHeight?: React.CSSProperties['maxHeight'];\n\n /** Determines whether the actions list should be scrollable. If not set, `maxHeight` is ignored @default false */\n scrollable?: boolean;\n}\n\nexport type SpotlightRootFactory = Factory<{\n props: SpotlightRootProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightRootStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n size: 600,\n yOffset: 80,\n zIndex: getDefaultZIndex('max'),\n overlayProps: { backgroundOpacity: 0.35, blur: 7 },\n transitionProps: { duration: 200, transition: 'pop' },\n store: spotlightStore,\n clearQueryOnClose: true,\n closeOnActionTrigger: true,\n shortcut: 'mod + K',\n maxHeight: 400,\n} satisfies Partial<SpotlightRootProps>;\n\nexport const SpotlightRoot = factory<SpotlightRootFactory>((_props) => {\n const props = useProps('SpotlightRoot', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n store,\n children,\n query,\n onQueryChange,\n transitionProps,\n clearQueryOnClose,\n shortcut,\n tagsToIgnore,\n triggerOnContentEditable,\n disabled,\n onSpotlightOpen,\n onSpotlightClose,\n forceOpened,\n closeOnActionTrigger,\n maxHeight,\n scrollable,\n attributes,\n ...others\n } = props;\n\n const { opened, query: storeQuery } = useSpotlight(store);\n const _query = typeof query === 'string' ? query : storeQuery;\n const setQuery = (q: string) => {\n onQueryChange?.(q);\n spotlightActions.setQuery(q, store);\n };\n\n const getStyles = useStyles<SpotlightRootFactory>({\n name: 'Spotlight',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<SpotlightRootFactory>({\n classNames,\n styles,\n props,\n });\n\n useHotkeys(getHotkeys(shortcut, store), tagsToIgnore, triggerOnContentEditable);\n\n useDidUpdate(() => {\n opened ? onSpotlightOpen?.() : onSpotlightClose?.();\n }, [opened]);\n\n if (disabled) {\n return null;\n }\n\n return (\n <SpotlightProvider\n value={{\n getStyles,\n query: _query,\n setQuery,\n store,\n closeOnActionTrigger,\n }}\n >\n <Modal\n {...others}\n withCloseButton={false}\n opened={opened || !!forceOpened}\n padding={0}\n onClose={() => spotlightActions.close(store)}\n className={className}\n style={style}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n attributes={attributes}\n transitionProps={{\n ...transitionProps,\n onExited: () => {\n clearQueryOnClose && setQuery('');\n spotlightActions.clearSpotlightState({ clearQuery: clearQueryOnClose }, store);\n transitionProps?.onExited?.();\n },\n }}\n __vars={{ '--spotlight-max-height': scrollable ? rem(maxHeight) : undefined }}\n __staticSelector=\"Spotlight\"\n data-scrollable={scrollable || undefined}\n >\n {children}\n </Modal>\n </SpotlightProvider>\n );\n});\n\nSpotlightRoot.classes = classes;\nSpotlightRoot.displayName = '@mantine/spotlight/SpotlightRoot';\n"],"mappings":";;;;;;;;;AAgGA,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,QAAQ,iBAAiB,MAAM;CAC/B,cAAc;EAAE,mBAAmB;EAAM,MAAM;EAAG;CAClD,iBAAiB;EAAE,UAAU;EAAK,YAAY;EAAO;CACrD,OAAO;CACP,mBAAmB;CACnB,sBAAsB;CACtB,UAAU;CACV,WAAW;CACZ;AAED,MAAa,gBAAgB,SAA+B,WAAW;CACrE,MAAM,QAAQ,SAAS,iBAAiB,cAAc,OAAO;CAC7D,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,OACA,UACA,OACA,eACA,iBACA,mBACA,UACA,cACA,0BACA,UACA,iBACA,kBACA,aACA,sBACA,WACA,YACA,YACA,GAAG,WACD;CAEJ,MAAM,EAAE,QAAQ,OAAO,eAAe,aAAa,MAAM;CACzD,MAAM,SAAS,OAAO,UAAU,WAAW,QAAQ;CACnD,MAAM,YAAY,MAAc;AAC9B,kBAAgB,EAAE;AAClB,mBAAiB,SAAS,GAAG,MAAM;;CAGrC,MAAM,YAAY,UAAgC;EAChD,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,EAAE,oBAAoB,mBAAmB,qBAA2C;EACxF;EACA;EACA;EACD,CAAC;AAEF,YAAW,WAAW,UAAU,MAAM,EAAE,cAAc,yBAAyB;AAE/E,oBAAmB;AACjB,WAAS,mBAAmB,GAAG,oBAAoB;IAClD,CAAC,OAAO,CAAC;AAEZ,KAAI,SACF,QAAO;AAGT,QACE,oBAAC,mBAAD;EACE,OAAO;GACL;GACA,OAAO;GACP;GACA;GACA;GACD;YAED,oBAAC,OAAD;GACE,GAAI;GACJ,iBAAiB;GACjB,QAAQ,UAAU,CAAC,CAAC;GACpB,SAAS;GACT,eAAe,iBAAiB,MAAM,MAAM;GACjC;GACJ;GACP,YAAY;GACZ,QAAQ;GACI;GACZ,iBAAiB;IACf,GAAG;IACH,gBAAgB;AACd,0BAAqB,SAAS,GAAG;AACjC,sBAAiB,oBAAoB,EAAE,YAAY,mBAAmB,EAAE,MAAM;AAC9E,sBAAiB,YAAY;;IAEhC;GACD,QAAQ,EAAE,0BAA0B,aAAa,IAAI,UAAU,GAAG,KAAA,GAAW;GAC7E,kBAAiB;GACjB,mBAAiB,cAAc,KAAA;GAE9B;GACK,CAAA;EACU,CAAA;EAEtB;AAEF,cAAc,UAAUA;AACxB,cAAc,cAAc"}
1
+ {"version":3,"file":"SpotlightRoot.mjs","names":["classes"],"sources":["../src/SpotlightRoot.tsx"],"sourcesContent":["import {\n factory,\n Factory,\n getDefaultZIndex,\n Modal,\n ModalProps,\n ModalStylesNames,\n rem,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDidUpdate, useHotkeys } from '@mantine/hooks';\nimport { getHotkeys } from './get-hotkeys';\nimport { SpotlightProvider } from './Spotlight.context';\nimport { spotlightActions, SpotlightStore, spotlightStore, useSpotlight } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightRootStylesNames =\n | ModalStylesNames\n | 'search'\n | 'actionsList'\n | 'action'\n | 'empty'\n | 'footer'\n | 'actionBody'\n | 'actionLabel'\n | 'actionDescription'\n | 'actionSection'\n | 'actionsGroup';\n\nexport interface SpotlightRootProps\n extends\n StylesApiProps<SpotlightRootFactory>,\n Omit<\n ModalProps,\n | 'styles'\n | 'classNames'\n | 'vars'\n | 'variant'\n | 'opened'\n | 'onClose'\n | 'closeButtonProps'\n | 'withCloseButton'\n > {\n /** Spotlight store, can be used to create multiple instances of spotlight */\n store?: SpotlightStore;\n\n /** Controlled Spotlight search query */\n query?: string;\n\n /** Called when query changes */\n onQueryChange?: (query: string) => void;\n\n /** Determines whether the search query should be cleared when the spotlight is closed @default true */\n clearQueryOnClose?: boolean;\n\n /** Keyboard shortcut or a list of shortcuts to trigger spotlight @default 'mod + K' */\n shortcut?: string | string[] | null;\n\n /** A list of tags which when focused will be ignored by shortcut @default ['input', 'textarea', 'select'] */\n tagsToIgnore?: string[];\n\n /** Determines whether shortcut should trigger based in contentEditable @default false */\n triggerOnContentEditable?: boolean;\n\n /** If set, spotlight will not be rendered */\n disabled?: boolean;\n\n /** Called when spotlight opens */\n onSpotlightOpen?: () => void;\n\n /** Called when spotlight closes */\n onSpotlightClose?: () => void;\n\n /** Forces opened state, useful for tests */\n forceOpened?: boolean;\n\n /** Determines whether spotlight should be closed when one of the actions is triggered @default true */\n closeOnActionTrigger?: boolean;\n\n /** Spotlight content max-height. Ignored unless `scrollable` prop is set. @default 400 */\n maxHeight?: React.CSSProperties['maxHeight'];\n\n /** Determines whether the actions list should be scrollable. If not set, `maxHeight` is ignored @default false */\n scrollable?: boolean;\n}\n\nexport type SpotlightRootFactory = Factory<{\n props: SpotlightRootProps;\n ref: HTMLDivElement;\n stylesNames: SpotlightRootStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n size: 600,\n yOffset: 80,\n zIndex: getDefaultZIndex('max'),\n overlayProps: { backgroundOpacity: 0.35, blur: 7 },\n transitionProps: { duration: 200, transition: 'pop' },\n store: spotlightStore,\n clearQueryOnClose: true,\n closeOnActionTrigger: true,\n shortcut: 'mod + K',\n maxHeight: 400,\n} satisfies Partial<SpotlightRootProps>;\n\nexport const SpotlightRoot = factory<SpotlightRootFactory>((_props) => {\n const props = useProps('SpotlightRoot', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n store,\n children,\n query,\n onQueryChange,\n transitionProps,\n clearQueryOnClose,\n shortcut,\n tagsToIgnore,\n triggerOnContentEditable,\n disabled,\n onSpotlightOpen,\n onSpotlightClose,\n forceOpened,\n closeOnActionTrigger,\n maxHeight,\n scrollable,\n attributes,\n ...others\n } = props;\n\n const { opened, query: storeQuery } = useSpotlight(store);\n const _query = typeof query === 'string' ? query : storeQuery;\n const setQuery = (q: string) => {\n onQueryChange?.(q);\n spotlightActions.setQuery(q, store);\n };\n\n const getStyles = useStyles<SpotlightRootFactory>({\n name: 'Spotlight',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<SpotlightRootFactory>({\n classNames,\n styles,\n props,\n });\n\n useHotkeys(getHotkeys(shortcut, store), tagsToIgnore, triggerOnContentEditable);\n\n useDidUpdate(() => {\n opened ? onSpotlightOpen?.() : onSpotlightClose?.();\n }, [opened]);\n\n if (disabled) {\n return null;\n }\n\n return (\n <SpotlightProvider\n value={{\n getStyles,\n query: _query,\n setQuery,\n store,\n closeOnActionTrigger,\n }}\n >\n <Modal\n {...others}\n withCloseButton={false}\n opened={opened || !!forceOpened}\n padding={0}\n onClose={() => spotlightActions.close(store)}\n className={className}\n style={style}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n attributes={attributes}\n transitionProps={{\n ...transitionProps,\n onExited: () => {\n clearQueryOnClose && setQuery('');\n spotlightActions.clearSpotlightState({ clearQuery: clearQueryOnClose }, store);\n transitionProps?.onExited?.();\n },\n }}\n __vars={{ '--spotlight-max-height': scrollable ? rem(maxHeight) : undefined }}\n __staticSelector=\"Spotlight\"\n data-scrollable={scrollable || undefined}\n >\n {children}\n </Modal>\n </SpotlightProvider>\n );\n});\n\nSpotlightRoot.classes = classes;\nSpotlightRoot.displayName = '@mantine/spotlight/SpotlightRoot';\n"],"mappings":";;;;;;;;;AAgGA,MAAM,eAAe;CACnB,MAAM;CACN,SAAS;CACT,QAAQ,iBAAiB,KAAK;CAC9B,cAAc;EAAE,mBAAmB;EAAM,MAAM;CAAE;CACjD,iBAAiB;EAAE,UAAU;EAAK,YAAY;CAAM;CACpD,OAAO;CACP,mBAAmB;CACnB,sBAAsB;CACtB,UAAU;CACV,WAAW;AACb;AAEA,MAAa,gBAAgB,SAA+B,WAAW;CACrE,MAAM,QAAQ,SAAS,iBAAiB,cAAc,MAAM;CAC5D,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,OACA,UACA,OACA,eACA,iBACA,mBACA,UACA,cACA,0BACA,UACA,iBACA,kBACA,aACA,sBACA,WACA,YACA,YACA,GAAG,WACD;CAEJ,MAAM,EAAE,QAAQ,OAAO,eAAe,aAAa,KAAK;CACxD,MAAM,SAAS,OAAO,UAAU,WAAW,QAAQ;CACnD,MAAM,YAAY,MAAc;EAC9B,gBAAgB,CAAC;EACjB,iBAAiB,SAAS,GAAG,KAAK;CACpC;CAEA,MAAM,YAAY,UAAgC;EAChD,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,oBAAoB,mBAAmB,qBAA2C;EACxF;EACA;EACA;CACF,CAAC;CAED,WAAW,WAAW,UAAU,KAAK,GAAG,cAAc,wBAAwB;CAE9E,mBAAmB;EACjB,SAAS,kBAAkB,IAAI,mBAAmB;CACpD,GAAG,CAAC,MAAM,CAAC;CAEX,IAAI,UACF,OAAO;CAGT,OACE,oBAAC,mBAAD;EACE,OAAO;GACL;GACA,OAAO;GACP;GACA;GACA;EACF;YAEA,oBAAC,OAAD;GACE,GAAI;GACJ,iBAAiB;GACjB,QAAQ,UAAU,CAAC,CAAC;GACpB,SAAS;GACT,eAAe,iBAAiB,MAAM,KAAK;GAChC;GACJ;GACP,YAAY;GACZ,QAAQ;GACI;GACZ,iBAAiB;IACf,GAAG;IACH,gBAAgB;KACd,qBAAqB,SAAS,EAAE;KAChC,iBAAiB,oBAAoB,EAAE,YAAY,kBAAkB,GAAG,KAAK;KAC7E,iBAAiB,WAAW;IAC9B;GACF;GACA,QAAQ,EAAE,0BAA0B,aAAa,IAAI,SAAS,IAAI,KAAA,EAAU;GAC5E,kBAAiB;GACjB,mBAAiB,cAAc,KAAA;GAE9B;EACI,CAAA;CACU,CAAA;AAEvB,CAAC;AAED,cAAc,UAAUA;AACxB,cAAc,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpotlightSearch.mjs","names":["classes"],"sources":["../src/SpotlightSearch.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n Input,\n InputProps,\n InputStylesNames,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightSearchStylesNames = InputStylesNames;\n\nexport interface SpotlightSearchProps\n extends\n BoxProps,\n Omit<InputProps, 'classNames' | 'styles' | 'vars' | 'variant'>,\n CompoundStylesApiProps<SpotlightSearchFactory>,\n ElementProps<'input', 'size'> {}\n\nexport type SpotlightSearchFactory = Factory<{\n props: SpotlightSearchProps;\n ref: HTMLInputElement;\n stylesNames: SpotlightSearchStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n size: 'lg',\n} satisfies Partial<SpotlightSearchProps>;\n\nexport const SpotlightSearch = factory<SpotlightSearchFactory>((props) => {\n const { classNames, styles, onKeyDown, onChange, vars, value, attributes, ...others } = useProps(\n 'SpotlightSearch',\n defaultProps,\n props\n );\n const ctx = useSpotlightContext();\n const inputStyles = ctx.getStyles('search');\n const [isComposing, setIsComposing] = useState(false); // IME\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (isComposing) {\n return;\n }\n\n if (event.nativeEvent.code === 'ArrowDown') {\n event.preventDefault();\n spotlightActions.selectNextAction(ctx.store);\n }\n\n if (event.nativeEvent.code === 'ArrowUp') {\n event.preventDefault();\n spotlightActions.selectPreviousAction(ctx.store);\n }\n\n if (event.nativeEvent.code === 'Enter' || event.nativeEvent.code === 'NumpadEnter') {\n event.preventDefault();\n spotlightActions.triggerSelectedAction(ctx.store);\n }\n };\n\n return (\n <Input\n {...inputStyles}\n classNames={[{ input: inputStyles.className }, classNames] as any}\n styles={[{ input: inputStyles.style }, styles] as any}\n {...others}\n value={value ?? ctx.query}\n onChange={(event) => {\n ctx.setQuery(event.currentTarget.value);\n onChange?.(event);\n }}\n onKeyDown={handleKeyDown}\n onCompositionStart={() => setIsComposing(true)}\n onCompositionEnd={() => setIsComposing(false)}\n />\n );\n});\n\nSpotlightSearch.classes = classes;\nSpotlightSearch.displayName = '@mantine/spotlight/SpotlightSearch';\n"],"mappings":";;;;;;;;AAgCA,MAAM,eAAe,EACnB,MAAM,MACP;AAED,MAAa,kBAAkB,SAAiC,UAAU;CACxE,MAAM,EAAE,YAAY,QAAQ,WAAW,UAAU,MAAM,OAAO,YAAY,GAAG,WAAW,SACtF,mBACA,cACA,MACD;CACD,MAAM,MAAM,qBAAqB;CACjC,MAAM,cAAc,IAAI,UAAU,SAAS;CAC3C,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CAErD,MAAM,iBAAiB,UAAiD;AACtE,cAAY,MAAM;AAClB,MAAI,YACF;AAGF,MAAI,MAAM,YAAY,SAAS,aAAa;AAC1C,SAAM,gBAAgB;AACtB,oBAAiB,iBAAiB,IAAI,MAAM;;AAG9C,MAAI,MAAM,YAAY,SAAS,WAAW;AACxC,SAAM,gBAAgB;AACtB,oBAAiB,qBAAqB,IAAI,MAAM;;AAGlD,MAAI,MAAM,YAAY,SAAS,WAAW,MAAM,YAAY,SAAS,eAAe;AAClF,SAAM,gBAAgB;AACtB,oBAAiB,sBAAsB,IAAI,MAAM;;;AAIrD,QACE,oBAAC,OAAD;EACE,GAAI;EACJ,YAAY,CAAC,EAAE,OAAO,YAAY,WAAW,EAAE,WAAW;EAC1D,QAAQ,CAAC,EAAE,OAAO,YAAY,OAAO,EAAE,OAAO;EAC9C,GAAI;EACJ,OAAO,SAAS,IAAI;EACpB,WAAW,UAAU;AACnB,OAAI,SAAS,MAAM,cAAc,MAAM;AACvC,cAAW,MAAM;;EAEnB,WAAW;EACX,0BAA0B,eAAe,KAAK;EAC9C,wBAAwB,eAAe,MAAM;EAC7C,CAAA;EAEJ;AAEF,gBAAgB,UAAUA;AAC1B,gBAAgB,cAAc"}
1
+ {"version":3,"file":"SpotlightSearch.mjs","names":["classes"],"sources":["../src/SpotlightSearch.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n Input,\n InputProps,\n InputStylesNames,\n useProps,\n} from '@mantine/core';\nimport { useSpotlightContext } from './Spotlight.context';\nimport { spotlightActions } from './spotlight.store';\nimport classes from './Spotlight.module.css';\n\nexport type SpotlightSearchStylesNames = InputStylesNames;\n\nexport interface SpotlightSearchProps\n extends\n BoxProps,\n Omit<InputProps, 'classNames' | 'styles' | 'vars' | 'variant'>,\n CompoundStylesApiProps<SpotlightSearchFactory>,\n ElementProps<'input', 'size'> {}\n\nexport type SpotlightSearchFactory = Factory<{\n props: SpotlightSearchProps;\n ref: HTMLInputElement;\n stylesNames: SpotlightSearchStylesNames;\n compound: true;\n}>;\n\nconst defaultProps = {\n size: 'lg',\n} satisfies Partial<SpotlightSearchProps>;\n\nexport const SpotlightSearch = factory<SpotlightSearchFactory>((props) => {\n const { classNames, styles, onKeyDown, onChange, vars, value, attributes, ...others } = useProps(\n 'SpotlightSearch',\n defaultProps,\n props\n );\n const ctx = useSpotlightContext();\n const inputStyles = ctx.getStyles('search');\n const [isComposing, setIsComposing] = useState(false); // IME\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (isComposing) {\n return;\n }\n\n if (event.nativeEvent.code === 'ArrowDown') {\n event.preventDefault();\n spotlightActions.selectNextAction(ctx.store);\n }\n\n if (event.nativeEvent.code === 'ArrowUp') {\n event.preventDefault();\n spotlightActions.selectPreviousAction(ctx.store);\n }\n\n if (event.nativeEvent.code === 'Enter' || event.nativeEvent.code === 'NumpadEnter') {\n event.preventDefault();\n spotlightActions.triggerSelectedAction(ctx.store);\n }\n };\n\n return (\n <Input\n {...inputStyles}\n classNames={[{ input: inputStyles.className }, classNames] as any}\n styles={[{ input: inputStyles.style }, styles] as any}\n {...others}\n value={value ?? ctx.query}\n onChange={(event) => {\n ctx.setQuery(event.currentTarget.value);\n onChange?.(event);\n }}\n onKeyDown={handleKeyDown}\n onCompositionStart={() => setIsComposing(true)}\n onCompositionEnd={() => setIsComposing(false)}\n />\n );\n});\n\nSpotlightSearch.classes = classes;\nSpotlightSearch.displayName = '@mantine/spotlight/SpotlightSearch';\n"],"mappings":";;;;;;;;AAgCA,MAAM,eAAe,EACnB,MAAM,KACR;AAEA,MAAa,kBAAkB,SAAiC,UAAU;CACxE,MAAM,EAAE,YAAY,QAAQ,WAAW,UAAU,MAAM,OAAO,YAAY,GAAG,WAAW,SACtF,mBACA,cACA,KACF;CACA,MAAM,MAAM,oBAAoB;CAChC,MAAM,cAAc,IAAI,UAAU,QAAQ;CAC1C,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CAEpD,MAAM,iBAAiB,UAAiD;EACtE,YAAY,KAAK;EACjB,IAAI,aACF;EAGF,IAAI,MAAM,YAAY,SAAS,aAAa;GAC1C,MAAM,eAAe;GACrB,iBAAiB,iBAAiB,IAAI,KAAK;EAC7C;EAEA,IAAI,MAAM,YAAY,SAAS,WAAW;GACxC,MAAM,eAAe;GACrB,iBAAiB,qBAAqB,IAAI,KAAK;EACjD;EAEA,IAAI,MAAM,YAAY,SAAS,WAAW,MAAM,YAAY,SAAS,eAAe;GAClF,MAAM,eAAe;GACrB,iBAAiB,sBAAsB,IAAI,KAAK;EAClD;CACF;CAEA,OACE,oBAAC,OAAD;EACE,GAAI;EACJ,YAAY,CAAC,EAAE,OAAO,YAAY,UAAU,GAAG,UAAU;EACzD,QAAQ,CAAC,EAAE,OAAO,YAAY,MAAM,GAAG,MAAM;EAC7C,GAAI;EACJ,OAAO,SAAS,IAAI;EACpB,WAAW,UAAU;GACnB,IAAI,SAAS,MAAM,cAAc,KAAK;GACtC,WAAW,KAAK;EAClB;EACA,WAAW;EACX,0BAA0B,eAAe,IAAI;EAC7C,wBAAwB,eAAe,KAAK;CAC7C,CAAA;AAEL,CAAC;AAED,gBAAgB,UAAUA;AAC1B,gBAAgB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"default-spotlight-filter.mjs","names":[],"sources":["../src/default-spotlight-filter.ts"],"sourcesContent":["import type {\n SpotlightActionData,\n SpotlightActionGroupData,\n SpotlightActions,\n SpotlightFilterFunction,\n} from './Spotlight';\n\nfunction getKeywords(keywords: string | string[] | undefined) {\n if (Array.isArray(keywords)) {\n return keywords\n .map((keyword) => keyword.trim())\n .join(',')\n .toLowerCase()\n .trim();\n }\n\n if (typeof keywords === 'string') {\n return keywords.toLowerCase().trim();\n }\n\n return '';\n}\n\nfunction getFlatActions(data: SpotlightActions[]) {\n return data.reduce<SpotlightActionData[]>((acc, item) => {\n if ('actions' in item) {\n return [...acc, ...item.actions.map((action) => ({ ...action, group: item.group }))];\n }\n\n return [...acc, item];\n }, []);\n}\n\nfunction flatActionsToGroups(data: SpotlightActionData[]) {\n const groups: Record<string, { pushed: boolean; data: SpotlightActionGroupData }> = {};\n const result: SpotlightActions[] = [];\n\n data.forEach((action) => {\n if (action.group) {\n if (!groups[action.group]) {\n groups[action.group] = { pushed: false, data: { group: action.group, actions: [] } };\n }\n\n groups[action.group].data.actions.push(action);\n\n if (!groups[action.group].pushed) {\n groups[action.group].pushed = true;\n result.push(groups[action.group].data);\n }\n } else {\n result.push(action);\n }\n });\n\n return result;\n}\n\nexport const defaultSpotlightFilter: SpotlightFilterFunction = (_query, data) => {\n const query = _query.trim().toLowerCase();\n const priorityMatrix: SpotlightActionData[][] = [[], []];\n const flatActions = getFlatActions(data);\n flatActions.forEach((item) => {\n if (item.label?.toLowerCase().includes(query)) {\n priorityMatrix[0].push(item);\n } else if (\n item.description?.toLowerCase().includes(query) ||\n getKeywords(item.keywords).includes(query)\n ) {\n priorityMatrix[1].push(item);\n }\n });\n\n return flatActionsToGroups(priorityMatrix.flat());\n};\n"],"mappings":";;AAOA,SAAS,YAAY,UAAyC;AAC5D,KAAI,MAAM,QAAQ,SAAS,CACzB,QAAO,SACJ,KAAK,YAAY,QAAQ,MAAM,CAAC,CAChC,KAAK,IAAI,CACT,aAAa,CACb,MAAM;AAGX,KAAI,OAAO,aAAa,SACtB,QAAO,SAAS,aAAa,CAAC,MAAM;AAGtC,QAAO;;AAGT,SAAS,eAAe,MAA0B;AAChD,QAAO,KAAK,QAA+B,KAAK,SAAS;AACvD,MAAI,aAAa,KACf,QAAO,CAAC,GAAG,KAAK,GAAG,KAAK,QAAQ,KAAK,YAAY;GAAE,GAAG;GAAQ,OAAO,KAAK;GAAO,EAAE,CAAC;AAGtF,SAAO,CAAC,GAAG,KAAK,KAAK;IACpB,EAAE,CAAC;;AAGR,SAAS,oBAAoB,MAA6B;CACxD,MAAM,SAA8E,EAAE;CACtF,MAAM,SAA6B,EAAE;AAErC,MAAK,SAAS,WAAW;AACvB,MAAI,OAAO,OAAO;AAChB,OAAI,CAAC,OAAO,OAAO,OACjB,QAAO,OAAO,SAAS;IAAE,QAAQ;IAAO,MAAM;KAAE,OAAO,OAAO;KAAO,SAAS,EAAE;KAAE;IAAE;AAGtF,UAAO,OAAO,OAAO,KAAK,QAAQ,KAAK,OAAO;AAE9C,OAAI,CAAC,OAAO,OAAO,OAAO,QAAQ;AAChC,WAAO,OAAO,OAAO,SAAS;AAC9B,WAAO,KAAK,OAAO,OAAO,OAAO,KAAK;;QAGxC,QAAO,KAAK,OAAO;GAErB;AAEF,QAAO;;AAGT,MAAa,0BAAmD,QAAQ,SAAS;CAC/E,MAAM,QAAQ,OAAO,MAAM,CAAC,aAAa;CACzC,MAAM,iBAA0C,CAAC,EAAE,EAAE,EAAE,CAAC;AACpC,gBAAe,KAAK,CAC5B,SAAS,SAAS;AAC5B,MAAI,KAAK,OAAO,aAAa,CAAC,SAAS,MAAM,CAC3C,gBAAe,GAAG,KAAK,KAAK;WAE5B,KAAK,aAAa,aAAa,CAAC,SAAS,MAAM,IAC/C,YAAY,KAAK,SAAS,CAAC,SAAS,MAAM,CAE1C,gBAAe,GAAG,KAAK,KAAK;GAE9B;AAEF,QAAO,oBAAoB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"default-spotlight-filter.mjs","names":[],"sources":["../src/default-spotlight-filter.ts"],"sourcesContent":["import type {\n SpotlightActionData,\n SpotlightActionGroupData,\n SpotlightActions,\n SpotlightFilterFunction,\n} from './Spotlight';\n\nfunction getKeywords(keywords: string | string[] | undefined) {\n if (Array.isArray(keywords)) {\n return keywords\n .map((keyword) => keyword.trim())\n .join(',')\n .toLowerCase()\n .trim();\n }\n\n if (typeof keywords === 'string') {\n return keywords.toLowerCase().trim();\n }\n\n return '';\n}\n\nfunction getFlatActions(data: SpotlightActions[]) {\n return data.reduce<SpotlightActionData[]>((acc, item) => {\n if ('actions' in item) {\n return [...acc, ...item.actions.map((action) => ({ ...action, group: item.group }))];\n }\n\n return [...acc, item];\n }, []);\n}\n\nfunction flatActionsToGroups(data: SpotlightActionData[]) {\n const groups: Record<string, { pushed: boolean; data: SpotlightActionGroupData }> = {};\n const result: SpotlightActions[] = [];\n\n data.forEach((action) => {\n if (action.group) {\n if (!groups[action.group]) {\n groups[action.group] = { pushed: false, data: { group: action.group, actions: [] } };\n }\n\n groups[action.group].data.actions.push(action);\n\n if (!groups[action.group].pushed) {\n groups[action.group].pushed = true;\n result.push(groups[action.group].data);\n }\n } else {\n result.push(action);\n }\n });\n\n return result;\n}\n\nexport const defaultSpotlightFilter: SpotlightFilterFunction = (_query, data) => {\n const query = _query.trim().toLowerCase();\n const priorityMatrix: SpotlightActionData[][] = [[], []];\n const flatActions = getFlatActions(data);\n flatActions.forEach((item) => {\n if (item.label?.toLowerCase().includes(query)) {\n priorityMatrix[0].push(item);\n } else if (\n item.description?.toLowerCase().includes(query) ||\n getKeywords(item.keywords).includes(query)\n ) {\n priorityMatrix[1].push(item);\n }\n });\n\n return flatActionsToGroups(priorityMatrix.flat());\n};\n"],"mappings":";;AAOA,SAAS,YAAY,UAAyC;CAC5D,IAAI,MAAM,QAAQ,QAAQ,GACxB,OAAO,SACJ,KAAK,YAAY,QAAQ,KAAK,CAAC,EAC/B,KAAK,GAAG,EACR,YAAY,EACZ,KAAK;CAGV,IAAI,OAAO,aAAa,UACtB,OAAO,SAAS,YAAY,EAAE,KAAK;CAGrC,OAAO;AACT;AAEA,SAAS,eAAe,MAA0B;CAChD,OAAO,KAAK,QAA+B,KAAK,SAAS;EACvD,IAAI,aAAa,MACf,OAAO,CAAC,GAAG,KAAK,GAAG,KAAK,QAAQ,KAAK,YAAY;GAAE,GAAG;GAAQ,OAAO,KAAK;EAAM,EAAE,CAAC;EAGrF,OAAO,CAAC,GAAG,KAAK,IAAI;CACtB,GAAG,CAAC,CAAC;AACP;AAEA,SAAS,oBAAoB,MAA6B;CACxD,MAAM,SAA8E,CAAC;CACrF,MAAM,SAA6B,CAAC;CAEpC,KAAK,SAAS,WAAW;EACvB,IAAI,OAAO,OAAO;GAChB,IAAI,CAAC,OAAO,OAAO,QACjB,OAAO,OAAO,SAAS;IAAE,QAAQ;IAAO,MAAM;KAAE,OAAO,OAAO;KAAO,SAAS,CAAC;IAAE;GAAE;GAGrF,OAAO,OAAO,OAAO,KAAK,QAAQ,KAAK,MAAM;GAE7C,IAAI,CAAC,OAAO,OAAO,OAAO,QAAQ;IAChC,OAAO,OAAO,OAAO,SAAS;IAC9B,OAAO,KAAK,OAAO,OAAO,OAAO,IAAI;GACvC;EACF,OACE,OAAO,KAAK,MAAM;CAEtB,CAAC;CAED,OAAO;AACT;AAEA,MAAa,0BAAmD,QAAQ,SAAS;CAC/E,MAAM,QAAQ,OAAO,KAAK,EAAE,YAAY;CACxC,MAAM,iBAA0C,CAAC,CAAC,GAAG,CAAC,CAAC;CAEvD,eADmC,IACzB,EAAE,SAAS,SAAS;EAC5B,IAAI,KAAK,OAAO,YAAY,EAAE,SAAS,KAAK,GAC1C,eAAe,GAAG,KAAK,IAAI;OACtB,IACL,KAAK,aAAa,YAAY,EAAE,SAAS,KAAK,KAC9C,YAAY,KAAK,QAAQ,EAAE,SAAS,KAAK,GAEzC,eAAe,GAAG,KAAK,IAAI;CAE/B,CAAC;CAED,OAAO,oBAAoB,eAAe,KAAK,CAAC;AAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-hotkeys.mjs","names":[],"sources":["../src/get-hotkeys.ts"],"sourcesContent":["import { HotkeyItem } from '@mantine/hooks';\nimport { spotlightActions, SpotlightStore } from './spotlight.store';\n\nexport function getHotkeys(\n hotkeys: string | string[] | null | undefined,\n store: SpotlightStore\n): HotkeyItem[] {\n if (!hotkeys) {\n return [];\n }\n\n const open = () => spotlightActions.open(store);\n\n if (Array.isArray(hotkeys)) {\n return hotkeys.map((hotkey) => [hotkey, open]);\n }\n\n return [[hotkeys, open]];\n}\n"],"mappings":";;;AAGA,SAAgB,WACd,SACA,OACc;AACd,KAAI,CAAC,QACH,QAAO,EAAE;CAGX,MAAM,aAAa,iBAAiB,KAAK,MAAM;AAE/C,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QAAQ,KAAK,WAAW,CAAC,QAAQ,KAAK,CAAC;AAGhD,QAAO,CAAC,CAAC,SAAS,KAAK,CAAC"}
1
+ {"version":3,"file":"get-hotkeys.mjs","names":[],"sources":["../src/get-hotkeys.ts"],"sourcesContent":["import { HotkeyItem } from '@mantine/hooks';\nimport { spotlightActions, SpotlightStore } from './spotlight.store';\n\nexport function getHotkeys(\n hotkeys: string | string[] | null | undefined,\n store: SpotlightStore\n): HotkeyItem[] {\n if (!hotkeys) {\n return [];\n }\n\n const open = () => spotlightActions.open(store);\n\n if (Array.isArray(hotkeys)) {\n return hotkeys.map((hotkey) => [hotkey, open]);\n }\n\n return [[hotkeys, open]];\n}\n"],"mappings":";;;AAGA,SAAgB,WACd,SACA,OACc;CACd,IAAI,CAAC,SACH,OAAO,CAAC;CAGV,MAAM,aAAa,iBAAiB,KAAK,KAAK;CAE9C,IAAI,MAAM,QAAQ,OAAO,GACvB,OAAO,QAAQ,KAAK,WAAW,CAAC,QAAQ,IAAI,CAAC;CAG/C,OAAO,CAAC,CAAC,SAAS,IAAI,CAAC;AACzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"is-actions-group.mjs","names":[],"sources":["../src/is-actions-group.ts"],"sourcesContent":["import type { SpotlightActionData, SpotlightActionGroupData } from './Spotlight';\n\nexport function isActionsGroup(\n item: SpotlightActionData | SpotlightActionGroupData\n): item is SpotlightActionGroupData {\n const _item = item as SpotlightActionGroupData;\n return _item.group !== undefined && Array.isArray(_item.actions);\n}\n"],"mappings":";;AAEA,SAAgB,eACd,MACkC;CAClC,MAAM,QAAQ;AACd,QAAO,MAAM,UAAU,KAAA,KAAa,MAAM,QAAQ,MAAM,QAAQ"}
1
+ {"version":3,"file":"is-actions-group.mjs","names":[],"sources":["../src/is-actions-group.ts"],"sourcesContent":["import type { SpotlightActionData, SpotlightActionGroupData } from './Spotlight';\n\nexport function isActionsGroup(\n item: SpotlightActionData | SpotlightActionGroupData\n): item is SpotlightActionGroupData {\n const _item = item as SpotlightActionGroupData;\n return _item.group !== undefined && Array.isArray(_item.actions);\n}\n"],"mappings":";;AAEA,SAAgB,eACd,MACkC;CAClC,MAAM,QAAQ;CACd,OAAO,MAAM,UAAU,KAAA,KAAa,MAAM,QAAQ,MAAM,OAAO;AACjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"limit-actions.mjs","names":[],"sources":["../src/limit-actions.ts"],"sourcesContent":["import { isActionsGroup } from './is-actions-group';\nimport type { SpotlightActionData, SpotlightActions } from './Spotlight';\n\nexport function limitActions(actions: SpotlightActions[], limit: number) {\n if (!Array.isArray(actions)) {\n return [];\n }\n\n let count = 0;\n return actions.reduce<SpotlightActions[]>((acc, item) => {\n if (count >= limit) {\n return acc;\n }\n\n if (isActionsGroup(item)) {\n const groupActions = limitActions(item.actions, limit - count);\n acc.push({\n group: item.group,\n actions: groupActions as SpotlightActionData[],\n });\n count += groupActions.length;\n } else {\n acc.push(item);\n count += 1;\n }\n\n return acc;\n }, []);\n}\n"],"mappings":";;;AAGA,SAAgB,aAAa,SAA6B,OAAe;AACvE,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO,EAAE;CAGX,IAAI,QAAQ;AACZ,QAAO,QAAQ,QAA4B,KAAK,SAAS;AACvD,MAAI,SAAS,MACX,QAAO;AAGT,MAAI,eAAe,KAAK,EAAE;GACxB,MAAM,eAAe,aAAa,KAAK,SAAS,QAAQ,MAAM;AAC9D,OAAI,KAAK;IACP,OAAO,KAAK;IACZ,SAAS;IACV,CAAC;AACF,YAAS,aAAa;SACjB;AACL,OAAI,KAAK,KAAK;AACd,YAAS;;AAGX,SAAO;IACN,EAAE,CAAC"}
1
+ {"version":3,"file":"limit-actions.mjs","names":[],"sources":["../src/limit-actions.ts"],"sourcesContent":["import { isActionsGroup } from './is-actions-group';\nimport type { SpotlightActionData, SpotlightActions } from './Spotlight';\n\nexport function limitActions(actions: SpotlightActions[], limit: number) {\n if (!Array.isArray(actions)) {\n return [];\n }\n\n let count = 0;\n return actions.reduce<SpotlightActions[]>((acc, item) => {\n if (count >= limit) {\n return acc;\n }\n\n if (isActionsGroup(item)) {\n const groupActions = limitActions(item.actions, limit - count);\n acc.push({\n group: item.group,\n actions: groupActions as SpotlightActionData[],\n });\n count += groupActions.length;\n } else {\n acc.push(item);\n count += 1;\n }\n\n return acc;\n }, []);\n}\n"],"mappings":";;;AAGA,SAAgB,aAAa,SAA6B,OAAe;CACvE,IAAI,CAAC,MAAM,QAAQ,OAAO,GACxB,OAAO,CAAC;CAGV,IAAI,QAAQ;CACZ,OAAO,QAAQ,QAA4B,KAAK,SAAS;EACvD,IAAI,SAAS,OACX,OAAO;EAGT,IAAI,eAAe,IAAI,GAAG;GACxB,MAAM,eAAe,aAAa,KAAK,SAAS,QAAQ,KAAK;GAC7D,IAAI,KAAK;IACP,OAAO,KAAK;IACZ,SAAS;GACX,CAAC;GACD,SAAS,aAAa;EACxB,OAAO;GACL,IAAI,KAAK,IAAI;GACb,SAAS;EACX;EAEA,OAAO;CACT,GAAG,CAAC,CAAC;AACP"}
@@ -1 +1 @@
1
- {"version":3,"file":"spotlight.store.mjs","names":[],"sources":["../src/spotlight.store.ts"],"sourcesContent":["import { clamp } from '@mantine/hooks';\nimport { createStore, MantineStore, useStore } from '@mantine/store';\n\nexport interface SpotlightState {\n opened: boolean;\n selected: number;\n listId: string;\n query: string;\n empty: boolean;\n registeredActions: Set<string>;\n}\n\nexport type SpotlightStore = MantineStore<SpotlightState>;\n\nexport const createSpotlightStore = () =>\n createStore<SpotlightState>({\n opened: false,\n empty: false,\n selected: -1,\n listId: '',\n query: '',\n registeredActions: new Set(),\n });\n\nexport const useSpotlight = (store: SpotlightStore) => useStore(store);\n\nexport function updateSpotlightStateAction(\n update: (state: SpotlightState) => Partial<SpotlightState>,\n store: SpotlightStore\n) {\n const state = store.getState();\n store.setState({ ...state, ...update(store.getState()) });\n}\n\nexport function openSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ opened: true, selected: -1 }), store);\n}\n\nexport function closeSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ opened: false }), store);\n}\n\nexport function toggleSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(\n (state) => ({ opened: !state.opened, selected: state.opened ? state.selected : -1 }),\n store\n );\n}\n\nexport function setSelectedAction(index: number, store: SpotlightStore) {\n store.updateState((state) => ({ ...state, selected: index }));\n}\n\nexport function setListId(id: string, store: SpotlightStore) {\n store.updateState((state) => ({ ...state, listId: id }));\n}\n\nfunction findElementByQuerySelector<T extends HTMLElement>(\n selector: string,\n root: Document | Element | ShadowRoot = document\n): T | null {\n // Directly try to find the element in the current root.\n const element = root.querySelector<T>(selector);\n if (element) {\n return element;\n }\n\n // Iterate through all children of the current root.\n const children = root instanceof ShadowRoot ? root.host.children : root.children;\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n\n // Recursively search in the child's shadow root if it exists.\n if (child.shadowRoot) {\n const shadowElement = findElementByQuerySelector<T>(selector, child.shadowRoot);\n if (shadowElement) {\n return shadowElement;\n }\n }\n\n // Also, search recursively in the child itself if it does not have a shadow root or the element wasn't found in its shadow root.\n const nestedElement = findElementByQuerySelector<T>(selector, child);\n if (nestedElement) {\n return nestedElement;\n }\n }\n\n // Return null if the element isn't found in the current root or any of its shadow DOMs.\n return null;\n}\n\nexport function selectAction(index: number, store: SpotlightStore): number {\n const state = store.getState();\n const actionsList = state.listId ? findElementByQuerySelector(`#${state.listId}`) : null;\n const selected = actionsList?.querySelector<HTMLButtonElement>('[data-selected]');\n const actions = actionsList?.querySelectorAll<HTMLButtonElement>('[data-action]') ?? [];\n const nextIndex = index === -1 ? actions.length - 1 : index === actions.length ? 0 : index;\n\n const selectedIndex = clamp(nextIndex, 0, actions.length - 1);\n selected?.removeAttribute('data-selected');\n actions[selectedIndex]?.scrollIntoView({ block: 'nearest' });\n actions[selectedIndex]?.setAttribute('data-selected', 'true');\n setSelectedAction(selectedIndex, store);\n\n return selectedIndex;\n}\n\nexport function selectNextAction(store: SpotlightStore) {\n return selectAction(store.getState().selected + 1, store);\n}\n\nexport function selectPreviousAction(store: SpotlightStore) {\n return selectAction(store.getState().selected - 1, store);\n}\n\nexport function triggerSelectedAction(store: SpotlightStore) {\n const state = store.getState();\n const selected = state.listId\n ? findElementByQuerySelector<HTMLButtonElement>(`#${state.listId} [data-selected]`)\n : null;\n selected?.click();\n}\n\nexport function registerAction(id: string, store: SpotlightStore) {\n const state = store.getState();\n state.registeredActions.add(id);\n return () => {\n state.registeredActions.delete(id);\n };\n}\n\nexport function setQuery(query: string, store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ query }), store);\n Promise.resolve().then(() => {\n selectAction(0, store);\n updateSpotlightStateAction(\n (state) => ({\n empty: (state.query.trim().length > 0 && state.registeredActions.size === 0) || false,\n }),\n store\n );\n });\n}\n\nexport function clearSpotlightState(\n { clearQuery }: { clearQuery: boolean | undefined },\n store: SpotlightStore\n) {\n store.updateState((state) => ({\n ...state,\n selected: -1,\n query: clearQuery ? '' : state.query,\n empty: clearQuery ? false : state.empty,\n }));\n}\n\nexport const spotlightActions = {\n open: openSpotlightAction,\n close: closeSpotlightAction,\n toggle: toggleSpotlightAction,\n updateState: updateSpotlightStateAction,\n setSelectedAction,\n setListId,\n selectAction,\n selectNextAction,\n selectPreviousAction,\n triggerSelectedAction,\n registerAction,\n setQuery,\n clearSpotlightState,\n};\n\nexport function createSpotlight() {\n const store = createSpotlightStore();\n const actions = {\n open: () => openSpotlightAction(store),\n close: () => closeSpotlightAction(store),\n toggle: () => toggleSpotlightAction(store),\n };\n\n return [store, actions] as const;\n}\n\nexport const [spotlightStore, spotlight] = createSpotlight();\nexport const { open: openSpotlight, close: closeSpotlight, toggle: toggleSpotlight } = spotlight;\n"],"mappings":"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"}
1
+ {"version":3,"file":"spotlight.store.mjs","names":[],"sources":["../src/spotlight.store.ts"],"sourcesContent":["import { clamp } from '@mantine/hooks';\nimport { createStore, MantineStore, useStore } from '@mantine/store';\n\nexport interface SpotlightState {\n opened: boolean;\n selected: number;\n listId: string;\n query: string;\n empty: boolean;\n registeredActions: Set<string>;\n}\n\nexport type SpotlightStore = MantineStore<SpotlightState>;\n\nexport const createSpotlightStore = () =>\n createStore<SpotlightState>({\n opened: false,\n empty: false,\n selected: -1,\n listId: '',\n query: '',\n registeredActions: new Set(),\n });\n\nexport const useSpotlight = (store: SpotlightStore) => useStore(store);\n\nexport function updateSpotlightStateAction(\n update: (state: SpotlightState) => Partial<SpotlightState>,\n store: SpotlightStore\n) {\n const state = store.getState();\n store.setState({ ...state, ...update(store.getState()) });\n}\n\nexport function openSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ opened: true, selected: -1 }), store);\n}\n\nexport function closeSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ opened: false }), store);\n}\n\nexport function toggleSpotlightAction(store: SpotlightStore) {\n updateSpotlightStateAction(\n (state) => ({ opened: !state.opened, selected: state.opened ? state.selected : -1 }),\n store\n );\n}\n\nexport function setSelectedAction(index: number, store: SpotlightStore) {\n store.updateState((state) => ({ ...state, selected: index }));\n}\n\nexport function setListId(id: string, store: SpotlightStore) {\n store.updateState((state) => ({ ...state, listId: id }));\n}\n\nfunction findElementByQuerySelector<T extends HTMLElement>(\n selector: string,\n root: Document | Element | ShadowRoot = document\n): T | null {\n // Directly try to find the element in the current root.\n const element = root.querySelector<T>(selector);\n if (element) {\n return element;\n }\n\n // Iterate through all children of the current root.\n const children = root instanceof ShadowRoot ? root.host.children : root.children;\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n\n // Recursively search in the child's shadow root if it exists.\n if (child.shadowRoot) {\n const shadowElement = findElementByQuerySelector<T>(selector, child.shadowRoot);\n if (shadowElement) {\n return shadowElement;\n }\n }\n\n // Also, search recursively in the child itself if it does not have a shadow root or the element wasn't found in its shadow root.\n const nestedElement = findElementByQuerySelector<T>(selector, child);\n if (nestedElement) {\n return nestedElement;\n }\n }\n\n // Return null if the element isn't found in the current root or any of its shadow DOMs.\n return null;\n}\n\nexport function selectAction(index: number, store: SpotlightStore): number {\n const state = store.getState();\n const actionsList = state.listId ? findElementByQuerySelector(`#${state.listId}`) : null;\n const selected = actionsList?.querySelector<HTMLButtonElement>('[data-selected]');\n const actions = actionsList?.querySelectorAll<HTMLButtonElement>('[data-action]') ?? [];\n const nextIndex = index === -1 ? actions.length - 1 : index === actions.length ? 0 : index;\n\n const selectedIndex = clamp(nextIndex, 0, actions.length - 1);\n selected?.removeAttribute('data-selected');\n actions[selectedIndex]?.scrollIntoView({ block: 'nearest' });\n actions[selectedIndex]?.setAttribute('data-selected', 'true');\n setSelectedAction(selectedIndex, store);\n\n return selectedIndex;\n}\n\nexport function selectNextAction(store: SpotlightStore) {\n return selectAction(store.getState().selected + 1, store);\n}\n\nexport function selectPreviousAction(store: SpotlightStore) {\n return selectAction(store.getState().selected - 1, store);\n}\n\nexport function triggerSelectedAction(store: SpotlightStore) {\n const state = store.getState();\n const selected = state.listId\n ? findElementByQuerySelector<HTMLButtonElement>(`#${state.listId} [data-selected]`)\n : null;\n selected?.click();\n}\n\nexport function registerAction(id: string, store: SpotlightStore) {\n const state = store.getState();\n state.registeredActions.add(id);\n return () => {\n state.registeredActions.delete(id);\n };\n}\n\nexport function setQuery(query: string, store: SpotlightStore) {\n updateSpotlightStateAction(() => ({ query }), store);\n Promise.resolve().then(() => {\n selectAction(0, store);\n updateSpotlightStateAction(\n (state) => ({\n empty: (state.query.trim().length > 0 && state.registeredActions.size === 0) || false,\n }),\n store\n );\n });\n}\n\nexport function clearSpotlightState(\n { clearQuery }: { clearQuery: boolean | undefined },\n store: SpotlightStore\n) {\n store.updateState((state) => ({\n ...state,\n selected: -1,\n query: clearQuery ? '' : state.query,\n empty: clearQuery ? false : state.empty,\n }));\n}\n\nexport const spotlightActions = {\n open: openSpotlightAction,\n close: closeSpotlightAction,\n toggle: toggleSpotlightAction,\n updateState: updateSpotlightStateAction,\n setSelectedAction,\n setListId,\n selectAction,\n selectNextAction,\n selectPreviousAction,\n triggerSelectedAction,\n registerAction,\n setQuery,\n clearSpotlightState,\n};\n\nexport function createSpotlight() {\n const store = createSpotlightStore();\n const actions = {\n open: () => openSpotlightAction(store),\n close: () => closeSpotlightAction(store),\n toggle: () => toggleSpotlightAction(store),\n };\n\n return [store, actions] as const;\n}\n\nexport const [spotlightStore, spotlight] = createSpotlight();\nexport const { open: openSpotlight, close: closeSpotlight, toggle: toggleSpotlight } = spotlight;\n"],"mappings":";;;;AAcA,MAAa,6BACX,YAA4B;CAC1B,QAAQ;CACR,OAAO;CACP,UAAU;CACV,QAAQ;CACR,OAAO;CACP,mCAAmB,IAAI,IAAI;AAC7B,CAAC;AAEH,MAAa,gBAAgB,UAA0B,SAAS,KAAK;AAErE,SAAgB,2BACd,QACA,OACA;CACA,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,SAAS;EAAE,GAAG;EAAO,GAAG,OAAO,MAAM,SAAS,CAAC;CAAE,CAAC;AAC1D;AAEA,SAAgB,oBAAoB,OAAuB;CACzD,kCAAkC;EAAE,QAAQ;EAAM,UAAU;CAAG,IAAI,KAAK;AAC1E;AAEA,SAAgB,qBAAqB,OAAuB;CAC1D,kCAAkC,EAAE,QAAQ,MAAM,IAAI,KAAK;AAC7D;AAEA,SAAgB,sBAAsB,OAAuB;CAC3D,4BACG,WAAW;EAAE,QAAQ,CAAC,MAAM;EAAQ,UAAU,MAAM,SAAS,MAAM,WAAW;CAAG,IAClF,KACF;AACF;AAEA,SAAgB,kBAAkB,OAAe,OAAuB;CACtE,MAAM,aAAa,WAAW;EAAE,GAAG;EAAO,UAAU;CAAM,EAAE;AAC9D;AAEA,SAAgB,UAAU,IAAY,OAAuB;CAC3D,MAAM,aAAa,WAAW;EAAE,GAAG;EAAO,QAAQ;CAAG,EAAE;AACzD;AAEA,SAAS,2BACP,UACA,OAAwC,UAC9B;CAEV,MAAM,UAAU,KAAK,cAAiB,QAAQ;CAC9C,IAAI,SACF,OAAO;CAIT,MAAM,WAAW,gBAAgB,aAAa,KAAK,KAAK,WAAW,KAAK;CACxE,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;EAC3C,MAAM,QAAQ,SAAS;EAGvB,IAAI,MAAM,YAAY;GACpB,MAAM,gBAAgB,2BAA8B,UAAU,MAAM,UAAU;GAC9E,IAAI,eACF,OAAO;EAEX;EAGA,MAAM,gBAAgB,2BAA8B,UAAU,KAAK;EACnE,IAAI,eACF,OAAO;CAEX;CAGA,OAAO;AACT;AAEA,SAAgB,aAAa,OAAe,OAA+B;CACzE,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,cAAc,MAAM,SAAS,2BAA2B,IAAI,MAAM,QAAQ,IAAI;CACpF,MAAM,WAAW,aAAa,cAAiC,iBAAiB;CAChF,MAAM,UAAU,aAAa,iBAAoC,eAAe,KAAK,CAAC;CAGtF,MAAM,gBAAgB,MAFJ,UAAU,KAAK,QAAQ,SAAS,IAAI,UAAU,QAAQ,SAAS,IAAI,OAE9C,GAAG,QAAQ,SAAS,CAAC;CAC5D,UAAU,gBAAgB,eAAe;CACzC,QAAQ,gBAAgB,eAAe,EAAE,OAAO,UAAU,CAAC;CAC3D,QAAQ,gBAAgB,aAAa,iBAAiB,MAAM;CAC5D,kBAAkB,eAAe,KAAK;CAEtC,OAAO;AACT;AAEA,SAAgB,iBAAiB,OAAuB;CACtD,OAAO,aAAa,MAAM,SAAS,EAAE,WAAW,GAAG,KAAK;AAC1D;AAEA,SAAgB,qBAAqB,OAAuB;CAC1D,OAAO,aAAa,MAAM,SAAS,EAAE,WAAW,GAAG,KAAK;AAC1D;AAEA,SAAgB,sBAAsB,OAAuB;CAC3D,MAAM,QAAQ,MAAM,SAAS;CAI7B,CAHiB,MAAM,SACnB,2BAA8C,IAAI,MAAM,OAAO,iBAAiB,IAChF,OACM,MAAM;AAClB;AAEA,SAAgB,eAAe,IAAY,OAAuB;CAChE,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,kBAAkB,IAAI,EAAE;CAC9B,aAAa;EACX,MAAM,kBAAkB,OAAO,EAAE;CACnC;AACF;AAEA,SAAgB,SAAS,OAAe,OAAuB;CAC7D,kCAAkC,EAAE,MAAM,IAAI,KAAK;CACnD,QAAQ,QAAQ,EAAE,WAAW;EAC3B,aAAa,GAAG,KAAK;EACrB,4BACG,WAAW,EACV,OAAQ,MAAM,MAAM,KAAK,EAAE,SAAS,KAAK,MAAM,kBAAkB,SAAS,KAAM,MAClF,IACA,KACF;CACF,CAAC;AACH;AAEA,SAAgB,oBACd,EAAE,cACF,OACA;CACA,MAAM,aAAa,WAAW;EAC5B,GAAG;EACH,UAAU;EACV,OAAO,aAAa,KAAK,MAAM;EAC/B,OAAO,aAAa,QAAQ,MAAM;CACpC,EAAE;AACJ;AAEA,MAAa,mBAAmB;CAC9B,MAAM;CACN,OAAO;CACP,QAAQ;CACR,aAAa;CACb;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,kBAAkB;CAChC,MAAM,QAAQ,qBAAqB;CAOnC,OAAO,CAAC,OAAO;EALb,YAAY,oBAAoB,KAAK;EACrC,aAAa,qBAAqB,KAAK;EACvC,cAAc,sBAAsB,KAAK;CAGtB,CAAC;AACxB;AAEA,MAAa,CAAC,gBAAgB,aAAa,gBAAgB;AAC3D,MAAa,EAAE,MAAM,eAAe,OAAO,gBAAgB,QAAQ,oBAAoB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mantine/spotlight",
3
- "version": "9.1.1",
3
+ "version": "9.2.1",
4
4
  "description": "Command center components for react and Mantine",
5
5
  "homepage": "https://mantine.dev",
6
6
  "license": "MIT",
@@ -41,19 +41,19 @@
41
41
  "directory": "packages/@mantine/spotlight"
42
42
  },
43
43
  "peerDependencies": {
44
- "@mantine/core": "9.1.1",
45
- "@mantine/hooks": "9.1.1",
44
+ "@mantine/core": "9.2.1",
45
+ "@mantine/hooks": "9.2.1",
46
46
  "react": "^19.2.0",
47
47
  "react-dom": "^19.2.0"
48
48
  },
49
49
  "dependencies": {
50
- "@mantine/store": "9.1.1"
50
+ "@mantine/store": "9.2.1"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@mantine-tests/core": "workspace:*",
54
54
  "@mantine/core": "workspace:*",
55
55
  "@mantine/hooks": "workspace:*",
56
- "react": "19.2.5",
57
- "react-dom": "19.2.5"
56
+ "react": "19.2.6",
57
+ "react-dom": "19.2.6"
58
58
  }
59
59
  }