From dfa1ba85548508e680f68200ea521be95c3eafe0 Mon Sep 17 00:00:00 2001 From: Corentin THOMASSET Date: Mon, 7 Aug 2023 17:30:00 +0200 Subject: [PATCH] feat(ui): added c-select in the ui lib (#550) * feat(ui): added c-select in the ui lib * refactor(ui): switched n-select to c-select --- .eslintrc-auto-import.json | 5 +- components.d.ts | 9 + package.json | 1 + pnpm-lock.yaml | 37 ++- src/composable/fuzzySearch.ts | 13 +- src/layouts/base.layout.vue | 4 + src/modules/shared/number.models.ts | 5 + src/tools/bip39-generator/bip39-generator.vue | 12 +- src/tools/camera-recorder/camera-recorder.vue | 35 +-- .../date-time-converter.vue | 6 +- src/tools/encryption/encryption.vue | 22 +- src/tools/eta-calculator/eta-calculator.vue | 16 +- src/tools/hash-text/hash-text.vue | 46 +-- src/tools/hmac-generator/hmac-generator.vue | 60 ++-- src/tools/list-converter/list-converter.vue | 24 +- .../meta-tag-generator/meta-tag-generator.vue | 8 +- src/tools/mime-types/mime-types.vue | 32 +-- .../phone-parser-and-formatter.vue | 4 +- .../qr-code-generator/qr-code-generator.vue | 15 +- src/tools/sql-prettify/sql-prettify.vue | 80 +++--- src/ui/c-label/c-label.types.ts | 7 + src/ui/c-label/c-label.vue | 32 +++ src/ui/c-select/c-select.demo.vue | 36 +++ src/ui/c-select/c-select.theme.ts | 60 ++++ src/ui/c-select/c-select.types.ts | 4 + src/ui/c-select/c-select.vue | 262 ++++++++++++++++++ src/ui/demo/demo-home.page.vue | 13 + src/ui/demo/demo.routes.ts | 10 +- unocss.config.ts | 7 +- 29 files changed, 666 insertions(+), 199 deletions(-) create mode 100644 src/modules/shared/number.models.ts create mode 100644 src/ui/c-label/c-label.types.ts create mode 100644 src/ui/c-label/c-label.vue create mode 100644 src/ui/c-select/c-select.demo.vue create mode 100644 src/ui/c-select/c-select.theme.ts create mode 100644 src/ui/c-select/c-select.types.ts create mode 100644 src/ui/c-select/c-select.vue create mode 100644 src/ui/demo/demo-home.page.vue diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index 8830c72d..4084d922 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -285,6 +285,7 @@ "watchThrottled": true, "watchTriggerable": true, "watchWithFilter": true, - "whenever": true + "whenever": true, + "toValue": true } -} \ No newline at end of file +} diff --git a/components.d.ts b/components.d.ts index 25148492..64bb5f3d 100644 --- a/components.d.ts +++ b/components.d.ts @@ -31,6 +31,7 @@ declare module '@vue/runtime-core' { Chronometer: typeof import('./src/tools/chronometer/chronometer.vue')['default'] CInputText: typeof import('./src/ui/c-input-text/c-input-text.vue')['default'] 'CInputText.demo': typeof import('./src/ui/c-input-text/c-input-text.demo.vue')['default'] + CLabel: typeof import('./src/ui/c-label/c-label.vue')['default'] CLink: typeof import('./src/ui/c-link/c-link.vue')['default'] 'CLink.demo': typeof import('./src/ui/c-link/c-link.demo.vue')['default'] CModal: typeof import('./src/ui/c-modal/c-modal.vue')['default'] @@ -41,7 +42,11 @@ declare module '@vue/runtime-core' { CommandPalette: typeof import('./src/modules/command-palette/command-palette.vue')['default'] CommandPaletteOption: typeof import('./src/modules/command-palette/components/command-palette-option.vue')['default'] CrontabGenerator: typeof import('./src/tools/crontab-generator/crontab-generator.vue')['default'] + CSelect: typeof import('./src/ui/c-select/c-select.vue')['default'] + 'CSelect.demo': typeof import('./src/ui/c-select/c-select.demo.vue')['default'] DateTimeConverter: typeof import('./src/tools/date-time-converter/date-time-converter.vue')['default'] + 'Demo.routes': typeof import('./src/ui/demo/demo.routes.vue')['default'] + 'DemoHome.page': typeof import('./src/ui/demo/demo-home.page.vue')['default'] DemoWrapper: typeof import('./src/ui/demo/demo-wrapper.vue')['default'] DeviceInformation: typeof import('./src/tools/device-information/device-information.vue')['default'] DiffViewer: typeof import('./src/tools/json-diff/diff-viewer/diff-viewer.vue')['default'] @@ -60,9 +65,13 @@ declare module '@vue/runtime-core' { HtmlEntities: typeof import('./src/tools/html-entities/html-entities.vue')['default'] HtmlWysiwygEditor: typeof import('./src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue')['default'] HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default'] + 'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default'] 'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default'] IconMdiArrowRightBottom: typeof import('~icons/mdi/arrow-right-bottom')['default'] IconMdiCamera: typeof import('~icons/mdi/camera')['default'] + IconMdiCameraOutline: typeof import('~icons/mdi/camera-outline')['default'] + IconMdiCameraVideoOff: typeof import('~icons/mdi/camera-video-off')['default'] + IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default'] IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default'] IconMdiClose: typeof import('~icons/mdi/close')['default'] IconMdiContentCopy: typeof import('~icons/mdi/content-copy')['default'] diff --git a/package.json b/package.json index 5e98d5de..f4b95cec 100644 --- a/package.json +++ b/package.json @@ -118,6 +118,7 @@ "prettier": "^2.8.7", "typescript": "~4.9.0", "unocss": "^0.53.0", + "unocss-preset-scrollbar": "^0.2.1", "unplugin-icons": "^0.16.1", "unplugin-vue-components": "^0.25.0", "vite": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 684b2e89..836e4a21 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -256,6 +256,9 @@ devDependencies: unocss: specifier: ^0.53.0 version: 0.53.0(postcss@8.4.24)(rollup@2.79.1)(vite@4.3.9) + unocss-preset-scrollbar: + specifier: ^0.2.1 + version: 0.2.1(unocss@0.53.0) unplugin-icons: specifier: ^0.16.1 version: 0.16.1(@vue/compiler-sfc@3.2.47) @@ -3366,7 +3369,7 @@ packages: dependencies: '@unhead/dom': 0.5.1 '@unhead/schema': 0.5.1 - '@vueuse/shared': 10.2.1(vue@3.3.4) + '@vueuse/shared': 10.3.0(vue@3.3.4) unhead: 0.5.1 vue: 3.3.4 transitivePeerDependencies: @@ -3413,6 +3416,10 @@ packages: unconfig: 0.3.9 dev: true + /@unocss/core@0.31.17: + resolution: {integrity: sha512-DJ3Uk2ePVXvV1qQmgoLK44aqB6f0s+naOEvouI97nzVXDZgxDQPBxIPB/L4vvE4U+gQxEiHwwE3gJ75iPqVzXw==} + dev: true + /@unocss/core@0.53.0: resolution: {integrity: sha512-MB6hqSN2wjmm3NNYspNqzxvMv7LnyLqz0uCWr15elRqnjsuq01w7DZ1iPS9ckA2M3YjQIRTXR9YPtDbSqY0jcA==} dev: true @@ -3486,6 +3493,12 @@ packages: - supports-color dev: true + /@unocss/preset-mini@0.31.17: + resolution: {integrity: sha512-gVgMTOKLt3O1ym348QIBmR5sS9W0Ozkk5xelhH6e0VXcpg0dXDPDrl4hFErMy4x6IB86yyJG6Dz5JhcwQB13Ig==} + dependencies: + '@unocss/core': 0.31.17 + dev: true + /@unocss/preset-mini@0.53.0: resolution: {integrity: sha512-hGj9ltZUJIuPT+9bO+R0OlsQOSlV7rjQRkSSMnUaDsuKfzhahsyc7QglNHZI4wuTI/9iSJKGUD4nvTe559+8Hg==} dependencies: @@ -3928,8 +3941,8 @@ packages: - vue dev: false - /@vueuse/shared@10.2.1(vue@3.3.4): - resolution: {integrity: sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==} + /@vueuse/shared@10.3.0(vue@3.3.4): + resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} dependencies: vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: @@ -5013,7 +5026,6 @@ packages: /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} - hasBin: true requiresBuild: true optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -7772,7 +7784,6 @@ packages: /rollup@3.25.1: resolution: {integrity: sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true optionalDependencies: fsevents: 2.3.2 dev: true @@ -8502,6 +8513,15 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unocss-preset-scrollbar@0.2.1(unocss@0.53.0): + resolution: {integrity: sha512-7ubHdOaUwr7xBn1glPpICNNsM2SZGjvWK5uRPNiQYsrZ9YFjsCGHk9x5S2R8pTkuMDQeiaSa/UQbYhjC8Fra5g==} + peerDependencies: + unocss: '>= 0.31.13 < 1' + dependencies: + '@unocss/preset-mini': 0.31.17 + unocss: 0.53.0(postcss@8.4.24)(rollup@2.79.1)(vite@4.3.9) + dev: true + /unocss@0.53.0(postcss@8.4.24)(rollup@2.79.1)(vite@4.3.9): resolution: {integrity: sha512-kY4h5ERiDYlSnL2X+hbDfh+uaF7QNouy7j51GOTUr3Q0aaWehaNd05b15SjHrab559dEC0mYfrSEdh/DnCK1cw==} engines: {node: '>=14'} @@ -8635,7 +8655,6 @@ packages: /update-browserslist-db@1.0.10(browserslist@4.21.5): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: @@ -8646,7 +8665,6 @@ packages: /update-browserslist-db@1.0.11(browserslist@4.21.9): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: @@ -8777,7 +8795,6 @@ packages: /vite@4.3.9(@types/node@18.15.11)(less@4.1.3): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true peerDependencies: '@types/node': '>= 14' less: '*' @@ -8811,7 +8828,6 @@ packages: /vitest@0.32.0(jsdom@19.0.0)(less@4.1.3): resolution: {integrity: sha512-SW83o629gCqnV3BqBnTxhB10DAwzwEx3z+rqYZESehUB+eWsJxwcBQx7CKy0otuGMJTYh7qCVuUX23HkftGl/Q==} engines: {node: '>=v14.18.0'} - hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@vitest/browser': '*' @@ -8886,7 +8902,6 @@ packages: /vue-demi@0.13.11(vue@3.3.4): resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} engines: {node: '>=12'} - hasBin: true requiresBuild: true peerDependencies: '@vue/composition-api': ^1.0.0-rc.1 @@ -8901,7 +8916,6 @@ packages: /vue-demi@0.14.1(vue@3.3.4): resolution: {integrity: sha512-rt+yuCtXvscYot9SQQj3WKZJVSriPNqVkpVBNEHPzSgBv7QIYzsS410VqVgvx8f9AAPgjg+XPKvmV3vOqqkJQQ==} engines: {node: '>=12'} - hasBin: true requiresBuild: true peerDependencies: '@vue/composition-api': ^1.0.0-rc.1 @@ -8976,7 +8990,6 @@ packages: /vue-tsc@1.8.1(typescript@4.9.3): resolution: {integrity: sha512-GxBQrcb0Qvyrj1uZqnTXQyWbXdNDRY2MTa+r7ESgjhf+WzBSdxZfkS3KD/C3WhKYG+aN8hf44Hp5Gqzb6PehAA==} - hasBin: true peerDependencies: typescript: '*' dependencies: diff --git a/src/composable/fuzzySearch.ts b/src/composable/fuzzySearch.ts index 66480f79..00794fd8 100644 --- a/src/composable/fuzzySearch.ts +++ b/src/composable/fuzzySearch.ts @@ -11,12 +11,19 @@ function useFuzzySearch({ }: { search: MaybeRef data: Data[] - options?: Fuse.IFuseOptions + options?: Fuse.IFuseOptions & { filterEmpty?: boolean } }) { const fuse = new Fuse(data, options); + const filterEmpty = options.filterEmpty ?? true; - const searchResult = computed(() => { - return fuse.search(get(search)).map(({ item }) => item); + const searchResult = computed(() => { + const query = get(search); + + if (!filterEmpty && query === '') { + return data; + } + + return fuse.search(query).map(({ item }) => item); }); return { searchResult }; diff --git a/src/layouts/base.layout.vue b/src/layouts/base.layout.vue index 5ee8a9d7..5c3841b5 100644 --- a/src/layouts/base.layout.vue +++ b/src/layouts/base.layout.vue @@ -103,6 +103,10 @@ const tools = computed(() => [ Home + + + +
diff --git a/src/modules/shared/number.models.ts b/src/modules/shared/number.models.ts new file mode 100644 index 00000000..45f7509b --- /dev/null +++ b/src/modules/shared/number.models.ts @@ -0,0 +1,5 @@ +function clamp({ value, min = 0, max = 100 }: { value: number; min?: number; max?: number }) { + return Math.min(Math.max(value, min), max); +} + +export { clamp }; diff --git a/src/tools/bip39-generator/bip39-generator.vue b/src/tools/bip39-generator/bip39-generator.vue index 6c2af7b0..03c1fe38 100644 --- a/src/tools/bip39-generator/bip39-generator.vue +++ b/src/tools/bip39-generator/bip39-generator.vue @@ -84,12 +84,12 @@ const { copy: copyPassphrase } = useCopy({ source: passphrase, text: 'Passphrase
- - - + -
-
-
Video
- -
-
-
Audio
- -
+
+ +
diff --git a/src/tools/date-time-converter/date-time-converter.vue b/src/tools/date-time-converter/date-time-converter.vue index fcebce88..79f92188 100644 --- a/src/tools/date-time-converter/date-time-converter.vue +++ b/src/tools/date-time-converter/date-time-converter.vue @@ -142,7 +142,7 @@ function formatDateUsingFormatter(formatter: (date: Date) => string, date?: Date