buildgrid-ui 1.14.7 → 1.14.9
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.
- package/dist/assets/en-US-BUOWLxFp.js.map +1 -1
- package/dist/assets/jsx-runtime-D_zvdyIk.js.map +1 -1
- package/dist/assets/magic-string.es-CTSuTltI.js +11 -0
- package/dist/assets/magic-string.es-CTSuTltI.js.map +1 -0
- package/dist/assets/vi.bdSIJ99Y-C6e_ZQS2.js +482 -0
- package/dist/assets/vi.bdSIJ99Y-C6e_ZQS2.js.map +1 -0
- package/dist/blocks/bento-grid/bento-grid.js.map +1 -1
- package/dist/blocks/bento-grid/bento-grid.stories.js.map +1 -1
- package/dist/blocks/data-table/components/active-filters.d.ts +1 -1
- package/dist/blocks/data-table/components/active-filters.js.map +1 -1
- package/dist/blocks/data-table/components/column-visibility-dropdown.d.ts +1 -1
- package/dist/blocks/data-table/components/column-visibility-dropdown.js.map +1 -1
- package/dist/blocks/data-table/components/filter-dropdown.d.ts +1 -1
- package/dist/blocks/data-table/components/filter-dropdown.js.map +1 -1
- package/dist/blocks/data-table/components/search-input.js.map +1 -1
- package/dist/blocks/data-table/components/selection-info.js.map +1 -1
- package/dist/blocks/data-table/components/table-header.d.ts +1 -1
- package/dist/blocks/data-table/components/table-header.js.map +1 -1
- package/dist/blocks/data-table/components/table-row.d.ts +1 -1
- package/dist/blocks/data-table/components/table-row.js.map +1 -1
- package/dist/blocks/data-table/components/table-skeleton.js.map +1 -1
- package/dist/blocks/data-table/data-table.d.ts +2 -2
- package/dist/blocks/data-table/data-table.stories.js.map +1 -1
- package/dist/blocks/data-table/types/data-table.d.ts +1 -1
- package/dist/blocks/data-table/utils/export.d.ts +1 -1
- package/dist/blocks/data-table/utils/export.js.map +1 -1
- package/dist/blocks/empty-message/empty-message.js.map +1 -1
- package/dist/blocks/empty-message/empty-message.stories.js.map +1 -1
- package/dist/blocks/help-carousel/help-carousel.js.map +1 -1
- package/dist/blocks/help-carousel/help-carousel.stories.js.map +1 -1
- package/dist/blocks/html-text-editor/html-text-area.d.ts +1 -0
- package/dist/blocks/html-text-editor/html-text-area.js.map +1 -1
- package/dist/blocks/html-text-editor/html-text-area.stories.js.map +1 -1
- package/dist/blocks/html-text-editor/html-text-editor.d.ts +2 -1
- package/dist/blocks/html-text-editor/html-text-editor.js.map +1 -1
- package/dist/blocks/html-text-editor/html-text-editor.stories.js.map +1 -1
- package/dist/blocks/html-text-editor/options-bar.js.map +1 -1
- package/dist/blocks/lazy-image-gallery/lazy-image-gallery.d.ts +1 -1
- package/dist/blocks/lazy-image-gallery/lazy-image-gallery.js.map +1 -1
- package/dist/blocks/lazy-image-gallery/lazy-image-gallery.stories.js.map +1 -1
- package/dist/blocks/month-navigator/month-navigator.js.map +1 -1
- package/dist/blocks/month-navigator/month-navigator.stories.js.map +1 -1
- package/dist/blocks/navigable-list/navigable-list.d.ts +1 -1
- package/dist/blocks/paginated-items/paginated-items.js.map +1 -1
- package/dist/blocks/paginated-items/paginated-items.stories.js.map +1 -1
- package/dist/blocks/pagination-controls/pagination-controls.js.map +1 -1
- package/dist/blocks/pagination-controls/pagination-controls.stories.js.map +1 -1
- package/dist/blocks/sidebar/sidebar.d.ts +1 -1
- package/dist/blocks/sidebar/sidebar.js.map +1 -1
- package/dist/blocks/sidebar/sidebar.stories.js.map +1 -1
- package/dist/components/accordion/accordion.js.map +1 -1
- package/dist/components/accordion/accordion.stories.js +1 -1
- package/dist/components/accordion/accordion.stories.js.map +1 -1
- package/dist/components/adaptive-input/adaptive-input.d.ts +1 -1
- package/dist/components/adaptive-input/adaptive-input.js.map +1 -1
- package/dist/components/adaptive-input/adaptive-input.stories.js.map +1 -1
- package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/components/alert-dialog/alert-dialog.stories.js.map +1 -1
- package/dist/components/autocomplete/autocomplete.d.ts +1 -1
- package/dist/components/autocomplete/autocomplete.js.map +1 -1
- package/dist/components/autocomplete/autocomplete.stories.js.map +1 -1
- package/dist/components/autocomplete/autocomplete.test.js +1 -1
- package/dist/components/autocomplete/autocomplete.test.js.map +1 -1
- package/dist/components/avatar/avatar.js.map +1 -1
- package/dist/components/avatar/avatar.stories.js.map +1 -1
- package/dist/components/badge/badge.d.ts +2 -2
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/badge/badge.stories.js.map +1 -1
- package/dist/components/button/button.d.ts +1 -1
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button/button.stories.js.map +1 -1
- package/dist/components/button/button.test.js +1 -1
- package/dist/components/button/button.test.js.map +1 -1
- package/dist/components/button/button.types.d.ts +3 -3
- package/dist/components/button/button.types.js.map +1 -1
- package/dist/components/calendar/calendar.d.ts +1 -1
- package/dist/components/calendar/calendar.js.map +1 -1
- package/dist/components/calendar/calendar.stories.js.map +1 -1
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/card/card.stories.js.map +1 -1
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/checkbox/checkbox.stories.js.map +1 -1
- package/dist/components/command/command.d.ts +1 -1
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/command/command.stories.js.map +1 -1
- package/dist/components/currency-input/currency-input.d.ts +1 -1
- package/dist/components/currency-input/currency-input.js.map +1 -1
- package/dist/components/currency-input/currency-input.stories.js.map +1 -1
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/dialog/dialog.stories.js.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.stories.js.map +1 -1
- package/dist/components/input/input.d.ts +1 -1
- package/dist/components/input/input.js.map +1 -1
- package/dist/components/input/input.stories.js.map +1 -1
- package/dist/components/label/label.d.ts +2 -2
- package/dist/components/label/label.js.map +1 -1
- package/dist/components/label/label.stories.js.map +1 -1
- package/dist/components/multi-select/multi-select.d.ts +2 -2
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-select/multi-select.stories.js.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.d.ts +1 -1
- package/dist/components/navigation-menu/navigation-menu.js.map +1 -1
- package/dist/components/navigation-menu/navigation-menu.stories.js.map +1 -1
- package/dist/components/pagination/pagination.d.ts +1 -1
- package/dist/components/pagination/pagination.js.map +1 -1
- package/dist/components/pagination/pagination.stories.js.map +1 -1
- package/dist/components/password-input/password-input.js.map +1 -1
- package/dist/components/password-input/password-input.stories.js.map +1 -1
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/popover/popover.stories.js.map +1 -1
- package/dist/components/progress/progress.js.map +1 -1
- package/dist/components/progress/progress.stories.js.map +1 -1
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/radio-group/radio-group.stories.js.map +1 -1
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/select/select.stories.js.map +1 -1
- package/dist/components/separator/separator.js.map +1 -1
- package/dist/components/separator/separator.stories.js.map +1 -1
- package/dist/components/skeleton/skeleton.js.map +1 -1
- package/dist/components/skeleton/skeleton.stories.js.map +1 -1
- package/dist/components/spinner/spinner.d.ts +1 -1
- package/dist/components/spinner/spinner.js.map +1 -1
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/switch/switch.stories.js.map +1 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/table.stories.js.map +1 -1
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tabs/tabs.stories.js.map +1 -1
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/textarea/textarea.stories.js.map +1 -1
- package/dist/components/toaster/toast.d.ts +8 -8
- package/dist/components/toaster/toast.js.map +1 -1
- package/dist/components/toaster/toaster.js.map +1 -1
- package/dist/components/toaster/toaster.stories.js.map +1 -1
- package/dist/components/toggle/toggle.d.ts +3 -3
- package/dist/components/toggle/toggle.js.map +1 -1
- package/dist/components/toggle/toggle.stories.js.map +1 -1
- package/dist/components/toggle-group/toggle-group.d.ts +3 -3
- package/dist/components/toggle-group/toggle-group.js.map +1 -1
- package/dist/components/toggle-group/toggle-group.stories.js.map +1 -1
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/components/tooltip/tooltip.stories.js.map +1 -1
- package/dist/lib/hooks/use-debounce.js.map +1 -1
- package/dist/lib/hooks/use-dialog.js.map +1 -1
- package/dist/lib/hooks/use-dialog.stories.js.map +1 -1
- package/dist/lib/hooks/use-file-utilities.d.ts +1 -1
- package/dist/lib/utils/cn.d.ts +1 -1
- package/dist/lib/utils/cn.js.map +1 -1
- package/dist/lib/utils/merge-objects.js.map +1 -1
- package/package.json +17 -31
- package/dist/assets/magic-string.es-CoDNcMYi.js +0 -11
- package/dist/assets/magic-string.es-CoDNcMYi.js.map +0 -1
- package/dist/assets/vi.B-PuvDzu-CCLEoytE.js +0 -500
- package/dist/assets/vi.B-PuvDzu-CCLEoytE.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-text-editor.stories.js","sources":["../../../src/blocks/html-text-editor/html-text-editor.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React, { useState } from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { HtmlTextEditor } from './html-text-editor'\n\nconst meta: Meta<typeof HtmlTextEditor> = {\n\tcomponent: HtmlTextEditor,\n\tparameters: {\n\t\tstatus: {\n\t\t\ttype: 'beta', // 'beta' | 'stable' | 'deprecated' | 'releaseCandidate'\n\t\t},\n\t},\n}\n\nexport default meta\ntype Story = StoryObj<typeof HtmlTextEditor>\n\nconst Template = () => {\n\tconst [value, setValue] = useState('This is the <b>initial value</b>')\n\treturn (\n\t\t<div className=\"h-96 max-w-2xl\">\n\t\t\t<HtmlTextEditor initialValue={value} onChange={(value) => setValue(value)} />\n\t\t\tValue: {value}\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","value","setValue","useState","jsxs","jsx","HtmlTextEditor"],"mappings":"slFAiBA,MAAMA,EAAW,IAAM,CACtB,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAS,kCAAkC,
|
|
1
|
+
{"version":3,"file":"html-text-editor.stories.js","sources":["../../../src/blocks/html-text-editor/html-text-editor.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React, { useState } from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { HtmlTextEditor } from './html-text-editor'\n\nconst meta: Meta<typeof HtmlTextEditor> = {\n\tcomponent: HtmlTextEditor,\n\tparameters: {\n\t\tstatus: {\n\t\t\ttype: 'beta', // 'beta' | 'stable' | 'deprecated' | 'releaseCandidate'\n\t\t},\n\t},\n}\n\nexport default meta\ntype Story = StoryObj<typeof HtmlTextEditor>\n\nconst Template = () => {\n\tconst [value, setValue] = useState('This is the <b>initial value</b>')\n\treturn (\n\t\t<div className=\"h-96 max-w-2xl\">\n\t\t\t<HtmlTextEditor initialValue={value} onChange={(value) => setValue(value)} />\n\t\t\tValue: {value}\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","value","setValue","useState","jsxs","jsx","HtmlTextEditor"],"mappings":"slFAiBA,MAAMA,EAAW,IAAM,CACtB,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAS,kCAAkC,EACrE,OACCC,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACd,SAAA,CAAAC,MAACC,EAAA,CAAe,aAAcL,EAAO,SAAWA,GAAUC,EAASD,CAAK,EAAG,EAAE,UACrEA,CAAA,EACT,CAEF,EAGSD,EAAS,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options-bar.js","sources":["../../../src/blocks/html-text-editor/options-bar.tsx"],"sourcesContent":["import {\n\tButton,\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from '@/components'\nimport {\n\tBold,\n\tImageIcon,\n\tItalic,\n\tLinkIcon,\n\tList,\n\tListOrdered,\n\tQuote,\n\tUnderline,\n} from 'lucide-react'\n\ntype OptionsBarProps = {\n\texecCommand: (command: string, value?: string) => void\n}\n\nexport const OptionsBar = (props: OptionsBarProps) => {\n\tconst { execCommand } = props\n\n\tconst insertImage = () => {\n\t\tconst input = document.createElement('input')\n\t\tinput.type = 'file'\n\t\tinput.accept = 'image/*'\n\t\tinput.onchange = async (event) => {\n\t\t\tconst file = (event.target as HTMLInputElement).files?.[0]\n\t\t\tif (file) {\n\t\t\t\tconst reader = new FileReader()\n\t\t\t\treader.onload = () => {\n\t\t\t\t\texecCommand('insertImage', reader.result as string)\n\t\t\t\t}\n\t\t\t\treader.readAsDataURL(file)\n\t\t\t}\n\t\t}\n\t\tinput.click()\n\t}\n\n\tconst insertLink = () => {\n\t\tconst url = prompt('Enter the URL:')\n\t\tif (url) {\n\t\t\texecCommand('createLink', url)\n\t\t}\n\t}\n\n\tconst changeFontSize = (size: string) => {\n\t\texecCommand('fontSize', size)\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-wrap gap-2 border-b pb-2 mb-2\">\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('bold')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Bold size={16} />\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('italic')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Italic size={16} />\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('underline')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Underline size={16} />\n\t\t\t</Button>\n\t\t\t<Select onValueChange={(value) => changeFontSize(value)} defaultValue=\"3\">\n\t\t\t\t<SelectTrigger className=\"w-[100px]\">\n\t\t\t\t\t<SelectValue placeholder=\"Size\" />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t<SelectItem value=\"1\">\n\t\t\t\t\t\t<div>Small</div>\n\t\t\t\t\t</SelectItem>\n\t\t\t\t\t<SelectItem value=\"3\">\n\t\t\t\t\t\t<div>Medium</div>\n\t\t\t\t\t</SelectItem>\n\t\t\t\t\t<SelectItem value=\"5\">\n\t\t\t\t\t\t<div>Large</div>\n\t\t\t\t\t</SelectItem>\n\t\t\t\t\t<SelectItem value=\"7\">\n\t\t\t\t\t\t<div>Extra Large</div>\n\t\t\t\t\t</SelectItem>\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('insertUnorderedList')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<List size={16} />\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('insertOrderedList')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<ListOrdered size={16} />\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('formatBlock', 'blockquote')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Quote size={16} />\n\t\t\t</Button>\n\t\t\t<Button variant=\"outline\" size=\"icon\" onClick={insertImage} type=\"button\">\n\t\t\t\t<ImageIcon size={16} />\n\t\t\t</Button>\n\t\t\t<Button variant=\"outline\" size=\"icon\" onClick={insertLink} type=\"button\">\n\t\t\t\t<LinkIcon size={16} />\n\t\t\t</Button>\n\t\t\t{/* <Button\n\t\t\t\tvariant={isHtmlMode ? 'default' : 'outline'}\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={toggleHtmlMode}\n\t\t\t\tclassName=\"ml-auto\"\n\t\t\t>\n\t\t\t\t<Code size={16} />\n\t\t\t</Button> */}\n\t\t</div>\n\t)\n}\n"],"names":["OptionsBar","props","execCommand","insertImage","input","event","file","_a","reader","insertLink","url","changeFontSize","size","jsxs","jsx","Button","Bold","Italic","Underline","Select","value","SelectTrigger","SelectValue","SelectContent","SelectItem","List","ListOrdered","Quote","ImageIcon","LinkIcon"],"mappings":"
|
|
1
|
+
{"version":3,"file":"options-bar.js","sources":["../../../src/blocks/html-text-editor/options-bar.tsx"],"sourcesContent":["import {\n\tButton,\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from '@/components'\nimport {\n\tBold,\n\tImageIcon,\n\tItalic,\n\tLinkIcon,\n\tList,\n\tListOrdered,\n\tQuote,\n\tUnderline,\n} from 'lucide-react'\n\ntype OptionsBarProps = {\n\texecCommand: (command: string, value?: string) => void\n}\n\nexport const OptionsBar = (props: OptionsBarProps) => {\n\tconst { execCommand } = props\n\n\tconst insertImage = () => {\n\t\tconst input = document.createElement('input')\n\t\tinput.type = 'file'\n\t\tinput.accept = 'image/*'\n\t\tinput.onchange = async (event) => {\n\t\t\tconst file = (event.target as HTMLInputElement).files?.[0]\n\t\t\tif (file) {\n\t\t\t\tconst reader = new FileReader()\n\t\t\t\treader.onload = () => {\n\t\t\t\t\texecCommand('insertImage', reader.result as string)\n\t\t\t\t}\n\t\t\t\treader.readAsDataURL(file)\n\t\t\t}\n\t\t}\n\t\tinput.click()\n\t}\n\n\tconst insertLink = () => {\n\t\tconst url = prompt('Enter the URL:')\n\t\tif (url) {\n\t\t\texecCommand('createLink', url)\n\t\t}\n\t}\n\n\tconst changeFontSize = (size: string) => {\n\t\texecCommand('fontSize', size)\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-wrap gap-2 border-b pb-2 mb-2\">\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('bold')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Bold size={16} />\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('italic')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Italic size={16} />\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('underline')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Underline size={16} />\n\t\t\t</Button>\n\t\t\t<Select onValueChange={(value) => changeFontSize(value)} defaultValue=\"3\">\n\t\t\t\t<SelectTrigger className=\"w-[100px]\">\n\t\t\t\t\t<SelectValue placeholder=\"Size\" />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t<SelectItem value=\"1\">\n\t\t\t\t\t\t<div>Small</div>\n\t\t\t\t\t</SelectItem>\n\t\t\t\t\t<SelectItem value=\"3\">\n\t\t\t\t\t\t<div>Medium</div>\n\t\t\t\t\t</SelectItem>\n\t\t\t\t\t<SelectItem value=\"5\">\n\t\t\t\t\t\t<div>Large</div>\n\t\t\t\t\t</SelectItem>\n\t\t\t\t\t<SelectItem value=\"7\">\n\t\t\t\t\t\t<div>Extra Large</div>\n\t\t\t\t\t</SelectItem>\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('insertUnorderedList')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<List size={16} />\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('insertOrderedList')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<ListOrdered size={16} />\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => execCommand('formatBlock', 'blockquote')}\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t<Quote size={16} />\n\t\t\t</Button>\n\t\t\t<Button variant=\"outline\" size=\"icon\" onClick={insertImage} type=\"button\">\n\t\t\t\t<ImageIcon size={16} />\n\t\t\t</Button>\n\t\t\t<Button variant=\"outline\" size=\"icon\" onClick={insertLink} type=\"button\">\n\t\t\t\t<LinkIcon size={16} />\n\t\t\t</Button>\n\t\t\t{/* <Button\n\t\t\t\tvariant={isHtmlMode ? 'default' : 'outline'}\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={toggleHtmlMode}\n\t\t\t\tclassName=\"ml-auto\"\n\t\t\t>\n\t\t\t\t<Code size={16} />\n\t\t\t</Button> */}\n\t\t</div>\n\t)\n}\n"],"names":["OptionsBar","props","execCommand","insertImage","input","event","file","_a","reader","insertLink","url","changeFontSize","size","jsxs","jsx","Button","Bold","Italic","Underline","Select","value","SelectTrigger","SelectValue","SelectContent","SelectItem","List","ListOrdered","Quote","ImageIcon","LinkIcon"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-image-gallery.js","sources":["../../../src/blocks/lazy-image-gallery/lazy-image-gallery.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport React, { useEffect, useRef, useState } from 'react'\n\ninterface LazyImageGalleryProps {\n\timages: string[]\n\tobserverOptions?: IntersectionObserverInit\n\tclassNames?: {\n\t\timageGallery?: string\n\t\timageCell?: string\n\t\timage?: string\n\t}\n}\n\nexport const LazyImageGallery: React.FC<LazyImageGalleryProps> = (props) => {\n\tconst { observerOptions, images, classNames } = props\n\tconst [visibleImages, setVisibleImages] = useState<number[]>([])\n\tconst observer = useRef<IntersectionObserver | null>(null)\n\n\tuseEffect(() => {\n\t\tconst observerConfig = {\n\t\t\troot: document.querySelector('.image-gallery'),\n\t\t\trootMargin: '0px',\n\t\t\tthreshold: 1,\n\t\t\t...observerOptions,\n\t\t}\n\n\t\tobserver.current = new IntersectionObserver((entries) => {\n\t\t\tentries.forEach((entry) => {\n\t\t\t\tif (entry.isIntersecting && entry.target instanceof HTMLDivElement) {\n\t\t\t\t\tconst index = Number(entry.target.dataset.index)\n\t\t\t\t\tsetVisibleImages((prev) => [...new Set([...prev, index])])\n\t\t\t\t}\n\t\t\t})\n\t\t}, observerConfig)\n\n\t\treturn () => observer.current?.disconnect()\n\t}, [])\n\n\tuseEffect(() => {\n\t\tconst imageDivs = document.querySelectorAll('.image-cell')\n\t\timageDivs.forEach((div) => observer.current?.observe(div as Element))\n\t}, [images])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'image-gallery overflow-auto grid grid-cols-[repeat(auto-fit,minmax(300px,1fr))]',\n\t\t\t\t'gap-2 justify-center h-full',\n\t\t\t\tclassNames?.imageGallery,\n\t\t\t)}\n\t\t>\n\t\t\t{images.map((src, index) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={index}\n\t\t\t\t\tdata-index={index}\n\t\t\t\t\tclassName={cn('image-cell w-full h-52', classNames?.imageCell)}\n\t\t\t\t>\n\t\t\t\t\t{visibleImages.includes(index) && (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\talt={`Gallery Image ${index + 1}`}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'animate-fade-up animate-duration-[400ms] animate-ease-linear w-full h-full object-cover',\n\t\t\t\t\t\t\t\tclassNames?.image,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t)\n}\n"],"names":["LazyImageGallery","props","observerOptions","images","classNames","visibleImages","setVisibleImages","useState","observer","useRef","useEffect","observerConfig","entries","entry","index","prev","_a","div","jsx","cn","src"],"mappings":"
|
|
1
|
+
{"version":3,"file":"lazy-image-gallery.js","sources":["../../../src/blocks/lazy-image-gallery/lazy-image-gallery.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport React, { useEffect, useRef, useState } from 'react'\n\ninterface LazyImageGalleryProps {\n\timages: string[]\n\tobserverOptions?: IntersectionObserverInit\n\tclassNames?: {\n\t\timageGallery?: string\n\t\timageCell?: string\n\t\timage?: string\n\t}\n}\n\nexport const LazyImageGallery: React.FC<LazyImageGalleryProps> = (props) => {\n\tconst { observerOptions, images, classNames } = props\n\tconst [visibleImages, setVisibleImages] = useState<number[]>([])\n\tconst observer = useRef<IntersectionObserver | null>(null)\n\n\tuseEffect(() => {\n\t\tconst observerConfig = {\n\t\t\troot: document.querySelector('.image-gallery'),\n\t\t\trootMargin: '0px',\n\t\t\tthreshold: 1,\n\t\t\t...observerOptions,\n\t\t}\n\n\t\tobserver.current = new IntersectionObserver((entries) => {\n\t\t\tentries.forEach((entry) => {\n\t\t\t\tif (entry.isIntersecting && entry.target instanceof HTMLDivElement) {\n\t\t\t\t\tconst index = Number(entry.target.dataset.index)\n\t\t\t\t\tsetVisibleImages((prev) => [...new Set([...prev, index])])\n\t\t\t\t}\n\t\t\t})\n\t\t}, observerConfig)\n\n\t\treturn () => observer.current?.disconnect()\n\t}, [])\n\n\tuseEffect(() => {\n\t\tconst imageDivs = document.querySelectorAll('.image-cell')\n\t\timageDivs.forEach((div) => observer.current?.observe(div as Element))\n\t}, [images])\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'image-gallery overflow-auto grid grid-cols-[repeat(auto-fit,minmax(300px,1fr))]',\n\t\t\t\t'gap-2 justify-center h-full',\n\t\t\t\tclassNames?.imageGallery,\n\t\t\t)}\n\t\t>\n\t\t\t{images.map((src, index) => (\n\t\t\t\t<div\n\t\t\t\t\tkey={index}\n\t\t\t\t\tdata-index={index}\n\t\t\t\t\tclassName={cn('image-cell w-full h-52', classNames?.imageCell)}\n\t\t\t\t>\n\t\t\t\t\t{visibleImages.includes(index) && (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\talt={`Gallery Image ${index + 1}`}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'animate-fade-up animate-duration-[400ms] animate-ease-linear w-full h-full object-cover',\n\t\t\t\t\t\t\t\tclassNames?.image,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t))}\n\t\t</div>\n\t)\n}\n"],"names":["LazyImageGallery","props","observerOptions","images","classNames","visibleImages","setVisibleImages","useState","observer","useRef","useEffect","observerConfig","entries","entry","index","prev","_a","div","jsx","cn","src"],"mappings":"uNAaO,MAAMA,EAAqDC,GAAU,CAC3E,KAAM,CAAE,gBAAAC,EAAiB,OAAAC,EAAQ,WAAAC,CAAA,EAAeH,EAC1C,CAACI,EAAeC,CAAgB,EAAIC,EAAmB,CAAA,CAAE,EACzDC,EAAWC,EAAoC,IAAI,EAEzD,OAAAC,EAAU,IAAM,CACf,MAAMC,EAAiB,CACtB,KAAM,SAAS,cAAc,gBAAgB,EAC7C,WAAY,MACZ,UAAW,EACX,GAAGT,CAAA,EAGJ,OAAAM,EAAS,QAAU,IAAI,qBAAsBI,GAAY,CACxDA,EAAQ,QAASC,GAAU,CAC1B,GAAIA,EAAM,gBAAkBA,EAAM,kBAAkB,eAAgB,CACnE,MAAMC,EAAQ,OAAOD,EAAM,OAAO,QAAQ,KAAK,EAC/CP,EAAkBS,GAAS,CAAC,GAAG,IAAI,IAAI,CAAC,GAAGA,EAAMD,CAAK,CAAC,CAAC,CAAC,CAAA,CAC1D,CACA,CAAA,EACCH,CAAc,EAEV,IAAA,OAAM,OAAAK,EAAAR,EAAS,UAAT,YAAAQ,EAAkB,aAAW,EACxC,EAAE,EAELN,EAAU,IAAM,CACG,SAAS,iBAAiB,aAAa,EAC/C,QAASO,GAAA,OAAQ,OAAAD,EAAAR,EAAS,UAAT,YAAAQ,EAAkB,QAAQC,GAAe,CAAA,EAClE,CAACd,CAAM,CAAC,EAGVe,EAAAA,IAAC,MAAA,CACA,UAAWC,EACV,kFACA,8BACAf,GAAA,YAAAA,EAAY,YAAA,EAGZ,SAAAD,EAAO,IAAI,CAACiB,EAAKN,IACjBI,EAAAA,IAAC,MAAA,CAEA,aAAYJ,EACZ,UAAWK,EAAG,yBAA0Bf,GAAA,YAAAA,EAAY,SAAS,EAE5D,SAAAC,EAAc,SAASS,CAAK,GAC5BI,EAAAA,IAAC,MAAA,CACA,IAAAE,EACA,IAAK,iBAAiBN,EAAQ,CAAC,GAC/B,UAAWK,EACV,0FACAf,GAAA,YAAAA,EAAY,KAAA,CACb,CAAA,CACD,EAZIU,CAAA,CAeN,CAAA,CAAA,CAGJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-image-gallery.stories.js","sources":["../../../src/blocks/lazy-image-gallery/lazy-image-gallery.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { LazyImageGallery } from './lazy-image-gallery'\n\nconst meta: Meta<typeof LazyImageGallery> = {\n\tcomponent: LazyImageGallery,\n}\n\nexport default meta\ntype Story = StoryObj<typeof LazyImageGallery>\n\nconst imageUrls = [\n\t'https://placehold.co/600x400',\n\t'https://placehold.co/700x500',\n\t'https://placehold.co/800x600',\n\t'https://placehold.co/900x700',\n\t'https://placehold.co/1000x800',\n\t'https://placehold.co/1100x900',\n\t'https://placehold.co/1200x1000',\n\t'https://placehold.co/1300x1100',\n\t'https://placehold.co/1400x1200',\n\t'https://placehold.co/1500x1300',\n\t'https://placehold.co/1600x1400',\n\t'https://placehold.co/1800x1500',\n\t'https://placehold.co/1900x1600',\n\t'https://placehold.co/2000x1700',\n\t'https://placehold.co/2100x1800',\n\t'https://placehold.co/2200x1900',\n\t// Add more URLs here\n]\n\nconst Template = () => {\n\treturn (\n\t\t<div className=\"h-96 border rounded p-2\">\n\t\t\t<LazyImageGallery images={imageUrls} />\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["imageUrls","Template","jsx","LazyImageGallery"],"mappings":"yMAYA,MAAMA,EAAY,CACjB,+BACA,+BACA,+BACA,+BACA,gCACA,gCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,gCAED,EAEMC,EAAW,IAEfC,MAAC,OAAI,UAAU,0BACd,eAACC,
|
|
1
|
+
{"version":3,"file":"lazy-image-gallery.stories.js","sources":["../../../src/blocks/lazy-image-gallery/lazy-image-gallery.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { LazyImageGallery } from './lazy-image-gallery'\n\nconst meta: Meta<typeof LazyImageGallery> = {\n\tcomponent: LazyImageGallery,\n}\n\nexport default meta\ntype Story = StoryObj<typeof LazyImageGallery>\n\nconst imageUrls = [\n\t'https://placehold.co/600x400',\n\t'https://placehold.co/700x500',\n\t'https://placehold.co/800x600',\n\t'https://placehold.co/900x700',\n\t'https://placehold.co/1000x800',\n\t'https://placehold.co/1100x900',\n\t'https://placehold.co/1200x1000',\n\t'https://placehold.co/1300x1100',\n\t'https://placehold.co/1400x1200',\n\t'https://placehold.co/1500x1300',\n\t'https://placehold.co/1600x1400',\n\t'https://placehold.co/1800x1500',\n\t'https://placehold.co/1900x1600',\n\t'https://placehold.co/2000x1700',\n\t'https://placehold.co/2100x1800',\n\t'https://placehold.co/2200x1900',\n\t// Add more URLs here\n]\n\nconst Template = () => {\n\treturn (\n\t\t<div className=\"h-96 border rounded p-2\">\n\t\t\t<LazyImageGallery images={imageUrls} />\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["imageUrls","Template","jsx","LazyImageGallery"],"mappings":"yMAYA,MAAMA,EAAY,CACjB,+BACA,+BACA,+BACA,+BACA,gCACA,gCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,iCACA,gCAED,EAEMC,EAAW,IAEfC,MAAC,OAAI,UAAU,0BACd,eAACC,EAAA,CAAiB,OAAQH,EAAW,CAAA,CACtC,EAKOC,EAAS,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"month-navigator.js","sources":["../../../src/blocks/month-navigator/month-navigator.tsx"],"sourcesContent":["import { Button } from '@/components'\nimport { enUS, Locale } from 'date-fns/locale'\nimport { ArrowLeft, ArrowRight } from 'lucide-react'\n\nexport type Month = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11\nexport type Mode = 'month' | 'year'\n\nexport interface MonthNavigatorProps {\n\tlocale?: Locale\n\tcurrentMonth: Month\n\tcurrentYear: number\n\tonChangeMonthYear: (month: Month, year: number) => void\n\tmode?: Mode\n}\n\nexport const MonthNavigator = (props: MonthNavigatorProps) => {\n\tconst {\n\t\tcurrentMonth,\n\t\tcurrentYear,\n\t\tonChangeMonthYear,\n\t\tlocale = enUS,\n\t\tmode = 'month',\n\t} = props\n\n\tconst navigate = (direction: 'prev' | 'next') => {\n\t\tlet newMonth = currentMonth\n\t\tlet newYear = currentYear\n\n\t\tif (mode === 'month') {\n\t\t\tif (direction === 'prev') {\n\t\t\t\tif (newMonth === 0) {\n\t\t\t\t\tnewMonth = 11\n\t\t\t\t\tnewYear--\n\t\t\t\t} else {\n\t\t\t\t\tnewMonth--\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (newMonth === 11) {\n\t\t\t\t\tnewMonth = 0\n\t\t\t\t\tnewYear++\n\t\t\t\t} else {\n\t\t\t\t\tnewMonth++\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tnewYear = direction === 'prev' ? newYear - 1 : newYear + 1\n\t\t}\n\n\t\tonChangeMonthYear(newMonth as Month, newYear)\n\t}\n\n\treturn (\n\t\t<div className=\"flex items-center justify-between\">\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => navigate('prev')}\n\t\t\t\taria-label={`Previous ${mode}`}\n\t\t\t>\n\t\t\t\t<ArrowLeft className=\"!h-8 !w-8\" />\n\t\t\t</Button>\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<h2 className=\"text-2xl font-bold capitalize\">\n\t\t\t\t\t{mode === 'month'\n\t\t\t\t\t\t? locale.localize.month(currentMonth, { width: 'wide' })\n\t\t\t\t\t\t: currentYear}\n\t\t\t\t</h2>\n\t\t\t\t{mode === 'month' && (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">{currentYear}</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => navigate('next')}\n\t\t\t\taria-label={`Next ${mode}`}\n\t\t\t>\n\t\t\t\t<ArrowRight className=\"!h-8 !w-8\" />\n\t\t\t</Button>\n\t\t</div>\n\t)\n}\n"],"names":["MonthNavigator","props","currentMonth","currentYear","onChangeMonthYear","locale","enUS","mode","navigate","direction","newMonth","newYear","jsxs","jsx","Button","ArrowLeft","ArrowRight"],"mappings":"
|
|
1
|
+
{"version":3,"file":"month-navigator.js","sources":["../../../src/blocks/month-navigator/month-navigator.tsx"],"sourcesContent":["import { Button } from '@/components'\nimport { enUS, Locale } from 'date-fns/locale'\nimport { ArrowLeft, ArrowRight } from 'lucide-react'\n\nexport type Month = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11\nexport type Mode = 'month' | 'year'\n\nexport interface MonthNavigatorProps {\n\tlocale?: Locale\n\tcurrentMonth: Month\n\tcurrentYear: number\n\tonChangeMonthYear: (month: Month, year: number) => void\n\tmode?: Mode\n}\n\nexport const MonthNavigator = (props: MonthNavigatorProps) => {\n\tconst {\n\t\tcurrentMonth,\n\t\tcurrentYear,\n\t\tonChangeMonthYear,\n\t\tlocale = enUS,\n\t\tmode = 'month',\n\t} = props\n\n\tconst navigate = (direction: 'prev' | 'next') => {\n\t\tlet newMonth = currentMonth\n\t\tlet newYear = currentYear\n\n\t\tif (mode === 'month') {\n\t\t\tif (direction === 'prev') {\n\t\t\t\tif (newMonth === 0) {\n\t\t\t\t\tnewMonth = 11\n\t\t\t\t\tnewYear--\n\t\t\t\t} else {\n\t\t\t\t\tnewMonth--\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (newMonth === 11) {\n\t\t\t\t\tnewMonth = 0\n\t\t\t\t\tnewYear++\n\t\t\t\t} else {\n\t\t\t\t\tnewMonth++\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tnewYear = direction === 'prev' ? newYear - 1 : newYear + 1\n\t\t}\n\n\t\tonChangeMonthYear(newMonth as Month, newYear)\n\t}\n\n\treturn (\n\t\t<div className=\"flex items-center justify-between\">\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => navigate('prev')}\n\t\t\t\taria-label={`Previous ${mode}`}\n\t\t\t>\n\t\t\t\t<ArrowLeft className=\"!h-8 !w-8\" />\n\t\t\t</Button>\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<h2 className=\"text-2xl font-bold capitalize\">\n\t\t\t\t\t{mode === 'month'\n\t\t\t\t\t\t? locale.localize.month(currentMonth, { width: 'wide' })\n\t\t\t\t\t\t: currentYear}\n\t\t\t\t</h2>\n\t\t\t\t{mode === 'month' && (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">{currentYear}</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize=\"icon\"\n\t\t\t\tonClick={() => navigate('next')}\n\t\t\t\taria-label={`Next ${mode}`}\n\t\t\t>\n\t\t\t\t<ArrowRight className=\"!h-8 !w-8\" />\n\t\t\t</Button>\n\t\t</div>\n\t)\n}\n"],"names":["MonthNavigator","props","currentMonth","currentYear","onChangeMonthYear","locale","enUS","mode","navigate","direction","newMonth","newYear","jsxs","jsx","Button","ArrowLeft","ArrowRight"],"mappings":"0jFAeO,MAAMA,GAAkBC,GAA+B,CAC7D,KAAM,CACL,aAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,OAAAC,EAASC,EACT,KAAAC,EAAO,OAAA,EACJN,EAEEO,EAAYC,GAA+B,CAChD,IAAIC,EAAWR,EACXS,EAAUR,EAEVI,IAAS,QACRE,IAAc,OACbC,IAAa,GAChBA,EAAW,GACXC,KAEAD,IAGGA,IAAa,IAChBA,EAAW,EACXC,KAEAD,IAIFC,EAAUF,IAAc,OAASE,EAAU,EAAIA,EAAU,EAG1DP,EAAkBM,EAAmBC,CAAO,CAAA,EAG7C,OACCC,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,QAAQ,QACR,KAAK,OACL,QAAS,IAAMN,EAAS,MAAM,EAC9B,aAAY,YAAYD,CAAI,GAE5B,SAAAM,EAAAA,IAACE,EAAA,CAAU,UAAU,WAAA,CAAY,CAAA,CAAA,EAElCH,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,gCACZ,SAAAN,IAAS,QACPF,EAAO,SAAS,MAAMH,EAAc,CAAE,MAAO,MAAA,CAAQ,EACrDC,EACJ,EACCI,IAAS,SACTM,EAAAA,IAAC,IAAA,CAAE,UAAU,gCAAiC,SAAAV,CAAA,CAAY,CAAA,EAE5D,EACAU,EAAAA,IAACC,EAAA,CACA,QAAQ,QACR,KAAK,OACL,QAAS,IAAMN,EAAS,MAAM,EAC9B,aAAY,QAAQD,CAAI,GAExB,SAAAM,EAAAA,IAACG,EAAA,CAAW,UAAU,WAAA,CAAY,CAAA,CAAA,CACnC,EACD,CAEF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"month-navigator.stories.js","sources":["../../../src/blocks/month-navigator/month-navigator.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { Month, MonthNavigator } from './month-navigator'\n\nconst meta: Meta<typeof MonthNavigator> = {\n\tcomponent: MonthNavigator,\n}\n\nexport default meta\ntype Story = StoryObj<typeof MonthNavigator>\n\nconst Template = () => {\n\tconst [month, setMonth] = React.useState(new Date().getMonth() as Month)\n\tconst [year, setYear] = React.useState(new Date().getFullYear())\n\n\treturn (\n\t\t<div className=\"w-96 border rounded-md p-4\">\n\t\t\t<MonthNavigator\n\t\t\t\tcurrentMonth={month}\n\t\t\t\tcurrentYear={year}\n\t\t\t\tonChangeMonthYear={(month, year) => {\n\t\t\t\t\tsetMonth(month)\n\t\t\t\t\tsetYear(year)\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n\nconst YearModeTemplate = () => {\n\tconst [month, setMonth] = React.useState(new Date().getMonth() as Month)\n\tconst [year, setYear] = React.useState(new Date().getFullYear())\n\n\treturn (\n\t\t<div className=\"w-96 border rounded-md p-4\">\n\t\t\t<MonthNavigator\n\t\t\t\tcurrentMonth={month}\n\t\t\t\tcurrentYear={year}\n\t\t\t\tmode=\"year\"\n\t\t\t\tonChangeMonthYear={(month, year) => {\n\t\t\t\t\tsetMonth(month)\n\t\t\t\t\tsetYear(year)\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\nexport const YearMode: Story = {\n\trender: YearModeTemplate.bind({}),\n\targs: {},\n}\n"],"names":["Template","month","setMonth","React","year","setYear","jsx","MonthNavigator","YearModeTemplate"],"mappings":"8iFAYA,MAAMA,EAAW,IAAM,
|
|
1
|
+
{"version":3,"file":"month-navigator.stories.js","sources":["../../../src/blocks/month-navigator/month-navigator.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { Month, MonthNavigator } from './month-navigator'\n\nconst meta: Meta<typeof MonthNavigator> = {\n\tcomponent: MonthNavigator,\n}\n\nexport default meta\ntype Story = StoryObj<typeof MonthNavigator>\n\nconst Template = () => {\n\tconst [month, setMonth] = React.useState(new Date().getMonth() as Month)\n\tconst [year, setYear] = React.useState(new Date().getFullYear())\n\n\treturn (\n\t\t<div className=\"w-96 border rounded-md p-4\">\n\t\t\t<MonthNavigator\n\t\t\t\tcurrentMonth={month}\n\t\t\t\tcurrentYear={year}\n\t\t\t\tonChangeMonthYear={(month, year) => {\n\t\t\t\t\tsetMonth(month)\n\t\t\t\t\tsetYear(year)\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n\nconst YearModeTemplate = () => {\n\tconst [month, setMonth] = React.useState(new Date().getMonth() as Month)\n\tconst [year, setYear] = React.useState(new Date().getFullYear())\n\n\treturn (\n\t\t<div className=\"w-96 border rounded-md p-4\">\n\t\t\t<MonthNavigator\n\t\t\t\tcurrentMonth={month}\n\t\t\t\tcurrentYear={year}\n\t\t\t\tmode=\"year\"\n\t\t\t\tonChangeMonthYear={(month, year) => {\n\t\t\t\t\tsetMonth(month)\n\t\t\t\t\tsetYear(year)\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\nexport const YearMode: Story = {\n\trender: YearModeTemplate.bind({}),\n\targs: {},\n}\n"],"names":["Template","month","setMonth","React","year","setYear","jsx","MonthNavigator","YearModeTemplate"],"mappings":"8iFAYA,MAAMA,EAAW,IAAM,CACtB,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAM,SAAS,IAAI,OAAO,UAAmB,EACjE,CAACC,EAAMC,CAAO,EAAIF,EAAM,SAAS,IAAI,OAAO,aAAa,EAE/D,OACCG,EAAAA,IAAC,MAAA,CAAI,UAAU,6BACd,SAAAA,EAAAA,IAACC,EAAA,CACA,aAAcN,EACd,YAAaG,EACb,kBAAmB,CAACH,EAAOG,IAAS,CACnCF,EAASD,CAAK,EACdI,EAAQD,CAAI,CAAA,CACb,CAAA,EAEF,CAEF,EAGSJ,EAAS,KAAK,EAAE,EAIzB,MAAMQ,EAAmB,IAAM,CAC9B,KAAM,CAACP,EAAOC,CAAQ,EAAIC,EAAM,SAAS,IAAI,OAAO,UAAmB,EACjE,CAACC,EAAMC,CAAO,EAAIF,EAAM,SAAS,IAAI,OAAO,aAAa,EAE/D,OACCG,EAAAA,IAAC,MAAA,CAAI,UAAU,6BACd,SAAAA,EAAAA,IAACC,EAAA,CACA,aAAcN,EACd,YAAaG,EACb,KAAK,OACL,kBAAmB,CAACH,EAAOG,IAAS,CACnCF,EAASD,CAAK,EACdI,EAAQD,CAAI,CAAA,CACb,CAAA,EAEF,CAEF,EAGSI,EAAiB,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paginated-items.js","sources":["../../../src/blocks/paginated-items/paginated-items.tsx"],"sourcesContent":["import { Skeleton, Spinner } from '@/components'\nimport { Fragment, ReactNode, useEffect, useState } from 'react'\nimport { EmptyItems } from '../empty-message'\nimport { PaginationControls } from '../pagination-controls'\n\ninterface PaginatedControlsProps {\n\tinitIndex: number\n\tendIndex: number\n\ttotalItems: number\n\ttotalPages: number\n\tcurrentPage: number\n\tpageTotalItems: number\n\tonPageChange: (page: number) => void\n\tshowItemsCounter?: boolean\n}\n\ninterface PaginatedItemsProps<Entry> {\n\tdata: Entry[]\n\tperPage?: number\n\tinitialPage?: number\n\titemsContainerClass?: string\n\tchildren: (item: Entry, index: number) => React.ReactNode\n\temptyState?: ReactNode\n\tisLoading?: boolean\n\tloadingVariant?: 'loader' | 'skeleton'\n\tshowItemsCounter?: boolean\n}\n\nconst PaginatedControls = ({\n\tinitIndex,\n\tonPageChange,\n\ttotalItems,\n\ttotalPages,\n\tpageTotalItems,\n\tcurrentPage,\n\tshowItemsCounter = true,\n}: PaginatedControlsProps) => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 items-end\">\n\t\t\t{showItemsCounter && (\n\t\t\t\t<p>\n\t\t\t\t\t<b>{initIndex + 1}</b> - <b>{initIndex + pageTotalItems}</b> ({totalItems})\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{totalPages > 1 && (\n\t\t\t\t<PaginationControls\n\t\t\t\t\tcurrentPage={currentPage}\n\t\t\t\t\tonPageChange={onPageChange}\n\t\t\t\t\ttotalPages={totalPages}\n\t\t\t\t\ttotalItems={totalItems}\n\t\t\t\t\tstartIndex={initIndex}\n\t\t\t\t\tendIndex={initIndex + pageTotalItems}\n\t\t\t\t\tonPreviousPage={() => onPageChange(currentPage - 1)}\n\t\t\t\t\tonNextPage={() => onPageChange(currentPage + 1)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nexport const PaginatedItems = <Entry extends { id?: string }>(\n\tprops: PaginatedItemsProps<Entry>,\n) => {\n\tconst {\n\t\tdata: originalData = [],\n\t\tperPage = 50,\n\t\tinitialPage = 1,\n\t\tchildren,\n\t\titemsContainerClass = '',\n\t\temptyState = <EmptyItems notFoundText=\"No item found!\" />,\n\t\tisLoading = false,\n\t\tshowItemsCounter = true,\n\t\tloadingVariant = 'loader',\n\t} = props\n\n\tconst [data, setData] = useState<Entry[]>(originalData)\n\n\tuseEffect(() => {\n\t\tsetData(originalData)\n\t\tsetCurrentPage(1)\n\t}, [originalData])\n\n\tconst [currentPage, setCurrentPage] = useState(initialPage)\n\tconst totalPages = Math.ceil(data.length / perPage)\n\tconst initIndex = (currentPage - 1) * perPage\n\tconst endIndex = currentPage * perPage\n\tconst currentPageItems = data.slice(initIndex, endIndex)\n\n\tconst alternativeDisplay = isLoading ? (\n\t\t<section className=\"w-full\">\n\t\t\t{loadingVariant === 'loader' ? (\n\t\t\t\t<Spinner size=\"lg\" />\n\t\t\t) : (\n\t\t\t\t<Skeleton className=\"h-12 w-full\" repeat={perPage} />\n\t\t\t)}\n\t\t</section>\n\t) : data.length === 0 ? (\n\t\temptyState\n\t) : undefined\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4 items-end\">\n\t\t\t<PaginatedControls\n\t\t\t\tinitIndex={initIndex}\n\t\t\t\tendIndex={endIndex}\n\t\t\t\ttotalItems={data.length}\n\t\t\t\ttotalPages={totalPages}\n\t\t\t\tcurrentPage={currentPage}\n\t\t\t\tpageTotalItems={currentPageItems.length}\n\t\t\t\tonPageChange={setCurrentPage}\n\t\t\t\tshowItemsCounter={showItemsCounter}\n\t\t\t/>\n\n\t\t\t{alternativeDisplay ? (\n\t\t\t\t<section className=\"w-full\">{alternativeDisplay}</section>\n\t\t\t) : (\n\t\t\t\t<section className={`w-full ${itemsContainerClass}`}>\n\t\t\t\t\t{currentPageItems.map((item, i) => (\n\t\t\t\t\t\t<Fragment key={item.id}>{children(item, i)}</Fragment>\n\t\t\t\t\t))}\n\t\t\t\t</section>\n\t\t\t)}\n\t\t\t<PaginatedControls\n\t\t\t\tinitIndex={initIndex}\n\t\t\t\tendIndex={endIndex}\n\t\t\t\ttotalItems={data.length}\n\t\t\t\ttotalPages={totalPages}\n\t\t\t\tcurrentPage={currentPage}\n\t\t\t\tpageTotalItems={currentPageItems.length}\n\t\t\t\tonPageChange={setCurrentPage}\n\t\t\t\tshowItemsCounter={showItemsCounter}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"names":["PaginatedControls","initIndex","onPageChange","totalItems","totalPages","pageTotalItems","currentPage","showItemsCounter","jsxs","jsx","PaginationControls","PaginatedItems","props","originalData","perPage","initialPage","children","itemsContainerClass","emptyState","EmptyItems","isLoading","loadingVariant","data","setData","useState","useEffect","setCurrentPage","endIndex","currentPageItems","alternativeDisplay","Spinner","Skeleton","item","i","Fragment"],"mappings":"qsFA4BA,MAAMA,EAAoB,CAAC,CAC1B,UAAAC,EACA,aAAAC,EACA,WAAAC,EACA,WAAAC,EACA,eAAAC,EACA,YAAAC,EACA,iBAAAC,EAAmB,EACpB,IAEEC,
|
|
1
|
+
{"version":3,"file":"paginated-items.js","sources":["../../../src/blocks/paginated-items/paginated-items.tsx"],"sourcesContent":["import { Skeleton, Spinner } from '@/components'\nimport { Fragment, ReactNode, useEffect, useState } from 'react'\nimport { EmptyItems } from '../empty-message'\nimport { PaginationControls } from '../pagination-controls'\n\ninterface PaginatedControlsProps {\n\tinitIndex: number\n\tendIndex: number\n\ttotalItems: number\n\ttotalPages: number\n\tcurrentPage: number\n\tpageTotalItems: number\n\tonPageChange: (page: number) => void\n\tshowItemsCounter?: boolean\n}\n\ninterface PaginatedItemsProps<Entry> {\n\tdata: Entry[]\n\tperPage?: number\n\tinitialPage?: number\n\titemsContainerClass?: string\n\tchildren: (item: Entry, index: number) => React.ReactNode\n\temptyState?: ReactNode\n\tisLoading?: boolean\n\tloadingVariant?: 'loader' | 'skeleton'\n\tshowItemsCounter?: boolean\n}\n\nconst PaginatedControls = ({\n\tinitIndex,\n\tonPageChange,\n\ttotalItems,\n\ttotalPages,\n\tpageTotalItems,\n\tcurrentPage,\n\tshowItemsCounter = true,\n}: PaginatedControlsProps) => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 items-end\">\n\t\t\t{showItemsCounter && (\n\t\t\t\t<p>\n\t\t\t\t\t<b>{initIndex + 1}</b> - <b>{initIndex + pageTotalItems}</b> ({totalItems})\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{totalPages > 1 && (\n\t\t\t\t<PaginationControls\n\t\t\t\t\tcurrentPage={currentPage}\n\t\t\t\t\tonPageChange={onPageChange}\n\t\t\t\t\ttotalPages={totalPages}\n\t\t\t\t\ttotalItems={totalItems}\n\t\t\t\t\tstartIndex={initIndex}\n\t\t\t\t\tendIndex={initIndex + pageTotalItems}\n\t\t\t\t\tonPreviousPage={() => onPageChange(currentPage - 1)}\n\t\t\t\t\tonNextPage={() => onPageChange(currentPage + 1)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nexport const PaginatedItems = <Entry extends { id?: string }>(\n\tprops: PaginatedItemsProps<Entry>,\n) => {\n\tconst {\n\t\tdata: originalData = [],\n\t\tperPage = 50,\n\t\tinitialPage = 1,\n\t\tchildren,\n\t\titemsContainerClass = '',\n\t\temptyState = <EmptyItems notFoundText=\"No item found!\" />,\n\t\tisLoading = false,\n\t\tshowItemsCounter = true,\n\t\tloadingVariant = 'loader',\n\t} = props\n\n\tconst [data, setData] = useState<Entry[]>(originalData)\n\n\tuseEffect(() => {\n\t\tsetData(originalData)\n\t\tsetCurrentPage(1)\n\t}, [originalData])\n\n\tconst [currentPage, setCurrentPage] = useState(initialPage)\n\tconst totalPages = Math.ceil(data.length / perPage)\n\tconst initIndex = (currentPage - 1) * perPage\n\tconst endIndex = currentPage * perPage\n\tconst currentPageItems = data.slice(initIndex, endIndex)\n\n\tconst alternativeDisplay = isLoading ? (\n\t\t<section className=\"w-full\">\n\t\t\t{loadingVariant === 'loader' ? (\n\t\t\t\t<Spinner size=\"lg\" />\n\t\t\t) : (\n\t\t\t\t<Skeleton className=\"h-12 w-full\" repeat={perPage} />\n\t\t\t)}\n\t\t</section>\n\t) : data.length === 0 ? (\n\t\temptyState\n\t) : undefined\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4 items-end\">\n\t\t\t<PaginatedControls\n\t\t\t\tinitIndex={initIndex}\n\t\t\t\tendIndex={endIndex}\n\t\t\t\ttotalItems={data.length}\n\t\t\t\ttotalPages={totalPages}\n\t\t\t\tcurrentPage={currentPage}\n\t\t\t\tpageTotalItems={currentPageItems.length}\n\t\t\t\tonPageChange={setCurrentPage}\n\t\t\t\tshowItemsCounter={showItemsCounter}\n\t\t\t/>\n\n\t\t\t{alternativeDisplay ? (\n\t\t\t\t<section className=\"w-full\">{alternativeDisplay}</section>\n\t\t\t) : (\n\t\t\t\t<section className={`w-full ${itemsContainerClass}`}>\n\t\t\t\t\t{currentPageItems.map((item, i) => (\n\t\t\t\t\t\t<Fragment key={item.id}>{children(item, i)}</Fragment>\n\t\t\t\t\t))}\n\t\t\t\t</section>\n\t\t\t)}\n\t\t\t<PaginatedControls\n\t\t\t\tinitIndex={initIndex}\n\t\t\t\tendIndex={endIndex}\n\t\t\t\ttotalItems={data.length}\n\t\t\t\ttotalPages={totalPages}\n\t\t\t\tcurrentPage={currentPage}\n\t\t\t\tpageTotalItems={currentPageItems.length}\n\t\t\t\tonPageChange={setCurrentPage}\n\t\t\t\tshowItemsCounter={showItemsCounter}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n"],"names":["PaginatedControls","initIndex","onPageChange","totalItems","totalPages","pageTotalItems","currentPage","showItemsCounter","jsxs","jsx","PaginationControls","PaginatedItems","props","originalData","perPage","initialPage","children","itemsContainerClass","emptyState","EmptyItems","isLoading","loadingVariant","data","setData","useState","useEffect","setCurrentPage","endIndex","currentPageItems","alternativeDisplay","Spinner","Skeleton","item","i","Fragment"],"mappings":"qsFA4BA,MAAMA,EAAoB,CAAC,CAC1B,UAAAC,EACA,aAAAC,EACA,WAAAC,EACA,WAAAC,EACA,eAAAC,EACA,YAAAC,EACA,iBAAAC,EAAmB,EACpB,IAEEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAD,UACC,IAAA,CACA,SAAA,CAAAE,EAAAA,IAAC,IAAA,CAAG,WAAY,CAAA,CAAE,EAAI,MAAGA,EAAAA,IAAC,IAAA,CAAG,SAAAR,EAAYI,CAAA,CAAe,EAAI,KAAGF,EAAW,GAAA,EAC3E,EAEAC,EAAa,GACbK,EAAAA,IAACC,EAAA,CACA,YAAAJ,EACA,aAAAJ,EACA,WAAAE,EACA,WAAAD,EACA,WAAYF,EACZ,SAAUA,EAAYI,EACtB,eAAgB,IAAMH,EAAaI,EAAc,CAAC,EAClD,WAAY,IAAMJ,EAAaI,EAAc,CAAC,CAAA,CAAA,CAC/C,EAEF,EAIWK,GACZC,GACI,CACJ,KAAM,CACL,KAAMC,EAAe,CAAA,EACrB,QAAAC,EAAU,GACV,YAAAC,EAAc,EACd,SAAAC,EACA,oBAAAC,EAAsB,GACtB,WAAAC,EAAaT,EAAAA,IAACU,EAAA,CAAW,aAAa,gBAAA,CAAiB,EACvD,UAAAC,EAAY,GACZ,iBAAAb,EAAmB,GACnB,eAAAc,EAAiB,QAAA,EACdT,EAEE,CAACU,EAAMC,CAAO,EAAIC,EAAkBX,CAAY,EAEtDY,EAAU,IAAM,CACfF,EAAQV,CAAY,EACpBa,EAAe,CAAC,CAAA,EACd,CAACb,CAAY,CAAC,EAEjB,KAAM,CAACP,EAAaoB,CAAc,EAAIF,EAAST,CAAW,EACpDX,EAAa,KAAK,KAAKkB,EAAK,OAASR,CAAO,EAC5Cb,GAAaK,EAAc,GAAKQ,EAChCa,EAAWrB,EAAcQ,EACzBc,EAAmBN,EAAK,MAAMrB,EAAW0B,CAAQ,EAEjDE,EAAqBT,EAC1BX,EAAAA,IAAC,UAAA,CAAQ,UAAU,SACjB,SAAAY,IAAmB,SACnBZ,EAAAA,IAACqB,EAAA,CAAQ,KAAK,KAAK,EAEnBrB,EAAAA,IAACsB,EAAA,CAAS,UAAU,cAAc,OAAQjB,EAAS,EAErD,EACGQ,EAAK,SAAW,EACnBJ,EACG,OAEJ,OACCV,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACd,SAAA,CAAAC,EAAAA,IAACT,EAAA,CACA,UAAAC,EACA,SAAA0B,EACA,WAAYL,EAAK,OACjB,WAAAlB,EACA,YAAAE,EACA,eAAgBsB,EAAiB,OACjC,aAAcF,EACd,iBAAAnB,CAAA,CAAA,EAGAsB,EACApB,EAAAA,IAAC,UAAA,CAAQ,UAAU,SAAU,SAAAoB,CAAA,CAAmB,EAEhDpB,EAAAA,IAAC,UAAA,CAAQ,UAAW,UAAUQ,CAAmB,GAC/C,SAAAW,EAAiB,IAAI,CAACI,EAAMC,IAC5BxB,EAAAA,IAACyB,EAAA,CAAwB,SAAAlB,EAASgB,EAAMC,CAAC,CAAA,EAA1BD,EAAK,EAAuB,CAC3C,EACF,EAEDvB,EAAAA,IAACT,EAAA,CACA,UAAAC,EACA,SAAA0B,EACA,WAAYL,EAAK,OACjB,WAAAlB,EACA,YAAAE,EACA,eAAgBsB,EAAiB,OACjC,aAAcF,EACd,iBAAAnB,CAAA,CAAA,CACD,EACD,CAEF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paginated-items.stories.js","sources":["../../../src/blocks/paginated-items/paginated-items.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { PaginatedItems } from '.'\nimport { User } from 'lucide-react'\n\nconst meta: Meta<typeof PaginatedItems> = {\n\tcomponent: PaginatedItems,\n}\n\nexport default meta\ntype Story = StoryObj<typeof PaginatedItems>\n\ntype User = {\n\tid: string\n\tname: string\n\temail: string\n}\n// create a list of 100 users using the map function\nconst users: User[] = Array.from({ length: 1000 }, (_, index) => index + 1).map(\n\t(user) => ({\n\t\tid: user.toString(),\n\t\tname: `User ${user}`,\n\t\temail: `user${user}@example.com`,\n\t}),\n)\n\nconst Template = () => {\n\treturn (\n\t\t<PaginatedItems<User> data={users} itemsContainerClass=\"grid grid-cols-2 gap-3\">\n\t\t\t{(user) => (\n\t\t\t\t<div key={user.id} className=\"border rounded-sm p-3\">\n\t\t\t\t\t<div className=\"flex gap-2 items-center\">\n\t\t\t\t\t\t<User />\n\t\t\t\t\t\t{user.name}\n\t\t\t\t\t</div>\n\t\t\t\t\t<span className=\"text-sm text-gray-400\">{user.email}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</PaginatedItems>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["users","_","index","user","Template","jsx","PaginatedItems","jsxs","User"],"mappings":"6pFAmBA,MAAMA,EAAgB,MAAM,KAAK,CAAE,OAAQ,GAAA,EAAQ,CAACC,EAAGC,IAAUA,EAAQ,CAAC,EAAE,IAC1EC,IAAU,CACV,GAAIA,EAAK,
|
|
1
|
+
{"version":3,"file":"paginated-items.stories.js","sources":["../../../src/blocks/paginated-items/paginated-items.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { PaginatedItems } from '.'\nimport { User } from 'lucide-react'\n\nconst meta: Meta<typeof PaginatedItems> = {\n\tcomponent: PaginatedItems,\n}\n\nexport default meta\ntype Story = StoryObj<typeof PaginatedItems>\n\ntype User = {\n\tid: string\n\tname: string\n\temail: string\n}\n// create a list of 100 users using the map function\nconst users: User[] = Array.from({ length: 1000 }, (_, index) => index + 1).map(\n\t(user) => ({\n\t\tid: user.toString(),\n\t\tname: `User ${user}`,\n\t\temail: `user${user}@example.com`,\n\t}),\n)\n\nconst Template = () => {\n\treturn (\n\t\t<PaginatedItems<User> data={users} itemsContainerClass=\"grid grid-cols-2 gap-3\">\n\t\t\t{(user) => (\n\t\t\t\t<div key={user.id} className=\"border rounded-sm p-3\">\n\t\t\t\t\t<div className=\"flex gap-2 items-center\">\n\t\t\t\t\t\t<User />\n\t\t\t\t\t\t{user.name}\n\t\t\t\t\t</div>\n\t\t\t\t\t<span className=\"text-sm text-gray-400\">{user.email}</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</PaginatedItems>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["users","_","index","user","Template","jsx","PaginatedItems","jsxs","User"],"mappings":"6pFAmBA,MAAMA,EAAgB,MAAM,KAAK,CAAE,OAAQ,GAAA,EAAQ,CAACC,EAAGC,IAAUA,EAAQ,CAAC,EAAE,IAC1EC,IAAU,CACV,GAAIA,EAAK,SAAA,EACT,KAAM,QAAQA,CAAI,GAClB,MAAO,OAAOA,CAAI,cAAA,EAEpB,EAEMC,EAAW,IAEfC,EAAAA,IAACC,EAAA,CAAqB,KAAMN,EAAO,oBAAoB,yBACrD,SAACG,GACDI,EAAAA,KAAC,MAAA,CAAkB,UAAU,wBAC5B,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAF,EAAAA,IAACG,EAAA,EAAK,EACLL,EAAK,IAAA,EACP,EACAE,EAAAA,IAAC,OAAA,CAAK,UAAU,wBAAyB,WAAK,KAAA,CAAM,CAAA,GAL3CF,EAAK,EAMf,EAEF,EAKOC,EAAS,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-controls.js","sources":["../../../src/blocks/pagination-controls/pagination-controls.tsx"],"sourcesContent":["'use client'\n\nimport { Button } from '@/components/button'\nimport { replaceTemplateWithVariables } from '@/lib/utils'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport React from 'react'\n\ninterface PaginationControlsProps {\n\tcurrentPage: number\n\ttotalPages: number\n\ttotalItems: number\n\tstartIndex: number\n\tendIndex: number\n\tonPageChange: (page: number) => void\n\tonPreviousPage: () => void\n\tonNextPage: () => void\n\tshowItemsCounter?: boolean\n\tcounterText?: string\n}\n\nexport const PaginationControls = (props: PaginationControlsProps) => {\n\tconst {\n\t\tcurrentPage,\n\t\ttotalPages,\n\t\ttotalItems,\n\t\tstartIndex,\n\t\tendIndex,\n\t\tonPageChange,\n\t\tonPreviousPage,\n\t\tonNextPage,\n\t\tshowItemsCounter = true,\n\t\tcounterText = 'Showing {{startIndex}} to {{endIndex}} of {{totalItems}} results',\n\t} = props\n\n\t// Generate page numbers for pagination\n\tconst getPageNumbers = () => {\n\t\tconst pages: (number | string)[] = []\n\t\tconst maxVisiblePages = 7\n\n\t\tif (totalPages <= maxVisiblePages) {\n\t\t\tfor (let i = 1; i <= totalPages; i++) {\n\t\t\t\tpages.push(i)\n\t\t\t}\n\t\t} else {\n\t\t\t// Always show first page\n\t\t\tpages.push(1)\n\n\t\t\tif (currentPage > 4) {\n\t\t\t\tpages.push('...')\n\t\t\t}\n\n\t\t\t// Show pages around current page\n\t\t\tconst start = Math.max(2, currentPage - 1)\n\t\t\tconst end = Math.min(totalPages - 1, currentPage + 1)\n\n\t\t\tfor (let i = start; i <= end; i++) {\n\t\t\t\tif (i !== 1 && i !== totalPages) {\n\t\t\t\t\tpages.push(i)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentPage < totalPages - 3) {\n\t\t\t\tpages.push('...')\n\t\t\t}\n\n\t\t\t// Always show last page\n\t\t\tif (totalPages > 1) {\n\t\t\t\tpages.push(totalPages)\n\t\t\t}\n\t\t}\n\n\t\treturn pages\n\t}\n\n\tif (totalPages <= 1) return null\n\n\treturn (\n\t\t<div className=\"flex flex-col sm:flex-row items-center justify-between gap-4\">\n\t\t\t{showItemsCounter ? (\n\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{replaceTemplateWithVariables(counterText, {\n\t\t\t\t\t\tstartIndex: startIndex + 1,\n\t\t\t\t\t\tendIndex,\n\t\t\t\t\t\ttotalItems,\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t<div className=\"flex items-center space-x-1\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onPreviousPage}\n\t\t\t\t\tdisabled={currentPage === 1}\n\t\t\t\t\tclassName=\"h-8 w-8 p-0\"\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t</Button>\n\n\t\t\t\t{getPageNumbers().map((page, index) => (\n\t\t\t\t\t<React.Fragment key={index}>\n\t\t\t\t\t\t{page === '...' ? (\n\t\t\t\t\t\t\t<span className=\"px-2 text-muted-foreground\">...</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant={currentPage === page ? 'default' : 'outline'}\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonClick={() => onPageChange(page as number)}\n\t\t\t\t\t\t\t\tclassName=\"h-8 w-8 p-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{page}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</React.Fragment>\n\t\t\t\t))}\n\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onNextPage}\n\t\t\t\t\tdisabled={currentPage === totalPages}\n\t\t\t\t\tclassName=\"h-8 w-8 p-0\"\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"],"names":["PaginationControls","props","currentPage","totalPages","totalItems","startIndex","endIndex","onPageChange","onPreviousPage","onNextPage","showItemsCounter","counterText","getPageNumbers","pages","i","start","end","jsxs","jsx","Button","ChevronLeft","page","index","React","ChevronRight"],"mappings":"
|
|
1
|
+
{"version":3,"file":"pagination-controls.js","sources":["../../../src/blocks/pagination-controls/pagination-controls.tsx"],"sourcesContent":["'use client'\n\nimport { Button } from '@/components/button'\nimport { replaceTemplateWithVariables } from '@/lib/utils'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport React from 'react'\n\ninterface PaginationControlsProps {\n\tcurrentPage: number\n\ttotalPages: number\n\ttotalItems: number\n\tstartIndex: number\n\tendIndex: number\n\tonPageChange: (page: number) => void\n\tonPreviousPage: () => void\n\tonNextPage: () => void\n\tshowItemsCounter?: boolean\n\tcounterText?: string\n}\n\nexport const PaginationControls = (props: PaginationControlsProps) => {\n\tconst {\n\t\tcurrentPage,\n\t\ttotalPages,\n\t\ttotalItems,\n\t\tstartIndex,\n\t\tendIndex,\n\t\tonPageChange,\n\t\tonPreviousPage,\n\t\tonNextPage,\n\t\tshowItemsCounter = true,\n\t\tcounterText = 'Showing {{startIndex}} to {{endIndex}} of {{totalItems}} results',\n\t} = props\n\n\t// Generate page numbers for pagination\n\tconst getPageNumbers = () => {\n\t\tconst pages: (number | string)[] = []\n\t\tconst maxVisiblePages = 7\n\n\t\tif (totalPages <= maxVisiblePages) {\n\t\t\tfor (let i = 1; i <= totalPages; i++) {\n\t\t\t\tpages.push(i)\n\t\t\t}\n\t\t} else {\n\t\t\t// Always show first page\n\t\t\tpages.push(1)\n\n\t\t\tif (currentPage > 4) {\n\t\t\t\tpages.push('...')\n\t\t\t}\n\n\t\t\t// Show pages around current page\n\t\t\tconst start = Math.max(2, currentPage - 1)\n\t\t\tconst end = Math.min(totalPages - 1, currentPage + 1)\n\n\t\t\tfor (let i = start; i <= end; i++) {\n\t\t\t\tif (i !== 1 && i !== totalPages) {\n\t\t\t\t\tpages.push(i)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentPage < totalPages - 3) {\n\t\t\t\tpages.push('...')\n\t\t\t}\n\n\t\t\t// Always show last page\n\t\t\tif (totalPages > 1) {\n\t\t\t\tpages.push(totalPages)\n\t\t\t}\n\t\t}\n\n\t\treturn pages\n\t}\n\n\tif (totalPages <= 1) return null\n\n\treturn (\n\t\t<div className=\"flex flex-col sm:flex-row items-center justify-between gap-4\">\n\t\t\t{showItemsCounter ? (\n\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t{replaceTemplateWithVariables(counterText, {\n\t\t\t\t\t\tstartIndex: startIndex + 1,\n\t\t\t\t\t\tendIndex,\n\t\t\t\t\t\ttotalItems,\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t<div className=\"flex items-center space-x-1\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onPreviousPage}\n\t\t\t\t\tdisabled={currentPage === 1}\n\t\t\t\t\tclassName=\"h-8 w-8 p-0\"\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t</Button>\n\n\t\t\t\t{getPageNumbers().map((page, index) => (\n\t\t\t\t\t<React.Fragment key={index}>\n\t\t\t\t\t\t{page === '...' ? (\n\t\t\t\t\t\t\t<span className=\"px-2 text-muted-foreground\">...</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant={currentPage === page ? 'default' : 'outline'}\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonClick={() => onPageChange(page as number)}\n\t\t\t\t\t\t\t\tclassName=\"h-8 w-8 p-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{page}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</React.Fragment>\n\t\t\t\t))}\n\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onNextPage}\n\t\t\t\t\tdisabled={currentPage === totalPages}\n\t\t\t\t\tclassName=\"h-8 w-8 p-0\"\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n"],"names":["PaginationControls","props","currentPage","totalPages","totalItems","startIndex","endIndex","onPageChange","onPreviousPage","onNextPage","showItemsCounter","counterText","getPageNumbers","pages","i","start","end","jsxs","jsx","Button","ChevronLeft","page","index","React","ChevronRight"],"mappings":"gdAoBO,MAAMA,EAAsBC,GAAmC,CACrE,KAAM,CACL,YAAAC,EACA,WAAAC,EACA,WAAAC,EACA,WAAAC,EACA,SAAAC,EACA,aAAAC,EACA,eAAAC,EACA,WAAAC,EACA,iBAAAC,EAAmB,GACnB,YAAAC,EAAc,kEAAA,EACXV,EAGEW,EAAiB,IAAM,CAC5B,MAAMC,EAA6B,CAAA,EAGnC,GAAIV,GAAc,EACjB,QAASW,EAAI,EAAGA,GAAKX,EAAYW,IAChCD,EAAM,KAAKC,CAAC,MAEP,CAEND,EAAM,KAAK,CAAC,EAERX,EAAc,GACjBW,EAAM,KAAK,KAAK,EAIjB,MAAME,EAAQ,KAAK,IAAI,EAAGb,EAAc,CAAC,EACnCc,EAAM,KAAK,IAAIb,EAAa,EAAGD,EAAc,CAAC,EAEpD,QAAS,EAAIa,EAAO,GAAKC,EAAK,IACzB,IAAM,GAAK,IAAMb,GACpBU,EAAM,KAAK,CAAC,EAIVX,EAAcC,EAAa,GAC9BU,EAAM,KAAK,KAAK,EAIbV,EAAa,GAChBU,EAAM,KAAKV,CAAU,CACtB,CAGD,OAAOU,CAAA,EAGR,OAAIV,GAAc,EAAU,KAG3Bc,EAAAA,KAAC,MAAA,CAAI,UAAU,+DACb,SAAA,CAAAP,EACAQ,EAAAA,IAAC,MAAA,CAAI,UAAU,gCACb,WAA6BP,EAAa,CAC1C,WAAYN,EAAa,EACzB,SAAAC,EACA,WAAAF,CAAA,CACA,EACF,EACG,KAEJa,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,QAAQ,UACR,KAAK,KACL,QAASX,EACT,SAAUN,IAAgB,EAC1B,UAAU,cAEV,SAAAgB,EAAAA,IAACE,EAAA,CAAY,UAAU,SAAA,CAAU,CAAA,CAAA,EAGjCR,IAAiB,IAAI,CAACS,EAAMC,IAC5BJ,MAACK,EAAM,SAAN,CACC,aAAS,MACTL,EAAAA,IAAC,QAAK,UAAU,6BAA6B,eAAG,EAEhDA,EAAAA,IAACC,EAAA,CACA,QAASjB,IAAgBmB,EAAO,UAAY,UAC5C,KAAK,KACL,QAAS,IAAMd,EAAac,CAAc,EAC1C,UAAU,cAET,SAAAA,CAAA,CAAA,CACF,EAXmBC,CAarB,CACA,EAEDJ,EAAAA,IAACC,EAAA,CACA,QAAQ,UACR,KAAK,KACL,QAASV,EACT,SAAUP,IAAgBC,EAC1B,UAAU,cAEV,SAAAe,EAAAA,IAACM,EAAA,CAAa,UAAU,SAAA,CAAU,CAAA,CAAA,CACnC,CAAA,CACD,CAAA,EACD,CAEF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-controls.stories.js","sources":["../../../src/blocks/pagination-controls/pagination-controls.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { PaginationControls } from './pagination-controls'\n\nconst meta: Meta<typeof PaginationControls> = {\n\tcomponent: PaginationControls,\n}\n\nexport default meta\ntype Story = StoryObj<typeof PaginationControls>\n\nconst Template = () => {\n\tconst [currentPage, setCurrentPage] = React.useState(1)\n\treturn (\n\t\t<PaginationControls\n\t\t\tcurrentPage={currentPage}\n\t\t\ttotalPages={10}\n\t\t\ttotalItems={100}\n\t\t\tstartIndex={0}\n\t\t\tendIndex={10}\n\t\t\tonPageChange={(page) => setCurrentPage(page)}\n\t\t\tonPreviousPage={() => setCurrentPage(currentPage - 1)}\n\t\t\tonNextPage={() => setCurrentPage(currentPage + 1)}\n\t\t/>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","currentPage","setCurrentPage","React","jsx","PaginationControls","page"],"mappings":"6bAYA,MAAMA,EAAW,IAAM,CACtB,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAM,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"pagination-controls.stories.js","sources":["../../../src/blocks/pagination-controls/pagination-controls.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { PaginationControls } from './pagination-controls'\n\nconst meta: Meta<typeof PaginationControls> = {\n\tcomponent: PaginationControls,\n}\n\nexport default meta\ntype Story = StoryObj<typeof PaginationControls>\n\nconst Template = () => {\n\tconst [currentPage, setCurrentPage] = React.useState(1)\n\treturn (\n\t\t<PaginationControls\n\t\t\tcurrentPage={currentPage}\n\t\t\ttotalPages={10}\n\t\t\ttotalItems={100}\n\t\t\tstartIndex={0}\n\t\t\tendIndex={10}\n\t\t\tonPageChange={(page) => setCurrentPage(page)}\n\t\t\tonPreviousPage={() => setCurrentPage(currentPage - 1)}\n\t\t\tonNextPage={() => setCurrentPage(currentPage + 1)}\n\t\t/>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","currentPage","setCurrentPage","React","jsx","PaginationControls","page"],"mappings":"6bAYA,MAAMA,EAAW,IAAM,CACtB,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAM,SAAS,CAAC,EACtD,OACCC,EAAAA,IAACC,EAAA,CACA,YAAAJ,EACA,WAAY,GACZ,WAAY,IACZ,WAAY,EACZ,SAAU,GACV,aAAeK,GAASJ,EAAeI,CAAI,EAC3C,eAAgB,IAAMJ,EAAeD,EAAc,CAAC,EACpD,WAAY,IAAMC,EAAeD,EAAc,CAAC,CAAA,CAAA,CAGnD,EAGSD,EAAS,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.js","sources":["../../../src/blocks/sidebar/sidebar.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport React, { PropsWithChildren, useEffect, useRef, useState } from 'react'\n\ninterface SidebarProps {\n\tfixed: boolean\n\tisOpen?: boolean\n\tonToggle?: (open: boolean) => void\n\tchildren: React.ReactNode\n\tclassName?: string\n}\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n\tfixed,\n\tisOpen: externalOpen,\n\tonToggle,\n\tchildren,\n\tclassName,\n}) => {\n\tconst [internalOpen, setInternalOpen] = useState(true)\n\tconst sidebarRef = useRef<HTMLDivElement>(null)\n\tconst toggleButtonRef = useRef<HTMLButtonElement>(null)\n\n\tconst isOpen = externalOpen !== undefined ? externalOpen : internalOpen\n\n\tconst toggleSidebar = () => {\n\t\tif (!fixed) {\n\t\t\tconst newState = !isOpen\n\t\t\tonToggle ? onToggle(newState) : setInternalOpen(newState)\n\t\t}\n\t}\n\n\tconst closeSidebar = () => {\n\t\tif (!fixed) {\n\t\t\tonToggle ? onToggle(false) : setInternalOpen(false)\n\t\t\ttoggleButtonRef.current?.focus()\n\t\t}\n\t}\n\n\tconst handleClickOutside = (event: MouseEvent) => {\n\t\tif (\n\t\t\tsidebarRef.current &&\n\t\t\t!sidebarRef.current.contains(event.target as Node) &&\n\t\t\t!fixed\n\t\t) {\n\t\t\tcloseSidebar()\n\t\t}\n\t}\n\n\tuseEffect(() => {\n\t\tif (!fixed) {\n\t\t\tdocument.addEventListener('mousedown', handleClickOutside)\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener('mousedown', handleClickOutside)\n\t\t\t}\n\t\t}\n\t}, [fixed])\n\n\treturn (\n\t\t<>\n\t\t\t<aside\n\t\t\t\tref={sidebarRef}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'bg-white z-50 h-full shadow-md flex flex-col fixed top-0 left-0 transition-all duration-300 ease-in-out overflow-auto',\n\t\t\t\t\t{ 'w-72': fixed || isOpen },\n\t\t\t\t\t{ 'w-0': !isOpen && !fixed },\n\t\t\t\t\t{ 'translate-x-0': isOpen },\n\t\t\t\t\t{ '-translate-x-full': !isOpen && !fixed },\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden={!isOpen}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</aside>\n\t\t\t{fixed && <div className=\"w-72 relative\" />}\n\t\t</>\n\t)\n}\n\nexport const SidebarHeader = ({\n\tchildren,\n\tclassName,\n}: PropsWithChildren<{ className?: string }>) => {\n\treturn (\n\t\t<header\n\t\t\tclassName={cn('p-4 flex justify-between items-center border-b', className)}\n\t\t\taria-label=\"Sidebar header\"\n\t\t>\n\t\t\t{children}\n\t\t</header>\n\t)\n}\n\nexport const SidebarNav = ({\n\tchildren,\n\tclassName,\n}: PropsWithChildren<{ className?: string }>) => {\n\treturn (\n\t\t<nav aria-label=\"Sidebar navigation\" className={className}>\n\t\t\t{children}\n\t\t</nav>\n\t)\n}\n\nexport const SidebarList = ({\n\tchildren,\n\tclassName,\n}: PropsWithChildren<{ className?: string }>) => {\n\treturn <ul className={cn('flex flex-col gap-2 my-4 px-4', className)}>{children}</ul>\n}\n\nexport const SidebarListItem = ({\n\tchildren,\n\tclassName,\n\tonClick,\n}: PropsWithChildren<{ className?: string; onClick?: () => void }>) => {\n\treturn (\n\t\t<li\n\t\t\tclassName={cn(\n\t\t\t\t'flex items-center gap-2 hover:bg-gray-100 rounded transition-colors',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t{children}\n\t\t</li>\n\t)\n}\n\nexport const SidebarFooter = ({\n\tchildren,\n\tclassName,\n}: PropsWithChildren<{ className?: string }>) => {\n\treturn (\n\t\t<footer className={cn('mt-auto p-4 text-sm', className)} aria-label=\"Sidebar footer\">\n\t\t\t{children}\n\t\t</footer>\n\t)\n}\n"],"names":["Sidebar","fixed","externalOpen","onToggle","children","className","internalOpen","setInternalOpen","useState","sidebarRef","useRef","toggleButtonRef","isOpen","closeSidebar","_a","handleClickOutside","event","useEffect","jsxs","Fragment","jsx","cn","SidebarHeader","SidebarNav","SidebarList","SidebarListItem","onClick","SidebarFooter"],"mappings":"uNAWO,MAAMA,EAAkC,CAAC,CAC/C,MAAAC,EACA,OAAQC,EACR,SAAAC,EACA,SAAAC,EACA,UAAAC,CACD,IAAM,CACL,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAS,EAAI,EAC/CC,EAAaC,EAAuB,IAAI,EACxCC,EAAkBD,EAA0B,IAAI,EAEhDE,EAASV,IAAiB,OAAYA,EAAeI,EASrDO,EAAe,IAAM,OACrBZ,IACJE,EAAWA,EAAS,EAAK,EAAII,EAAgB,EAAK,GAClDO,EAAAH,EAAgB,UAAhB,MAAAG,EAAyB,
|
|
1
|
+
{"version":3,"file":"sidebar.js","sources":["../../../src/blocks/sidebar/sidebar.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport React, { PropsWithChildren, useEffect, useRef, useState } from 'react'\n\ninterface SidebarProps {\n\tfixed: boolean\n\tisOpen?: boolean\n\tonToggle?: (open: boolean) => void\n\tchildren: React.ReactNode\n\tclassName?: string\n}\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n\tfixed,\n\tisOpen: externalOpen,\n\tonToggle,\n\tchildren,\n\tclassName,\n}) => {\n\tconst [internalOpen, setInternalOpen] = useState(true)\n\tconst sidebarRef = useRef<HTMLDivElement>(null)\n\tconst toggleButtonRef = useRef<HTMLButtonElement>(null)\n\n\tconst isOpen = externalOpen !== undefined ? externalOpen : internalOpen\n\n\tconst toggleSidebar = () => {\n\t\tif (!fixed) {\n\t\t\tconst newState = !isOpen\n\t\t\tonToggle ? onToggle(newState) : setInternalOpen(newState)\n\t\t}\n\t}\n\n\tconst closeSidebar = () => {\n\t\tif (!fixed) {\n\t\t\tonToggle ? onToggle(false) : setInternalOpen(false)\n\t\t\ttoggleButtonRef.current?.focus()\n\t\t}\n\t}\n\n\tconst handleClickOutside = (event: MouseEvent) => {\n\t\tif (\n\t\t\tsidebarRef.current &&\n\t\t\t!sidebarRef.current.contains(event.target as Node) &&\n\t\t\t!fixed\n\t\t) {\n\t\t\tcloseSidebar()\n\t\t}\n\t}\n\n\tuseEffect(() => {\n\t\tif (!fixed) {\n\t\t\tdocument.addEventListener('mousedown', handleClickOutside)\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener('mousedown', handleClickOutside)\n\t\t\t}\n\t\t}\n\t}, [fixed])\n\n\treturn (\n\t\t<>\n\t\t\t<aside\n\t\t\t\tref={sidebarRef}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'bg-white z-50 h-full shadow-md flex flex-col fixed top-0 left-0 transition-all duration-300 ease-in-out overflow-auto',\n\t\t\t\t\t{ 'w-72': fixed || isOpen },\n\t\t\t\t\t{ 'w-0': !isOpen && !fixed },\n\t\t\t\t\t{ 'translate-x-0': isOpen },\n\t\t\t\t\t{ '-translate-x-full': !isOpen && !fixed },\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden={!isOpen}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</aside>\n\t\t\t{fixed && <div className=\"w-72 relative\" />}\n\t\t</>\n\t)\n}\n\nexport const SidebarHeader = ({\n\tchildren,\n\tclassName,\n}: PropsWithChildren<{ className?: string }>) => {\n\treturn (\n\t\t<header\n\t\t\tclassName={cn('p-4 flex justify-between items-center border-b', className)}\n\t\t\taria-label=\"Sidebar header\"\n\t\t>\n\t\t\t{children}\n\t\t</header>\n\t)\n}\n\nexport const SidebarNav = ({\n\tchildren,\n\tclassName,\n}: PropsWithChildren<{ className?: string }>) => {\n\treturn (\n\t\t<nav aria-label=\"Sidebar navigation\" className={className}>\n\t\t\t{children}\n\t\t</nav>\n\t)\n}\n\nexport const SidebarList = ({\n\tchildren,\n\tclassName,\n}: PropsWithChildren<{ className?: string }>) => {\n\treturn <ul className={cn('flex flex-col gap-2 my-4 px-4', className)}>{children}</ul>\n}\n\nexport const SidebarListItem = ({\n\tchildren,\n\tclassName,\n\tonClick,\n}: PropsWithChildren<{ className?: string; onClick?: () => void }>) => {\n\treturn (\n\t\t<li\n\t\t\tclassName={cn(\n\t\t\t\t'flex items-center gap-2 hover:bg-gray-100 rounded transition-colors',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t{children}\n\t\t</li>\n\t)\n}\n\nexport const SidebarFooter = ({\n\tchildren,\n\tclassName,\n}: PropsWithChildren<{ className?: string }>) => {\n\treturn (\n\t\t<footer className={cn('mt-auto p-4 text-sm', className)} aria-label=\"Sidebar footer\">\n\t\t\t{children}\n\t\t</footer>\n\t)\n}\n"],"names":["Sidebar","fixed","externalOpen","onToggle","children","className","internalOpen","setInternalOpen","useState","sidebarRef","useRef","toggleButtonRef","isOpen","closeSidebar","_a","handleClickOutside","event","useEffect","jsxs","Fragment","jsx","cn","SidebarHeader","SidebarNav","SidebarList","SidebarListItem","onClick","SidebarFooter"],"mappings":"uNAWO,MAAMA,EAAkC,CAAC,CAC/C,MAAAC,EACA,OAAQC,EACR,SAAAC,EACA,SAAAC,EACA,UAAAC,CACD,IAAM,CACL,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAS,EAAI,EAC/CC,EAAaC,EAAuB,IAAI,EACxCC,EAAkBD,EAA0B,IAAI,EAEhDE,EAASV,IAAiB,OAAYA,EAAeI,EASrDO,EAAe,IAAM,OACrBZ,IACJE,EAAWA,EAAS,EAAK,EAAII,EAAgB,EAAK,GAClDO,EAAAH,EAAgB,UAAhB,MAAAG,EAAyB,QAC1B,EAGKC,EAAsBC,GAAsB,CAEhDP,EAAW,SACX,CAACA,EAAW,QAAQ,SAASO,EAAM,MAAc,GACjD,CAACf,GAEDY,EAAA,CACD,EAGD,OAAAI,EAAU,IAAM,CACf,GAAI,CAAChB,EACJ,gBAAS,iBAAiB,YAAac,CAAkB,EAClD,IAAM,CACZ,SAAS,oBAAoB,YAAaA,CAAkB,CAAA,CAE9D,EACE,CAACd,CAAK,CAAC,EAGTiB,EAAAA,KAAAC,WAAA,CACC,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACA,IAAKX,EACL,UAAWY,EACV,wHACA,CAAE,OAAQpB,GAASW,CAAA,EACnB,CAAE,MAAO,CAACA,GAAU,CAACX,CAAA,EACrB,CAAE,gBAAiBW,CAAA,EACnB,CAAE,oBAAqB,CAACA,GAAU,CAACX,CAAA,EACnCI,CAAA,EAED,cAAa,CAACO,EAEb,SAAAR,CAAA,CAAA,EAEDH,GAASmB,EAAAA,IAAC,MAAA,CAAI,UAAU,eAAA,CAAgB,CAAA,EAC1C,CAEF,EAEaE,EAAgB,CAAC,CAC7B,SAAAlB,EACA,UAAAC,CACD,IAEEe,EAAAA,IAAC,SAAA,CACA,UAAWC,EAAG,iDAAkDhB,CAAS,EACzE,aAAW,iBAEV,SAAAD,CAAA,CAAA,EAKSmB,EAAa,CAAC,CAC1B,SAAAnB,EACA,UAAAC,CACD,IAEEe,EAAAA,IAAC,MAAA,CAAI,aAAW,qBAAqB,UAAAf,EACnC,SAAAD,EACF,EAIWoB,EAAc,CAAC,CAC3B,SAAApB,EACA,UAAAC,CACD,UACS,KAAA,CAAG,UAAWgB,EAAG,gCAAiChB,CAAS,EAAI,SAAAD,EAAS,EAGpEqB,EAAkB,CAAC,CAC/B,SAAArB,EACA,UAAAC,EACA,QAAAqB,CACD,IAEEN,EAAAA,IAAC,KAAA,CACA,UAAWC,EACV,sEACAhB,CAAA,EAED,QAAAqB,EAEC,SAAAtB,CAAA,CAAA,EAKSuB,EAAgB,CAAC,CAC7B,SAAAvB,EACA,UAAAC,CACD,IAEEe,MAAC,UAAO,UAAWC,EAAG,sBAAuBhB,CAAS,EAAG,aAAW,iBAClE,SAAAD,CAAA,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.stories.js","sources":["../../../src/blocks/sidebar/sidebar.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React, { useState } from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { Button } from '../../components/button'\nimport {\n\tSidebar,\n\tSidebarFooter,\n\tSidebarHeader,\n\tSidebarList,\n\tSidebarListItem,\n\tSidebarNav,\n} from '../sidebar'\nimport { Check, Home, List } from 'lucide-react'\n\nconst meta: Meta<typeof Sidebar> = {\n\tcomponent: Sidebar,\n}\n\nexport default meta\ntype Story = StoryObj<typeof Sidebar>\n\nconst Template = () => {\n\tconst [isSidebarOpen, setSidebarOpen] = useState(true)\n\n\treturn (\n\t\t<div className=\"bg-gray-200 w-full h-screen\">\n\t\t\t<Button onClick={() => setSidebarOpen((prev) => !prev)}>Toggle Sidebar</Button>\n\t\t\t<Sidebar fixed={false} isOpen={isSidebarOpen} onToggle={setSidebarOpen}>\n\t\t\t\t<SidebarHeader>\n\t\t\t\t\t<h1>My app</h1>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setSidebarOpen((prev) => !prev)}\n\t\t\t\t\t\tclassName=\"toggle-button\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{isSidebarOpen ? 'Collapse' : 'Expand'}\n\t\t\t\t\t</button>\n\t\t\t\t</SidebarHeader>\n\t\t\t\t<SidebarNav>\n\t\t\t\t\t<SidebarList>\n\t\t\t\t\t\t<SidebarListItem className=\"px-4 py-2\" onClick={() => setSidebarOpen(false)}>\n\t\t\t\t\t\t\t<Home /> Dashboard\n\t\t\t\t\t\t</SidebarListItem>\n\t\t\t\t\t\t<SidebarListItem className=\"px-4 py-2\" onClick={() => setSidebarOpen(false)}>\n\t\t\t\t\t\t\t<List /> Projects\n\t\t\t\t\t\t</SidebarListItem>\n\t\t\t\t\t\t<SidebarListItem className=\"px-4 py-2\" onClick={() => setSidebarOpen(false)}>\n\t\t\t\t\t\t\t<Check /> Tasks\n\t\t\t\t\t\t</SidebarListItem>\n\t\t\t\t\t</SidebarList>\n\t\t\t\t</SidebarNav>\n\t\t\t\t<SidebarFooter>\n\t\t\t\t\t<p>©2025 Copyright</p>\n\t\t\t\t</SidebarFooter>\n\t\t\t</Sidebar>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","isSidebarOpen","setSidebarOpen","useState","jsxs","jsx","Button","prev","Sidebar","SidebarHeader","SidebarNav","SidebarList","SidebarListItem","Home","List","Check","SidebarFooter"],"mappings":"8eAqBA,MAAMA,EAAW,IAAM,CACtB,KAAM,CAACC,EAAeC,CAAc,EAAIC,EAAS,EAAI,
|
|
1
|
+
{"version":3,"file":"sidebar.stories.js","sources":["../../../src/blocks/sidebar/sidebar.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React, { useState } from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { Button } from '../../components/button'\nimport {\n\tSidebar,\n\tSidebarFooter,\n\tSidebarHeader,\n\tSidebarList,\n\tSidebarListItem,\n\tSidebarNav,\n} from '../sidebar'\nimport { Check, Home, List } from 'lucide-react'\n\nconst meta: Meta<typeof Sidebar> = {\n\tcomponent: Sidebar,\n}\n\nexport default meta\ntype Story = StoryObj<typeof Sidebar>\n\nconst Template = () => {\n\tconst [isSidebarOpen, setSidebarOpen] = useState(true)\n\n\treturn (\n\t\t<div className=\"bg-gray-200 w-full h-screen\">\n\t\t\t<Button onClick={() => setSidebarOpen((prev) => !prev)}>Toggle Sidebar</Button>\n\t\t\t<Sidebar fixed={false} isOpen={isSidebarOpen} onToggle={setSidebarOpen}>\n\t\t\t\t<SidebarHeader>\n\t\t\t\t\t<h1>My app</h1>\n\t\t\t\t\t<button\n\t\t\t\t\t\tonClick={() => setSidebarOpen((prev) => !prev)}\n\t\t\t\t\t\tclassName=\"toggle-button\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{isSidebarOpen ? 'Collapse' : 'Expand'}\n\t\t\t\t\t</button>\n\t\t\t\t</SidebarHeader>\n\t\t\t\t<SidebarNav>\n\t\t\t\t\t<SidebarList>\n\t\t\t\t\t\t<SidebarListItem className=\"px-4 py-2\" onClick={() => setSidebarOpen(false)}>\n\t\t\t\t\t\t\t<Home /> Dashboard\n\t\t\t\t\t\t</SidebarListItem>\n\t\t\t\t\t\t<SidebarListItem className=\"px-4 py-2\" onClick={() => setSidebarOpen(false)}>\n\t\t\t\t\t\t\t<List /> Projects\n\t\t\t\t\t\t</SidebarListItem>\n\t\t\t\t\t\t<SidebarListItem className=\"px-4 py-2\" onClick={() => setSidebarOpen(false)}>\n\t\t\t\t\t\t\t<Check /> Tasks\n\t\t\t\t\t\t</SidebarListItem>\n\t\t\t\t\t</SidebarList>\n\t\t\t\t</SidebarNav>\n\t\t\t\t<SidebarFooter>\n\t\t\t\t\t<p>©2025 Copyright</p>\n\t\t\t\t</SidebarFooter>\n\t\t\t</Sidebar>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","isSidebarOpen","setSidebarOpen","useState","jsxs","jsx","Button","prev","Sidebar","SidebarHeader","SidebarNav","SidebarList","SidebarListItem","Home","List","Check","SidebarFooter"],"mappings":"8eAqBA,MAAMA,EAAW,IAAM,CACtB,KAAM,CAACC,EAAeC,CAAc,EAAIC,EAAS,EAAI,EAErD,OACCC,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAO,QAAS,IAAMJ,EAAgBK,GAAS,CAACA,CAAI,EAAG,SAAA,gBAAA,CAAc,SACrEC,EAAA,CAAQ,MAAO,GAAO,OAAQP,EAAe,SAAUC,EACvD,SAAA,CAAAE,OAACK,EAAA,CACA,SAAA,CAAAJ,EAAAA,IAAC,MAAG,SAAA,QAAA,CAAM,EACVA,EAAAA,IAAC,SAAA,CACA,QAAS,IAAMH,EAAgBK,GAAS,CAACA,CAAI,EAC7C,UAAU,gBAET,WAAgB,WAAa,QAAA,CAAA,CAC/B,EACD,EACAF,EAAAA,IAACK,EAAA,CACA,SAAAN,EAAAA,KAACO,EAAA,CACA,SAAA,CAAAP,OAACQ,GAAgB,UAAU,YAAY,QAAS,IAAMV,EAAe,EAAK,EACzE,SAAA,CAAAG,EAAAA,IAACQ,EAAA,EAAK,EAAE,YAAA,EACT,EACAT,OAACQ,GAAgB,UAAU,YAAY,QAAS,IAAMV,EAAe,EAAK,EACzE,SAAA,CAAAG,EAAAA,IAACS,EAAA,EAAK,EAAE,WAAA,EACT,EACAV,OAACQ,GAAgB,UAAU,YAAY,QAAS,IAAMV,EAAe,EAAK,EACzE,SAAA,CAAAG,EAAAA,IAACU,EAAA,EAAM,EAAE,QAAA,CAAA,CACV,CAAA,CAAA,CACD,CAAA,CACD,EACAV,MAACW,EAAA,CACA,SAAAX,EAAAA,IAAC,IAAA,CAAE,2BAAe,CAAA,CACnB,CAAA,CAAA,CACD,CAAA,EACD,CAEF,EAGSL,EAAS,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","sources":["../../../src/components/accordion/accordion.tsx"],"sourcesContent":["import * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDown } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Item>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n\t<AccordionPrimitive.Item ref={ref} className={cn('border-b', className)} {...props} />\n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Trigger>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n\t<AccordionPrimitive.Header className=\"flex\">\n\t\t<AccordionPrimitive.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'text-base flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n\t\t</AccordionPrimitive.Trigger>\n\t</AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Content>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n\t<AccordionPrimitive.Content\n\t\tref={ref}\n\t\tclassName=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n\t\t{...props}\n\t>\n\t\t<div className={cn('pb-4 pt-0', className)}>{children}</div>\n\t</AccordionPrimitive.Content>\n))\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger }\n"],"names":["Accordion","AccordionPrimitive","AccordionItem","React","className","props","ref","jsx","cn","AccordionTrigger","children","jsxs","ChevronDown","AccordionContent"],"mappings":"0QAMA,MAAMA,EAAYC,EAAmB,KAE/BC,EAAgBC,EAAM,WAG1B,CAAC,CAAE,UAAAC,EAAW,GAAGC,
|
|
1
|
+
{"version":3,"file":"accordion.js","sources":["../../../src/components/accordion/accordion.tsx"],"sourcesContent":["import * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDown } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Item>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n\t<AccordionPrimitive.Item ref={ref} className={cn('border-b', className)} {...props} />\n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Trigger>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n\t<AccordionPrimitive.Header className=\"flex\">\n\t\t<AccordionPrimitive.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'text-base flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n\t\t</AccordionPrimitive.Trigger>\n\t</AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n\tReact.ElementRef<typeof AccordionPrimitive.Content>,\n\tReact.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n\t<AccordionPrimitive.Content\n\t\tref={ref}\n\t\tclassName=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n\t\t{...props}\n\t>\n\t\t<div className={cn('pb-4 pt-0', className)}>{children}</div>\n\t</AccordionPrimitive.Content>\n))\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger }\n"],"names":["Accordion","AccordionPrimitive","AccordionItem","React","className","props","ref","jsx","cn","AccordionTrigger","children","jsxs","ChevronDown","AccordionContent"],"mappings":"0QAMA,MAAMA,EAAYC,EAAmB,KAE/BC,EAAgBC,EAAM,WAG1B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC3BC,EAAAA,IAACN,EAAmB,KAAnB,CAAwB,IAAAK,EAAU,UAAWE,EAAG,WAAYJ,CAAS,EAAI,GAAGC,EAAO,CACpF,EACDH,EAAc,YAAc,gBAE5B,MAAMO,EAAmBN,EAAM,WAG7B,CAAC,CAAE,UAAAC,EAAW,SAAAM,EAAU,GAAGL,CAAA,EAASC,IACrCC,EAAAA,IAACN,EAAmB,OAAnB,CAA0B,UAAU,OACpC,SAAAU,EAAAA,KAACV,EAAmB,QAAnB,CACA,IAAAK,EACA,UAAWE,EACV,yIACAJ,CAAA,EAEA,GAAGC,EAEH,SAAA,CAAAK,EACDH,EAAAA,IAACK,EAAA,CAAY,UAAU,oDAAA,CAAqD,CAAA,CAAA,CAC7E,EACD,CACA,EACDH,EAAiB,YAAcR,EAAmB,QAAQ,YAE1D,MAAMY,EAAmBV,EAAM,WAG7B,CAAC,CAAE,UAAAC,EAAW,SAAAM,EAAU,GAAGL,GAASC,IACrCC,EAAAA,IAACN,EAAmB,QAAnB,CACA,IAAAK,EACA,UAAU,2HACT,GAAGD,EAEJ,eAAC,MAAA,CAAI,UAAWG,EAAG,YAAaJ,CAAS,EAAI,SAAAM,CAAA,CAAS,CAAA,CACvD,CACA,EAEDG,EAAiB,YAAcZ,EAAmB,QAAQ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as e}from"../../assets/jsx-runtime-D_zvdyIk.js";import{A as r,a as s,b as
|
|
1
|
+
import{j as e}from"../../assets/jsx-runtime-D_zvdyIk.js";import{A as r,a as s,b as t,c as i}from"./accordion.js";import"@radix-ui/react-accordion";import"lucide-react";import"react";import"../../lib/utils/cn.js";import"clsx";import"tailwind-merge";import"date-fns-tz";const n=()=>e.jsx("div",{className:"max-w-[350px]",children:e.jsxs(r,{type:"single",collapsible:!0,children:[e.jsxs(s,{value:"item-1",children:[e.jsx(t,{className:"text-blue-800 md:text-orange-700 lg:text-teal-800",children:"Is it accessible?"}),e.jsx(i,{children:"Yes. It adheres to the WAI-ARIA design pattern."})]}),e.jsxs(s,{value:"item-2",children:[e.jsx(t,{children:"Is it styled?"}),e.jsx(i,{children:"Yes. It has a default style."})]}),e.jsxs(s,{value:"item-3",children:[e.jsx(t,{children:"Is it animated?"}),e.jsx(i,{children:"Yes. It uses CSS transitions to animate its content."})]}),e.jsxs(s,{value:"item-4",children:[e.jsx(t,{children:"Can it be closed?"}),e.jsx(i,{children:"Yes. It is closed by default."})]})]})});n.bind({});
|
|
2
2
|
//# sourceMappingURL=accordion.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.stories.js","sources":["../../../src/components/accordion/accordion.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from './accordion'\n\nconst meta: Meta<typeof Accordion> = {\n\ttitle: 'Components/
|
|
1
|
+
{"version":3,"file":"accordion.stories.js","sources":["../../../src/components/accordion/accordion.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from './accordion'\n\nconst meta: Meta<typeof Accordion> = {\n\ttitle: 'Components/Accordion',\n\tcomponent: Accordion,\n\ttags: ['autodocs'],\n}\n\nexport default meta\ntype Story = StoryObj<typeof Accordion>\n\nconst Template = () => {\n\treturn (\n\t\t<div className=\"max-w-[350px]\">\n\t\t\t<Accordion type=\"single\" collapsible>\n\t\t\t\t<AccordionItem value=\"item-1\">\n\t\t\t\t\t<AccordionTrigger className=\"text-blue-800 md:text-orange-700 lg:text-teal-800\">\n\t\t\t\t\t\tIs it accessible?\n\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t<AccordionContent>\n\t\t\t\t\t\tYes. It adheres to the WAI-ARIA design pattern.\n\t\t\t\t\t</AccordionContent>\n\t\t\t\t</AccordionItem>\n\t\t\t\t<AccordionItem value=\"item-2\">\n\t\t\t\t\t<AccordionTrigger>Is it styled?</AccordionTrigger>\n\t\t\t\t\t<AccordionContent>Yes. It has a default style.</AccordionContent>\n\t\t\t\t</AccordionItem>\n\t\t\t\t<AccordionItem value=\"item-3\">\n\t\t\t\t\t<AccordionTrigger>Is it animated?</AccordionTrigger>\n\t\t\t\t\t<AccordionContent>\n\t\t\t\t\t\tYes. It uses CSS transitions to animate its content.\n\t\t\t\t\t</AccordionContent>\n\t\t\t\t</AccordionItem>\n\t\t\t\t<AccordionItem value=\"item-4\">\n\t\t\t\t\t<AccordionTrigger>Can it be closed?</AccordionTrigger>\n\t\t\t\t\t<AccordionContent>Yes. It is closed by default.</AccordionContent>\n\t\t\t\t</AccordionItem>\n\t\t\t</Accordion>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","jsx","Accordion","jsxs","AccordionItem","AccordionTrigger","AccordionContent"],"mappings":"4QAcA,MAAMA,EAAW,IAEfC,EAAAA,IAAC,OAAI,UAAU,gBACd,gBAACC,EAAA,CAAU,KAAK,SAAS,YAAW,GACnC,SAAA,CAAAC,EAAAA,KAACC,EAAA,CAAc,MAAM,SACpB,SAAA,CAAAH,EAAAA,IAACI,EAAA,CAAiB,UAAU,oDAAoD,SAAA,oBAEhF,EACAJ,EAAAA,IAACK,GAAiB,SAAA,iDAAA,CAElB,CAAA,EACD,EACAH,EAAAA,KAACC,EAAA,CAAc,MAAM,SACpB,SAAA,CAAAH,EAAAA,IAACI,GAAiB,SAAA,eAAA,CAAa,EAC/BJ,EAAAA,IAACK,GAAiB,SAAA,8BAAA,CAA4B,CAAA,EAC/C,EACAH,EAAAA,KAACC,EAAA,CAAc,MAAM,SACpB,SAAA,CAAAH,EAAAA,IAACI,GAAiB,SAAA,iBAAA,CAAe,EACjCJ,EAAAA,IAACK,GAAiB,SAAA,sDAAA,CAElB,CAAA,EACD,EACAH,EAAAA,KAACC,EAAA,CAAc,MAAM,SACpB,SAAA,CAAAH,EAAAA,IAACI,GAAiB,SAAA,mBAAA,CAAiB,EACnCJ,EAAAA,IAACK,GAAiB,SAAA,+BAAA,CAA6B,CAAA,CAAA,CAChD,CAAA,CAAA,CACD,CAAA,CACD,EAKON,EAAS,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adaptive-input.js","sources":["../../../src/components/adaptive-input/adaptive-input.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport * as React from 'react'\nimport { Input, InputProps } from '../input'\n\nexport interface AdaptiveInputProps extends InputProps {\n\tleftIcon?: React.ReactNode\n\trightIcon?: React.ReactNode\n\tmask?: string // New prop for the mask\n}\n\nconst applyMask = (value: string, mask: string): string => {\n\tconst cleanValue = value.replace(/\\D/g, '')\n\tlet maskedValue = ''\n\tlet maskIndex = 0\n\tlet valueIndex = 0\n\n\twhile (maskIndex < mask.length && valueIndex < cleanValue.length) {\n\t\tif (mask[maskIndex] === '0') {\n\t\t\tmaskedValue += cleanValue[valueIndex]\n\t\t\tvalueIndex++\n\t\t} else {\n\t\t\tmaskedValue += mask[maskIndex]\n\t\t}\n\t\tmaskIndex++\n\t}\n\n\treturn maskedValue\n}\n\nconst AdaptiveInput = React.forwardRef<HTMLInputElement, AdaptiveInputProps>(\n\t({ className, leftIcon, rightIcon, mask, onChange, ...props }, ref) => {\n\t\tconst handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst input = e.target\n\t\t\tif (mask) {\n\t\t\t\tconst maskedValue = applyMask(input.value, mask)\n\t\t\t\tinput.value = maskedValue\n\t\t\t}\n\t\t\tonChange?.(e) // Call the original onChange if provided\n\t\t}\n\n\t\treturn (\n\t\t\t<div className=\"relative w-full\">\n\t\t\t\t{leftIcon && (\n\t\t\t\t\t<div className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground\">\n\t\t\t\t\t\t{leftIcon}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<Input\n\t\t\t\t\tclassName={cn(leftIcon && 'pl-8', rightIcon && 'pr-8', className)}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tonInput={handleInputChange} // Attach the input handler\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t{rightIcon && (\n\t\t\t\t\t<div className=\"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground\">\n\t\t\t\t\t\t{rightIcon}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nAdaptiveInput.displayName = 'AdaptiveInput'\n\nexport { AdaptiveInput }\n"],"names":["applyMask","value","mask","cleanValue","maskedValue","maskIndex","valueIndex","AdaptiveInput","React","className","leftIcon","rightIcon","onChange","props","ref","handleInputChange","e","input","jsxs","jsx","Input","cn"],"mappings":"0PAUA,MAAMA,EAAY,CAACC,EAAeC,IAAyB,CAC1D,MAAMC,EAAaF,EAAM,QAAQ,MAAO,EAAE,EAC1C,IAAIG,EAAc,GACdC,EAAY,EACZC,EAAa,EAEjB,KAAOD,EAAYH,EAAK,QAAUI,EAAaH,EAAW,QACrDD,EAAKG,CAAS,IAAM,KACvBD,GAAeD,EAAWG,CAAU,EACpCA,KAEAF,GAAeF,EAAKG,CAAS,EAE9BA,
|
|
1
|
+
{"version":3,"file":"adaptive-input.js","sources":["../../../src/components/adaptive-input/adaptive-input.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport * as React from 'react'\nimport { Input, InputProps } from '../input'\n\nexport interface AdaptiveInputProps extends InputProps {\n\tleftIcon?: React.ReactNode\n\trightIcon?: React.ReactNode\n\tmask?: string // New prop for the mask\n}\n\nconst applyMask = (value: string, mask: string): string => {\n\tconst cleanValue = value.replace(/\\D/g, '')\n\tlet maskedValue = ''\n\tlet maskIndex = 0\n\tlet valueIndex = 0\n\n\twhile (maskIndex < mask.length && valueIndex < cleanValue.length) {\n\t\tif (mask[maskIndex] === '0') {\n\t\t\tmaskedValue += cleanValue[valueIndex]\n\t\t\tvalueIndex++\n\t\t} else {\n\t\t\tmaskedValue += mask[maskIndex]\n\t\t}\n\t\tmaskIndex++\n\t}\n\n\treturn maskedValue\n}\n\nconst AdaptiveInput = React.forwardRef<HTMLInputElement, AdaptiveInputProps>(\n\t({ className, leftIcon, rightIcon, mask, onChange, ...props }, ref) => {\n\t\tconst handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tconst input = e.target\n\t\t\tif (mask) {\n\t\t\t\tconst maskedValue = applyMask(input.value, mask)\n\t\t\t\tinput.value = maskedValue\n\t\t\t}\n\t\t\tonChange?.(e) // Call the original onChange if provided\n\t\t}\n\n\t\treturn (\n\t\t\t<div className=\"relative w-full\">\n\t\t\t\t{leftIcon && (\n\t\t\t\t\t<div className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground\">\n\t\t\t\t\t\t{leftIcon}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<Input\n\t\t\t\t\tclassName={cn(leftIcon && 'pl-8', rightIcon && 'pr-8', className)}\n\t\t\t\t\tref={ref}\n\t\t\t\t\tonInput={handleInputChange} // Attach the input handler\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t{rightIcon && (\n\t\t\t\t\t<div className=\"absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground\">\n\t\t\t\t\t\t{rightIcon}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nAdaptiveInput.displayName = 'AdaptiveInput'\n\nexport { AdaptiveInput }\n"],"names":["applyMask","value","mask","cleanValue","maskedValue","maskIndex","valueIndex","AdaptiveInput","React","className","leftIcon","rightIcon","onChange","props","ref","handleInputChange","e","input","jsxs","jsx","Input","cn"],"mappings":"0PAUA,MAAMA,EAAY,CAACC,EAAeC,IAAyB,CAC1D,MAAMC,EAAaF,EAAM,QAAQ,MAAO,EAAE,EAC1C,IAAIG,EAAc,GACdC,EAAY,EACZC,EAAa,EAEjB,KAAOD,EAAYH,EAAK,QAAUI,EAAaH,EAAW,QACrDD,EAAKG,CAAS,IAAM,KACvBD,GAAeD,EAAWG,CAAU,EACpCA,KAEAF,GAAeF,EAAKG,CAAS,EAE9BA,IAGD,OAAOD,CACR,EAEMG,EAAgBC,EAAM,WAC3B,CAAC,CAAE,UAAAC,EAAW,SAAAC,EAAU,UAAAC,EAAW,KAAAT,EAAM,SAAAU,EAAU,GAAGC,CAAA,EAASC,IAAQ,CACtE,MAAMC,EAAqBC,GAA2C,CACrE,MAAMC,EAAQD,EAAE,OAChB,GAAId,EAAM,CACT,MAAME,EAAcJ,EAAUiB,EAAM,MAAOf,CAAI,EAC/Ce,EAAM,MAAQb,CAAA,CAEfQ,GAAA,MAAAA,EAAWI,EAAC,EAGb,OACCE,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAAR,GACAS,EAAAA,IAAC,MAAA,CAAI,UAAU,iEACb,SAAAT,EACF,EAEDS,EAAAA,IAACC,EAAA,CACA,UAAWC,EAAGX,GAAY,OAAQC,GAAa,OAAQF,CAAS,EAChE,IAAAK,EACA,QAASC,EACR,GAAGF,CAAA,CAAA,EAEJF,GACAQ,EAAAA,IAAC,MAAA,CAAI,UAAU,kEACb,SAAAR,CAAA,CACF,CAAA,EAEF,CAAA,CAGH,EAEAJ,EAAc,YAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adaptive-input.stories.js","sources":["../../../src/components/adaptive-input/adaptive-input.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\n\nimport { AdaptiveInput } from './adaptive-input'\nimport { HelpCircle, Phone, User } from 'lucide-react'\n\nconst meta: Meta<typeof AdaptiveInput> = {\n\ttitle: 'Components/input/adaptiveInput',\n\tcomponent: AdaptiveInput,\n}\n\nexport default meta\ntype Story = StoryObj<typeof AdaptiveInput>\n\nconst Template = () => {\n\treturn (\n\t\t<div className=\"w-64\">\n\t\t\t<AdaptiveInput\n\t\t\t\tleftIcon={<Phone className=\"w-4 h-4\" />}\n\t\t\t\trightIcon={<HelpCircle className=\"w-4 h-4\" />}\n\t\t\t\tmask=\"+00 0000-0000\"\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","jsx","AdaptiveInput","Phone","HelpCircle"],"mappings":"qTAeA,MAAMA,EAAW,IAEfC,EAAAA,IAAC,
|
|
1
|
+
{"version":3,"file":"adaptive-input.stories.js","sources":["../../../src/components/adaptive-input/adaptive-input.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\n\nimport { AdaptiveInput } from './adaptive-input'\nimport { HelpCircle, Phone, User } from 'lucide-react'\n\nconst meta: Meta<typeof AdaptiveInput> = {\n\ttitle: 'Components/input/adaptiveInput',\n\tcomponent: AdaptiveInput,\n}\n\nexport default meta\ntype Story = StoryObj<typeof AdaptiveInput>\n\nconst Template = () => {\n\treturn (\n\t\t<div className=\"w-64\">\n\t\t\t<AdaptiveInput\n\t\t\t\tleftIcon={<Phone className=\"w-4 h-4\" />}\n\t\t\t\trightIcon={<HelpCircle className=\"w-4 h-4\" />}\n\t\t\t\tmask=\"+00 0000-0000\"\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","jsx","AdaptiveInput","Phone","HelpCircle"],"mappings":"qTAeA,MAAMA,EAAW,IAEfC,EAAAA,IAAC,MAAA,CAAI,UAAU,OACd,SAAAA,EAAAA,IAACC,EAAA,CACA,SAAUD,EAAAA,IAACE,EAAA,CAAM,UAAU,SAAA,CAAU,EACrC,UAAWF,EAAAA,IAACG,EAAA,CAAW,UAAU,SAAA,CAAU,EAC3C,KAAK,eAAA,CAAA,EAEP,EAKOJ,EAAS,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert-dialog.js","sources":["../../../src/components/alert-dialog/alert-dialog.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'\nimport * as React from 'react'\nimport { buttonVariants } from '../button'\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Overlay\n\t\tclassName={cn(\n\t\t\t'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t\tref={ref}\n\t/>\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Content>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPortal>\n\t\t<AlertDialogOverlay />\n\t\t<AlertDialogPrimitive.Content\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t</AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div\n\t\tclassName={cn('flex flex-col space-y-2 text-center sm:text-left', className)}\n\t\t{...props}\n\t/>\n)\nAlertDialogHeader.displayName = 'AlertDialogHeader'\n\nconst AlertDialogFooter = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n)\nAlertDialogFooter.displayName = 'AlertDialogFooter'\n\nconst AlertDialogTitle = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Title>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Title\n\t\tref={ref}\n\t\tclassName={cn('text-lg font-semibold', className)}\n\t\t{...props}\n\t/>\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Description>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Description\n\t\tref={ref}\n\t\tclassName={cn('text-sm text-muted-foreground', className)}\n\t\t{...props}\n\t/>\n))\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Action>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Action\n\t\tref={ref}\n\t\tclassName={cn(buttonVariants(), className)}\n\t\t{...props}\n\t/>\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Cancel\n\t\tref={ref}\n\t\tclassName={cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className)}\n\t\t{...props}\n\t/>\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogOverlay,\n\tAlertDialogPortal,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n}\n"],"names":["AlertDialog","AlertDialogPrimitive","AlertDialogTrigger","AlertDialogPortal","AlertDialogOverlay","React","className","props","ref","jsx","cn","AlertDialogContent","jsxs","AlertDialogHeader","AlertDialogFooter","AlertDialogTitle","AlertDialogDescription","AlertDialogAction","buttonVariants","AlertDialogCancel"],"mappings":"uYAKA,MAAMA,EAAcC,EAAqB,KAEnCC,EAAqBD,EAAqB,QAE1CE,EAAoBF,EAAqB,OAEzCG,EAAqBC,EAAM,WAG/B,CAAC,CAAE,UAAAC,EAAW,GAAGC,
|
|
1
|
+
{"version":3,"file":"alert-dialog.js","sources":["../../../src/components/alert-dialog/alert-dialog.tsx"],"sourcesContent":["import { cn } from '@/lib/utils'\nimport * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'\nimport * as React from 'react'\nimport { buttonVariants } from '../button'\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Overlay\n\t\tclassName={cn(\n\t\t\t'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t\tref={ref}\n\t/>\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Content>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPortal>\n\t\t<AlertDialogOverlay />\n\t\t<AlertDialogPrimitive.Content\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t</AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div\n\t\tclassName={cn('flex flex-col space-y-2 text-center sm:text-left', className)}\n\t\t{...props}\n\t/>\n)\nAlertDialogHeader.displayName = 'AlertDialogHeader'\n\nconst AlertDialogFooter = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n)\nAlertDialogFooter.displayName = 'AlertDialogFooter'\n\nconst AlertDialogTitle = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Title>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Title\n\t\tref={ref}\n\t\tclassName={cn('text-lg font-semibold', className)}\n\t\t{...props}\n\t/>\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Description>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Description\n\t\tref={ref}\n\t\tclassName={cn('text-sm text-muted-foreground', className)}\n\t\t{...props}\n\t/>\n))\nAlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Action>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Action\n\t\tref={ref}\n\t\tclassName={cn(buttonVariants(), className)}\n\t\t{...props}\n\t/>\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n\tReact.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n\tReact.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n\t<AlertDialogPrimitive.Cancel\n\t\tref={ref}\n\t\tclassName={cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className)}\n\t\t{...props}\n\t/>\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogOverlay,\n\tAlertDialogPortal,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n}\n"],"names":["AlertDialog","AlertDialogPrimitive","AlertDialogTrigger","AlertDialogPortal","AlertDialogOverlay","React","className","props","ref","jsx","cn","AlertDialogContent","jsxs","AlertDialogHeader","AlertDialogFooter","AlertDialogTitle","AlertDialogDescription","AlertDialogAction","buttonVariants","AlertDialogCancel"],"mappings":"uYAKA,MAAMA,EAAcC,EAAqB,KAEnCC,EAAqBD,EAAqB,QAE1CE,EAAoBF,EAAqB,OAEzCG,EAAqBC,EAAM,WAG/B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC3BC,EAAAA,IAACR,EAAqB,QAArB,CACA,UAAWS,EACV,yJACAJ,CAAA,EAEA,GAAGC,EACJ,IAAAC,CAAA,CACD,CACA,EACDJ,EAAmB,YAAcH,EAAqB,QAAQ,YAE9D,MAAMU,EAAqBN,EAAM,WAG/B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC3BI,EAAAA,KAACT,EAAA,CACA,SAAA,CAAAM,EAAAA,IAACL,EAAA,EAAmB,EACpBK,EAAAA,IAACR,EAAqB,QAArB,CACA,IAAAO,EACA,UAAWE,EACV,8fACAJ,CAAA,EAEA,GAAGC,CAAA,CAAA,CACL,EACD,CACA,EACDI,EAAmB,YAAcV,EAAqB,QAAQ,YAE9D,MAAMY,EAAoB,CAAC,CAC1B,UAAAP,EACA,GAAGC,CACJ,IACCE,EAAAA,IAAC,MAAA,CACA,UAAWC,EAAG,mDAAoDJ,CAAS,EAC1E,GAAGC,CAAA,CACL,EAEDM,EAAkB,YAAc,oBAEhC,MAAMC,EAAoB,CAAC,CAC1B,UAAAR,EACA,GAAGC,CACJ,IACCE,EAAAA,IAAC,MAAA,CACA,UAAWC,EACV,gEACAJ,CAAA,EAEA,GAAGC,CAAA,CACL,EAEDO,EAAkB,YAAc,oBAEhC,MAAMC,EAAmBV,EAAM,WAG7B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC3BC,EAAAA,IAACR,EAAqB,MAArB,CACA,IAAAO,EACA,UAAWE,EAAG,wBAAyBJ,CAAS,EAC/C,GAAGC,CAAA,CACL,CACA,EACDQ,EAAiB,YAAcd,EAAqB,MAAM,YAE1D,MAAMe,EAAyBX,EAAM,WAGnC,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC3BC,EAAAA,IAACR,EAAqB,YAArB,CACA,IAAAO,EACA,UAAWE,EAAG,gCAAiCJ,CAAS,EACvD,GAAGC,CAAA,CACL,CACA,EACDS,EAAuB,YAAcf,EAAqB,YAAY,YAEtE,MAAMgB,EAAoBZ,EAAM,WAG9B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC3BC,EAAAA,IAACR,EAAqB,OAArB,CACA,IAAAO,EACA,UAAWE,EAAGQ,EAAA,EAAkBZ,CAAS,EACxC,GAAGC,CAAA,CACL,CACA,EACDU,EAAkB,YAAchB,EAAqB,OAAO,YAE5D,MAAMkB,EAAoBd,EAAM,WAG9B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC3BC,EAAAA,IAACR,EAAqB,OAArB,CACA,IAAAO,EACA,UAAWE,EAAGQ,EAAe,CAAE,QAAS,UAAW,EAAG,eAAgBZ,CAAS,EAC9E,GAAGC,CAAA,CACL,CACA,EACDY,EAAkB,YAAclB,EAAqB,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert-dialog.stories.js","sources":["../../../src/components/alert-dialog/alert-dialog.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n} from './alert-dialog'\nimport { Button } from '../button'\n\nconst meta: Meta<typeof AlertDialog> = {\n\tcomponent: AlertDialog,\n}\n\nexport default meta\ntype Story = StoryObj<typeof AlertDialog>\n\nconst Template = () => {\n\treturn (\n\t\t<AlertDialog>\n\t\t\t<AlertDialogTrigger asChild>\n\t\t\t\t<Button>Open dialog</Button>\n\t\t\t</AlertDialogTrigger>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Alert title</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>This is the alert description</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<div className=\"bg-gray-200 p-4 h-20 text-sm\">Content goes here</div>\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction>Submit</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","AlertDialog","jsx","AlertDialogTrigger","Button","AlertDialogContent","jsxs","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"qcAuBA,MAAMA,EAAW,WAEdC,
|
|
1
|
+
{"version":3,"file":"alert-dialog.stories.js","sources":["../../../src/components/alert-dialog/alert-dialog.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n\tAlertDialogTrigger,\n} from './alert-dialog'\nimport { Button } from '../button'\n\nconst meta: Meta<typeof AlertDialog> = {\n\tcomponent: AlertDialog,\n}\n\nexport default meta\ntype Story = StoryObj<typeof AlertDialog>\n\nconst Template = () => {\n\treturn (\n\t\t<AlertDialog>\n\t\t\t<AlertDialogTrigger asChild>\n\t\t\t\t<Button>Open dialog</Button>\n\t\t\t</AlertDialogTrigger>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Alert title</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription>This is the alert description</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\t\t\t\t<div className=\"bg-gray-200 p-4 h-20 text-sm\">Content goes here</div>\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction>Submit</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["Template","AlertDialog","jsx","AlertDialogTrigger","Button","AlertDialogContent","jsxs","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"mappings":"qcAuBA,MAAMA,EAAW,WAEdC,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,GAAmB,QAAO,GAC1B,SAAAD,MAACE,EAAA,CAAO,uBAAW,CAAA,CACpB,SACCC,EAAA,CACA,SAAA,CAAAC,OAACC,EAAA,CACA,SAAA,CAAAL,EAAAA,IAACM,GAAiB,SAAA,aAAA,CAAW,EAC7BN,EAAAA,IAACO,GAAuB,SAAA,+BAAA,CAA6B,CAAA,EACtD,EACAP,EAAAA,IAAC,MAAA,CAAI,UAAU,+BAA+B,SAAA,oBAAiB,SAE9DQ,EAAA,CACA,SAAA,CAAAR,EAAAA,IAACS,GAAkB,SAAA,QAAA,CAAM,EACzBT,EAAAA,IAACU,GAAkB,SAAA,QAAA,CAAM,CAAA,CAAA,CAC1B,CAAA,CAAA,CACD,CAAA,EACD,EAKOZ,EAAS,KAAK,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.js","sources":["../../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["'use client'\n\nimport { cn, containSearchStrings } from '@/lib/utils'\nimport { Search, X } from 'lucide-react'\nimport React, {\n\tforwardRef,\n\tKeyboardEvent,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from 'react'\nimport { AdaptiveInput } from '../adaptive-input'\n\nexport interface Option {\n\tlabel: string\n\tvalue: string\n}\n\ninterface AutocompleteProps {\n\toptions: Option[]\n\tplaceholder?: string\n\tonSelect: (option: Option | null) => void\n\tonChange?: (value: string) => void\n\tdefaultSelectedOption?: Option\n\tclassName?: string\n}\n\nexport const Autocomplete = forwardRef(function Autocomplete(\n\tprops: AutocompleteProps,\n\tref: React.Ref<{ clearSelection: () => void }>,\n) {\n\tconst {\n\t\toptions,\n\t\tplaceholder = 'Type to search...',\n\t\tonSelect,\n\t\tdefaultSelectedOption,\n\t} = props\n\n\tconst [inputValue, setInputValue] = useState(defaultSelectedOption?.label || '')\n\tconst [filteredOptions, setFilteredOptions] = useState<Option[]>([])\n\tconst [isOpen, setIsOpen] = useState(false)\n\tconst [activeIndex, setActiveIndex] = useState(-1)\n\tconst [dropdownPosition, setDropdownPosition] = useState<'down' | 'up'>('down')\n\tconst [selectedOption, setSelectedOption] = useState<Option | null>(\n\t\tdefaultSelectedOption || null,\n\t)\n\tconst autocompleteRef = useRef<HTMLDivElement>(null)\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\tconst listRef = useRef<HTMLUListElement>(null)\n\n\t// Expose the clearSelection method via the ref\n\tuseImperativeHandle(ref, () => ({\n\t\tclearSelection: () => {\n\t\t\tsetSelectedOption(null)\n\t\t\tsetInputValue('')\n\t\t\tonSelect(null)\n\t\t},\n\t}))\n\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tautocompleteRef.current &&\n\t\t\t\t!autocompleteRef.current.contains(event.target as Node)\n\t\t\t) {\n\t\t\t\tsetIsOpen(false)\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('click', handleClickOutside)\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('click', handleClickOutside)\n\t\t}\n\t}, [])\n\n\tuseEffect(() => {\n\t\tconst filtered = options.filter((option) =>\n\t\t\tcontainSearchStrings(option.label, inputValue),\n\t\t)\n\t\tsetFilteredOptions(filtered)\n\t\tsetActiveIndex(-1)\n\t}, [inputValue, options])\n\n\tuseEffect(() => {\n\t\tif (isOpen && inputRef.current) {\n\t\t\tconst rect = inputRef.current.getBoundingClientRect()\n\t\t\tconst spaceBelow = window.innerHeight - rect.bottom\n\t\t\tconst spaceAbove = rect.top\n\t\t\tconst listHeight = Math.min(filteredOptions.length * 40, 240) // Assuming each option is 40px high, max 240px\n\n\t\t\tsetDropdownPosition(\n\t\t\t\tspaceBelow >= listHeight || spaceBelow > spaceAbove ? 'down' : 'up',\n\t\t\t)\n\t\t}\n\t}, [isOpen, filteredOptions])\n\n\tconst handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetInputValue(e.target.value)\n\t\tprops.onChange?.(e.target.value)\n\t\tsetSelectedOption(null)\n\t\tsetIsOpen(true)\n\t}\n\n\tconst handleOptionClick = (option: Option) => {\n\t\tsetInputValue(option.label)\n\t\tsetSelectedOption(option)\n\t\tsetIsOpen(false)\n\t\tonSelect(option)\n\t}\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n\t\tif (!isOpen) {\n\t\t\tif (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n\t\t\t\tsetIsOpen(true)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tsetActiveIndex((prev) => (prev < filteredOptions.length - 1 ? prev + 1 : prev))\n\t\t\t\tbreak\n\t\t\tcase 'ArrowUp':\n\t\t\t\tsetActiveIndex((prev) => (prev > 0 ? prev - 1 : prev))\n\t\t\t\tbreak\n\t\t\tcase 'Enter':\n\t\t\t\tif (activeIndex >= 0 && activeIndex < filteredOptions.length) {\n\t\t\t\t\thandleOptionClick(filteredOptions[activeIndex])\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase 'Escape':\n\t\t\t\tsetIsOpen(false)\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tuseEffect(() => {\n\t\tif (isOpen && listRef.current && activeIndex >= 0) {\n\t\t\tconst activeElement = listRef.current.children[activeIndex] as HTMLElement\n\t\t\tactiveElement.scrollIntoView({ block: 'nearest' })\n\t\t}\n\t}, [activeIndex, isOpen])\n\n\treturn (\n\t\t<div ref={autocompleteRef} className=\"relative w-full\">\n\t\t\t<AdaptiveInput\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={inputValue}\n\t\t\t\tonChange={handleInputChange}\n\t\t\t\tonFocus={() => setIsOpen(true)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tclassName={cn('w-full', props.className)}\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\taria-controls=\"autocomplete-list\"\n\t\t\t\trole=\"combobox\"\n\t\t\t\tleftIcon={<Search className=\"w-4 h-4\" />}\n\t\t\t\trightIcon={\n\t\t\t\t\tselectedOption ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclassName=\"mt-[5px]\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tsetSelectedOption(null)\n\t\t\t\t\t\t\t\tsetInputValue('')\n\t\t\t\t\t\t\t\tonSelect(null)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"w-5 h-5\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isOpen && filteredOptions.length > 0 && (\n\t\t\t\t<ul\n\t\t\t\t\tid=\"autocomplete-list\"\n\t\t\t\t\tref={listRef}\n\t\t\t\t\tclassName={`absolute z-10 w-full bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-auto ${\n\t\t\t\t\t\tdropdownPosition === 'up' ? 'bottom-full mb-1' : 'top-full mt-1'\n\t\t\t\t\t}`}\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t>\n\t\t\t\t\t{filteredOptions.map((option, index) => {\n\t\t\t\t\t\tconst parts = option.label.split(new RegExp(`(${inputValue})`, 'gi'))\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\tonClick={() => handleOptionClick(option)}\n\t\t\t\t\t\t\t\tclassName={`px-4 py-2 cursor-pointer ${\n\t\t\t\t\t\t\t\t\tindex === activeIndex ? 'bg-blue-100' : 'hover:bg-gray-100'\n\t\t\t\t\t\t\t\t} ${selectedOption?.value === option.value ? 'bg-blue-200' : ''}`}\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\taria-selected={index === activeIndex}\n\t\t\t\t\t\t\t\tid={`option-${index}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{parts.map((part, i) =>\n\t\t\t\t\t\t\t\t\tpart.toLowerCase() === inputValue.toLowerCase() ? (\n\t\t\t\t\t\t\t\t\t\t<span key={i} className=\"font-bold text-blue-600\">\n\t\t\t\t\t\t\t\t\t\t\t{part}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\tpart\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n"],"names":["Autocomplete","forwardRef","props","ref","options","placeholder","onSelect","defaultSelectedOption","inputValue","setInputValue","useState","filteredOptions","setFilteredOptions","isOpen","setIsOpen","activeIndex","setActiveIndex","dropdownPosition","setDropdownPosition","selectedOption","setSelectedOption","autocompleteRef","useRef","inputRef","listRef","useImperativeHandle","useEffect","handleClickOutside","event","filtered","option","containSearchStrings","rect","spaceBelow","spaceAbove","listHeight","handleInputChange","_a","handleOptionClick","handleKeyDown","prev","jsxs","jsx","AdaptiveInput","cn","Search","X","index","parts","part","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sources":["../../../src/components/autocomplete/autocomplete.tsx"],"sourcesContent":["'use client'\n\nimport { cn, containSearchStrings } from '@/lib/utils'\nimport { Search, X } from 'lucide-react'\nimport React, {\n\tforwardRef,\n\tKeyboardEvent,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from 'react'\nimport { AdaptiveInput } from '../adaptive-input'\n\nexport interface Option {\n\tlabel: string\n\tvalue: string\n}\n\ninterface AutocompleteProps {\n\toptions: Option[]\n\tplaceholder?: string\n\tonSelect: (option: Option | null) => void\n\tonChange?: (value: string) => void\n\tdefaultSelectedOption?: Option\n\tclassName?: string\n}\n\nexport const Autocomplete = forwardRef(function Autocomplete(\n\tprops: AutocompleteProps,\n\tref: React.Ref<{ clearSelection: () => void }>,\n) {\n\tconst {\n\t\toptions,\n\t\tplaceholder = 'Type to search...',\n\t\tonSelect,\n\t\tdefaultSelectedOption,\n\t} = props\n\n\tconst [inputValue, setInputValue] = useState(defaultSelectedOption?.label || '')\n\tconst [filteredOptions, setFilteredOptions] = useState<Option[]>([])\n\tconst [isOpen, setIsOpen] = useState(false)\n\tconst [activeIndex, setActiveIndex] = useState(-1)\n\tconst [dropdownPosition, setDropdownPosition] = useState<'down' | 'up'>('down')\n\tconst [selectedOption, setSelectedOption] = useState<Option | null>(\n\t\tdefaultSelectedOption || null,\n\t)\n\tconst autocompleteRef = useRef<HTMLDivElement>(null)\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\tconst listRef = useRef<HTMLUListElement>(null)\n\n\t// Expose the clearSelection method via the ref\n\tuseImperativeHandle(ref, () => ({\n\t\tclearSelection: () => {\n\t\t\tsetSelectedOption(null)\n\t\t\tsetInputValue('')\n\t\t\tonSelect(null)\n\t\t},\n\t}))\n\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tautocompleteRef.current &&\n\t\t\t\t!autocompleteRef.current.contains(event.target as Node)\n\t\t\t) {\n\t\t\t\tsetIsOpen(false)\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('click', handleClickOutside)\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('click', handleClickOutside)\n\t\t}\n\t}, [])\n\n\tuseEffect(() => {\n\t\tconst filtered = options.filter((option) =>\n\t\t\tcontainSearchStrings(option.label, inputValue),\n\t\t)\n\t\tsetFilteredOptions(filtered)\n\t\tsetActiveIndex(-1)\n\t}, [inputValue, options])\n\n\tuseEffect(() => {\n\t\tif (isOpen && inputRef.current) {\n\t\t\tconst rect = inputRef.current.getBoundingClientRect()\n\t\t\tconst spaceBelow = window.innerHeight - rect.bottom\n\t\t\tconst spaceAbove = rect.top\n\t\t\tconst listHeight = Math.min(filteredOptions.length * 40, 240) // Assuming each option is 40px high, max 240px\n\n\t\t\tsetDropdownPosition(\n\t\t\t\tspaceBelow >= listHeight || spaceBelow > spaceAbove ? 'down' : 'up',\n\t\t\t)\n\t\t}\n\t}, [isOpen, filteredOptions])\n\n\tconst handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetInputValue(e.target.value)\n\t\tprops.onChange?.(e.target.value)\n\t\tsetSelectedOption(null)\n\t\tsetIsOpen(true)\n\t}\n\n\tconst handleOptionClick = (option: Option) => {\n\t\tsetInputValue(option.label)\n\t\tsetSelectedOption(option)\n\t\tsetIsOpen(false)\n\t\tonSelect(option)\n\t}\n\n\tconst handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n\t\tif (!isOpen) {\n\t\t\tif (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n\t\t\t\tsetIsOpen(true)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tsetActiveIndex((prev) => (prev < filteredOptions.length - 1 ? prev + 1 : prev))\n\t\t\t\tbreak\n\t\t\tcase 'ArrowUp':\n\t\t\t\tsetActiveIndex((prev) => (prev > 0 ? prev - 1 : prev))\n\t\t\t\tbreak\n\t\t\tcase 'Enter':\n\t\t\t\tif (activeIndex >= 0 && activeIndex < filteredOptions.length) {\n\t\t\t\t\thandleOptionClick(filteredOptions[activeIndex])\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase 'Escape':\n\t\t\t\tsetIsOpen(false)\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tuseEffect(() => {\n\t\tif (isOpen && listRef.current && activeIndex >= 0) {\n\t\t\tconst activeElement = listRef.current.children[activeIndex] as HTMLElement\n\t\t\tactiveElement.scrollIntoView({ block: 'nearest' })\n\t\t}\n\t}, [activeIndex, isOpen])\n\n\treturn (\n\t\t<div ref={autocompleteRef} className=\"relative w-full\">\n\t\t\t<AdaptiveInput\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={inputValue}\n\t\t\t\tonChange={handleInputChange}\n\t\t\t\tonFocus={() => setIsOpen(true)}\n\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tclassName={cn('w-full', props.className)}\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\taria-controls=\"autocomplete-list\"\n\t\t\t\trole=\"combobox\"\n\t\t\t\tleftIcon={<Search className=\"w-4 h-4\" />}\n\t\t\t\trightIcon={\n\t\t\t\t\tselectedOption ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclassName=\"mt-[5px]\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tsetSelectedOption(null)\n\t\t\t\t\t\t\t\tsetInputValue('')\n\t\t\t\t\t\t\t\tonSelect(null)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"w-5 h-5\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{isOpen && filteredOptions.length > 0 && (\n\t\t\t\t<ul\n\t\t\t\t\tid=\"autocomplete-list\"\n\t\t\t\t\tref={listRef}\n\t\t\t\t\tclassName={`absolute z-10 w-full bg-white border border-gray-300 rounded-md shadow-lg max-h-60 overflow-auto ${\n\t\t\t\t\t\tdropdownPosition === 'up' ? 'bottom-full mb-1' : 'top-full mt-1'\n\t\t\t\t\t}`}\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t>\n\t\t\t\t\t{filteredOptions.map((option, index) => {\n\t\t\t\t\t\tconst parts = option.label.split(new RegExp(`(${inputValue})`, 'gi'))\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\tonClick={() => handleOptionClick(option)}\n\t\t\t\t\t\t\t\tclassName={`px-4 py-2 cursor-pointer ${\n\t\t\t\t\t\t\t\t\tindex === activeIndex ? 'bg-blue-100' : 'hover:bg-gray-100'\n\t\t\t\t\t\t\t\t} ${selectedOption?.value === option.value ? 'bg-blue-200' : ''}`}\n\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\taria-selected={index === activeIndex}\n\t\t\t\t\t\t\t\tid={`option-${index}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{parts.map((part, i) =>\n\t\t\t\t\t\t\t\t\tpart.toLowerCase() === inputValue.toLowerCase() ? (\n\t\t\t\t\t\t\t\t\t\t<span key={i} className=\"font-bold text-blue-600\">\n\t\t\t\t\t\t\t\t\t\t\t{part}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\tpart\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n"],"names":["Autocomplete","forwardRef","props","ref","options","placeholder","onSelect","defaultSelectedOption","inputValue","setInputValue","useState","filteredOptions","setFilteredOptions","isOpen","setIsOpen","activeIndex","setActiveIndex","dropdownPosition","setDropdownPosition","selectedOption","setSelectedOption","autocompleteRef","useRef","inputRef","listRef","useImperativeHandle","useEffect","handleClickOutside","event","filtered","option","containSearchStrings","rect","spaceBelow","spaceAbove","listHeight","handleInputChange","_a","handleOptionClick","handleKeyDown","prev","jsxs","jsx","AdaptiveInput","cn","Search","X","index","parts","part","i"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.stories.js","sources":["../../../src/components/autocomplete/autocomplete.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React, { useRef } from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\n\nimport { Autocomplete, Option } from './autocomplete'\nimport { Button } from '../button'\n\nconst meta: Meta<typeof Autocomplete> = {\n\ttitle: 'Components/input/autocomplete',\n\tcomponent: Autocomplete,\n}\n\nexport default meta\ntype Story = StoryObj<typeof Autocomplete>\n\n// list of 50 names of countries\nconst options = [\n\t'United States',\n\t'Canada',\n\t'Argentina',\n\t'Brazil',\n\t'Chile',\n\t'Colombia',\n\t'Ecuador',\n\t'Peru',\n\t'Uruguay',\n\t'Venezuela',\n\t'Australia',\n\t'China',\n\t'India',\n\t'Indonesia',\n\t'Japan',\n\t'Korea',\n\t'Malaysia',\n\t'Philippines',\n\t'Singapore',\n\t'Thailand',\n\t'Vietnam',\n\t'Austria',\n\t'Belgium',\n\t'Croatia',\n\t'Denmark',\n\t'Finland',\n\t'France',\n\t'Germany',\n\t'Greece',\n\t'Hungary',\n\t'Ireland',\n\t'Italy',\n\t'Netherlands',\n\t'Norway',\n\t'Poland',\n\t'Portugal',\n\t'Romania',\n\t'Russia',\n\t'Spain',\n\t'Sweden',\n\t'Switzerland',\n\t'Turkey',\n\t'Ukraine',\n\t'United Kingdom',\n\t'Egypt',\n\t'Nigeria',\n\t'South Africa',\n\t'Kenya',\n]\n\nconst Template = () => {\n\tconst [value, setValue] = React.useState<Option | null>()\n\n\tconst autocompleteRef = useRef<{ clearSelection: () => void }>(null)\n\n\tconst handleClear = () => {\n\t\tautocompleteRef.current?.clearSelection()\n\t}\n\n\treturn (\n\t\t<div className=\"w-80\">\n\t\t\t<Autocomplete\n\t\t\t\tref={autocompleteRef}\n\t\t\t\tdefaultSelectedOption={{ value: 'Italy', label: 'Italy' }}\n\t\t\t\tonSelect={(value) => setValue(value)}\n\t\t\t\toptions={options.map((option) => ({ value: option, label: option }))}\n\t\t\t/>\n\t\t\t<p className=\"mt-4\">\n\t\t\t\tSelected value: <code>{JSON.stringify(value)}</code>\n\t\t\t</p>\n\t\t\t<Button onClick={handleClear}>Clear Selection</Button>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["options","Template","value","setValue","React","autocompleteRef","useRef","handleClear","_a","jsxs","jsx","Autocomplete","option","Button"],"mappings":"0hBAgBA,MAAMA,EAAU,CACf,gBACA,SACA,YACA,SACA,QACA,WACA,UACA,OACA,UACA,YACA,YACA,QACA,QACA,YACA,QACA,QACA,WACA,cACA,YACA,WACA,UACA,UACA,UACA,UACA,UACA,UACA,SACA,UACA,SACA,UACA,UACA,QACA,cACA,SACA,SACA,WACA,UACA,SACA,QACA,SACA,cACA,SACA,UACA,iBACA,QACA,UACA,eACA,OACD,EAEMC,EAAW,IAAM,CACtB,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAM,
|
|
1
|
+
{"version":3,"file":"autocomplete.stories.js","sources":["../../../src/components/autocomplete/autocomplete.stories.tsx"],"sourcesContent":["// organize-imports-ignore\nimport React, { useRef } from 'react'\nimport type { Meta, StoryObj } from '@storybook/react'\n\nimport { Autocomplete, Option } from './autocomplete'\nimport { Button } from '../button'\n\nconst meta: Meta<typeof Autocomplete> = {\n\ttitle: 'Components/input/autocomplete',\n\tcomponent: Autocomplete,\n}\n\nexport default meta\ntype Story = StoryObj<typeof Autocomplete>\n\n// list of 50 names of countries\nconst options = [\n\t'United States',\n\t'Canada',\n\t'Argentina',\n\t'Brazil',\n\t'Chile',\n\t'Colombia',\n\t'Ecuador',\n\t'Peru',\n\t'Uruguay',\n\t'Venezuela',\n\t'Australia',\n\t'China',\n\t'India',\n\t'Indonesia',\n\t'Japan',\n\t'Korea',\n\t'Malaysia',\n\t'Philippines',\n\t'Singapore',\n\t'Thailand',\n\t'Vietnam',\n\t'Austria',\n\t'Belgium',\n\t'Croatia',\n\t'Denmark',\n\t'Finland',\n\t'France',\n\t'Germany',\n\t'Greece',\n\t'Hungary',\n\t'Ireland',\n\t'Italy',\n\t'Netherlands',\n\t'Norway',\n\t'Poland',\n\t'Portugal',\n\t'Romania',\n\t'Russia',\n\t'Spain',\n\t'Sweden',\n\t'Switzerland',\n\t'Turkey',\n\t'Ukraine',\n\t'United Kingdom',\n\t'Egypt',\n\t'Nigeria',\n\t'South Africa',\n\t'Kenya',\n]\n\nconst Template = () => {\n\tconst [value, setValue] = React.useState<Option | null>()\n\n\tconst autocompleteRef = useRef<{ clearSelection: () => void }>(null)\n\n\tconst handleClear = () => {\n\t\tautocompleteRef.current?.clearSelection()\n\t}\n\n\treturn (\n\t\t<div className=\"w-80\">\n\t\t\t<Autocomplete\n\t\t\t\tref={autocompleteRef}\n\t\t\t\tdefaultSelectedOption={{ value: 'Italy', label: 'Italy' }}\n\t\t\t\tonSelect={(value) => setValue(value)}\n\t\t\t\toptions={options.map((option) => ({ value: option, label: option }))}\n\t\t\t/>\n\t\t\t<p className=\"mt-4\">\n\t\t\t\tSelected value: <code>{JSON.stringify(value)}</code>\n\t\t\t</p>\n\t\t\t<Button onClick={handleClear}>Clear Selection</Button>\n\t\t</div>\n\t)\n}\n\nexport const Default: Story = {\n\trender: Template.bind({}),\n\targs: {},\n}\n"],"names":["options","Template","value","setValue","React","autocompleteRef","useRef","handleClear","_a","jsxs","jsx","Autocomplete","option","Button"],"mappings":"0hBAgBA,MAAMA,EAAU,CACf,gBACA,SACA,YACA,SACA,QACA,WACA,UACA,OACA,UACA,YACA,YACA,QACA,QACA,YACA,QACA,QACA,WACA,cACA,YACA,WACA,UACA,UACA,UACA,UACA,UACA,UACA,SACA,UACA,SACA,UACA,UACA,QACA,cACA,SACA,SACA,WACA,UACA,SACA,QACA,SACA,cACA,SACA,UACA,iBACA,QACA,UACA,eACA,OACD,EAEMC,EAAW,IAAM,CACtB,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAM,SAAA,EAE1BC,EAAkBC,EAAuC,IAAI,EAE7DC,EAAc,IAAM,QACzBC,EAAAH,EAAgB,UAAhB,MAAAG,EAAyB,gBAAe,EAGzC,OACCC,EAAAA,KAAC,MAAA,CAAI,UAAU,OACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,IAAKN,EACL,sBAAuB,CAAE,MAAO,QAAS,MAAO,OAAA,EAChD,SAAWH,GAAUC,EAASD,CAAK,EACnC,QAASF,EAAQ,IAAKY,IAAY,CAAE,MAAOA,EAAQ,MAAOA,GAAS,CAAA,CAAA,EAEpEH,EAAAA,KAAC,IAAA,CAAE,UAAU,OAAO,SAAA,CAAA,mBACHC,EAAAA,IAAC,OAAA,CAAM,SAAA,KAAK,UAAUR,CAAK,CAAA,CAAE,CAAA,EAC9C,EACAQ,EAAAA,IAACG,EAAA,CAAO,QAASN,EAAa,SAAA,iBAAA,CAAe,CAAA,EAC9C,CAEF,EAGSN,EAAS,KAAK,EAAE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as i}from"../../assets/jsx-runtime-D_zvdyIk.js";import{v as u,d as h,i as l,r as c,s as n,g as s,f as o}from"../../assets/vi.
|
|
1
|
+
import{j as i}from"../../assets/jsx-runtime-D_zvdyIk.js";import{v as u,d as h,i as l,r as c,s as n,g as s,f as o}from"../../assets/vi.bdSIJ99Y-C6e_ZQS2.js";import{A as r}from"./autocomplete.js";import"react";import"react-dom";import"../../lib/utils/cn.js";import"clsx";import"tailwind-merge";import"date-fns-tz";import"../../lib/utils/string.js";import"lucide-react";import"../adaptive-input/adaptive-input.js";import"../input/input.js";import"class-variance-authority";const a=[{value:"apple",label:"Apple"},{value:"banana",label:"Banana"},{value:"orange",label:"Orange"}],p=u.fn();h("Autocomplete Component",()=>{l("renders the input field with a placeholder",()=>{c(i.jsx(r,{options:a,placeholder:"Search fruits...",onSelect:p}));const t=n.getByPlaceholderText(/search fruits.../i);s(t).toBeInTheDocument()}),l("renders all suggestions initially when the input is focused",()=>{c(i.jsx(r,{options:a,onSelect:p}));const t=n.getByPlaceholderText(/search.../i);o.focus(t);const e=n.getAllByRole("option");s(e).toHaveLength(a.length),s(e[0]).toHaveTextContent("Apple"),s(e[1]).toHaveTextContent("Banana"),s(e[2]).toHaveTextContent("Orange")}),l("calls onSelect with the selected value when a suggestion is clicked",()=>{const t=u.fn();c(i.jsx(r,{options:a,onSelect:t}));const e=n.getByPlaceholderText(/search.../i);o.focus(e);const g=n.getByText(/banana/i);o.click(g),s(t).toHaveBeenCalledWith(a[1])}),l("updates the input value when a suggestion is clicked",()=>{c(i.jsx(r,{options:a,onSelect:p}));const t=n.getByPlaceholderText(/search.../i);o.focus(t);const e=n.getByText(/orange/i);o.click(e),s(t).toHaveValue("Orange")}),l("navigates suggestions with keyboard (ArrowDown, ArrowUp, Enter)",()=>{const t=u.fn();c(i.jsx(r,{options:a,onSelect:t}));const e=n.getByPlaceholderText(/search.../i);o.focus(e),o.keyDown(e,{key:"ArrowDown"}),o.keyDown(e,{key:"ArrowDown"}),o.keyDown(e,{key:"Enter"}),s(t).toHaveBeenCalledWith(a[1]),s(e).toHaveValue("Banana")}),l("closes suggestions when Escape is pressed",()=>{c(i.jsx(r,{options:a,onSelect:p}));const t=n.getByPlaceholderText(/search.../i);o.focus(t),o.keyDown(t,{key:"Escape"});const e=n.queryAllByRole("option");s(e).toHaveLength(0)})});
|
|
2
2
|
//# sourceMappingURL=autocomplete.test.js.map
|