diff --git a/client-tauri/index.html b/client-tauri/index.html index 03abf55f9..92c0a3c96 100644 --- a/client-tauri/index.html +++ b/client-tauri/index.html @@ -2,7 +2,7 @@ - + Tauri + React + TS diff --git a/client-tauri/package.json b/client-tauri/package.json index 82d35bf22..1b6f068fb 100644 --- a/client-tauri/package.json +++ b/client-tauri/package.json @@ -13,9 +13,13 @@ "@stirling-pdf/shared-operations": "^0.0.0", "@tauri-apps/api": "^1.5.1", "archiver": "^6.0.1", + "bootstrap": "^5.3.2", "path-browserify": "^1.0.1", "react": "^18.2.0", + "react-bootstrap": "^2.9.1", "react-dom": "^18.2.0", + "react-icons": "^4.11.0", + "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.18.0" }, "devDependencies": { @@ -23,6 +27,7 @@ "@types/archiver": "^5.3.4", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", + "@types/react-router-bootstrap": "^0.26.5", "@vitejs/plugin-react": "^4.0.3", "typescript": "^5.0.2", "vite": "^4.4.4" diff --git a/client-tauri/public/stirling-pdf-logo.png b/client-tauri/public/stirling-pdf-logo.png new file mode 100644 index 000000000..a26e7db08 Binary files /dev/null and b/client-tauri/public/stirling-pdf-logo.png differ diff --git a/client-tauri/public/stirling-pdf-logo.svg b/client-tauri/public/stirling-pdf-logo.svg new file mode 100644 index 000000000..700e64446 --- /dev/null +++ b/client-tauri/public/stirling-pdf-logo.svg @@ -0,0 +1,298 @@ + + + + diff --git a/client-tauri/public/tauri.svg b/client-tauri/public/tauri.svg deleted file mode 100644 index 31b62c928..000000000 --- a/client-tauri/public/tauri.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/client-tauri/public/vite.svg b/client-tauri/public/vite.svg deleted file mode 100644 index e7b8dfb1b..000000000 --- a/client-tauri/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client-tauri/src/App.tsx b/client-tauri/src/App.tsx index 2ab017c2a..c503ef4f3 100644 --- a/client-tauri/src/App.tsx +++ b/client-tauri/src/App.tsx @@ -5,11 +5,12 @@ import Dashboard from "./pages/Dashboard"; import NoMatch from "./pages/NoMatch"; import NavBar from "./components/NavBar"; +import 'bootstrap/dist/css/bootstrap.min.css'; +import { Col, Container, Row } from "react-bootstrap"; + export default function App() { return (
-

Basic Example

- {/* Routes nest inside one another. Nested route paths build upon parent route paths, and nested route elements render inside parent route elements. See the note about below. */} @@ -32,12 +33,18 @@ export default function App() { function Layout() { return (
- + {/* An renders whatever child route is currently active, so you can think about this as a placeholder for the child routes we defined above. */} - + +
+
+ +
+
+
); } diff --git a/client-tauri/src/components/NavBar.css b/client-tauri/src/components/NavBar.css new file mode 100644 index 000000000..abe47888a --- /dev/null +++ b/client-tauri/src/components/NavBar.css @@ -0,0 +1,135 @@ +#search-icon i { + font-size: 24px; /* Adjust this to your desired size */ + transition: color 0.3s; +} + +#search-icon:hover i { + color: #666; /* Adjust this to your hover color */ +} + +#navbarSearch { + transition: all 0.3s; + max-height: 0; + overflow: hidden; + +} + +#navbarSearch.show { + max-height: 300px; /* Adjust this to your desired max height */ +} + +.search-input { + transition: border 0.3s, box-shadow 0.3s; + +} + +.search-input:focus { + border-color: #666; /* Adjust this to your focus color */ + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* Adjust this to your desired shadow */ +} + +#searchResults { + max-width: 300px; /* Adjust to your preferred width */ + transition: height 0.3s ease; /* Smooth height transition */ +} + +/* Set a fixed height and styling for each search result item */ +.search-results a { + display: flex; + align-items: center; + gap: 10px; /* space between icon and text */ + height: 40px; /* Adjust based on your design */ + overflow: hidden; /* Prevent content from overflowing */ + white-space: nowrap; /* Prevent text from wrapping to next line */ + text-overflow: ellipsis; /* Truncate text if it's too long */ +} + + + + + + + + + + + + +#navbarSearch { + top: 100%; + right: 0; +} + +#searchForm { + width: 200px; /* Adjust this value as needed */ +} + +/* Style the search results to match the navbar */ +#searchResults { + max-height: 200px; /* Adjust this value as needed */ + overflow-y: auto; + width: 100%; +} + +#searchResults .dropdown-item { + display: flex; + align-items: center; + white-space: nowrap; + height: 50px; /* Fixed height */ + overflow: hidden; /* Hide overflow */ +} + +#searchResults .icon { + margin-right: 10px; +} + +#searchResults .icon-text { + display: inline; + overflow: hidden; /* Hide overflow */ + text-overflow: ellipsis; /* Add ellipsis for long text */ +} + + + +.main-icon { + width: 36px; + height: 36px; + vertical-align: middle; + transform: translateY(-2px); +} + +.nav-icon svg { + width: 16px; + height: 16px; + vertical-align: middle; + transform: translateY(-2px); +} +/* +.icon+.icon { + margin-left: -4px; +} +*/ +.nav-icon span { + margin-left: 9px; +} + +.nav-item-separator { + position: relative; + margin: 0 4px; /* Adjust the margin as needed */ +} + +.nav-item-separator::before { + content: ''; + position: absolute; + left: 0; + top: 10%; /* Adjust the top and bottom margins as needed */ + bottom: 10%; + width: 1px; + background-color: #ccc; /* Adjust the color as needed */ +} + +.navbar-icon { + width: 20px; + height: 20px; + transform: translateY(-2px); +} \ No newline at end of file diff --git a/client-tauri/src/components/NavBar.tsx b/client-tauri/src/components/NavBar.tsx index 1f8532c09..35b01d670 100644 --- a/client-tauri/src/components/NavBar.tsx +++ b/client-tauri/src/components/NavBar.tsx @@ -1,18 +1,121 @@ -import { Link } from "react-router-dom"; +import { + BsTools, BsSortNumericDown, BsArrowClockwise, BsFileEarmarkX, BsLayoutSplit, BsPalette, BsArrowUpSquare, Bs1Square, BsFileEarmarkPdf, + BsArrowLeftRight, BsFileEarmarkImage, BsFileEarmark, BsFiletypeHtml, BsLink, BsFiletypeMd, BsFileEarmarkWord, BsFiletypePpt, BsFiletypeTxt, + BsFiletypeXml +} from "react-icons/bs"; +import { AiOutlineMergeCells, AiOutlineSplitCells } from "react-icons/ai"; +import { LuLayoutGrid } from "react-icons/lu"; +import { SlSizeFullscreen } from "react-icons/sl"; +import { BiCrop } from "react-icons/bi"; +import { IconType } from "react-icons"; + +import Container from 'react-bootstrap/Container'; +import Nav from 'react-bootstrap/Nav'; +import Navbar from 'react-bootstrap/Navbar'; +import NavDropdown from 'react-bootstrap/NavDropdown'; +import { LinkContainer } from 'react-router-bootstrap'; + +import Logo from '../../public/stirling-pdf-logo.svg' +import './NavBar.css'; + +interface NavInfoItem { + displayText: string; + icon: any; + dest: string; + tooltip?: string; +} +interface NavInfoSublist { + displayText: string; + icon: IconType; + sublist: Array; +} + +function convertToNavLink(item: NavInfoItem, index: number) { + return {item.displayText}; +} +function convertToNavDropdownItem(item: NavInfoItem | null) { + if (item == null) + return ; + return {item.displayText}; +} +function convertToNavDropdown(sublist: NavInfoSublist) { + return ( + {sublist.displayText}} id="basic-nav-dropdown"> + {sublist.sublist.map(convertToNavDropdownItem)} + + ); +} + -function NoMatch() { /* A "layout route" is a good place to put markup you want to share across all the pages on your site, like navigation. */ +function Layout() { + const navInfo = [ + {displayText: "PDF Multi Tool", icon: BsTools, dest: "/home", tooltip: "Merge, Rotate, Rearrange, and Remove pages"}, + {displayText: "Page Operations", icon: BsFileEarmarkPdf, sublist: [ + { displayText: "Merge", icon: AiOutlineMergeCells, dest: "/dashboard", tooltip: "Easily merge multiple PDFs into one." }, + { displayText: "Split", icon: AiOutlineSplitCells, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Organise", icon: BsSortNumericDown, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Rotate", icon: BsArrowClockwise, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Remove", icon: BsFileEarmarkX, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Multi-Page Layout", icon: LuLayoutGrid, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Adjust page size/scale", icon: SlSizeFullscreen, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Auto Split Pages", icon: BsLayoutSplit, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Adjust Colors/Contrast", icon: BsPalette, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Crop PDF", icon: BiCrop, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "Extract page(s)", icon: BsArrowUpSquare, dest: "/nothing-here", tooltip: "fghjgfhj" }, + { displayText: "PDF to Single Large Page", icon: Bs1Square, dest: "/nothing-here", tooltip: "fghjgfhj" }, + ]}, + {displayText: "Convert", icon: BsArrowLeftRight, sublist: [ + { displayText: "Image to PDF", icon: BsFileEarmarkImage, dest: "/dashboard" }, + { displayText: "File to PDF", icon: BsFileEarmark, dest: "/nothing-here" }, + { displayText: "HTML to PDF", icon: BsFiletypeHtml, dest: "/nothing-here" }, + { displayText: "URL/Website To PDF", icon: BsLink, dest: "/nothing-here" }, + { displayText: "Markdown to PDF", icon: BsFiletypeMd, dest: "/nothing-here" }, + null, + { displayText: "PDF to Image", icon: BsFileEarmarkImage, dest: "/nothing-here" }, + { displayText: "PDF to Word", icon: BsFileEarmarkWord, dest: "/nothing-here" }, + { displayText: "PDF to Presentation", icon: BsFiletypePpt, dest: "/nothing-here" }, + { displayText: "PDF to RTF (Text)", icon: BsFiletypeTxt, dest: "/nothing-here" }, + { displayText: "PDF to HTML", icon: BsFiletypeHtml, dest: "/nothing-here" }, + { displayText: "PDF to XML", icon: BsFiletypeXml, dest: "/nothing-here" }, + { displayText: "PDF to PDF/A", icon: BsFileEarmarkPdf, dest: "/nothing-here" }, + ]}, + ] as Array; + return ( - + + + + + Image + Stirling PDF + + + + + + + + ); } -export default NoMatch; \ No newline at end of file +export default Layout; \ No newline at end of file diff --git a/client-tauri/src/index.css b/client-tauri/src/index.css index f7de85bf0..7cb3d1c3a 100644 --- a/client-tauri/src/index.css +++ b/client-tauri/src/index.css @@ -1,4 +1,4 @@ -:root { +/*:root { font-family: Inter, Avenir, Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; @@ -107,3 +107,4 @@ button { background-color: #0f0f0f69; } } +*/ \ No newline at end of file diff --git a/client-tauri/src/pages/Dashboard.tsx b/client-tauri/src/pages/Dashboard.tsx index 5ce906f6f..b2486a5f5 100644 --- a/client-tauri/src/pages/Dashboard.tsx +++ b/client-tauri/src/pages/Dashboard.tsx @@ -3,6 +3,45 @@ function Dashboard() { return (

Dashboard

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquet felis in ornare molestie. Quisque et dolor gravida, vulputate libero ultricies, suscipit diam. Pellentesque semper eget purus et rutrum. Duis fringilla elementum tellus, ut egestas nisi ultrices sed. Fusce id elit ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla facilisi. Duis varius, orci vel tempor cursus, elit tellus interdum sem, at vulputate lorem ex et dolor. Vestibulum purus mauris, consequat viverra gravida eget, fermentum a lacus. Phasellus eu varius dolor. Etiam a vulputate sapien. Etiam pulvinar, neque eu elementum imperdiet, nibh ex lobortis magna, ut varius lectus ante tristique massa. + +Nullam quis porttitor sapien. Suspendisse dictum enim vitae tristique aliquet. Nunc imperdiet pellentesque quam, sit amet luctus dui dignissim non. Vivamus eleifend sagittis mauris, at imperdiet nisl. Morbi rutrum magna ut tortor euismod efficitur. Pellentesque quis tortor consectetur, lobortis turpis eget, tincidunt turpis. Nulla consectetur massa ex. Donec lectus purus, interdum sit amet sapien eu, maximus dapibus diam. Suspendisse potenti. In lacinia augue massa, et vulputate eros convallis id. Suspendisse bibendum sagittis posuere. Integer ullamcorper odio eget risus venenatis, non mollis arcu lacinia. Vestibulum feugiat arcu elit, eu varius enim fermentum vitae. + +Morbi rutrum metus magna, ac tempor enim posuere sit amet. Vivamus laoreet, ligula a maximus mattis, eros justo ultrices libero, eget congue enim mi vel massa. Nunc finibus tempor lacus, ac condimentum neque vehicula sit amet. Maecenas vestibulum, eros ut fringilla interdum, nisi metus vestibulum libero, efficitur lacinia massa risus et orci. Nulla orci magna, efficitur a iaculis nec, consequat eu lorem. Maecenas faucibus, diam ut vehicula tincidunt, nulla ipsum dictum magna, quis lobortis felis lacus ac felis. Suspendisse a luctus nunc. Aliquam eget nisi non libero gravida gravida. Etiam massa metus, posuere vel dui eu, malesuada aliquam purus. Maecenas sed sagittis sapien. Integer vel posuere nunc, sit amet venenatis mi. + +Donec vitae ipsum ut velit bibendum ultricies et ut est. Maecenas ac felis commodo, hendrerit sapien ut, molestie sapien. Sed rhoncus dui ut porta volutpat. Fusce in arcu id leo dignissim dignissim. Aenean pharetra ullamcorper tristique. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris convallis ultrices ante pellentesque pellentesque. Proin sed efficitur neque, ut sollicitudin neque. Sed sollicitudin dui diam, vitae fringilla eros bibendum vitae. Duis in augue nec enim pharetra lacinia nec quis nisi. Suspendisse pellentesque et quam a volutpat. Integer consectetur, tellus non feugiat sollicitudin, nibh nisl fringilla felis, at imperdiet turpis orci ut ex. Nam malesuada diam turpis. Phasellus blandit sodales suscipit. Sed condimentum placerat mi blandit ultrices. Integer egestas eleifend blandit. + +Morbi massa sem, efficitur dapibus sapien quis, mollis auctor lorem. Maecenas eget fringilla sem, vitae scelerisque tellus. Nulla orci ante, consequat interdum ornare sit amet, finibus sed lorem. Nunc vulputate ante placerat, porttitor dui sit amet, elementum libero. Maecenas hendrerit, neque et iaculis tristique, arcu felis porta libero, et luctus est enim a arcu. In blandit magna turpis, lobortis accumsan sem pellentesque a. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut dui urna, finibus eu tincidunt a, dignissim a metus. + +Ut condimentum eros eu hendrerit aliquam. Vestibulum faucibus, ipsum et posuere tempor, ante sem cursus ante, non facilisis libero arcu ac nisi. Sed porttitor non mi nec tristique. Donec et ligula tincidunt, congue felis et, vehicula ipsum. Integer eget nunc in lectus volutpat ultrices. Praesent malesuada velit vel enim egestas, eu auctor mauris maximus. Proin pretium odio lacus, ac fermentum erat fermentum id. + +Integer congue odio sit amet efficitur scelerisque. Nunc elit arcu, pulvinar vitae aliquam id, aliquet eget tortor. Donec ullamcorper condimentum libero, vel iaculis elit. Maecenas vestibulum fermentum tellus, auctor vestibulum leo volutpat et. Quisque ac mauris tristique, placerat augue et, cursus nunc. Sed nec lacinia lacus. Nam congue quam non nisl fermentum, nec lobortis nulla lobortis. Donec id neque a nibh tempus interdum in eget metus. + +Sed sed ligula sapien. Phasellus non tempor mauris, ac tempor velit. Suspendisse potenti. Nullam tempus enim purus, ac hendrerit odio lobortis vitae. Curabitur sit amet facilisis nisi. In tristique porttitor sem et sollicitudin. Etiam ut tortor hendrerit tortor blandit porttitor. In pretium ex nec arcu scelerisque, id cursus tortor ultrices. Suspendisse potenti. + +Ut dictum velit felis, vitae efficitur arcu varius lobortis. Etiam aliquet quam vel elementum pulvinar. Morbi ultricies nulla sit amet neque mattis, eget viverra elit laoreet. Vivamus elementum eros ipsum, vitae laoreet lacus accumsan at. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed vel turpis in arcu condimentum porta vel et eros. Maecenas luctus euismod mauris ac tincidunt. Nulla rutrum efficitur sollicitudin. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec et venenatis lorem. Sed malesuada tincidunt consequat. Phasellus vitae ex magna. Quisque ac hendrerit tellus, sed convallis velit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Ut imperdiet tempor dui, et sodales leo malesuada eget. Curabitur at finibus neque, vel efficitur ante. + +Suspendisse a pellentesque arcu. Mauris tempus posuere dui, vitae consectetur neque tristique ut. Duis imperdiet pulvinar lacus, ac porttitor diam. Praesent congue justo ut ex tincidunt, non pellentesque justo hendrerit. Etiam volutpat neque ut neque lacinia, quis dapibus tortor pulvinar. Etiam vestibulum tincidunt augue id lacinia. Nullam et fermentum ligula. + +Donec aliquet egestas elementum. Proin volutpat massa eu libero cursus, ut tincidunt enim convallis. Fusce ut magna nec odio feugiat auctor. Donec id libero eget quam finibus vestibulum et nec lectus. Duis et mattis arcu. Nam sit amet dolor eget est consequat euismod sed egestas enim. Fusce scelerisque ligula ut imperdiet mollis. + +Sed fermentum tellus feugiat, pretium tellus et, ullamcorper libero. Curabitur et justo quis odio efficitur euismod. Vivamus elementum sagittis odio euismod lobortis. Curabitur nec nunc eget ipsum malesuada gravida. Maecenas dignissim mauris sapien, quis malesuada ante condimentum in. In suscipit blandit turpis vitae congue. Aenean dignissim tempus finibus. + +Donec lacinia sapien risus, quis efficitur sapien vestibulum eget. Ut vehicula est in scelerisque pretium. Maecenas feugiat tempor urna a lobortis. Duis ac libero quis massa sodales rutrum. Suspendisse fermentum pellentesque nibh, pulvinar rutrum purus tempus consectetur. Donec non elementum diam. Aliquam et justo vitae quam tincidunt molestie. Mauris nec arcu erat. Mauris a justo ipsum. Maecenas consectetur nunc nec lobortis lacinia. Integer quis enim risus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam consequat, sem quis gravida semper, mauris est pretium nunc, a malesuada erat dolor eget metus. Ut pretium consectetur consequat. Quisque non mollis purus, in facilisis eros. + +Sed aliquam nunc id lorem gravida, non sagittis ligula ultrices. Ut vel risus congue, aliquet lacus eget, ullamcorper arcu. Morbi ullamcorper scelerisque risus eu molestie. Curabitur non dapibus risus. In in libero massa. Etiam sed mi ultrices, lacinia justo nec, gravida est. Sed vehicula sollicitudin ullamcorper. Suspendisse potenti. Etiam non metus malesuada, dictum risus venenatis, fringilla nunc. + +Ut vel ante volutpat justo luctus sollicitudin. Quisque sit amet sagittis velit, quis ultrices elit. Nam euismod, enim vel suscipit pharetra, nisl quam porta nisi, ac mollis eros ante ut lectus. Ut sagittis ex eget diam efficitur commodo. Suspendisse mattis eros ligula, eu facilisis ipsum cursus ac. Nullam imperdiet id diam vel ultrices. Nullam nunc purus, aliquet ac ornare at, posuere id lacus. Sed ex leo, sollicitudin ac velit id, pulvinar lacinia nunc. Nullam molestie faucibus lectus, sed molestie sem vehicula et. Sed justo eros, ullamcorper eu hendrerit ac, vehicula at est. Morbi ut sem iaculis, ultricies lacus eu, tincidunt metus. + +Nullam hendrerit consectetur pulvinar. Praesent id orci feugiat, congue libero sit amet, ultricies neque. Suspendisse magna elit, mattis in mauris eu, porta sollicitudin enim. Cras sagittis lacinia nunc, sed aliquet augue condimentum quis. Proin eu dui at libero pharetra finibus et ac sem. Aliquam euismod, enim eget elementum mattis, lorem tellus maximus nibh, vel malesuada felis nulla nec mi. Aliquam a neque ut ex dapibus accumsan. Donec vitae bibendum mi. Donec blandit ante at dui condimentum, et congue leo luctus. Sed sapien est, accumsan et tellus in, tincidunt vehicula sapien. Curabitur iaculis pharetra urna ac molestie. Proin in enim orci. Vestibulum scelerisque, risus ut tincidunt mollis, dolor mi pretium dui, in fermentum est sapien et lacus. Fusce tincidunt orci nulla, sed gravida massa facilisis sit amet. Proin eget finibus diam. Nunc vitae diam interdum, rhoncus nulla eu, pulvinar ex. + +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus ultrices pharetra magna eget malesuada. Ut vel mauris nibh. Integer maximus purus vitae ante elementum congue. Nam fringilla consectetur condimentum. Nunc pulvinar lobortis sem, sit amet egestas sem vulputate in. Curabitur eleifend mi vitae ipsum aliquam congue. Nullam lobortis aliquet euismod. Praesent augue lacus, dapibus sit amet venenatis sed, hendrerit dictum felis. Donec tristique, lectus nec cursus tincidunt, sem justo condimentum ligula, vel feugiat felis leo ut tortor. Donec sed est ac tortor pharetra pulvinar. Pellentesque scelerisque augue quis commodo congue. Etiam eget tempus sapien. Nullam ex ligula, venenatis sed felis vel, scelerisque fermentum nibh. In felis quam, vulputate ac dignissim ut, scelerisque et quam. + +Proin faucibus efficitur sollicitudin. Curabitur pharetra lectus ut metus molestie, eget rutrum velit laoreet. Duis sit amet tellus sem. In pretium egestas massa eu pharetra. Vestibulum suscipit, nibh sit amet tincidunt feugiat, quam mauris scelerisque lorem, quis commodo ex libero in tellus. Donec tellus erat, tempor id fringilla sed, vehicula ac nibh. Curabitur nisi lacus, maximus id lorem vitae, faucibus faucibus massa. Nulla dictum molestie dolor, finibus commodo est lobortis id. Ut nec dapibus purus. Curabitur quis ligula tincidunt, hendrerit risus eu, tristique ipsum. Morbi neque est, pharetra ut pharetra non, semper id justo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque tempor erat elit, non viverra tortor malesuada eget. Aliquam et efficitur lorem, ac euismod dui. + +Aenean tincidunt scelerisque ante non vestibulum. Curabitur eleifend ipsum sem, elementum ornare enim ornare eu. In molestie sodales mattis. Morbi ac posuere lorem. Aliquam in nisi ac ipsum euismod bibendum eget id urna. Quisque suscipit lectus non magna varius venenatis sed sit amet lectus. Nam leo nisl, imperdiet at lorem fringilla, lacinia bibendum lacus. Nunc auctor mauris at orci condimentum venenatis at non augue. Donec iaculis aliquam risus. Suspendisse vel massa leo. + +Mauris sed est turpis. Nullam ut magna eu elit vehicula tempus. Sed mollis ultrices eleifend. Curabitur metus felis, sodales a turpis accumsan, ultricies feugiat arcu. Donec sit amet dui commodo, lacinia sem facilisis, lobortis urna. Donec cursus arcu ex, ac imperdiet lorem rutrum at. Curabitur faucibus erat in dolor placerat, vel blandit ligula eleifend. Morbi blandit nisl ut arcu semper consequat. Nulla malesuada convallis lectus a egestas. Sed volutpat metus vitae libero pulvinar, ut pretium magna malesuada.
); } diff --git a/package-lock.json b/package-lock.json index c0870d465..0d007b3de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,9 +70,13 @@ "@stirling-pdf/shared-operations": "^0.0.0", "@tauri-apps/api": "^1.5.1", "archiver": "^6.0.1", + "bootstrap": "^5.3.2", "path-browserify": "^1.0.1", "react": "^18.2.0", + "react-bootstrap": "^2.9.1", "react-dom": "^18.2.0", + "react-icons": "^4.11.0", + "react-router-bootstrap": "^0.26.2", "react-router-dom": "^6.18.0" }, "devDependencies": { @@ -80,6 +84,7 @@ "@types/archiver": "^5.3.4", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", + "@types/react-router-bootstrap": "^0.26.5", "@vitejs/plugin-react": "^4.0.3", "typescript": "^5.0.2", "vite": "^4.4.4" @@ -287,6 +292,18 @@ "react": ">=16.8" } }, + "client-tauri/node_modules/react-router-bootstrap": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/react-router-bootstrap/-/react-router-bootstrap-0.26.2.tgz", + "integrity": "sha512-YlpI9Xi+Uqp6zFAUO8D/wu6P8mr1ujqq+0V5MhJG1kx9dr/95fAMoGk4J+/CsysOkwtR3tYSac4DDWmHwXvC8w==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">=16.13.1", + "react-router-dom": ">=6.0.0" + } + }, "client-tauri/node_modules/react-router-dom": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz", @@ -3655,6 +3672,29 @@ "pako": "^1.0.10" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.8.0.tgz", + "integrity": "sha512-Y54xs483rglN5DxbwfCPHxnkvZ+gZ0LbSYmR72LyWPGft8hN/lrl1VRS1EW2SMjnkEWlj+Km2mwvA3kEHDUA0A==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@remix-run/router": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz", @@ -3663,6 +3703,45 @@ "node": ">=14.0.0" } }, + "node_modules/@restart/hooks": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.11.tgz", + "integrity": "sha512-Ft/ncTULZN6ldGHiF/k5qt72O8JyRMOeg0tApvCni8LkoiEahO+z3TNxfXIVGy890YtWVDvJAl662dVJSJXvMw==", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz", + "integrity": "sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@popperjs/core": "^2.11.6", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.4.9", + "@types/warning": "^3.0.0", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "peerDependencies": { + "react": ">=16.14.0" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -3718,6 +3797,19 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/@swc/helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/@tauri-apps/api": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.1.tgz", @@ -4031,6 +4123,15 @@ "@types/react": "*" } }, + "node_modules/@types/react-router-bootstrap": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/@types/react-router-bootstrap/-/react-router-bootstrap-0.26.5.tgz", + "integrity": "sha512-0O3hThodHA/3RGGWKn323BFbucMHzWSR0QASxAkMDvYTpJafZATgKN+W4jgGsFsOCxn5WbOvCkLnKQzprLyTuA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-router-dom": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", @@ -4041,6 +4142,14 @@ "@types/react-router": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/readdir-glob": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.3.tgz", @@ -4103,6 +4212,11 @@ "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", "dev": true }, + "node_modules/@types/warning": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.2.tgz", + "integrity": "sha512-S/2+OjBIcBl8Kur23YLe0hG1e7J5m2bHfB4UuMNoLZjIFhQWhTf1FeS+WFoXHUC6QsCEfk4pftj4J1KIKC1glA==" + }, "node_modules/@types/yargs": { "version": "17.0.29", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", @@ -4935,6 +5049,24 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/bplist-parser": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", @@ -5211,6 +5343,11 @@ "node": ">=8" } }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -5879,6 +6016,14 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -5915,6 +6060,15 @@ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -7575,6 +7729,14 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ionicons": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.2.1.tgz", @@ -9668,6 +9830,23 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -9803,6 +9982,35 @@ "node": ">=0.10.0" } }, + "node_modules/react-bootstrap": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.1.tgz", + "integrity": "sha512-ezgmh/ARCYp18LbZEqPp0ppvy+ytCmycDORqc8vXSKYV3cer4VH7OReV8uMOoKXmYzivJTxgzGHalGrHamryHA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.6.6", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -9815,12 +10023,25 @@ "react": "^18.2.0" } }, + "node_modules/react-icons": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz", + "integrity": "sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -9884,6 +10105,21 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -11280,6 +11516,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -11750,6 +12000,14 @@ "node": ">=14" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",