Compare commits

..

464 Commits
v2.4.2 ... v3

Author SHA1 Message Date
Corentin Thomasset
70c04633d1 fix(css): update primary color variables 2024-12-28 10:38:48 +01:00
Corentin Thomasset
95a893c914 chore(app): update package dependencies and manager version 2024-12-28 00:35:05 +01:00
Corentin Thomasset
b41ad832b8 wip 2024-11-29 23:56:41 +01:00
Corentin Thomasset
8929b5af6e feat(ui): sidenav layout 2024-10-27 15:02:54 +01:00
Corentin Thomasset
b88f13a7ca feat(tools): added token generator
- Added Slider component to the UI library
- Added Checkbox component to the UI library
- Added Textarea component to the UI library
2024-10-26 23:51:56 +02:00
Corentin Thomasset
b22173681c feat(app): tools management base 2024-10-26 10:54:32 +02:00
Corentin Thomasset
202896fa95 feat(pages): home page base 2024-10-25 18:42:29 +02:00
Corentin Thomasset
87cfc9c1f3 feat(app): nuxt version 2024-10-24 14:45:43 +02:00
Luu Van Loi
f836666417 fix(yaml-to-json): allow merge key to be parsed (#1359)
* fix(yaml-to-json): allow merge key to be parsed

* correct e2e tests

---------

Co-authored-by: lvluu <loi.van.luu@mgm-tp.com>
2024-10-24 10:20:51 +00:00
Knu753n
aa8cba96de feat(i18n): added Norwegian language (#1337) 2024-10-24 10:19:13 +00:00
Corentin Thomasset
5732483fc2 chore(version): release 2024.10.22-7ca5933 2024-10-22 10:25:36 +02:00
Corentin Thomasset
bd184d934d docs(changelog): update changelog for 2024.10.22-7ca5933 2024-10-22 10:25:36 +02:00
sharevb
7ca5933178 fix(favorites): store favorites regardless of languages (#1202)
Fix #1110
2024-10-22 10:21:29 +02:00
Corentin THOMASSET
f962c416a3 chore(sponsors): fern sponsor banners (#1314)
* chore(sponsors): readme banner

* chore(sponsors): app sponsor
2024-10-03 00:01:09 +02:00
Corentin THOMASSET
1c35ac3704 docs(author): updated author links (#1316) 2024-09-27 12:49:11 +00:00
Corentin Thomasset
72517002f3 refactor(regex-tester): better description 2024-09-27 10:40:56 +02:00
sharevb
f5c4ab19bc feat(new tool): Regex Tester (and Cheatsheet) (#1030)
* feat(new tool): Regex Tester

Fix https://github.com/CorentinTh/it-tools/issues/1007, https://github.com/CorentinTh/it-tools/issues/991, https://github.com/CorentinTh/it-tools/issues/936, https://github.com/CorentinTh/it-tools/issues/761, https://github.com/CorentinTh/it-tools/issues/649
https://github.com/CorentinTh/it-tools/issues/644, https://github.com/CorentinTh/it-tools/issues/554
https://github.com/CorentinTh/it-tools/issues/308

* fix: refactor to service + add regex diagram + ui enhancements

* fix: update queryParams

* fix: deps

* fix: svg style bug in @regexper/render

@regexper/render use a stylesheet in svg that cause bugs in whole site. So add regexper in a shadow root

* feat(new tool): added Regex Cheatsheet

* Update src/tools/regex-memo/index.ts

* Update src/tools/regex-tester/index.ts

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2024-09-20 18:39:40 +00:00
Corentin THOMASSET
67094980c9 chore(readme): updated logos (#1294) 2024-09-13 18:56:32 +00:00
sharevb
87984e2081 feat(new tool): Markdown to HTML (#916)
* feat(new tool): Markdown to HTML

Fix partially #538

* feat: add print button

* Update src/tools/markdown-to-html/index.ts

* Update src/tools/markdown-to-html/markdown-to-html.vue

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2024-08-25 20:57:07 +00:00
Corentin THOMASSET
318fb6efb9 feat(new-tool): add email normalizer (#1243) 2024-08-15 13:29:58 +00:00
sharevb
f1a5489e21 feat(new tools): JSON to XML and XML to JSON (#1231)
* feat(new tool): JSON <> XML

Fix https://github.com/CorentinTh/it-tools/issues/314

* Update src/tools/xml-to-json/index.ts

* Update src/tools/json-to-xml/index.ts

* Update src/tools/json-to-xml/index.ts

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2024-08-09 20:11:39 +00:00
Diego Fabricio
e1b4f9aafe feat(lorem-ipsum): add button to refresh text lorem-ipsum (#1213)
Co-authored-by: Diego Guzmán <diego.guzman@caces.gob.ec>
2024-08-07 09:22:08 +02:00
sharevb
76a19d218d fix(emoji-picker): debounced search input (#1181)
* fix(Emoji picker): fix lags

Fix #1176 using debounced ref

* chore: fix strange corepack message

Fix corepack claiming strange thing : UsageError: This project is configured to use yarn because /home/runner/work/it-tools/it-tools/package.json has a "packageManager" field
2024-07-11 17:06:17 +02:00
code2933
b430baef40 fix(format-transformer): set overflow for output area width (#787) 2024-05-27 18:16:24 +02:00
sharevb
dd4b7e687b fix(jwt-parser): prevent UI overflow on small screen (#1095)
Fix #1045
2024-05-27 11:59:05 +02:00
sharevb
30144aa3f5 feat(base64): Base64 enhancements (#905)
* fix(base64): use js-base64 to handle non ascii text

Use js-base64 to handle non ascii text and ignore whitespaces
Fix #879 and #409

* fix(base64): use js-base64 to handle non ascii text

Use js-base64 to handle non ascii text and ignore whitespaces
Fix #879 and #409

* feat(base64 file converter): add a filename and extension fields

Add filename and extension (auto filled if data url) to allow downloading with right extension and filename
Fix #788

* feat(base64 file converter): add a preview image

Fix #594. Taken from #595 (thanks @SAF2k)
2024-05-20 22:13:55 +02:00
Corentin Thomasset
e876d03608 chore(version): release 2024.05.13-a0bc346 2024-05-13 10:54:18 +02:00
Corentin Thomasset
81cf6b5483 docs(changelog): update changelog for 2024.05.13-a0bc346 2024-05-13 10:54:18 +02:00
Corentin THOMASSET
a0bc3468b2 chore(issues): prevent empty issues (#1078) 2024-05-13 08:44:04 +00:00
Corentin THOMASSET
5a7b0f9636 chore(issues): removed old issue templates (#1077) 2024-05-13 08:11:47 +00:00
Corentin Thomasset
b59942ad9f chore(node): upgraded node version in CI workflows 2024-05-10 13:26:36 +02:00
Corentin Thomasset
38d568798c chore(version): release 2024.05.10-33e5294 2024-05-10 12:08:16 +02:00
Corentin Thomasset
9dfd347edf docs(changelog): update changelog for 2024.05.10-33e5294 2024-05-10 12:08:15 +02:00
Corentin Thomasset
33e5294a94 refactor(lint): removed extra semi 2024-05-10 12:07:50 +02:00
Corentin Thomasset
2852c30e1f chore(issues): improved issues template 2024-05-10 12:05:35 +02:00
Corentin Thomasset
124284278f refactor(auto-imports): regen auto imports 2024-05-10 11:41:48 +02:00
Corentin THOMASSET
a7992340f7 chore(issues): improved bug issue template (#1046) 2024-05-10 09:28:45 +00:00
steffenrapp
2c2fb216e3 feat(i18n): added German translation (#1038)
* feat(i18n): German translation

* more

* more

* more

* rest
2024-05-10 10:57:42 +02:00
Christopher Conley
221ddfa75c fix(language): English language cleanup (#1036)
Fix possessive vs. contraction form of "it," clarification, and some general cleanup
2024-05-05 18:49:31 +02:00
Pavel Gordon
cb5b462e11 fix(url-encoder, validation): typo in validation of url-encoder.vue #1024 2024-04-29 11:58:08 +02:00
sharevb
9eac9cb2a9 fix(integer base converter): support bigint (#872) 2024-04-22 08:45:51 +02:00
sharevb
23f82d956a fix(bcrypt tool): allow salt rounds up to 100 (#987)
* fix(bcrypt tool): allow salt rounds up to 100

Previously max salt rounds was 10

* chore(github workflows): ci and e2e tests: try updating to node 20
2024-04-15 09:43:12 +02:00
sharevb
d3b32cc14e feat(new tool): Outlook Safelink Decoder (#911)
* feat(new tool): Outlook Safelink Decoder

Fix #897

* Use native URL parsing

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>

* Update src/tools/safelink-decoder/index.ts

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2024-03-11 10:19:32 +00:00
sharevb
fe349ad69b feat(new tool): ascii art generator (#886)
* feat(new tool): ascii art generator

Fix #829 ; Text ASCII Art Generator (using figlet)

* fix: make fonts list searchable

* refactor(ascii-generator): updated tool definition

* refactor(ascii-generator): equilibrate ui

---------

Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2024-03-03 10:37:09 +00:00
Corentin THOMASSET
a07806cd15 refactor(home): lightened tool cards (#882) 2024-02-12 13:31:21 +00:00
Corentin THOMASSET
10e56b35bb refactor(home): removed n-grid to prevent layout shift (#881) 2024-02-12 09:30:41 +00:00
Corentin THOMASSET
dc0461595f feat(i18n): get locales on build (#880) 2024-02-11 00:33:52 +01:00
David Nguyen
079aa2164c feat(i18n): added vi tools translations (#876)
* Update Vietnamese translations in vi.yml file

* Add Vietnamese translations for various tools
2024-02-05 10:09:07 +00:00
QingFeng
9c6b12225e feat(i18n): added zh tools translations (#874) 2024-02-05 11:06:36 +01:00
Corentin THOMASSET
7f5fa00147 feat(i18n): added missing locale files in tools (#863) 2024-02-01 17:05:05 +00:00
hieudt-2054
1334bff30a feat(i18n): added vietnamese language (#859) 2024-02-01 14:47:09 +01:00
Corentin THOMASSET
95698cb938 refactor(i18n): added locales per tool (#861) 2024-02-01 14:05:54 +01:00
Raúl Mora
85b50bb8f0 feat(i18n): added spanish language (#854)
* spanish

translation

* Create es.yaml
2024-01-31 10:10:21 +00:00
Marcelo Gonçalves
c65ffb6e75 feat(i18n): added portuguese language (#813) 2024-01-31 11:03:54 +01:00
Nikitin Roman
693f362e15 feat(i18n): added ukrainian language (#827)
Added Ukrainian language
2024-01-31 11:01:56 +01:00
Isaiah
fc06f01b34 feat(new-tool): yaml formater (#779)
* validating if yaml is correct and collecting format options

* Formatting yaml, sorting keys and changing indent size.

* Removed unused format options

* Fixed lint errors

* Installed types for js-yaml

* Removed legacy routing and added tool creation date

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>

* Using existing yaml package instead of js-yaml

* Update src/tools/yaml-viewer/index.ts

---------

Co-authored-by: Isaiah <66272034+isaiah-j@users.noreply.github.com>
Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2024-01-31 09:58:53 +00:00
hieudt-2054
c46207f1bb feat(new-tool): added unicode conversion utilities (#858)
* feat: add Text to Unicode tool

* Update src/tools/text-to-unicode/index.ts

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2024-01-31 09:55:18 +00:00
Corentin Thomasset
670f735501 chore(version): release 2023.12.21-5ed3693 2023-12-21 08:45:28 +01:00
Corentin Thomasset
a29ad66809 docs(changelog): update changelog for 2023.12.21-5ed3693 2023-12-21 08:45:27 +01:00
Markus Blaschke
5ed36935c7 fix(jwt-parser): jwt claim array support (#799)
fixes support of claim array values (was shown "[Object]" before)

Signed-off-by: Markus Blaschke <mblaschke82@gmail.com>
2023-12-12 14:04:19 +01:00
Isaiah
80e46c9292 fix(camera-recorder): stop camera on navigation (#782)
* Stopping camera when user switches to another page

* Missing ;
2023-11-29 13:58:07 +01:00
Richard "EpicKitty" Bowey
7a70dbbe0c fix(doc): updated create new tool command in readme (#762) 2023-11-22 20:27:46 +01:00
lzb16
2e56641398 feat(i18n): improve chinese i18n (#757) 2023-11-16 18:27:51 +01:00
lzb16
a1037cf8f1 feat(i18n): add tooltip and favoriteButton i18n (#756) 2023-11-16 08:20:42 +00:00
renovate[bot]
0fe9a20329 chore(deps): switched from oui to oui-data for mac address lookup (#693)
* fix(deps): update dependency oui to v13

* chore(deps): switched from oui to oui-data for mac address lookup

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-11-14 23:44:23 +00:00
renovate[bot]
2e396d8776 chore(deps): update unocss monorepo to ^0.57.0 (#638)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-15 00:19:09 +01:00
Corentin THOMASSET
bd3edcb528 refactor(about, i18n): improved i18n dx with markdown (#753) 2023-11-14 23:15:41 +00:00
Corentin THOMASSET
de1ee69ef9 refactor(token, i18n): complete fr translation (#752) 2023-11-14 23:14:05 +00:00
Gary
8f99eb6017 feat(i18n): add Chinese translation base (#718)
* Create zh_CN.yml

* rename

* Update zh.yml

* Update zh.yml

* Update zh.yml

* Update zh.yml

* Update zh.yml
2023-11-15 00:09:36 +01:00
Corentin THOMASSET
38586caab7 refactor(uuid generator): uuid version picker (#751) 2023-11-13 21:38:01 +00:00
Corentin THOMASSET
043e4f0a08 fix(base64-file-converter): fix downloading of index.html content without data preambula (#750)
* fix(base64-file-converter): fix downloading of index.html content without data preambula

* feat(base64-file-converter): infer mime type from base64 signature

---------

Co-authored-by: akharlov <harl_aa@skbkontur.ru>
2023-11-13 10:44:23 +00:00
Corentin THOMASSET
ca43a25569 refactor(case converter): no split on lowercase, uppercase and mocking case (#748) 2023-11-13 00:00:55 +00:00
Corentin THOMASSET
7fe47b3be4 refactor(ui): replaced legacy n-upload with c-file-upload (#747) 2023-11-13 00:56:51 +01:00
Corentin THOMASSET
16ffe6b5c9 refactor(token): added password in token generator keywords (#746) 2023-11-12 22:54:13 +00:00
Corentin THOMASSET
478192065e feat(new tool): pdf signature checker (#745) 2023-11-12 22:22:41 +00:00
Corentin THOMASSET
205e360400 fix(docker): rollback armv7 in docker releases (#741) 2023-11-09 13:33:19 +00:00
Steltek
821cbea2bf fix(eta): corrected example (#737) 2023-11-08 19:56:58 +01:00
Oceansdeep7
093ff311fd refactor(bcrypt): fix input label align (#721)
Co-authored-by: robin.li <robin.li@webeye.com>
2023-11-07 09:10:52 +01:00
Corentin THOMASSET
e07e2ae5bc feat(new tool): numeronym generator (#729) 2023-11-05 21:59:31 +00:00
Corentin THOMASSET
fe1de8c5c9 chore(docker): added armv7 plateform for docker releases (#722) 2023-11-03 08:06:11 +00:00
Corentin Thomasset
b2614990e3 chore(version): release 2023.11.02-7d94e11 2023-11-02 09:11:26 +01:00
Corentin Thomasset
79646375f3 docs(changelog): update changelog for 2023.11.02-7d94e11 2023-11-02 09:11:26 +01:00
Andrii Bratanin
7d94e11cee fix(dockerfile): revert replacement of nginx image with non-privileged one (#716)
Fixes https://github.com/CorentinTh/it-tools/issues/714
2023-11-02 09:10:13 +01:00
swishkin
e87f4b1837 refactor(math-evaluator): improved description
Improved description.
2023-11-01 23:07:51 +01:00
Corentin THOMASSET
e86fd96ae3 feat(i18n): language selector (#710) 2023-11-01 15:38:19 +01:00
Corentin THOMASSET
58de8970f5 refactor(math-evaluator): improved search and UX (#713)
* refactor(math-evaluator): added keywords for search

* refactor(math-evaluator): improved input
2023-11-01 14:23:46 +00:00
Corentin THOMASSET
02b0d0d1a1 fix(encryption): alert on decryption error (#711)
* update(c-alert): Add variant 'error'

* fix(encryption): Alert decryption error (#652)

* feat(c-alert): added title

* refactor(composable): mutualized computedCatch

---------

Co-authored-by: code2933 <code2933@outlook.com>
2023-11-01 10:11:51 +00:00
Corentin Thomasset
4d5a67d96d chore(version): release 2023.11.01-e164afb 2023-11-01 10:02:22 +01:00
Corentin Thomasset
8174db9cf3 docs(changelog): update changelog for 2023.11.01-e164afb 2023-11-01 10:02:22 +01:00
Corentin THOMASSET
e164afb664 chore(deps): clean unused dependencies (#709)
* chore(deps): removed unused dep randombytes

* chore(deps): removed unused dep c8

* chore(deps): updated dep naive-ui
2023-10-31 21:00:23 +00:00
Corentin THOMASSET
d0136962b9 feat(command-palette): clear prompt on palette close (#708) 2023-10-31 19:27:21 +00:00
Corentin THOMASSET
015c673e09 refactor(ui): better ui demo preview menu (#664) 2023-10-31 17:49:36 +00:00
Corentin Thomasset
99b1eb944d feat(command-palette): added about page in command palette 2023-10-31 18:26:16 +01:00
Istvan Olah
cc3425dc77 feat(new tool): random MAC address generator (#657)
* #521 Random MAC address generator

* refactor(mac-address-generator): improved ux

* refactor(mac-address-generator): improved ux

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-10-31 11:34:24 +00:00
Corentin THOMASSET
681f7bf644 feat(case-converter): added mocking case (#705) 2023-10-31 09:52:01 +00:00
Corentin THOMASSET
f5eb7a8c49 feat(date-converter): added excel date time format (#704) 2023-10-31 08:59:35 +00:00
Corentin THOMASSET
abb8335041 refactor(color-converter): improved color-converter UX (#701) 2023-10-31 07:32:44 +00:00
Corentin THOMASSET
020e9cbe41 refactor(docker): improved docker config (#700) 2023-10-30 17:11:16 +00:00
莫颓
02e68d3f56 feat(i18n): token generator (#688) 2023-10-23 09:17:08 +02:00
莫颓
00562ed5e8 feat(i18n): home page (#687)
(cherry picked from commit 9d39826078ceb929a5ca3b577f9f39449303c289)
2023-10-23 09:14:34 +02:00
renovate[bot]
4365226d01 chore(deps): update docker/setup-qemu-action action to v3 (#627)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-22 10:30:26 +02:00
renovate[bot]
57ecda1623 chore(deps): update docker/setup-buildx-action action to v3 (#626)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-22 10:30:16 +02:00
renovate[bot]
d8d7a3b9ab chore(deps): update docker/login-action action to v3 (#625)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-22 10:30:04 +02:00
renovate[bot]
d36b18f193 chore(deps): update docker/build-push-action action to v5 (#624)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-22 10:29:05 +02:00
renovate[bot]
eea9f91276 chore(deps): update dependency node to v18.18.2 (#674)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-22 10:26:05 +02:00
莫颓
ebb4ec4165 feat(i18n): support for i18n in .ts files (#683)
(cherry picked from commit 732313bfc32a514ef064ca0f90304ff05e2e7ef3)
2023-10-22 10:23:00 +02:00
莫颓
84a4a646f6 feat(i18n): tool card (#682)
(cherry picked from commit 1d0a3904f72ab24364beda034d17cf6de9b5e959)
2023-10-22 08:21:10 +00:00
莫颓
a2b53c2e38 feat(i18n): about page (#680)
(cherry picked from commit 605b84c16e0eec1a16e6133203e7810a68447607)

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-10-22 08:15:39 +00:00
莫颓
35563b8457 feat(i18n): 404 page (#679) 2023-10-22 10:07:43 +02:00
Sellar
720201aa7b fix(deps): fix issue on slugify (#593) (#673) 2023-10-18 09:23:34 +02:00
Corentin THOMASSET
b2ad4f7a27 feat(new tool): text to ascii converter (#669) 2023-10-15 22:57:47 +00:00
Corentin Thomasset
b408df82c1 refactor(c-table): added description on c-table for accessibility 2023-10-15 23:41:55 +02:00
Corentin THOMASSET
88b881880c refactor(ci): reduced timeout in e2e (#666) 2023-10-14 22:48:18 +00:00
Corentin THOMASSET
ee4c853b9f refactor(ui): new c-table ui component (#665) 2023-10-14 22:45:14 +00:00
Corentin THOMASSET
cbf58fdd28 refactor(ui): removed n-page-header component in user-agent parser (#663) 2023-10-14 23:01:32 +02:00
Corentin THOMASSET
a757a5155a refactor(ui): removed n-p components in about page (#662) 2023-10-14 18:37:26 +02:00
Corentin THOMASSET
025f556023 refactor(ui): switched naive tooltip components to custom ones (#661) 2023-10-14 16:24:54 +00:00
renovate[bot]
2d2dffb14a chore(deps): update dependency node to v18.18.0 (#636)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-04 11:46:33 +02:00
Corentin THOMASSET
5c4d775e2d feat(new tool): ULID generator (#623) 2023-09-11 22:57:42 +00:00
Corentin THOMASSET
557b30426f doc(readme): added contributors list (#622) 2023-09-11 20:59:07 +00:00
renovate[bot]
4972159aa7 chore(deps): update actions/checkout action to v4 (#613)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-11 22:42:33 +02:00
renovate[bot]
e371ef702e fix(deps): update dependency monaco-editor to ^0.43.0 (#620)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-11 22:40:42 +02:00
Simon Bordeyne
0eedce69a6 feat(new tool): add wifi qr code generator (#599)
* (feat: new tool): add wifi qr code generator

* Update src/tools/wifi-qr-code-generator/wifi-qr-code-generator.vue

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>

* Update src/tools/wifi-qr-code-generator/index.ts

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>

* remove naive UI grid

* Update src/tools/wifi-qr-code-generator/index.ts

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-09-06 07:46:40 +00:00
Mark Townsend
8a30b6bdb3 refactor(spelling): minor corrections to phrasing/spelling (#596)
* Minor corrections to phrasing/spelling.

* Corrected 'millennia'.

* Corrected tests.

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-09-04 14:51:04 +02:00
Corentin THOMASSET
233d5565f6 refactor(i18n): merge tools scoped locales with global ones (#612) 2023-09-03 20:07:45 +00:00
Corentin THOMASSET
7ab9204e96 refactor(c-key-value-list): got rid of table for layout (#611) 2023-09-03 16:12:22 +00:00
renovate[bot]
c7d4562d3b fix(deps): update dependency sql-formatter to v13 (#606)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-03 16:51:12 +02:00
Corentin THOMASSET
18dd1400bd refactor(CI): run e2e against built app and no longer vercel (#610) 2023-09-03 14:28:19 +00:00
renovate[bot]
f035f485c0 chore(deps): update dependency unplugin-icons to ^0.17.0 (#609)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-03 16:16:01 +02:00
Anton Mosich
e18bae1fca refactor(bcrypt): fix typo (#604) 2023-09-01 16:30:51 +02:00
renovate[bot]
d1dff428d8 chore(deps): update dependency @intlify/unplugin-vue-i18n to ^0.13.0 (#597)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-01 10:14:50 +02:00
Corentin THOMASSET
3a63837d3d feat(new tool): iban validation and parser (#591) 2023-08-27 18:12:31 +00:00
Corentin THOMASSET
81bfe57cb8 feat(new tool): text diff and comparator (#588)
* feat(new tool): text diff and comparator

* chore(ci): increased memory in CI
2023-08-26 16:43:47 +02:00
renovate[bot]
a9cd91ca9c chore(deps): update dependency @antfu/eslint-config to ^0.41.0 (#585)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-26 16:28:31 +02:00
Corentin THOMASSET
06c35472d3 doc(hosting): added cloudron in the other hosting solutions section (#589) 2023-08-26 14:18:12 +00:00
renovate[bot]
f3e14fc18f chore(deps): update dependency typescript to ~5.2.0 (#587)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-26 16:17:19 +02:00
Corentin Thomasset
2274766a8f chore(version): release 2023.08.21-6f93cba 2023-08-22 01:02:24 +02:00
Corentin Thomasset
a346175d24 docs(changelog): update changelog for 2023.08.21-6f93cba 2023-08-22 01:02:24 +02:00
Corentin THOMASSET
6f93cba3da feat(copy): support legacy copy to clipboard for older browser (#581) 2023-08-21 23:00:20 +00:00
renovate[bot]
76b2761d62 chore(deps): switched to fucking typescript v5 (#501)
* chore(deps): update dependency typescript to v5

* chore(deps): switched to fucking typescript v5

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-08-21 19:57:59 +00:00
renovate[bot]
6ff9a01cc8 chore(deps): update dependency @antfu/eslint-config to ^0.40.0 (#552)
* chore(deps): update dependency @antfu/eslint-config to ^0.40.0

* chore(deps): updated eslint

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-08-21 18:27:08 +00:00
renovate[bot]
a2b9b157e5 chore(deps): update dependency prettier to v3 (#564)
* chore(deps): update dependency prettier to v3

* chore(deps): updated prettier

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-08-21 18:02:54 +00:00
renovate[bot]
144f86e2dc chore(deps): removed @typescript-eslint/parser (#563)
* chore(deps): update dependency @typescript-eslint/parser to v6

* chore(deps): removed @typescript-eslint/parser

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-08-21 17:18:04 +00:00
renovate[bot]
0f1f6590c5 chore(deps): removed ts-pattern (#565)
* fix(deps): update dependency ts-pattern to v5

* chore(deps): removed ts-pattern

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-08-21 17:06:09 +00:00
renovate[bot]
2bcb77a9f9 fix(deps): update dependency sql-formatter to v12 (#520)
* fix(deps): update dependency sql-formatter to v12

* fix(sql-prettify): corrected types

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-08-21 18:34:15 +02:00
Corentin THOMASSET
c58d6e3423 feat(new tool): string obfuscator (#575) 2023-08-16 21:43:45 +00:00
Corentin Thomasset
f235dcd6c1 chore(version): release 2023.08.16-9bd4ad4 2023-08-16 14:19:08 +02:00
Corentin Thomasset
ba2c589f0f docs(changelog): update changelog for 2023.08.16-9bd4ad4 2023-08-16 14:19:08 +02:00
renovate[bot]
9bd4ad4dfd chore(deps): update dependency vitest to ^0.34.0 (#562)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-10 16:15:18 +02:00
renovate[bot]
5e12991bcd fix(deps): update dependency uuid to v9 (#566)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-10 15:12:27 +02:00
renovate[bot]
65a9474078 chore(deps): update dependency node to v18.17.1 (#560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-10 01:10:53 +02:00
renovate[bot]
85cc7a8447 chore(deps): update dependency unocss to ^0.55.0 (#561)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-09 22:31:31 +00:00
renovate[bot]
4268e255de chore(deps): update dependency @unocss/eslint-config to ^0.55.0 (#553)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-09 22:22:15 +00:00
renovate[bot]
d1c888019b chore(deps): update dependency @intlify/unplugin-vue-i18n to ^0.12.0 (#526)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-10 00:11:59 +02:00
renovate[bot]
7924456cec fix(deps): update dependency mathjs to v11 (#519)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-10 00:11:30 +02:00
renovate[bot]
99bc84c37e chore(deps): update docker/login-action action to v2 (#512)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-10 00:10:31 +02:00
renovate[bot]
ea0f27cf4c fix(deps): update dependency @vueuse/router to v10 (#516)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-10 00:10:19 +02:00
renovate[bot]
cd5a503fc0 chore(deps): update dependency jsdom to v22 (#499)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-10 00:09:39 +02:00
Corentin THOMASSET
86e964a274 fix(copy): prevent shorthand copy if source is present in useCopy (#559)
* fix(copy): prevent shorthand copy if source is present in useCopy

* refactor(copy): normalized copy usage
2023-08-09 22:07:44 +00:00
Marvin
7b6232a151 feat(Case Converter): Add lowercase and uppercase (#534)
* feat(case converter): add uppercase and lowercase

* (case converter) correctly use stripRegexp

* style: lint fix

* 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

* feat(new tool): emoji picker (#551)

* chore(deps): update dependency @vitejs/plugin-vue to v4 (#496)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency @vitejs/plugin-vue-jsx to v3 (#497)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* refactor(case converter): using nocase to convert to upper and lower case

* refactor(case converter): config based case changes

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-09 23:45:21 +02:00
Corentin THOMASSET
56d74d07a8 fix(c-lib): hide component library shortcut link in non-dev (#557) 2023-08-09 20:58:15 +00:00
Corentin THOMASSET
e5d0ba7073 fix(emoji picker): fix copy button (#556) 2023-08-09 20:54:49 +00:00
renovate[bot]
1a602365be chore(deps): update dependency @vitejs/plugin-vue-jsx to v3 (#497)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-08 22:25:59 +02:00
renovate[bot]
a2494219a8 chore(deps): update dependency @vitejs/plugin-vue to v4 (#496)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-08 22:25:59 +02:00
Corentin THOMASSET
93f7cf0e98 feat(new tool): emoji picker (#551) 2023-08-08 22:25:59 +02:00
Corentin THOMASSET
dfa1ba8554 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
2023-08-07 15:30:00 +00:00
renovate[bot]
6498c9b0fa chore(deps): update dependency vite-plugin-pwa to ^0.16.0 (#488)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-05 16:29:58 +02:00
renovate[bot]
f40d7ecddf chore(deps): update dependency vite to v4 (#503)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-29 20:35:23 +02:00
Corentin THOMASSET
2e28c5073e chore(ci): e2e against vercel deployement (#518) 2023-06-29 20:27:35 +02:00
renovate[bot]
d12dd40841 fix(deps): update dependency @vueuse/head to v1 (#515)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-29 20:20:28 +02:00
Corentin THOMASSET
cf382b5a10 chore(e2e): execute e2e against built app (#511) 2023-06-29 18:48:51 +02:00
renovate[bot]
01525838e0 chore(deps): update github/codeql-action action to v2 (#513)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-29 08:57:10 +02:00
renovate[bot]
38cb61da4d chore(deps): update node.js to v18 (#514)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-28 08:35:45 +02:00
Corentin THOMASSET
354aed6e6f chore(deps): switched from vite-plugin-md to vite-plugin-vue-markdown (#510) 2023-06-27 18:39:20 +00:00
renovate[bot]
6b8682fd23 chore(deps): update dependency workbox-window to v7 (#509)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-27 20:29:41 +02:00
renovate[bot]
9e8349dbc4 chore(deps): update dependency vite-svg-loader to v4 (#508)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-27 20:13:06 +02:00
renovate[bot]
f44050742d chore(deps): update dependency typescript to ~4.9.0 (#481)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-27 20:08:12 +02:00
renovate[bot]
b0d9a3e6c7 chore(deps): update dependency vue-tsc to ^0.40.0 (#490)
* chore(deps): update dependency vue-tsc to ^0.40.0

* chore(deps): upgraded vue-tsc dependency

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-06-27 17:59:05 +00:00
Corentin THOMASSET
30f88fc6a8 refactor(navbar): consistent spacing in navbar buttons (#507) 2023-06-27 16:47:32 +00:00
Corentin THOMASSET
72c98a3c5e refactor(ui): remove n-text (#506) 2023-06-25 13:49:43 +00:00
Corentin THOMASSET
05ea545475 refactor(ui): replaced some n-input to c-input (#505) 2023-06-25 13:00:50 +00:00
Corentin THOMASSET
5c3bebfe62 chore(deps): updated unplugin-auto-import (#504) 2023-06-25 09:45:56 +00:00
renovate[bot]
8df7cd0f19 chore(deps): removed start-server-and-test dependency
* chore(deps): update dependency start-server-and-test to v2

* chore(deps): removed start-server-and-test dependency

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-06-25 08:34:36 +00:00
Corentin THOMASSET
a9c7b89193 feat(new-tool): password strength analyzer (#502) 2023-06-25 08:26:29 +00:00
renovate[bot]
6bda2caa04 chore(deps): update dependency c8 to v8 (#498)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-25 10:02:46 +02:00
renovate[bot]
994a1c3401 chore(deps): update dependency @types/jsdom to v21 (#495)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-24 18:55:46 +02:00
renovate[bot]
05edaf423c chore(deps): update node.js to v16.20.1 (#491)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-24 18:54:36 +02:00
renovate[bot]
8c72e692a7 fix(deps): update dependency country-code-lookup to ^0.1.0 (#493)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-24 18:49:54 +02:00
renovate[bot]
cec9dea9e0 fix(deps): update dependency @vueuse/head to ^0.9.0 (#492)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-24 18:48:42 +02:00
renovate[bot]
49eacea195 chore(deps): update dependency vitest to ^0.32.0 (#489)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-24 18:47:57 +02:00
renovate[bot]
3f7d469e9f chore(deps): update actions/checkout action to v3 (#494)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-24 18:46:01 +02:00
renovate[bot]
5f2190887d chore(deps): update dependency unplugin-vue-components to ^0.25.0 (#484)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-23 22:19:08 +02:00
renovate[bot]
6cb0845336 chore(deps): update dependency unplugin-auto-import to ^0.16.0 (#483)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-23 22:18:44 +02:00
Corentin Thomasset
12d9e5d377 fix(i18n): fallback for demo i18n 2023-06-23 21:57:08 +02:00
Corentin Thomasset
e29b258e90 feat(new-tool): yaml to toml 2023-06-23 21:47:23 +02:00
Corentin Thomasset
ea50a3fc65 feat(new-tool): json to toml 2023-06-23 21:47:23 +02:00
Corentin Thomasset
746e5bdccc feat(new-tool): toml to yaml 2023-06-23 21:47:23 +02:00
Corentin Thomasset
c7d4f112c0 feat(new-tool): toml to json 2023-06-23 21:47:23 +02:00
Marvin
9125dcf9c6 refactor(json-viewer): input monospace font (#485) 2023-06-23 19:38:34 +00:00
renovate[bot]
38710dce56 chore(deps): update dependency unocss to ^0.53.0 (#482)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-23 21:30:45 +02:00
renovate[bot]
282cfc4c4b chore(deps): update dependency @unocss/eslint-config to ^0.53.0 (#478)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-23 16:59:18 +02:00
Marvin
ba4876d0d5 refacor(transformers): use monospace font for JSON and SQL text areas (#476)
* feat(c-input): Add monospace prop

* feat: use monospace input for json and sql inputs
2023-06-23 16:51:52 +02:00
renovate[bot]
363c2e47e6 chore(deps): added renovate.json (#477)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-23 16:49:03 +02:00
Marvin
9526ed8324 fix(typos): fixed more typos & uppercase JSON (#475)
* fix(About): typo

* uppercase json & typos
2023-06-23 15:23:47 +02:00
Marvin
7068610438 fix(about): typos and wording (#474)
* fix(About): typos and wording

* Update src/pages/About.vue

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-06-21 19:45:48 +00:00
Corentin THOMASSET
847323ccba docs(ide): updated vscode extensions settings (#472) 2023-06-19 21:49:40 +00:00
Corentin THOMASSET
1b038c7826 chore(i18n): tool scoped locales (#471) 2023-06-19 21:14:44 +00:00
Corentin Thomasset
ec4c533718 feat(command-palette): random tool action 2023-06-19 21:51:25 +02:00
Seb
63045951e1 feat(config): allow app to run in a subfolder via BASE_URL (#461)
* fix: allow hosting in subfolder via BASE_URL

* Import baseUrl from config

* Revert "Import baseUrl from config"

This reverts commit 73c867ebc8.

* feat(config): fallback baseUrl to /

* feat(config): fallback baseUrl to /

---------

Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-06-19 18:42:29 +02:00
Corentin THOMASSET
c4cec9e18f fix(mime-types): typos (#470) 2023-06-19 16:09:03 +00:00
Corentin THOMASSET
bcb98b359c refactor(search): command palette design (#463) 2023-06-19 00:35:50 +02:00
Corentin Thomasset
732da08157 chore(wysiwyg-editor): update tiptap dependencies 2023-06-19 00:08:07 +02:00
Seb
b9406a492d feat(new-tool): percentage calculator (#456)
* feat(new tool): percentage calculator

* Apply suggestions from code review

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-06-18 18:24:39 +02:00
Corentin Thomasset
69f0bd079f feat(new-tool): json to csv converter 2023-06-18 18:10:06 +02:00
Corentin Thomasset
4cbd7ac145 fix(sonar): took down minor sonar warning 2023-06-18 14:56:52 +02:00
Corentin Thomasset
ebfb872fae chore(i18n): setup i18n plugin config 2023-06-18 14:33:58 +02:00
jmmanzano
a6bbeaebd8 feat(new tool): xml formatter (#457)
* feat(new tool): xml formatter

* feat(xml-formatter): added happy path e2e tests

* refactor(xml-formatter): improved unit tests

* refactor(xml-formatter): add better suitable icon

* feat(xml-formatter): added happy path e2e tests

* feat(xml-formatter): registered xml as syntax highlighter

* chore(auto-import): removed unused NSpace

---------

Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2023-06-18 10:27:26 +00:00
myztillx
f771e7a99f feat(chmod-calculator): added symbolic representation (#455) 2023-06-18 11:01:54 +02:00
Seb
cf7b1f000a feat(enhancement): use system dark mode (#458)
* Use prefers-color-scheme

* Remove theme store
2023-06-18 10:59:22 +02:00
Corentin Thomasset
1e2a35b892 refactor(c-input-text): force usage of props with default 2023-06-11 21:27:40 +02:00
Corentin Thomasset
45c2474279 refactor(naming): prevent auto import conflicts for git memo 2023-06-10 17:37:38 +02:00
Corentin Thomasset
fe61f0f2f2 refactor(imports): removed unnecessary imports to vue 2023-06-10 17:24:10 +02:00
David Nguyen
93799af83c chore(config): netlify deployment support (#443)
* Create netlify.toml

* Update netlify.toml

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-06-10 17:02:08 +02:00
Corentin Thomasset
962a6d6ec4 chore(ci): shard e2e tests 2023-06-10 16:59:54 +02:00
Corentin Thomasset
d2956b66fe feat(phone-parser): searchable country code select 2023-06-10 16:43:03 +02:00
DawnElixir
105b21badc fix(readme): typo
Fix readme typo
2023-05-31 22:55:44 +02:00
Corentin Thomasset
33c9b6643f chore(lint): switched to a better lint config 2023-05-28 23:29:14 +02:00
Corentin Thomasset
4d2b037dbe refactor(ui): removed all n-space 2023-05-27 17:53:13 +02:00
Corentin Thomasset
34d8e5ce2c feat(new tool): camera screenshot and recorder 2023-05-17 00:34:10 +02:00
Corentin Thomasset
8515c24264 chors(deps): updated vueuse dependency version 2023-05-15 17:21:59 +02:00
cgoIT
0b20f1c16a feat(base64-string-converter): switch to encode and decode url safe base64 strings (#392)
* feat(base64-string-converter): switch to encode and decode url safe

* feat(base64-string-converter): changes based on review comments, use config object instead of boolean argument.

* feat(base64-string-converter): fix validation, add option to watch additional refs for changes which interfere with validation rules
2023-05-15 14:35:44 +02:00
cgoIT
8c92d56318 fix(ipv4-range-expander): calculate correct for ip addresses where the first octet is lower than 128 (#405) 2023-05-15 10:23:16 +02:00
Corentin Thomasset
7aed9c56fd fix(ipv4-converter): removed readonly on input 2023-05-15 10:00:55 +02:00
Corentin Thomasset
f7fc779e63 refactor(ui): replaced some n-input with c-input-text 2023-05-15 01:31:22 +02:00
Corentin Thomasset
b3b6b7c46b chore(version): release 2023.05.14-77f2efc 2023-05-14 22:48:20 +02:00
Corentin Thomasset
141c12455e docs(changelog): update changelog for 2023.05.14-77f2efc 2023-05-14 22:48:20 +02:00
Corentin Thomasset
77f2efc0b9 refactor(ui): replaced some n-input with c-input-text 2023-05-14 22:30:23 +02:00
Corentin Thomasset
aad8d84e13 ui-lib(new-component): added text input component in the c-lib 2023-05-14 22:30:23 +02:00
Corentin Thomasset
401f13f7e3 ui-lib(button): size variants 2023-05-14 22:30:23 +02:00
Corentin THOMASSET
edae4c6915 chore(issues): updated new tool request issue template 2023-05-13 22:09:55 +02:00
Corentin Thomasset
a43c546e34 fix(phone-parser): use default country code 2023-05-07 13:25:33 +02:00
cgoIT
83a7b3bae9 feat(list-converter): a small converter who deals with column based data and do some stuff with it (#387)
* feat(list-converter): a small converter who deals with column based data and do some stuff with it

* Update src/tools/list-converter/index.ts

* Update src/tools/list-converter/index.ts

* Update src/tools/list-converter/index.ts

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>

fix(list-format): fix e2e
2023-05-07 13:25:25 +02:00
Corentin Thomasset
ce3150c65d feat(new tool): phone parser and normalizer 2023-05-02 13:57:39 +02:00
Corentin Thomasset
3f6c8f0edd fix(home): prevent weird blue border on card 2023-05-01 13:44:30 +02:00
Corentin Thomasset
daf2cf0285 chore(version): release 2023.04.23-92bd835 2023-04-23 22:44:35 +02:00
Corentin Thomasset
b7aaea1b58 docs(changelog): update changelog for 2023.04.23-92bd835 2023-04-23 22:44:35 +02:00
Corentin Thomasset
92bd83536f feat(ui-lib): demo pages for c-lib components 2023-04-23 22:43:06 +02:00
Corentin Thomasset
e88c1d5f2c fix(ts): cleaned legacy typechecking warning 2023-04-23 17:11:04 +02:00
Corentin Thomasset
362f2fa280 feat(new-tool): diff of two json objects 2023-04-23 15:24:20 +02:00
Corentin Thomasset
61ece2387f refactor(ui-lib): prevent c-button to shrink 2023-04-20 21:03:20 +02:00
Corentin Thomasset
f080933d2a refactor(ui): replaced naive ui cards with custom ones 2023-04-20 20:57:38 +02:00
Corentin Thomasset
bb32513bd3 refactor(clean): removed unused lodash import 2023-04-19 22:58:07 +02:00
Corentin Thomasset
c311e3824d fix(mac-address-lookup): added copy handler on button click 2023-04-19 22:56:50 +02:00
Corentin Thomasset
74073f5038 refactor(clean): removed useless br tags 2023-04-19 22:50:02 +02:00
Corentin Thomasset
c45bce36f9 refactor(ui): getting ride of naive ui buttons 2023-04-19 22:33:22 +02:00
cgoIT
df989e24b3 feat(ipv4-range-expander): expands a given IPv4 start and end address to a valid IPv4 subnet (#366)
* feat(ipv4-range-expander): expands a given IPv4 start and end address to a valid IPv4 subnet

* feat(ipv4-range-expander): remove old component copyable-ip-like.vue

* feat(ipv4-range-expander): fix sonar findings

* feat(ipv4-range-expander): changes due to review

* feat(ipv4-range-expander): only show n-alert if both ipv4 addresses are valid
2023-04-19 20:30:45 +02:00
Corentin Thomasset
6d2202597c feat(date converter): auto focus main input 2023-04-19 13:07:24 +02:00
Corentin Thomasset
c68a1fd713 chore(version): release 2023.04.14-dbad773 2023-04-14 21:09:36 +02:00
Corentin Thomasset
46b1a07213 docs(changelog): update changelog for 2023.04.14-dbad773 2023-04-14 21:09:36 +02:00
Corentin Thomasset
dbad7730f9 chore(release): create a github release on new version 2023-04-14 21:08:43 +02:00
Corentin Thomasset
85cb0ffabd chore(version): reset CHANGELOG content to support new format 2023-04-14 18:34:23 +02:00
Corentin Thomasset
8355bd2ae4 feat(new-tool): http status codes 2023-04-14 09:04:49 +02:00
Corentin Thomasset
6fb4994603 refactor(uuid-generator): prevent NaN in quantity 2023-04-13 23:36:25 +02:00
Corentin Thomasset
7d7cc99866 chore(version): release v2023.04.13-dce9ff9 2023-04-13 01:09:14 +02:00
Corentin Thomasset
dce9ff91e2 feat(cd): git version tag pushed to docker 2023-04-13 01:04:48 +02:00
Corentin Thomasset
80401b6405 refactor(404): simplified 404 page 2023-04-13 00:03:08 +02:00
Corentin Thomasset
fd9ab59172 refactor(date-converter): improved ux and layout 2023-04-12 23:41:09 +02:00
Corentin Thomasset
5fa811a583 chore(deps): updated dependencies 2023-04-12 20:35:44 +02:00
Corentin Thomasset
c0a89131dd feat(new-tool): yaml and json converters 2023-04-10 22:38:35 +02:00
Corentin Thomasset
05f06f6a07 refactor(dx): generic data transformer 2023-04-10 16:42:06 +02:00
Corentin Thomasset
9fa4c26929 refactor(config): removed new tools env config 2023-04-10 13:11:10 +02:00
Corentin Thomasset
9d639edf2d refactor(lint): auto fix lint 2023-04-10 13:01:40 +02:00
cgoIT
a1e983538c feat(new-tool): generate ula based on timestamp and mac address (#344)
* feat(ipv6-ula-generator): new tool: generate ula based on timestamp and mac address

This new tool generates a random unique ula based on the current timestamp and the provided mac address. An ULA is your "secondary" IPV6-Address only for internal use.
It can also be used as a backup address if your provider gets offline and your Prefix-IPs are not longer valid.Also you can create the most of your internal firewall rules based on your ULAs.

* feat(ipv6-ula-generator): changes requested by review

* Update src/tools/ipv6-ula-generator/index.ts

* Update src/tools/ipv6-ula-generator/ipv6-ula-generator.vue

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-04-09 21:05:26 +02:00
cgoIT
1d7f8b9a8c feat(new-tool): generate ula based on timestamp and mac address (#344)
* feat(ipv6-ula-generator): new tool: generate ula based on timestamp and mac address

This new tool generates a random unique ula based on the current timestamp and the provided mac address. An ULA is your "secondary" IPV6-Address only for internal use.
It can also be used as a backup address if your provider gets offline and your Prefix-IPs are not longer valid.Also you can create the most of your internal firewall rules based on your ULAs.

* feat(ipv6-ula-generator): changes requested by review

* Update src/tools/ipv6-ula-generator/index.ts

* Update src/tools/ipv6-ula-generator/ipv6-ula-generator.vue

---------

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-04-09 20:58:27 +02:00
Corentin Thomasset
ec7cb9351c feat(test): added e2e tests 2023-04-09 18:16:22 +02:00
Corentin Thomasset
ebfdb64fde chore(cd): don't run nightly release if their is no new commits 2023-04-09 15:27:58 +02:00
cgoIT
d2a2686705 fix(mac-address-lookup): fix typo in mac-address-lookup tool (#345) 2023-04-09 14:03:17 +02:00
Corentin Thomasset
d7a503b4ae feat(new-tool): ipv4 address converter 2023-04-08 22:09:22 +02:00
Corentin Thomasset
28145e0ffe feat(new-tool): ipv4 address converter 2023-04-08 21:13:14 +02:00
cgoIT
8930e139b2 fix(roman-numeral-converter): input validation and feedback (#332)
* fix(roman-numeral-converter):  checks for valid input and conversion enhancements

Validates if numeral values are between 1 and 3999999.
Validates if a roman number is valid.

* fix(roman-numeral-converter): optimize logic for copy button

* fix(roman-numeral-converter): changes due to review
2023-04-08 19:33:33 +02:00
Corentin Thomasset
076df11024 feat(new-tool): mac address lookup 2023-04-07 00:24:49 +02:00
Corentin Thomasset
1060652590 chore(cd): docker nightly releases 2023-04-06 21:44:11 +02:00
Corentin Thomasset
f5c865b278 chore(cd): docker nightly releases 2023-04-06 21:05:56 +02:00
Corentin Thomasset
001031b7b5 feat(css): added unocss with attributify preset 2023-04-06 20:35:37 +02:00
Corentin Thomasset
4ccd73c2d1 feat(dx): auto resolve vue components 2023-04-06 19:08:28 +02:00
Corentin Thomasset
2293f63a79 fix(ci): prevent ci from running twice in pr 2023-04-06 18:56:31 +02:00
Corentin Thomasset
0161395585 feat(dx): auto import vite plugin 2023-04-06 18:53:31 +02:00
Corentin Thomasset
4d011f15a1 feat(benchmark-builder): compute gap and export to bulet list 2023-04-06 14:00:54 +02:00
Corentin Thomasset
4a1afb2b69 feat(benchmark-builder): compute gap and export to bulet list 2023-04-06 13:33:51 +02:00
cgoIT
f350dc19aa feat(new-tool): add new tool user agent parser (#329)
* fix(docker-run-to-docker-compose-converter): use different version of converter which suppports more options and is mor failsafe

* chore(docker-run-to-docker-compose-converter): add pnpm-lock.yaml again which was accidently removed in last commit

* chore(docker-run-to-docker-compose-converter): add fixed version of composerize-ts

* chore(user-agent-parser): changes requested by code review

* chore(user-agent-parser): some more changes requested by code review
2023-04-06 10:28:12 +02:00
Corentin Thomasset
f3480fe560 refactor(qr-code): multiline input 2023-04-06 00:55:39 +02:00
Corentin Thomasset
f68e859c20 refactor(docker-run-converter): improve error handling 2023-04-06 00:16:32 +02:00
cgoIT
4872d71165 refactor(docker-run-converter): improved converter
* fix(docker-run-to-docker-compose-converter): use different version of converter which suppports more options and is mor failsafe

* chore(docker-run-to-docker-compose-converter): add pnpm-lock.yaml again which was accidently removed in last commit

* chore(docker-run-to-docker-compose-converter): add fixed version of composerize-ts
2023-04-06 00:10:19 +02:00
Corentin Thomasset
fb8a3a0fee refactor(tool): better new tool logic 2023-04-05 23:30:44 +02:00
Corentin Thomasset
20282987e3 feat(new-tool): simple benchmark calculator 2023-04-05 23:07:13 +02:00
Corentin Thomasset
ff5f38bec6 feat(new-tool): simple benchmark calculator 2023-04-05 23:06:05 +02:00
Corentin Thomasset
6e84ea4061 feat(new-tool): simple benchmark calculator 2023-04-05 22:57:58 +02:00
Corentin Thomasset
004cb83719 chore(clean): removed extra console.log 2023-04-05 08:47:54 +02:00
Corentin Thomasset
aa4dc0418e feat(plausible): disable plausible instance for self hosted instance 2023-04-04 19:01:59 +02:00
Corentin Thomasset
a599528044 fix(otp-generator): editable secret 2023-04-04 12:55:02 +02:00
Radu Ursache
b3390f6ff7 chore(docker): fixed the docker-run command in README (#323) 2023-03-31 16:53:32 +02:00
Corentin Thomasset
dee5586bf5 fix(docker): consistent casing in Dockerfile 2023-03-31 01:10:00 +02:00
Corentin Thomasset
5281824b5d fix(otp-generator): better computation of token 2023-03-31 01:01:44 +02:00
Corentin Thomasset
15cb03347c feat(menu): collapsible category 2023-03-30 23:51:23 +02:00
Corentin Thomasset
24ba0ff5fa feat(menu): collapsible category 2023-03-30 23:48:47 +02:00
Corentin Thomasset
849981d1ec refactor(issue): better issue template 2023-03-30 21:25:39 +02:00
Corentin Thomasset
3b625fd473 feat(json-prettify): sort keys 2023-03-29 23:33:30 +02:00
Corentin Thomasset
863c8d0f6a refactor(new-tool-script): added new tool creation script in package.json 2023-03-29 22:43:51 +02:00
Corentin Thomasset
9b4f7727f2 refactor(uuid-generator): now using computedRefreshable 2023-03-29 21:13:49 +02:00
Corentin Thomasset
cf16cb195d refactor(token-generator): now using computedRefreshable 2023-03-29 21:12:20 +02:00
Corentin Thomasset
f6237376e1 refactor(port-generator): now using computedRefreshable 2023-03-29 21:05:21 +02:00
Corentin Thomasset
165dc93f83 feat(rsa-key-pair-generator): refresh certs button 2023-03-29 20:54:11 +02:00
Corentin Thomasset
161a21f285 feat(config): hide the banner by default 2023-03-29 19:55:40 +02:00
Corentin Thomasset
972ffe6f69 fix(docker): nginx config to redirect to index.html 2023-03-29 00:15:56 +02:00
Corentin Thomasset
c339ab3551 feat(new-tool): IPv4 subnet calculator 2023-03-28 23:49:54 +02:00
Corentin Thomasset
47948dd343 refactor(import): removed unused imports 2023-03-28 23:49:54 +02:00
marvin-j97
91369cb238 refactor(html-editor): use correct letter casing (#292) 2023-03-27 17:38:37 +02:00
cgoIT
ffb99579ba feat(new-tool): add a docker run to docker compose converter (#291)
* Integrate composerize (https://github.com/magicmark/composerize) into it-tools

* Fix Prettier errors

* Fix Prettier errors

* Fix code according to suggestions

* Added syntax highlighting to TextareaCopyable component, some ui adjustments in docker-run-to-docker-compose-converter.vue
2023-03-27 17:31:13 +02:00
Corentin Thomasset
f512d09227 fix(rsa-key-pair-generator): correct prime web worker url 2023-03-27 00:17:36 +02:00
Corentin Thomasset
7c40539ef9 refactor(otp-generator): coerce lowercase secret characters to uppercase 2023-03-26 22:43:56 +02:00
Corentin Thomasset
f3b1863f09 feat(new-tool): html wysiwyg editor 2023-03-26 20:21:00 +02:00
Corentin Thomasset
b1d6bfd2dc refactor(otp-generator): no more barcode color invertion 2023-03-26 16:15:37 +02:00
Corentin Thomasset
8787ce72ab fix(roman-converter): replaced incorrect default value 2023-03-24 18:35:37 +01:00
Corentin Thomasset
dab8d63390 refactor(readme): better headings levels 2023-03-24 08:42:28 +01:00
Corentin Thomasset
96aaa35ea2 docs(docker): added self hosting command in README 2023-03-23 22:47:14 +01:00
Benny
519b169336 chore(docker): arm64 and amd64 as supported platform (#271) 2023-03-23 21:48:07 +01:00
Corentin Thomasset
3bc1f0d1fa chore(docker): it-tools docker container 2023-03-23 18:54:51 +01:00
Corentin Thomasset
b519cc9574 chore(deps): updated dependencies versions 2023-03-19 11:59:43 +01:00
Corentin Thomasset
30e9149d61 feat(new-tool): RSA key pair generator 2023-03-10 18:16:55 +01:00
marvin-j97
7958e2e075 refactor(branding): correct branding for twitter & github (#268) 2023-03-08 18:09:53 +01:00
Corentin Thomasset
61024279b5 fix(about): correct git branch in package.json url 2023-03-08 13:48:52 +01:00
Corentin Thomasset
ad202bd372 revert(pwa): fallback to autoUpdate 2023-03-01 23:35:17 +01:00
Corentin Thomasset
400654b6b1 chore(pwa): close update notification on update 2023-03-01 23:24:17 +01:00
Corentin Thomasset
3351b70c1a refactor(sponsor): updated support link to buy me a coffe 2023-03-01 22:15:51 +01:00
Corentin Thomasset
53ce079dff refactor(pwa): prompt for pwa update 2023-03-01 22:00:29 +01:00
Corentin Thomasset
a771346250 refactor(style): improved dark mode colors 2023-02-21 23:14:27 +01:00
Corentin Thomasset
a312dedf65 fix(jwt-parser): prevent [object Object] value 2023-02-21 22:52:08 +01:00
Corentin Thomasset
0ddf18f4b5 feat(new-tool): String to NATO alphabet 2023-02-15 00:45:20 +01:00
Corentin Thomasset
9634f5d9a8 fix(case-converter): allowed diacritics 2023-02-10 22:59:44 +01:00
Corentin Thomasset
e6c0445684 fix(case-converter): allowed diacritics 2023-02-10 22:53:10 +01:00
Corentin Thomasset
32f87f3fca refactor(tool-card): enforce description height 2023-02-10 22:20:50 +01:00
Corentin Thomasset
a3b1cb5737 refactor(tool-card): enforce description height 2023-02-10 22:13:08 +01:00
Corentin Thomasset
6fe4b5ac60 feat(new-tool): slugify string 2023-02-10 22:06:32 +01:00
Corentin Thomasset
1a3f0a135d refactor(keycode-info): wording 2023-02-06 23:26:40 +01:00
Corentin Thomasset
072083832d chore(release): 2.19.0 2023-02-06 23:14:52 +01:00
Corentin Thomasset
c934c4e50c feat(new-tool): keycode info 2023-02-06 23:13:20 +01:00
Corentin Thomasset
4a5734d4a3 chore(release): 2.18.0 2023-02-04 09:59:56 +01:00
Tsonglew
f708f5091e feat(new-tool): json minify (#265)
Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2023-02-04 09:56:17 +01:00
Corentin Thomasset
db817a2459 refactor(tools): config in query params 2023-01-28 21:06:16 +01:00
Corentin Thomasset
119041c185 chore(release): 2.17.0 2023-01-13 18:27:39 +01:00
Corentin Thomasset
4607837f9a feat(new-tool): temperature converter 2023-01-13 18:26:28 +01:00
Corentin Thomasset
f52f7a845c refactor(jwt-parser): simplified code 2023-01-13 14:02:44 +01:00
bastantoine
acc7f0a586 feat(new-tool): jwt parser (#262)
* npm install jwt-decode

* added base tool structure

* added function to decode JWT and display header and payload

* use a table to display the data

* show human readable values

* added switch to toggle display of parsed values

* lint

* replaced basic package-lock.json with pnpm-lock.json

* change the icon of the tool

* simplify return

* use camelCase

* added description of the tool

* always parse the values

* use camelCase...
2022-12-27 09:38:35 +01:00
Corentin Thomasset
ebb7301a98 chore(release): 2.16.0 2022-12-21 21:15:16 +01:00
Corentin Thomasset
def60e7248 refactor(tracker): better tracker injection 2022-12-21 21:02:57 +01:00
Corentin Thomasset
bf88836dbe feat(search-bar): use cmd + k to focus on mac 2022-12-21 00:21:12 +01:00
Corentin Thomasset
bfc2e24bbf feat(tracker): added actions monitoring 2022-12-21 00:03:31 +01:00
Corentin Thomasset
40872859a5 refactor(clean): removed unused import 2022-12-20 21:15:00 +01:00
Corentin Thomasset
cf723f144e refactor(clean): removed empty style tag 2022-12-20 21:14:40 +01:00
Corentin Thomasset
7f964941d3 chore(docs): updated readme 2022-12-20 20:57:24 +01:00
Corentin Thomasset
af075dcccc feat(tool): improved favorite tool management 2022-12-17 15:33:52 +01:00
Corentin Thomasset
274ff02b54 chore(git): added .env to gitignore 2022-12-17 11:42:47 +01:00
Corentin Thomasset
679dd1c1f6 refactor(menu): improve support button 2022-12-17 01:30:27 +01:00
Corentin Thomasset
4cd809bd0c feat(tools): added favorite tool handling 2022-12-17 01:30:02 +01:00
Corentin Thomasset
8d09086e78 chore(release): 2.15.0 2022-12-16 21:59:47 +01:00
Corentin Thomasset
acf8bc11db fix(tool-card): correct text color on light mode for card description 2022-12-16 21:57:23 +01:00
Corentin Thomasset
71e98e93e5 feat(search-bar): better search back result 2022-12-16 21:44:54 +01:00
Corentin Thomasset
1b5d4e72bd refactor(search-bar): improved tool fuzzy search 2022-12-16 18:10:50 +01:00
Corentin Thomasset
8476cf319b fix(integer-base-converter): handle non-decimal char and better error message 2022-12-07 21:52:24 +01:00
Corentin Thomasset
0ff853437b chore(release): 2.14.1 2022-11-23 22:00:08 +01:00
Corentin Thomasset
39c8f92065 chore(release): 2.14.0 2022-11-23 22:00:01 +01:00
Corentin Thomasset
35b5187119 feat(new-tool): chmod calculator 2022-11-23 21:57:38 +01:00
Corentin Thomasset
94698cea50 chore(release): 2.13.0 2022-11-14 22:17:34 +01:00
Corentin Thomasset
8294cd68da chore(deps): upgraded dependencies 2022-11-14 22:13:37 +01:00
Corentin Thomasset
7c9b8ac178 feat(new-tool): mime type to extension converter 2022-11-14 22:13:26 +01:00
Corentin Thomasset
5d8f46abf8 refactor(ui): change sponsor button location and caption 2022-11-13 23:16:57 +01:00
Corentin Thomasset
35a3760771 fix(ui): remove icon transparency overlap 2022-11-13 23:13:50 +01:00
Corentin Thomasset
4ef25887b9 feat(date-converter): added mongodb objectID format 2022-09-09 11:53:06 +02:00
Corentin Thomasset
7f229959d6 refactor(otp-generator): changed url 2022-08-24 00:22:54 +02:00
Corentin Thomasset
d3a2936979 chore(release): 2.12.0 2022-08-24 00:18:01 +02:00
Corentin Thomasset
5f16885923 feat(new-tool): added otp generator 2022-08-24 00:18:01 +02:00
Corentin Thomasset
ea5e7a7fc7 feat(config): added tsx to allowed extension 2022-08-24 00:18:01 +02:00
Corentin Thomasset
7de6c86f9e refactor(useQRCode): switched args to MaybeRef 2022-08-24 00:18:01 +02:00
Corentin Thomasset
83da6b7ee9 refactor: token generator can use a custom alphabet 2022-08-24 00:18:01 +02:00
Corentin Thomasset
737319edf1 chore(release): 2.11.0 2022-08-19 17:47:34 +02:00
Corentin Thomasset
a77a82f5a2 chore: updated ci workflow to handle pnpm 2022-08-19 17:42:46 +02:00
Corentin Thomasset
da17696293 refactor(colored-card): added transition on like hover 2022-08-19 17:40:13 +02:00
Corentin Thomasset
164e32b442 feat(new-tool): meta tag generator 2022-08-19 17:40:00 +02:00
Corentin Thomasset
49755909bd fix(deps): added missing optional deps 2022-08-18 10:53:23 +02:00
Corentin Thomasset
44d653b1f2 chore(deps): switched to pnpm 2022-08-18 10:35:22 +02:00
Corentin Thomasset
7c449f4f2d fix: removed colored card border 2022-08-17 17:33:44 +02:00
Corentin Thomasset
ab7483b5c2 feat: added colored share card 2022-08-17 17:06:48 +02:00
Corentin THOMASSET
5222bd5d04 refactor(share): updated share meta 2022-08-16 15:22:41 +02:00
Corentin Thomasset
cf5e4d9056 chore(release): 2.10.3 2022-08-14 10:55:06 +02:00
Corentin Thomasset
992f96b48a refactor(share): updated twitter meta tags 2022-08-14 10:53:45 +02:00
Corentin Thomasset
fcf4cfe64d refactor(share): new share banner 2022-08-14 10:53:39 +02:00
Corentin Thomasset
f54223fb0a refactor(validation): simplified validation management with helpers 2022-08-04 21:59:48 +02:00
Corentin Thomasset
b38ab82d05 chore(release): 2.10.2 2022-08-04 23:29:47 +02:00
Corentin Thomasset
f6cd9b76d3 refactor(dry): mutualised duplicated code with withDefaultOnError 2022-08-04 23:14:32 +02:00
Corentin Thomasset
208a373fd0 refactor(lint): added import rules 2022-08-04 22:46:50 +02:00
Corentin Thomasset
8089c60000 refactor(json-prettifier): more permissive json parser 2022-08-04 22:18:15 +02:00
Corentin Thomasset
d30cd8a9ab refactor(home): removed new tool first sort 2022-08-04 21:59:22 +02:00
Corentin Thomasset
04a8e122be chore(release): 2.10.1 2022-08-04 12:16:54 +02:00
Corentin Thomasset
447bdf2148 refactor(base64): mutualized base64 functions into global utilities 2022-08-04 12:09:32 +02:00
Corentin Thomasset
ca7cb44389 fix(bip39-generator): cleared an issue with the mnemonic validation 2022-08-04 12:08:23 +02:00
Corentin Thomasset
e48d60b1ed refactor(chronometer): improved chronometer precision 2022-08-04 09:06:42 +02:00
Corentin Thomasset
fda0b0ca25 fix(import): removed auto added weird .js extension 2022-08-04 08:50:15 +02:00
Corentin Thomasset
cc717bc87e chore(release): 2.10.0 2022-08-03 17:25:48 +02:00
Corentin Thomasset
1bc6380c6f feat(new-tool): hmac generator 2022-08-03 17:19:53 +02:00
Corentin Thomasset
02c4963531 refactor(lint): externalization of prettier for simpler IDE support 2022-08-03 17:19:53 +02:00
Corentin Thomasset
129f74c371 feat(new-tool): an svg placeholder image generator 2022-08-03 17:18:18 +02:00
Corentin Thomasset
0be33fb337 refactor(display): mutualized code display 2022-08-03 17:18:18 +02:00
Corentin THOMASSET
422b6eb05a feat(hash-text): digest base selector (#254) 2022-08-03 17:16:03 +02:00
Corentin Thomasset
fad4833ca2 chore(deps): updated dependencies 2022-08-03 17:13:34 +02:00
marvin-j97
531a25c1c4 fix(eta-calculator): clamp inputs (#249) 2022-08-03 17:13:33 +02:00
Corentin Thomasset
77b5b0cab5 refactor(validation): simplified validation system 2022-08-03 17:13:33 +02:00
Corentin Thomasset
7570ad9656 fix(bip39-generator): typo in validation message 2022-08-03 17:13:33 +02:00
Corentin Thomasset
8a9e7888de fix(base64-to-string): prevent validation error 2022-08-03 17:13:33 +02:00
Corentin Thomasset
750a76b00f refactor(base64-to-file): clean validation to convert base64 to file 2022-08-03 17:13:33 +02:00
marvin-j97
5f03619ab4 fix(wording): removed spaces before ponctuation (#252) 2022-08-03 08:46:59 +02:00
Corentin Thomasset
352365f012 chore(release): 2.9.2 2022-07-28 19:31:16 +02:00
Corentin Thomasset
4f599b6999 fix(device-information): handle of unknown values 2022-07-28 19:30:36 +02:00
JWB
138149e6f0 fix(device-information): prevent unwanted y-truncature of text
* Device information page styling fix

I was checking out your site, and really like it! already added to my bookmarks, and when I was on the Device Information page I noticed the `p` and `y` in the words 1 dppx and landscape-primary were cut off and my ocd kicked in to tweak it.
The fix was to remove the line height set on the value, and then to keep the spacing how it was just moving it up 5px seemed to do the trick.

I'm using Firefox 102.0.1 on Windows 11. I'll attach some pics so you can see the before and after.

I've never messed with vue, but after looking at this file here ya make me want to check it out more. I love how its keeping it all together in one file.
Might also need to rebuild it the site after this change, but you get the point. 

Awesome site!

* Update src/tools/device-information/device-information.vue

Co-authored-by: Corentin THOMASSET <corentin.thomasset74@gmail.com>
2022-07-28 19:28:23 +02:00
Corentin Thomasset
412de23796 fix(base64-file): fixed url slug 2022-07-25 23:31:06 +02:00
Corentin Thomasset
1a22d55b3c refactor(base64-file): fixed typo 2022-07-25 23:23:53 +02:00
Corentin Thomasset
bb4aac6d4a chore(release): 2.9.1 2022-07-25 23:22:32 +02:00
Corentin Thomasset
e6953d1b67 refactor(base64): split base64 text and file conversion in two tools + base64 to file 2022-07-25 23:21:42 +02:00
Corentin Thomasset
a70a0f83a1 chore(release): 2.9.0 2022-07-25 18:48:09 +02:00
Corentin Thomasset
bdee93a9e4 feat(new-tool): added a basic auth generator 2022-07-25 18:47:27 +02:00
Corentin Thomasset
08ce407a01 chore(release): 2.8.0 2022-07-24 18:36:15 +02:00
Corentin Thomasset
125a50215a feat(new-tool): added an ETA calculator 2022-07-24 18:32:05 +02:00
Corentin Thomasset
d5738e1aef chore(deps): upgraded naive-ui version 2022-07-24 18:24:44 +02:00
Corentin Thomasset
560fcf3f78 fix(sql-prettifier): better responsiveness 2022-07-24 15:54:05 +02:00
Corentin Thomasset
328fda65b3 refactor(json-prettify): improved layout for the json prettifier 2022-07-24 15:10:38 +02:00
Corentin Thomasset
ba87097e3d refactor(sql-prettifier): remove unused service files 2022-07-24 15:06:57 +02:00
Corentin Thomasset
99383d25fc chore(release): 2.7.0 2022-07-24 14:39:40 +02:00
Corentin Thomasset
d1f95f5b34 feat(new-tool): added an SQL prettifier and formatter 2022-07-24 14:37:27 +02:00
Corentin Thomasset
6cd25a743e fix(typo): fix few typos 2022-07-24 10:38:28 +02:00
Corentin Thomasset
d2f5d3c3de chore(release): 2.6.0 2022-07-24 00:58:59 +02:00
Corentin Thomasset
130031c225 feat(new-tool): added chronometer 2022-07-24 00:58:18 +02:00
Corentin Thomasset
1c7257eeb0 fix(script):fixed missing paranthesis in tool generator script 2022-07-23 23:07:53 +02:00
Corentin Thomasset
214084262c refactor(import): auto reordered imports 2022-07-23 23:04:57 +02:00
Corentin Thomasset
92ce419f45 fix(text-statistics): empty text mean 0 words and 0 lines 2022-07-23 19:09:22 +02:00
Corentin Thomasset
394d085846 refactor: added accessibility labels on icon buttons 2022-07-23 18:55:26 +02:00
Corentin Thomasset
ab53048d5f feat(search): focus the search bar using Ctrl+K 2022-07-23 18:49:10 +02:00
Corentin Thomasset
c3a302bc38 fix(lint): cleanned index.html 2022-07-23 18:19:40 +02:00
Corentin Thomasset
a16161cdb4 fix(deps): run dependencie audit auto fix 2022-07-23 18:19:06 +02:00
Corentin Thomasset
1dc113aaef chore(release): 2.5.3 2022-07-21 21:13:42 +02:00
Corentin Thomasset
e371e8fedf fix: updated license in README 2022-07-21 21:13:01 +02:00
Corentin Thomasset
e7997457a8 chore(release): 2.5.2 2022-07-21 21:07:42 +02:00
Corentin Thomasset
c4f9e90cc7 chore: added missing fields in package.json 2022-07-21 21:06:28 +02:00
Corentin Thomasset
eff7c23ebb chore: added license file 2022-07-21 21:06:22 +02:00
Corentin Thomasset
7a01af1c14 chore(release): 2.5.1 2022-06-02 01:00:49 +02:00
Corentin Thomasset
c2e1d59cb9 fix(title): trully reactive tool title 2022-06-02 00:59:42 +02:00
Corentin Thomasset
f48cd058cf fix: menu label key value was undefined 2022-06-02 00:57:17 +02:00
Corentin Thomasset
5ab4dd3d4a fix: tool sorting inconsistencies in home page 2022-06-02 00:44:23 +02:00
Corentin Thomasset
f05c8e1dc6 fix(lint): missing dangling comma 2022-06-02 00:30:43 +02:00
Corentin Thomasset
ba3b84c668 chore(release): 2.5.0 2022-06-02 00:26:10 +02:00
Corentin Thomasset
433ba2a3e5 feat(new-tool): math evaluator 2022-06-02 00:25:10 +02:00
Corentin Thomasset
8fb0e6af9c refactor: removed unused import 2022-06-02 00:11:49 +02:00
Corentin Thomasset
11720e6cde feat(tools): new badge for recently created tools 2022-06-02 00:11:49 +02:00
Corentin Thomasset
ac89490794 refactor: renammed Tool.ts to tool.ts 2022-06-02 00:11:49 +02:00
Corentin Thomasset
2f61c745f5 fix(config): updated env values loading 2022-06-01 09:08:46 +02:00
Corentin Thomasset
a9a6526e75 chore(deps): updated vitest version 2022-06-01 09:07:28 +02:00
257 changed files with 15970 additions and 24709 deletions

View File

@@ -1,30 +0,0 @@
/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution');
module.exports = {
root: true,
extends: [
'plugin:vue/vue3-essential',
'eslint:recommended',
'plugin:vue/vue3-recommended',
'plugin:vue/vue3-recommended',
'@vue/eslint-config-typescript/recommended',
'@vue/eslint-config-prettier',
],
env: {
'vue/setup-compiler-macros': true,
},
rules: {
'vue/multi-word-component-names': ['off'],
'prettier/prettier': [
'error',
{
singleQuote: true,
semi: true,
tabWidth: 2,
trailingComma: 'all',
printWidth: 120,
},
],
},
};

48
.github/ISSUE_TEMPLATE/bug-report.yml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: 🐞 Bug Report
description: File a bug report.
labels: ['bug', 'triage']
assignees:
- CorentinTh
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: textarea
id: bug-description
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us in the description. Thanks!
placeholder: Bug description
validations:
required: true
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us, what did you expect to happen? If you have a screenshot, you can paste it here.
placeholder: Tell us what you see!
value: 'A bug happened!'
validations:
required: true
- type: textarea
id: version
attributes:
label: System information
description: What is you environment? You can use the `npx envinfo --system --browsers` command to get this information.
validations:
required: true
- type: dropdown
id: app-type
attributes:
label: Where did you encounter the bug?
options:
- Public app (it-tools.tech)
- A self hosted
- Other (installations, docker, etc.)
validations:
required: true

View File

@@ -1,33 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG] "
labels: bug
assignees: CorentinTh
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Configuration (please complete the following information):**
- Device: [e.g. iPhone6, ]
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1 @@
blank_issues_enabled: false

View File

@@ -0,0 +1,56 @@
name: 🚀 New feature proposal
description: Propose a new feature/enhancement or tool idea for IT-Tools
labels: ['enhancement', 'triage']
body:
- type: markdown
attributes:
value: |
Thanks for your interest in the project and taking the time to fill out this feature report!
- type: dropdown
id: request-type
attributes:
label: What type of request is this?
options:
- New tool idea
- New feature for an existing tool
- Deployment or CI/CD improvement
- Self-hosting improvement
- Other
validations:
required: true
- type: textarea
id: feature-description
attributes:
label: Clear and concise description of the feature you are proposing
description: A clear and concise description of what the feature is.
placeholder: 'Example: a token generator tool'
validations:
required: true
- type: textarea
id: alternative
attributes:
label: Is their example of this tool in the wild?
description: Provide link to already existing tool (like websites, apps, cli, ...) or npm packages that could be used or provide inspiration for the feature.
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Any other context or screenshots about the feature request here.
- type: checkboxes
id: checkboxes
attributes:
label: Validations
description: Before submitting the issue, please make sure you do the following
options:
- label: Check the feature is not already implemented in the project.
required: true
- label: Check that there isn't already an issue that request the same feature to avoid creating a duplicate.
required: true
- label: Check that the feature can be implemented in a client side only app (IT-Tools is client side only, no server).
required: true

View File

@@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: "[FEAT]"
labels: enhancement
assignees: CorentinTh
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

11
.github/fern-banner.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 62 KiB

BIN
.github/logo.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

17
.github/stale.yml vendored
View File

@@ -1,17 +0,0 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

43
.github/workflows/cd-app-prod.yaml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: CD - Production
on:
push:
branches:
- v3
jobs:
publish-app-prod:
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
name: Publish app to production
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
node-version: 22
corepack: true
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Build the app
run: pnpm -F @it-tools/app build:cloudflare-pages
- name: Publish to Cloudflare Pages
uses: AdrianGonz97/refined-cf-pages-action@v1
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
githubToken: ${{ secrets.GITHUB_TOKEN }}
projectName: it-tools
workingDirectory: packages/app
directory: dist
deploymentName: Production App
branch: v3
wranglerVersion: '3'

View File

@@ -1,38 +1,34 @@
name: ci name: ci
on: [push, pull_request] on:
pull_request:
push:
branches:
- main
jobs: jobs:
ci: ci:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - uses: actions/checkout@v4
uses: actions/checkout@master - run: corepack enable
- uses: actions/setup-node@v3
with: with:
fetch-depth: 0 node-version: 22
cache: 'pnpm'
- name: Setup node env
uses: actions/setup-node@v3.0.0
with:
node-version: 16
- name: Cache node_modules
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm i
- name: Run linters - name: Run linters
run: npm run lint run: pnpm lint
- name: Run unit test # - name: Run unit test
run: npm run test # run: pnpm test:unit
- name: Type check
run: pnpm typecheck
- name: Build the app - name: Build the app
run: npm run build run: pnpm build

View File

@@ -1,69 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ dev ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ dev ]
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

48
.gitignore vendored
View File

@@ -1,28 +1,32 @@
# Nuxt dev/build outputs
.output
.data
.nuxt
.nitro
.cache
dist
dist-app
dist-node
dist-cloudflare
# Node dependencies
node_modules
# Logs # Logs
logs logs
*.log *.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules # Misc
.DS_Store .DS_Store
dist .fleet
dist-ssr
coverage
*.local
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea .idea
*.suo
*.ntvs* # Local env files
*.njsproj .env
*.sln .env.*
*.sw? !.env.example
.wrangler
coverage
cache
.zed

2
.npmrc Normal file
View File

@@ -0,0 +1,2 @@
shamefully-hoist=true
strict-peer-dependencies=false

2
.nvmrc
View File

@@ -1 +1 @@
16.14.2 v22

View File

@@ -1,14 +0,0 @@
{
"types": [
{"type": "feat", "section": "Features"},
{"type": "fix", "section": "Bug Fixes"},
{"type": "docs", "section": "Documentation"},
{"type": "style", "section": "Styling"},
{"type": "refactor", "section": "Refactors"},
{"type": "perf", "section": "Performance"},
{"type": "test", "section": "Tests"},
{"type": "build", "section": "Build System"},
{"type": "ci", "section": "CI"},
{"type": "revert", "section": "Reverts"}
]
}

View File

@@ -1,3 +0,0 @@
{
"recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin", "dbaeumer.vscode-eslint"]
}

View File

@@ -1,259 +0,0 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [2.4.2](https://github.com/CorentinTh/it-tools/compare/v2.4.1...v2.4.2) (2022-06-01)
### Refactors
* **config:** added config management with figue ([6becdbb](https://github.com/CorentinTh/it-tools/commit/6becdbb42329e1bdecf158707e37ba9f13ba1d2c))
* **imports:** removed useless defineProps import ([5ce1262](https://github.com/CorentinTh/it-tools/commit/5ce1262fb44864b829dac09d5c0b9b68d522ceb7))
* set coerent head title for home page ([a46d125](https://github.com/CorentinTh/it-tools/commit/a46d125c19902c2f41f37c62c07bb7b548d9f6f0))
### [2.4.1](https://github.com/CorentinTh/it-tools/compare/v2.4.0...v2.4.1) (2022-05-15)
### Bug Fixes
* **seo:** wrong url in share metas ([a88e4a9](https://github.com/CorentinTh/it-tools/commit/a88e4a9289e7d8cc80190f60f2fe08fe2ba08ee6))
### Refactors
* **json-viewer:** add clear button ([048bc4a](https://github.com/CorentinTh/it-tools/commit/048bc4ae943509dea2946764efaa69f845b6c478))
* **seo:** changed title string ([d4ea393](https://github.com/CorentinTh/it-tools/commit/d4ea393c1df87ae958a06ed66a11e36b081282d4))
## [2.4.0](https://github.com/CorentinTh/it-tools/compare/v2.3.2...v2.4.0) (2022-05-14)
### Features
* catch throw on validation ([a60f64f](https://github.com/CorentinTh/it-tools/commit/a60f64f74417f811204121f97c16cdb4754afc3b))
* **hash-text:** compute all hashes at the same time ([#242](https://github.com/CorentinTh/it-tools/issues/242)) ([e9cc499](https://github.com/CorentinTh/it-tools/commit/e9cc499ed87ba926086323223c7eca4f6658b3f0))
* **new-tool:** json viewer ([d356b14](https://github.com/CorentinTh/it-tools/commit/d356b1488fc640a4f5b65d62e0f2f368f5941996))
* **seo:** added cannonical meta ([34bc6a5](https://github.com/CorentinTh/it-tools/commit/34bc6a57a7bab98ff2a630d02034c342084e0af9))
### Bug Fixes
* **lint:** missing new lines ([3cfc5f8](https://github.com/CorentinTh/it-tools/commit/3cfc5f8bc27b66e6fbb6054f3c909818083ebc37))
* update recommended extension ids ([#244](https://github.com/CorentinTh/it-tools/issues/244)) ([1d7032d](https://github.com/CorentinTh/it-tools/commit/1d7032d0268220f594de6d837a303fc1e63cbd9f))
### Documentation
* added producthunt banners ([4c4da16](https://github.com/CorentinTh/it-tools/commit/4c4da16970e1dbb13705d8b6c020cd40cd2b5e0d))
### Refactors
* **base-layout:** renammed one letter variable ([383d975](https://github.com/CorentinTh/it-tools/commit/383d97569580c4f31448c07cb97e3778bc97a8af))
* **date-converter:** mutualised and dry-ed code ([d2c767f](https://github.com/CorentinTh/it-tools/commit/d2c767f0922e9b93172c3167226ad3db5499b9f6))
* **seo:** changed title string ([c3b6132](https://github.com/CorentinTh/it-tools/commit/c3b6132c261bd5952bafb1ff1e576eb13d2d0a7d))
* updated description ([b89db3c](https://github.com/CorentinTh/it-tools/commit/b89db3c8d0de601fecbd2f9f79492dff1b461bd8))
### [2.3.2](https://github.com/CorentinTh/it-tools/compare/v2.3.1...v2.3.2) (2022-05-09)
### Bug Fixes
* **base-converter:** responsive input ([0b0cbd5](https://github.com/CorentinTh/it-tools/commit/0b0cbd55c3809ded2eedfa0b2238bc950b01516a))
* **base64-converter:** async onUpload callback ([84cf1bb](https://github.com/CorentinTh/it-tools/commit/84cf1bb9645c5ae31579098df59471f7d99f6f0c))
* **typo:** misspelings ([9755e51](https://github.com/CorentinTh/it-tools/commit/9755e51fe216e5e25c56417152e70cb5bce26b11))
### Refactors
* **responsive:** row layout for multicards on big screens ([e21230b](https://github.com/CorentinTh/it-tools/commit/e21230bbd9550ba3315607b021a60a4f9f9e1b61))
### [2.3.1](https://github.com/CorentinTh/it-tools/compare/v2.3.0...v2.3.1) (2022-04-24)
### Refactors
* changed twitter account handler ([608ec3a](https://github.com/CorentinTh/it-tools/commit/608ec3a81db6583c8a2bf126b3868afd043c6981))
## [2.3.0](https://github.com/CorentinTh/it-tools/compare/v2.2.0...v2.3.0) (2022-04-22)
### Features
* **new-tool:** html entities escape/unescape ([8e29a97](https://github.com/CorentinTh/it-tools/commit/8e29a97404ea0aa9b9b576656358c8c276b6f992))
### Bug Fixes
* **head:** added titles for non-tool pages ([0a15892](https://github.com/CorentinTh/it-tools/commit/0a15892dde9852ff158a8fcb72d0ad6bae8bad02))
* **sider:** default collapsed value ([b22aa94](https://github.com/CorentinTh/it-tools/commit/b22aa941f52009118d4d3cc98277cc4c402a4c77))
* **sider:** missing href for link in footer ([c4dabcc](https://github.com/CorentinTh/it-tools/commit/c4dabccdaeac9d03163ac2588599b000e4e74562))
* **style:** hard width for group labels ([ebf6695](https://github.com/CorentinTh/it-tools/commit/ebf6695d2533db6f37b24dc7d338f422c551c8cb))
* **url-parser:** cleaned weird margins on dark mode ([005ebfb](https://github.com/CorentinTh/it-tools/commit/005ebfba318ece1a9c04aefb737baed5d7aafb91))
### Refactors
* **lint:** linter auto fix ([086d31e](https://github.com/CorentinTh/it-tools/commit/086d31eab5b3b1a927803eab5e650585f61abe19))
* removed useless ref and value ([b12cbe4](https://github.com/CorentinTh/it-tools/commit/b12cbe412407389186a58e4ceaa94f5b441c11ea))
### [2.2.1](https://github.com/CorentinTh/it-tools/compare/v2.2.0...v2.2.1) (2022-04-21)
### Bug Fixes
* **head:** added titles for non-tool pages ([0a15892](https://github.com/CorentinTh/it-tools/commit/0a15892dde9852ff158a8fcb72d0ad6bae8bad02))
* **sider:** missing href for link in footer ([c4dabcc](https://github.com/CorentinTh/it-tools/commit/c4dabccdaeac9d03163ac2588599b000e4e74562))
* **style:** hard width for group labels ([ebf6695](https://github.com/CorentinTh/it-tools/commit/ebf6695d2533db6f37b24dc7d338f422c551c8cb))
* **url-parser:** cleaned weird margins on dark mode ([005ebfb](https://github.com/CorentinTh/it-tools/commit/005ebfba318ece1a9c04aefb737baed5d7aafb91))
## [2.2.0](https://github.com/CorentinTh/it-tools/compare/v2.1.0...v2.2.0) (2022-04-18)
### Features
* **new-tool:** url parser ([2b38d6f](https://github.com/CorentinTh/it-tools/commit/2b38d6f81e34845f896b858513e35209cba29f98))
### Bug Fixes
* **sider-footer:** fixed commit sha url ([ed9046d](https://github.com/CorentinTh/it-tools/commit/ed9046d3e1f5a7dc01c722ed139a2ae477a2d48f))
## [2.1.0](https://github.com/CorentinTh/it-tools/compare/v2.0.2...v2.1.0) (2022-04-18)
### Features
* **new-tool:** bcrypt ([6d5856f](https://github.com/CorentinTh/it-tools/commit/6d5856fa93d1ffbf71856c75adc24ad87dc4b49b))
* **new-tool:** device information ([277bd5f](https://github.com/CorentinTh/it-tools/commit/277bd5f0da359fd54c5164b376007d182a9fabde))
### Refactors
* **menu:** removed burger menu icon tooltip ([09abffb](https://github.com/CorentinTh/it-tools/commit/09abffbcf9b09cb5adc34f8754b019d0c8b60854))
### [2.0.2](https://github.com/CorentinTh/it-tools/compare/v2.0.1...v2.0.2) (2022-04-18)
### Bug Fixes
* **git-memo:** pre scroll on overflow ([4fc303e](https://github.com/CorentinTh/it-tools/commit/4fc303e5e3f0bef9201cc002963e244a5d3be7b5))
* **menu:** menu auto closed on mobile ([71f79a5](https://github.com/CorentinTh/it-tools/commit/71f79a5bbfe0dd5451a435c0a55e8b77ee7d3848))
* **qr-code:** responsive layout ([cbf0b3d](https://github.com/CorentinTh/it-tools/commit/cbf0b3d6995e47d371a8fbcfccd65ba304fb08dc))
### Refactors
* **crontab:** list instead of table on small screen ([6b11de2](https://github.com/CorentinTh/it-tools/commit/6b11de258a8039fe7729130ede35d47592be7cbe))
* removed empty sources ([a14cac6](https://github.com/CorentinTh/it-tools/commit/a14cac6d5c5967a47ca76a1d1a420115114c3bbf))
* throw an error object instead of string ([4112fa5](https://github.com/CorentinTh/it-tools/commit/4112fa532e3d4be190d52bf3b11e0d4c3625a402))
### [2.0.1](https://github.com/CorentinTh/it-tools/compare/v2.0.0...v2.0.1) (2022-04-16)
### Features
* **config:** added vercel.json ([2e046ad](https://github.com/CorentinTh/it-tools/commit/2e046ad09fed4a55bbf4449e3683a4150839c461))
### Bug Fixes
* remove duplicate property ([d066319](https://github.com/CorentinTh/it-tools/commit/d066319b45dee35df0212c7ff407013bd7449ae3))
* **style:** url encode/decode layout ([34480b4](https://github.com/CorentinTh/it-tools/commit/34480b4e25ffc33536b03a0ba711c480219ad553))
### Documentation
* updated description ([70a3df0](https://github.com/CorentinTh/it-tools/commit/70a3df044ea86ac35c1839ac5ab624f694fdd845))
### Refactors
* clean imports ([724e142](https://github.com/CorentinTh/it-tools/commit/724e142222202798ea3df7d0fb34da1e7a5216a1))
* lint fix ([a58ae24](https://github.com/CorentinTh/it-tools/commit/a58ae24d9409728ac12fb780f2c64643087de5be))
* ref name ([5828085](https://github.com/CorentinTh/it-tools/commit/582808597c6aadf0feb48f6aae0a29b839e0dd54))
## 2.0.0 (2022-04-16)
### Features
* **a11y:** aria-label on icon button ([5f50275](https://github.com/CorentinTh/it-tools/commit/5f502755d69ab21a78d9256db8a1c64f1ab82c2a))
* added commit short sha ([668625c](https://github.com/CorentinTh/it-tools/commit/668625c6dab6e8b98f363df6c0aa3bf00a3afaa4))
* added plausible tracker ([0808920](https://github.com/CorentinTh/it-tools/commit/0808920951b55c938537f33353a37ece96b04084))
* added twitter link ([d126abc](https://github.com/CorentinTh/it-tools/commit/d126abc7b12a9fce778fe9883e44dca581509778))
* footer in sider ([3f03850](https://github.com/CorentinTh/it-tools/commit/3f038503dd705ba3a5562a1e8f85a3b0e7d0be5b))
* **layout:** menu category ([9c9be9e](https://github.com/CorentinTh/it-tools/commit/9c9be9e2e2e2c856d1af1df9d9d37a64460cd82b))
* mobile friendly menu ([1e67fa6](https://github.com/CorentinTh/it-tools/commit/1e67fa6e0bede8c055d9e4cb9bf7f97423bc9bdf))
* **navbar:** added github link ([d4e226e](https://github.com/CorentinTh/it-tools/commit/d4e226e09face78da794fa7e676eef85d05dde75))
* **nav:** navigation tooltips ([b892f50](https://github.com/CorentinTh/it-tools/commit/b892f50cd633d42e6261be208bd077d92d336afb))
* **page:** added 404 page ([3db4f91](https://github.com/CorentinTh/it-tools/commit/3db4f91c27a2ab37bb23d8feb77b6dffa9a92977))
* **page:** home page layout ([57fd14a](https://github.com/CorentinTh/it-tools/commit/57fd14a199a253f49f3c53810490e5d31512b261))
* persistent theme selection fallback to prefered theme ([40e9af0](https://github.com/CorentinTh/it-tools/commit/40e9af06cf28b7348152f8ec3898fa2b27ec0b21))
* **router:** added legacy routes redirections ([dbce46b](https://github.com/CorentinTh/it-tools/commit/dbce46b470b0187a395cdd350a023641c6319582))
* search-bar ([e8594de](https://github.com/CorentinTh/it-tools/commit/e8594de7b45102b8bc1cfb82d0839e3722d9c4c2))
* **search:** round and clearable searchbar ([b112f5f](https://github.com/CorentinTh/it-tools/commit/b112f5f226c6b03151bbeb4fc607e449c444e667))
* **seo:** added robots.txt and humans.txt ([cd9a3bc](https://github.com/CorentinTh/it-tools/commit/cd9a3bc9b10cf7363301e9a0d0b17f38ea640e0c))
* **seo:** added title + description ([5f74037](https://github.com/CorentinTh/it-tools/commit/5f74037105c5e8efc5bdad2261597458cfcf26d3))
* **seo:** pwa and icons ([b7193e8](https://github.com/CorentinTh/it-tools/commit/b7193e838ba83d0548211cff922e107a1f11f90f))
* **share:** social image ([39746e0](https://github.com/CorentinTh/it-tools/commit/39746e07c53c22ac132ad2aaf25dd71bb6458cde))
* **style:** dark mode ([3e92b7f](https://github.com/CorentinTh/it-tools/commit/3e92b7f1e04a709df231fce22801b55619e8faab))
* **style:** theme overrides ([d542688](https://github.com/CorentinTh/it-tools/commit/d542688664cc9c675d1d26f4278a25f1b9e3f28d))
* **tool:** add lch in color converter ([b5243c4](https://github.com/CorentinTh/it-tools/commit/b5243c43638f37a2d727b015bba61fab0d1b9fe9))
* **tool:** added token generator ([40dec52](https://github.com/CorentinTh/it-tools/commit/40dec52c8467fd27eb8f3857ed72746ebaa4f509))
* **tool:** base converter ([034c686](https://github.com/CorentinTh/it-tools/commit/034c686896d0443ea587cd152535b2227234c011))
* **tool:** base64 string converter ([203b6a9](https://github.com/CorentinTh/it-tools/commit/203b6a9d73dcb30182b130de59920534e18b76b4))
* **tool:** bip39-generator ([d55329f](https://github.com/CorentinTh/it-tools/commit/d55329f3abc3d3f8ad48def7d7f63b44cd768e27))
* **tool:** bip39-generator ([765c010](https://github.com/CorentinTh/it-tools/commit/765c010700c07b2809daef0e7c694ac265ce9ddc))
* **tool:** case converter ([7a7372d](https://github.com/CorentinTh/it-tools/commit/7a7372df191abc7ecd3fee7234d4de7aaaba03f6))
* **tool:** color converter ([4e50b7a](https://github.com/CorentinTh/it-tools/commit/4e50b7a973e950819a52c127db2a754838cbbf8e))
* **tool:** crontab generator ([358ff45](https://github.com/CorentinTh/it-tools/commit/358ff45ae1d9822b8a7c342515f668d25b7128b5))
* **tool:** date-time converter ([2d9cb20](https://github.com/CorentinTh/it-tools/commit/2d9cb209b377326f4bf62067db7d5ad0c7eb7bde))
* **tool:** encryption ([888ab2c](https://github.com/CorentinTh/it-tools/commit/888ab2cf378597e2880b6dd6a013f3bc192f2b1a))
* **tool:** git memo ([5cd9997](https://github.com/CorentinTh/it-tools/commit/5cd9997a845f6d5f82d3ae74d3ec12603224517d))
* **tool:** lorem ipsum generator ([5dcb2ed](https://github.com/CorentinTh/it-tools/commit/5dcb2ed95c318ea1c4134da207c844672d0fbbd8))
* **tool:** qr-code generator ([5582d75](https://github.com/CorentinTh/it-tools/commit/5582d75927b560d9259929c787c0809634d1f8ae))
* **tool:** random port generator ([7c540f1](https://github.com/CorentinTh/it-tools/commit/7c540f1208da749c3932aab8f2c392048c4546ae))
* **tool:** roman-arabic numbers converter ([655019c](https://github.com/CorentinTh/it-tools/commit/655019cf23babcec2a2f1e03cac87744e3139304))
* **tool:** text hash ([0f3b744](https://github.com/CorentinTh/it-tools/commit/0f3b7445ad1f945d9b364476147bf824ac309a6c))
* **tool:** text statistics ([0a7c325](https://github.com/CorentinTh/it-tools/commit/0a7c3252e36a4769eedaaec4524b4ee2ae2b19c7))
* **tool:** url encode/decode ([afac566](https://github.com/CorentinTh/it-tools/commit/afac5664c802c8480fe2c457bcfb7f5e26829cdf))
* **tool:** uuid v4 generator ([3ae6114](https://github.com/CorentinTh/it-tools/commit/3ae61147a94791987e9e326b19063579976d8dc0))
* **ux:** copyable input ([1859a9a](https://github.com/CorentinTh/it-tools/commit/1859a9a174010789dcd7ecefb2451e1de7b60b4c))
### Bug Fixes
* **hash-text:** added missing toString() ([4ca5fce](https://github.com/CorentinTh/it-tools/commit/4ca5fce911c3312d56bca1ffba863b2f37841c9e))
* **hash-text:** correct copy message ([bab92ef](https://github.com/CorentinTh/it-tools/commit/bab92ef84f66372df40ce385c2949518ed158427))
* removed global define ([889d594](https://github.com/CorentinTh/it-tools/commit/889d59499212a449ee460c68c480648e337a7ecb))
* **style:** working dark mode persistence ([3ae8728](https://github.com/CorentinTh/it-tools/commit/3ae872847b00d65e4e2e629775d479a3333450f1))
* **validation:** proper rules ([11d8110](https://github.com/CorentinTh/it-tools/commit/11d8110226e22e30ae16d297628c1d252a93be9e))
### Refactors
* better icon ([0af7d81](https://github.com/CorentinTh/it-tools/commit/0af7d81abd987aa5d1b0321c25a65131d978e929))
* **clean:** removed extra console.log ([82606f6](https://github.com/CorentinTh/it-tools/commit/82606f6a477fce2041ab33adc7e95bcba4343e2b))
* embeded sider scrollbar ([f872972](https://github.com/CorentinTh/it-tools/commit/f872972e69aeb4fde4c17f0c122ca3fd4aa1c56c))
* icon sizes ([9bb7fc4](https://github.com/CorentinTh/it-tools/commit/9bb7fc47aa70bdc5083d0883f1496fac63f812ea))
* menu option key ([390ef93](https://github.com/CorentinTh/it-tools/commit/390ef93232dc1b448022a0c09d36367adad9d221))
* **page:** removed unused import ([f70fce6](https://github.com/CorentinTh/it-tools/commit/f70fce65e20989eb19b0f0976e756a43edf02e9d))
* removed theme editor ([8559fbd](https://github.com/CorentinTh/it-tools/commit/8559fbd7744fe82b7702a5c0eb77a8d627c5a73d))
* removed unused files ([c1e7669](https://github.com/CorentinTh/it-tools/commit/c1e76695e4a16b8312ab6031a1bdfb6368946677))
* removed unused files ([8d9f924](https://github.com/CorentinTh/it-tools/commit/8d9f92417744a5fbd9b4108e851005f23de18b53))
* **style:** cleaner layout ([1d09a01](https://github.com/CorentinTh/it-tools/commit/1d09a01bb25088493cc9b7f2cb7f8a8aa69ac9e9))
* **style:** improve style for tool-card ([65a6896](https://github.com/CorentinTh/it-tools/commit/65a6896563d16f30420424e274bd306e3e9182c8))
* **style:** label width ([fd4426d](https://github.com/CorentinTh/it-tools/commit/fd4426d246ada553528759f761c8192df85c0d44))
* **style:** menu item height ([8951e87](https://github.com/CorentinTh/it-tools/commit/8951e87c143fda74be32bae5b28e009556d7086e))
* **style:** menu scrollbar ([483cf66](https://github.com/CorentinTh/it-tools/commit/483cf66db992169d361487c8461938810793b978))
* **style:** port display ([2632f24](https://github.com/CorentinTh/it-tools/commit/2632f24cc89af7dd12f7a0c1a8b58983a1bb78d8))
* **style:** removed extra br ([b44539c](https://github.com/CorentinTh/it-tools/commit/b44539c1820defbaaa6dfe83a76c72982a641971))
* **style:** replaced scss style block to less ([655d9d2](https://github.com/CorentinTh/it-tools/commit/655d9d22e3136bdf1dee29310ab04cf38596bdc8))
* **style:** responsive layout ([2df3f53](https://github.com/CorentinTh/it-tools/commit/2df3f53b78bbe419763fd359788a4b0b5710e4b7))
* **style:** updated linter config ([6b58ec5](https://github.com/CorentinTh/it-tools/commit/6b58ec554a0de91139f16d67cec42536d093d5fb))
### Documentation
* added new tool creation procedure ([8177883](https://github.com/CorentinTh/it-tools/commit/81778834e6a79725c42eae1772935682ce7580c6))
* updated readme ([1134e0b](https://github.com/CorentinTh/it-tools/commit/1134e0b822edbc25ce9ff83007bf5d331a1becbd))

View File

@@ -1,79 +1,3 @@
![logo](.github/logo.png) # IT-Tools
Useful tools for developer and people working in IT. [Have a look !](https://it-tools.tech). It-Tools v3 nuxt exploration branch
## Functionalities and roadmap
Please check the [issues](https://github.com/CorentinTh/it-tools/issues) to see if some feature listed to be implemented.
You have an idea of a tool? Submit a [feature request](https://github.com/CorentinTh/it-tools/issues/new?assignees=corentinth&labels=&template=feature_request.md&title=)!
## Contribute
### Recommended IDE Setup
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.vscode-typescript-vue-plugin).
### Node version
Ensure you have the correct node/npm version
```sh
nvm use
```
### Project Setup
```sh
npm install
```
#### Compile and Hot-Reload for Development
```sh
npm run dev
```
#### Type-Check, Compile and Minify for Production
```sh
npm run build
```
#### Run Unit Tests with [Vitest](https://vitest.dev/)
```sh
npm run test
```
#### Lint with [ESLint](https://eslint.org/)
```sh
npm run lint
```
### Create a new tool
To create a new tool, there is a script that generate the boilerplate of the new tool, simply run:
```sh
node scripts/create-tool.mjs my-tool-name
```
It will create a directory in `src/tools` with the correct files, and a the import in `src/tools/index.ts`. You will just need to add the inported tool in the proper category and develop the tool.
## Credits
Coded with ❤️ by [Corentin Thomasset](//corentin-thomasset.fr).
This project is continuously deployed using [vercel.com](https://vercel.com).
<a href="https://www.producthunt.com/posts/it-tools?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-it&#0045;tools" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=345793&theme=light" alt="IT&#0032;Tools - Collection&#0032;of&#0032;handy&#0032;online&#0032;tools&#0032;for&#0032;devs&#0044;&#0032;with&#0032;great&#0032;UX | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
<a href="https://www.producthunt.com/posts/it-tools?utm_source=badge-top-post-badge&utm_medium=badge&utm_souce=badge-it&#0045;tools" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=345793&theme=light&period=daily" alt="IT&#0032;Tools - Collection&#0032;of&#0032;handy&#0032;online&#0032;tools&#0032;for&#0032;devs&#0044;&#0032;with&#0032;great&#0032;UX | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
## License
This project is under the [MIT license](LICENSE).

14
env.d.ts vendored
View File

@@ -1,14 +0,0 @@
/// <reference types="vite/client" />
/// <reference types="vite-svg-loader" />
interface ImportMetaEnv {
VITE_PLAUSIBLE_API_HOST: string;
VITE_PLAUSIBLE_DOMAIN: string;
PACKAGE_VERSION: string;
GIT_SHORT_SHA: string;
PROD: boolean;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}

View File

@@ -1,38 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>IT Tools - Handy online tools for developers</title>
<meta itemprop="name" content="IT Tools - Handy online tools for developers" />
<meta name="description" content="Collection of handy online tools for developers, with great UX. IT Tools is a free and open-source collection of handy online tools for developers & people working in IT." />
<meta itemprop="description" content="Collection of handy online tools for developers, with great UX. IT Tools is a free and open-source collection of handy online tools for developers & people working in IT." />
<link rel="author" href="/humans.txt" />
<link rel=canonical href="https://it-tools.tech">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#18a058" />
<meta name="msapplication-TileColor" content="#da532c" />
<meta name="theme-color" content="#ffffff" />
<meta property="og:url" content="https://it-tools.tech/" />
<meta property="og:type" content="website" />
<meta property="og:title" content="IT Tools - Handy online tools for developers" />
<meta property="og:description" content="Collection of handy online tools for developers, with great UX. IT Tools is a free and open-source collection of handy online tools for developers & people working in IT." />
<meta property="og:image" content="/banner.png" />
<meta name="twitter:card" content="summary_large_image" />
<meta property="twitter:domain" content="it-tools.tech" />
<meta property="twitter:url" content="https://it-tools.tech/" />
<meta name="twitter:title" content="IT Tools - Handy online tools for developers" />
<meta name="twitter:description" content="Collection of handy online tools for developers, with great UX. IT Tools is a free and open-source collection of handy online tools for developers & people working in IT." />
<meta name="twitter:image" content="/banner.png" />
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

393
locales/no.yml Normal file
View File

@@ -0,0 +1,393 @@
home:
categories:
newestTools: Nyeste verktøy
favoriteTools: 'Dine favoritt verktøy'
allTools: 'Alle verktøyene'
subtitle: 'Nyttige verktøy for utviklere'
toggleMenu: 'Vekslemenmy'
home: Hjem
uiLib: 'UI Bib'
support: 'Støtt utviklingen av IT-Tools'
buyMeACoffee: 'Kjøp en kaffe til meg'
follow:
title: 'Liker du it-tools?'
p1: 'Gi oss en stjerne på'
githubRepository: 'IT-Tools GitHub-depotet'
p2: 'eller følg oss på'
twitterAccount: 'IT-Tools sin twitter konto'
thankYou: 'Tusen takk!'
nav:
github: 'GitHub-depot'
githubRepository: 'IT-Tools GitHub-depot'
twitter: 'Twitter konto'
twitterAccount: 'IT Tools Twitter konto'
about: 'Om IT-Tools'
aboutLabel: 'Om'
darkMode: 'Mørk modus'
lightMode: 'Lys modus'
mode: 'Veksle mørk/lys modus'
about:
content: >
# Om IT-Tools
Denne vidunderlige nettsiden, laget med ❤ av [Corentin Thomasset](https://corentin.tech?utm_source=it-tools&utm_medium=about) , sammenstiller nyttige verktøy for utviklere og folk som jobber innen IT. Hvis du finner dette nyttig, Del det gjerne med andre som du tror kan få nytte av dette, og ikke glem å lage et bokmerke!
IT Tools er åpen kildekode (under MIT lisensen) og gratis, og det vil det alltid være, men det koster å drifte og å fornye domenet. Hvis du ønsker å støtte arbeidet mitt, og motivere meg til å legge til flere verktøy, gjerne støtt meg ved å [sponse meg](https://www.buymeacoffee.com/cthmsst).
## Teknologier
IT Tools er laget i Vue.js (Vue 3) med Naive UI komponent bibliotektet og er hosted og kontinuerlig deployet av Vercel. Tredjeparts åpen-kildekode biblioteker er brukt i noen verktøy, du kan finne den komplette listen i [package.json](https://github.com/CorentinTh/it-tools/blob/main/package.json) filen i depoet.
## Funnet en feil? Et verktøy som mangler?
Hvis du trenger et verktøy som foreløpig ikke er tilgjengelig her, og du tenker det kan være nyttig for andre, så er du velkommen til å legge til en funksjonsforespørsel i [problem seksjonen](https://github.com/CorentinTh/it-tools/issues/new/choose) i github-depotet.
Og hvis du har funnet en feil, eller noe ikke oppfører seg som forventet, vennligst send inn en feilrapport i [problem seksjonen](https://github.com/CorentinTh/it-tools/issues/new/choose) i github-depotet.
404:
notFound: '404 ikke funnet'
sorry: 'Beklager, denne siden ser ikke ut til å eksistere'
maybe: 'Kanskje informasjonskapslene oppfører seg rart, prøvd en tvungen oppfriskning?'
backHome: 'Tilbake til start'
favoriteButton:
remove: 'Fjern fra favoritter'
add: 'Legg til favoritter'
toolCard:
new: Ny
search:
label: Søk
tools:
categories:
favorite-tools: 'Dine favoritt verktøy'
crypto: Krypto
converter: Konvertering
web: Web
images and videos: 'Bilder & Videoer'
development: Utvikling
network: Nettverk
math: Matte
measurement: Måling
text: Tekst
data: Data
password-strength-analyser:
title: Analyseverktøy for passordstyrke
description: Oppdag styrken av passordet ditt med dette kun-klient-maskin passordstyrke analyse verktøyet og se den estimerte knekketiden.
chronometer:
title: Kronometer
description: Overvåk varigheten av noe. I bunn og grunn et kronometer med enkle funksjoner.
token-generator:
title: Token generator
description: Generer en tilfeldig streng med store og/eller små bokstaver, siffer og/eller symboler.
uppercase: Store bokstaver (ABC...)
lowercase: Små bokstaver (abc...)
numbers: Siffer (123...)
symbols: Symboler (!-;...)
length: Lengde
tokenPlaceholder: 'Tokenet...'
copied: Tokenet er kopiert til utklippstavlen.
button:
copy: Kopier
refresh: Oppfrisk
percentage-calculator:
title: Prosent kalkulator
description: Beregn enkelt prosenter fra en verdi til en annen, eller fra en prosent til en verdi.
svg-placeholder-generator:
title: SVG plassholder generator
description: Generer svg bilder til å bruke som plassholder i applikasjonen din.
json-to-csv:
title: JSON til CSV
description: Konverter JSON til CSV med automatisk oppdagelse av headeren.
camera-recorder:
title: Kameraopptak
description: Ta et bilde eller spill inn en video med webkamera eller kameraet ditt.
keycode-info:
title: Tastekode info
description: Finn javascript tastekode, kode, plassering og modifikatorer av hvilken som helst tast.
emoji-picker:
title: Emoji velger
description: Klipp og lim emojis og få unicode og kode verdien av hver emoji.
color-converter:
title: Farge konverter
description: Konverter farger mellom de forskjellige formatene (hex, rgb, hsl og css navn).
bcrypt:
title: Bcrypt
description: Hash og sammenlign tekst ved hjelp av bcrypt. Bcrypt er en passord-hashings funksjon basert på Blowfish cipher.
crontab-generator:
title: Crontab generator
description: Verifiser og generer crontab og få den mennesklig leselige beskrivelsen av cron timeplanen.
http-status-codes:
title: HTTP status koder
description: Liste over alle HTTP status koder, navnet dems, og betydningen.
sql-prettify:
title: SQL forskjønning and format
description: Formater og forskjønn SQL spørringene dine (den støtter forskjellige SQL dialekter).
benchmark-builder:
title: Bygg en referansemåler
description: Sammenlign enkelt kjøretiden av oppgaver med denne enkle referansemåls byggeren.
git-memo:
title: Git jukselapp
description: Git er en desentralisert versjons håndterings programvare. Med denne jukselappen vil du få kjapp tilgang til de vanligste kommandoene.
slugify-string:
title: Slugify streng
description: Lag en trygg url, filbane eller id.
encryption:
title: Krypter / decrypter tekst
description: Krypter klartekst og dekrypter ciphertekst ved bruk av krypteringsalgoritmer som AES, TripleDES, Rabbit eller RC4.
random-port-generator:
title: Tilfeldig port generator
description: Generer tilfeldige portnumre utenfor scopet av "kjente" porter (0-1023).
yaml-prettify:
title: YAML forskjønning og formatering
description: Forskjønn YAML strengene dine til et lettlest format.
eta-calculator:
title: ETA kalkulator
description: En ETA (Estimert Tid for Ankomst) kalkulator for å anslå den sannsynelige slutt tiden for en oppgave, for eksempel, slutttiden og varigheten av en filnedlastning.
roman-numeral-converter:
title: Romertall konverter
description: Konverter romertall til tall eller konverter tall til romertall.
hmac-generator:
title: Hmac generator
description: Beregn en hash-basert meldings authentiserings kode (HMAC) ved bruk av en hemmelig nøkkel og din foretrukne hashings funksjon.
bip39-generator:
title: BIP39 nøkkelords generator
description: Generer et BIP39 nøkkelord fra en eksisterende eller tilfeldig huskesetning, eller få ut en huskesetning fra nøkkelordet.
base64-file-converter:
title: Base64 fil konverter
description: Konverter en base64 streng til fil eller en fil, bilde til en base64 representasjon.
list-converter:
title: Liste konverterer
description: Dette verktøyet kan prosessere kolonnebasert data og foreta forskjellige endringer (transposering, legge til prefix og suffix, reversere lister, sortere lister, gjøre om til små bokstaver, trunkere verdier) på hver rad.
base64-string-converter:
title: Base64 string kode/dekoder
description: Enkelt kode eller dekode en tekststreng til base64 representasjonen av strengen.
toml-to-yaml:
title: TOML til YAML
description: Parser og konverter TOML til YAML.
math-evaluator:
title: Matematikkevaluator
description: En Kalkulator for å evaluere matematiske uttrykk. Du kan bruke funksjoner som sqrt, cos, sin, abs, etc.
json-to-yaml-converter:
title: JSON til YAML konverterer
description: Enkelt konverter JSON til YAML med dette verktøyet.
url-parser:
title: URL analyse
description: Parsere en URL ned til bestanddelene (protokoll, opprinnelse, parametre, port, brukernavn-passord, ...).
iban-validator-and-parser:
title: IBAN validering og analysering
description: Valider og parser IBAN numre. Sjekk om et IBAN er gyldig og få landet, BBAN, om det er en QR-IBAN og IBAN i et vennlig format.
user-agent-parser:
title: User-agent analysering
description: Detekter og parser nettleser, motor, OS, CPU, og enhet type/modell fra en user-agent tekst streng.
numeronym-generator:
title: Numeronym generator
description: Et numeronym er et ord hvor et nummer er brukt til å lage en forkortelse. For eksempel, "i18n" er et numeronym for "internasjonalisering" hvor 18 står for antall bokstaver mellom første bokstaven i og den siste bokstaven n i ordet.
case-converter:
title: Bokstavkonvertering
description: Formater bokstavene med store eller små bokstaver, samt andre format.
html-entities:
title: HTML streng rensing
description: Rens bort eller omsvøp HTML entiteter (erstatt tegn som <,>, &, " and \' med deres HTML versjon).
json-prettify:
title: JSON forskjønning og formatering
description: Forskjønn JSON strenger til et lettlest format.
docker-run-to-docker-compose-converter:
title: Docker run til Docker compose konverter
description: Konverter "docker run" kommandoer til docker-compose filer!
mac-address-lookup:
title: MAC address oppslagsverk
description: Finn forhandler og produsent basert på MAC adressen.
mime-types:
title: MIME typer
description: Konverter MIME typer til fil utvidelser og visa-versa.
toml-to-json:
title: TOML til JSON
description: Parser og konverter TOML til JSON.
lorem-ipsum-generator:
title: Lorem ipsum generator
description: Lorem ipsum er brukt som plassholder tekst, vanligvis brukt til å demonstrere den visuelle formen av et dokument eller font-type uten å måtte ha meningsfult innhold.
qrcode-generator:
title: QR Kode generator
description: Generer og last ned en QR kode til en URL (eller ren tekst), og tilpass bakgrunns og forgrunns farger.
wifi-qrcode-generator:
title: WiFi QR Kode generator
description: Generer og last ned QR koder for rask tilkobling til wifi nettverket.
xml-formatter:
title: XML formaterer
description: Forskjønn en XML streng til et lettlest format.
temperature-converter:
title: Temperatur konverter
description: Temperatur konversjoner mellom Kelvin, Celsius, Fahrenheit, Rankine, Delisle, Newton, Réaumur, og Rømer.
chmod-calculator:
title: Chmod kalkulator
description: Beregn chmod tillatelser og kommandoer med denne chmod kalkulatoren.
rsa-key-pair-generator:
title: RSA nøkkelpar generator
description: Generer et nytt tilfeldig RSA privat og offentlig pem sertifikat nøkkel par.
html-wysiwyg-editor:
title: HTML WYSIWYG editor
description: Online, funksjonsrik WYSIWYG HTML editor som genererer kildekoden for innholdet øyeblikkelig.
yaml-to-toml:
title: YAML til TOML
description: Parser og konverter YAML til TOML.
mac-address-generator:
title: MAC adresse generator
description: Sett inn antall og prefix. MAC addressene blir generert i ønsket format
json-diff:
title: JSON diff
description: Sammenlign to JSON objekter og finn forskjellene mellom dem.
jwt-parser:
title: JWT parser
description: Parse og dekode et JSON Web Token (jwt) og vis innholdet.
date-converter:
title: Dato-tid konverter
description: Konverter dato og tid til forskjellige formater.
phone-parser-and-formatter:
title: Telefon format og parserer
description: Parser, valider og formater telefon numre. få innformasjonen om telefon nummeret, slik som landskoden, type etc.
ipv4-subnet-calculator:
title: IPv4 subnet kalkulator
description: Parser IPv4 CIDR blokker of åf all info du trenger om subnettet.
og-meta-generator:
title: Open graph meta generator
description: Generer open-graph og SoMe HTML meta tagger til nettsiden din.
ipv6-ula-generator:
title: IPv6 ULA generator
description: Generer din egen lokale, ikke-rutbare IP adresse til nettverket ditt i henhold til RFC4193.
hash-text:
title: Hash tekst
description: 'Hash en tekst streng med en av algoritmene : MD5, SHA1, SHA256, SHA224, SHA512, SHA384, SHA3 eller RIPEMD160'
json-to-toml:
title: JSON til TOML
description: Parser og konverter JSON til TOML.
device-information:
title: Enhets informasjon
description: Få informasjon om din nåværende enhet (skjermstørrelse, piksel-forhold, user agent, etc.)
pdf-signature-checker:
title: PDF signatur sjekker
description: Bekreft signaturen til en PDF fil. En signert PDF fil inneholder en eller flere signaturer som kan bli brukt til å bestemme om en fil har blitt endret etter at den var signert.
json-minify:
title: JSON minifiser
description: Minifiser og komprimer JSON ved å fjerne unødvendige mellomrom.
ulid-generator:
title: ULID generator
description: Generer tilfeldig Universell Unik Leksikografisk Sorterbar Identifikator (ULID).
string-obfuscator:
title: Streng obfuskator
description: Obfusker en streng (som en hemmelighet, en IBAN, eller et token) og gjør den delbar og identifiserbar uten å vise innholdet.
base-converter:
title: Heltalls konverter
description: Konverter et heltall mellom forskjellige baser (desimal, hexadesimal, binær, oktal, base64, etc.)
yaml-to-json-converter:
title: YAML til JSON konverter
description: Konverterl YAML til JSON.
uuid-generator:
title: UUIDs generator
description: En universell Unik Identifikator (UUID) er et 128-bit nummer, brukt til å identifisere informasjon i datasystemer.
ipv4-address-converter:
title: IPv4 adresse konverter
description: Konverter en IPv4 adresse til desimal, binær, hexadesimal, eller en IPv6 representasjon.
text-statistics:
title: Tekst statistikk
description: Få informasjonen om en tekst, antall karakterer, antall ord, størrelsen i bytes, etc.
text-to-nato-alphabet:
title: Tekst til NATO alfabetet
description: Transformer teksten til det NATO fonetiske alfabetet for muntlig gjengivelse.
basic-auth-generator:
title: Basic auth generator
description: Generer en base64 basic auth header fra et brukernavn og passord.
text-to-unicode:
title: Tekst til Unicode
description: Parser og konverter tekst til unicode og visa-versa
ipv4-range-expander:
title: IPv4 range utvider
description: Gitt en start og en slutt IPv4 adresse, kalkulerer dette verktøyet et gyldig IPv4 subnet sammen med sin CIDR notasjon.
text-diff:
title: Tekst diff
description: Sammenlign to tekster og vis forskjellen mellom dem.
otp-generator:
title: OTP kode generator
description: Generer og valider tidsbasert OTP (one time password) for multi-faktor autentisering.
url-encoder:
title: Kode/dekode URL-formaterte strenger
description: Kode tekst til URL-kodet format (også kjent som "prosent-kodet"), eller dekode fra det.
text-to-binary:
title: Tekst til ASCII binært
description: Konverter tekst til sin ASCII binære representasjon og visa-versa.

19772
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,71 +1,16 @@
{ {
"name": "it-tools", "name": "@it-tools/root",
"version": "2.4.2", "version": "0.0.0",
"description": "IT Tools monorepo root",
"packageManager": "pnpm@9.12.2",
"scripts": { "scripts": {
"dev": "vite", "dev": "pnpm -F @it-tools/app dev"
"build": "vue-tsc --noEmit && vite build",
"preview": "vite preview --port 5050",
"test": "npm run test:unit",
"test:unit": "vitest --environment jsdom",
"coverage": "vitest run --coverage",
"typecheck": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false",
"lint": "eslint src --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore",
"release": "standard-version"
}, },
"dependencies": { "keywords": [],
"@it-tools/bip39": "^0.0.4", "author": "Corentin Thomasset <corentinth@proton.me> (https://corentin.tech)",
"@vicons/material": "^0.12.0", "repository": {
"@vicons/tabler": "^0.12.0", "type": "git",
"@vueuse/core": "^8.2.1", "url": "https://github.com/CorentinTh/it-tools"
"@vueuse/head": "^0.7.5",
"bcryptjs": "^2.4.3",
"change-case": "^4.1.2",
"colord": "^2.9.2",
"cron-validator": "^1.3.1",
"cronstrue": "^2.2.0",
"crypto-js": "^4.1.1",
"date-fns": "^2.28.0",
"figue": "^1.1.0",
"highlight.js": "^11.5.1",
"lodash": "^4.17.21",
"naive-ui": "^2.28.0",
"pinia": "^2.0.11",
"plausible-tracker": "^0.3.5",
"qrcode": "^1.5.0",
"randombytes": "^2.1.0",
"uuid": "^8.3.2",
"vue": "^3.2.31",
"vue-router": "^4.0.12"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.1.0",
"@types/bcryptjs": "^2.4.2",
"@types/crypto-js": "^4.1.1",
"@types/jsdom": "^16.2.14",
"@types/node": "^16.11.25",
"@types/qrcode": "^1.4.2",
"@types/randombytes": "^2.0.0",
"@types/uuid": "^8.3.4",
"@vitejs/plugin-vue": "^2.2.2",
"@vitejs/plugin-vue-jsx": "^1.3.7",
"@vue/eslint-config-prettier": "^7.0.0",
"@vue/eslint-config-typescript": "^10.0.0",
"@vue/test-utils": "^2.0.0-rc.18",
"@vue/tsconfig": "^0.1.3",
"c8": "^7.11.0",
"eslint": "^8.5.0",
"eslint-plugin-vue": "^8.2.0",
"jsdom": "^19.0.0",
"less": "^4.1.2",
"prettier": "^2.6.2",
"standard-version": "^9.3.2",
"start-server-and-test": "^1.14.0",
"typescript": "~4.5.5",
"vite": "^2.9.1",
"vite-plugin-md": "^0.12.4",
"vite-plugin-pwa": "^0.11.13",
"vite-svg-loader": "^3.2.0",
"vitest": "^0.5.0",
"vue-tsc": "^0.31.4"
} }
} }

24
packages/app/.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
# Nuxt dev/build outputs
.output
.data
.nuxt
.nitro
.cache
dist
# Node dependencies
node_modules
# Logs
logs
*.log
# Misc
.DS_Store
.fleet
.idea
# Local env files
.env
.env.*
!.env.example

75
packages/app/README.md Normal file
View File

@@ -0,0 +1,75 @@
# Nuxt Minimal Starter
Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
## Setup
Make sure to install dependencies:
```bash
# npm
npm install
# pnpm
pnpm install
# yarn
yarn install
# bun
bun install
```
## Development Server
Start the development server on `http://localhost:3000`:
```bash
# npm
npm run dev
# pnpm
pnpm dev
# yarn
yarn dev
# bun
bun run dev
```
## Production
Build the application for production:
```bash
# npm
npm run build
# pnpm
pnpm build
# yarn
yarn build
# bun
bun run build
```
Locally preview production build:
```bash
# npm
npm run preview
# pnpm
pnpm preview
# yarn
yarn preview
# bun
bun run preview
```
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.

10
packages/app/app.vue Normal file
View File

@@ -0,0 +1,10 @@
<script setup lang="ts">
import CommandPalette from './src/modules/command-palette/components/command-palette.vue';
</script>
<template>
<NuxtLayout>
<CommandPalette />
<NuxtPage />
</NuxtLayout>
</template>

View File

@@ -0,0 +1,77 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 98%;
--foreground: 240 10% 3.9%;
--card: 0 0% 100%;
--card-foreground: 240 10% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
--primary: 95 71% 68%;
--primary-foreground: 240 10% 3.9%;
--secondary: 240 4.8% 95.9%;
--secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%;
--muted-foreground: 240 3.8% 46.1%;
--accent: 240 4.8% 95.9%;
--accent-foreground: 240 5.9% 10%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border:240 5.9% 90%;
--input:240 5.9% 90%;
--ring:240 5.9% 10%;
--radius: 0.5rem;
}
.dark {
--background:240 4% 10%;
--foreground:0 0% 98%;
--card: 240 5% 8%;
--card-foreground:0 0% 98%;
--popover:240 10% 3.9%;
--popover-foreground:0 0% 98%;
--primary: 83 79% 55%;
--primary-foreground:240 5.9% 10%;
--secondary:240 3.7% 15.9%;
--secondary-foreground:0 0% 98%;
--muted:240 3.7% 15.9%;
--muted-foreground:240 5% 64.9%;
--accent:240 3.7% 15.9%;
--accent-foreground:0 0% 98%;
--destructive:0 62.8% 30.6%;
--destructive-foreground:0 0% 98%;
--border:240 3.7% 15.9%;
--input:240 3.7% 15.9%;
--ring:240 4.9% 83.9%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
}
}

View File

@@ -0,0 +1,19 @@
{
"$schema": "https://shadcn-vue.com/schema.json",
"style": "new-york",
"typescript": true,
"tsConfigPath": ".nuxt/tsconfig.json",
"tailwind": {
"config": "tailwind.config.js",
"css": "assets/css/tailwind.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"framework": "nuxt",
"aliases": {
"components": "@/src/modules/ui/components",
"ui": "@/src/modules/ui/components",
"utils": "@/src/modules/shared/style/cn"
}
}

View File

@@ -0,0 +1,23 @@
import antfu from '@antfu/eslint-config';
export default antfu({
stylistic: {
semi: true,
},
vue: true,
rules: {
// To allow export on top of files
'ts/no-use-before-define': ['error', { allowNamedExports: true, functions: false }],
'curly': ['error', 'all'],
'vitest/consistent-test-it': ['error', { fn: 'test' }],
'ts/consistent-type-definitions': ['error', 'type'],
'style/brace-style': ['error', '1tbs', { allowSingleLine: false }],
'unused-imports/no-unused-vars': ['error', {
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
}],
},
});

View File

@@ -0,0 +1,5 @@
export default defineI18nConfig(() => ({
legacy: false,
locale: 'en',
fallbackLocale: 'en',
}));

View File

@@ -0,0 +1,60 @@
import toolsModule from './src/modules/tools/modules/tools.modules';
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2024-04-03',
devtools: { enabled: true },
extends: [
'src/modules/app',
],
modules: [
'@nuxtjs/tailwindcss',
'shadcn-nuxt',
'@nuxt/fonts',
'@nuxt/icon',
'@vueuse/nuxt',
'@nuxtjs/color-mode',
toolsModule, // Must be imported before i18n
'@nuxtjs/i18n',
'@nuxtjs/seo',
'@pinia/nuxt',
],
site: {
url: 'https://it-tools.tech',
name: 'IT Tools',
description: 'The open-source collection of handy online tools to help developers in their daily life.',
},
fonts: {
provider: 'bunny',
defaults: {
weights: [400, 500, 600, 700, 800],
},
},
colorMode: {
preference: 'system',
fallback: 'dark',
classSuffix: '',
storage: 'cookie',
storageKey: 'itts-color-mode',
},
i18n: {
strategy: 'prefix',
vueI18n: './i18n.config.ts',
defaultLocale: 'en',
langDir: './src/locales',
locales: [
{ code: 'en', file: 'en.yaml', name: 'English' },
{ code: 'fr', file: 'fr.yaml', name: 'Français' },
],
},
experimental: {
scanPageMeta: false, // Causes some issues with layouts and hook-registered pages
},
});

51
packages/app/package.json Normal file
View File

@@ -0,0 +1,51 @@
{
"name": "@it-tools/app",
"type": "module",
"private": true,
"packageManager": "pnpm@9.15.1",
"scripts": {
"dev": "nuxt dev",
"build": "nuxt build",
"build:cloudflare-pages": "nuxt build --preset cloudflare_pages",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare",
"lint": "eslint .",
"lint:fix": "eslint --fix .",
"test": "pnpm run test:unit",
"test:unit": "vitest run",
"test:unit:watch": "vitest watch",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@corentinth/chisels": "^1.1.0",
"@nuxt/fonts": "^0.10.3",
"@nuxt/icon": "^1.10.3",
"@nuxtjs/color-mode": "^3.5.2",
"@nuxtjs/i18n": "^8.5.6",
"@nuxtjs/seo": "2.0.0-rc.23",
"@pinia/nuxt": "^0.5.5",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lodash-es": "^4.17.21",
"lucide-vue-next": "^0.453.0",
"nuxt": "^3.15.0",
"radix-vue": "^1.9.11",
"shadcn-nuxt": "^0.10.4",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
"vue": "latest",
"vue-router": "latest"
},
"devDependencies": {
"@antfu/eslint-config": "^3.12.1",
"@nuxtjs/tailwindcss": "^6.12.2",
"@tailwindcss/typography": "^0.5.15",
"@types/lodash-es": "^4.17.12",
"@vueuse/core": "^11.3.0",
"@vueuse/nuxt": "^11.3.0",
"eslint": "^9.17.0",
"typescript": "^5.7.2",
"vitest": "^2.1.8"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,4 +1,4 @@
/* TEAM */ /* TEAM */
Developer: Corentin Thomasset Developer: Corentin Thomasset
Site: https://github.com/CorentinTh Site: https://corentin.tech
Twitter: @cthmsst Twitter: @cthmsst

View File

@@ -0,0 +1,3 @@
{
"extends": "../.nuxt/tsconfig.server.json"
}

View File

@@ -0,0 +1,41 @@
app:
title: IT-Tools
description: The open-source collection of handy online tools to help developers in their daily life.
home:
all-the-tools: All the tools
search-tools: Search for a tool
open-source: Open Source
free: Free
self-hostable: Self-hostable
open-tool: Open tool
footer:
resources:
title: Resources
all-tools: All the tools
github: GitHub repository
support: Support IT-Tools
license: License
support:
title: Support
report-bug: Report a bug
request-feature: Request a feature
contribute: Contribute to the project
contact: Contact me
friends:
title: Friends
tools:
token-generator:
title: Token Generator
description: >-
Generate random string with the characters you want, uppercase, lowercase
letters, numbers and/or symbols.
placeholder: Generated token will appear here, please select at least one option.
use-uppercase: Include uppercase letters
use-lowercase: Include lowercase letters
use-numbers: Include numbers
use-symbols: Include symbols
exclude-similar: Exclude similar characters
length: Length
refresh: Refresh token
quantity: Quantity
format: Format

View File

@@ -0,0 +1,29 @@
app:
title: IT-Tools
description: La collection open-source d'outils en ligne pour aider les devs dans leur vie quotidienne.
home:
all-the-tools: Tous les outils
search-tools: Rechercher un outil
open-source: Open Source
free: Gratuit
self-hostable: Self-hostable
open-tool: Ouvrir l'outil
footer:
resources:
title: Ressources
all-tools: Tous les outils
github: Dépôt GitHub
support: Soutenir IT-Tools
license: Licence
support:
title: Support
report-bug: Signaler un bug
request-feature: Demander une fonctionnalité
contribute: Contribuer au projet
contact: Me contacter
friends:
title: Ami·e·s
tools:
token-generator:
title: Générateur de token
description: Générer des chaines de caractères aléatoires, contrôlez les caractères que vous voulez, lettres majuscules, minuscules, chiffres et/ou symboles.

View File

@@ -0,0 +1,116 @@
<script setup>
const localePath = useLocalePath();
const { t } = useI18n();
const sections = computed(() => [
{
title: t('footer.resources.title'),
items: [
{ label: t('footer.resources.all-tools'), to: localePath('/tools') },
{ label: t('footer.resources.github'), href: 'https://github.com/CorentinTh/it-tools' },
{ label: t('footer.resources.support'), href: 'https://buymeacoffee.com/cthmsst' },
{ label: 'Humans.txt', href: '/humans.txt' },
{ label: t('footer.resources.license'), href: 'https://github.com/CorentinTh/it-tools/blob/main/LICENSE' },
],
},
{
title: t('footer.support.title'),
items: [
{ label: t('footer.support.report-bug'), href: 'https://github.com/CorentinTh/it-tools/issues/new/choose' },
{ label: t('footer.support.request-feature'), href: 'https://github.com/CorentinTh/it-tools/issues/new/choose' },
{ label: t('footer.support.contribute'), href: 'https://github.com/CorentinTh/it-tools/blob/main/CONTRIBUTING.md' },
{ label: t('footer.support.contact'), href: 'https://github.com/CorentinTh/it-tools/issues/new/choose' },
],
},
{
title: t('footer.friends.title'),
items: [
{ label: 'Jugly.io', href: 'https://jugly.io' },
{ label: 'Enclosed.cc', href: 'https://enclosed.cc' },
],
},
]);
const socialLinks = [
{
icon: 'i-tabler-brand-github',
href: 'https://github.com/CorentinTh/it-tools',
label: 'GitHub',
},
{
icon: 'i-tabler-brand-x',
href: 'https://x.com/ittoolsdottech',
label: 'X',
},
{
icon: 'i-tabler-coffee',
href: 'https://buymeacoffee.com/cthmsst',
label: 'Support the project',
},
];
</script>
<template>
<footer class="light:bg-muted/50 dark:bg-black/20 mt-12">
<div class="py-12 px-6 max-w-screen-xl mx-auto ">
<div class="flex items-start justify-between flex-col md:flex-row gap-12">
<div>
<div class="flex items-center gap-2">
<NuxtLink :to="localePath('/')" class="text-2xl font-semibold border-b border-transparent hover:no-underline h-auto py-0 px-1 ml--1 rounded-none !transition-border-color-250 group text-muted-foreground flex items-center gap-1">
<span class="font-bold group-hover:text-foreground transition">IT</span>
<span class="text-[80%] font-extrabold border-[2px] leading-none border-current rounded-md px-1 pt-0.5 ml-1 group-hover:text-primary transition">TOOLS</span>
</NuxtLink>
</div>
<div class="flex items-center gap-2 mt-4">
<!-- {socialLinks.map(({ icon, href, label }) => (
<a href="{href}" target="_blank" rel="noopener noreferrer" class="text-2xl text-muted-foreground hover:text-primary transition" aria-label="{label}">
<div class="{icon}" />
</a>
))} -->
<a
v-for="socialLink in socialLinks" :key="socialLink.label" :href="socialLink.href" target="_blank" rel="noopener noreferrer" class="text-2xl text-muted-foreground hover:text-primary transition" :aria-label="socialLink.label"
>
<Icon :name="socialLink.icon" />
</a>
</div>
<div class="text-muted-foreground mt-2">
Crafted on Earth by
<a href="https://corentin.tech" target="_blank" rel="noopener" class="hover:text-primary transition">
Corentin Thomasset
</a>
</div>
</div>
<div class="grid grid-cols-1 sm:grid-cols-3 gap-12">
<div v-for="section in sections" :key="section.title">
<h4 class="font-semibold text-foreground">
{{ section.title }}
</h4>
<ul class="mt-4">
<li v-for="item in section.items" :key="item.label" class="mt-1">
<NuxtLink v-if="item.to" :to="localePath(item.to)" class="text-muted-foreground hover:text-primary transition">
{{ item.label }}
</NuxtLink>
<a v-else :href="item.href" target="_blank" rel="noopener" class="text-muted-foreground hover:text-primary transition">
{{ item.label }}
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="text-xs text-muted-foreground border-t border-border pt-4 mt-12">
<span>
&copy;
{{ new Date().getFullYear() }}
Corentin Thomasset
</span>
</div>
<div class="text-xs text-foreground opacity-80%" />
</div>
</footer>
</template>

View File

@@ -0,0 +1,52 @@
<script setup>
import { Button } from '@/src/modules/ui/components/button';
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/src/modules/ui/components/dropdown-menu';
import { useCommandPaletteStore } from '../../command-palette/command-palette.store';
const { openCommandPalette } = useCommandPaletteStore();
const colorMode = useColorMode();
</script>
<template>
<div class="w-full flex items-center justify-between">
<div>
<Button variant="outline" class="sm:pr-12 md:pr-24 text-muted-foreground hidden sm:flex" @click="openCommandPalette">
<Icon name="i-tabler-search" class="mr-2 size-4" />
{{ $t('home.search-tools') }}
</Button>
</div>
<div class="flex items-center gap-0.5">
<Button variant="ghost" size="icon" class="sm:hidden" @click="openCommandPalette">
<Icon name="i-tabler-search" class="size-5" />
</Button>
<LocalePicker />
<DropdownMenu>
<DropdownMenuTrigger as-child>
<Button variant="ghost">
<Icon v-if="colorMode.value === 'dark'" name="i-tabler-moon" class="size-5" />
<Icon v-else name="i-tabler-sun" class="size-5" />
<Icon name="i-tabler-chevron-down" class="ml-1 text-muted-foreground" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem class="cursor-pointer" :class="{ 'font-bold': colorMode.preference === 'light' }" @click="colorMode.preference = 'light'">
<Icon name="i-tabler-sun" class="mr-2 size-4" />
Light
</DropdownMenuItem>
<DropdownMenuItem class="cursor-pointer" :class="{ 'font-bold': colorMode.preference === 'dark' }" @click="colorMode.preference = 'dark'">
<Icon name="i-tabler-moon" class="mr-2 size-4" />
Dark
</DropdownMenuItem>
<DropdownMenuItem class="cursor-pointer" :class="{ 'font-bold': colorMode.preference === 'system' }" @click="colorMode.preference = 'system'">
<Icon name="i-tabler-device-laptop" class="mr-2 size-4" />
System
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</div>
</template>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
const props = withDefaults(defineProps<{ fadeBottom?: boolean; faderClass?: string }>(), { fadeBottom: true });
</script>
<template>
<div class="w-full bg-[linear-gradient(to_right,#80808010_1px,transparent_1px),linear-gradient(to_bottom,#80808010_1px,transparent_1px)] bg-[size:48px_48px] pt-20">
<slot />
<div v-if="props.fadeBottom" class="bg-gradient-to-t from-background to-transparent h-24 mt-24" :class="props.faderClass" />
</div>
</template>

View File

@@ -0,0 +1,34 @@
<script setup lang="ts">
import { Button } from '../../ui/components/button';
import { DropdownMenu } from '../../ui/components/dropdown-menu';
import DropdownMenuContent from '../../ui/components/dropdown-menu/DropdownMenuContent.vue';
import DropdownMenuItem from '../../ui/components/dropdown-menu/DropdownMenuItem.vue';
import DropdownMenuTrigger from '../../ui/components/dropdown-menu/DropdownMenuTrigger.vue';
const { locale, locales, setLocale } = useI18n();
</script>
<template>
<DropdownMenu>
<DropdownMenuTrigger as-child>
<slot>
<Button variant="ghost" aria-label="Change language">
<Icon name="i-tabler-language" class="size-5 mr-1" />
<Icon name="i-tabler-chevron-down" class="text-muted-foreground" />
</Button>
</slot>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem
v-for="({ name, code }) in locales"
:key="code"
class="cursor-pointer"
:class="{ 'font-bold': locale === code }"
@click="setLocale(code)"
>
{{ name }}
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</template>

View File

@@ -0,0 +1,28 @@
<script setup>
import { Button } from '@/src/modules/ui/components/button';
import { useToolsStore } from '../../tools/tools.store';
const toolStore = useToolsStore();
const localePath = useLocalePath();
</script>
<template>
<div class="border-b h-[60px] flex items-center justify-between px-6">
<NuxtLink variant="link" class="text-xl font-semibold border-b border-transparent hover:no-underline h-auto px-1 rounded-none !transition-border-color-250" :as="Button" :to="localePath('/')" aria-label="Home">
<span class="font-bold text-foreground">IT</span>
<span class="text-[80%] font-extrabold border-[2px] leading-none border-current rounded-md px-1 py-0.5 ml-1.5 text-primary">TOOLS</span>
</NuxtLink>
</div>
<div class="pt-4 px-3 flex flex-col gap-0.5">
<NuxtLink to="/" class="py-1.5 px-3 flex items-center text-muted-foreground hover:text-foreground transition hover:bg-muted rounded-lg">
<Icon name="i-tabler-home" class="mr-2 size-4" />
Home
</NuxtLink>
<NuxtLink v-for="tool in toolStore.tools" :key="tool.key" class="py-1.5 px-3 flex items-center text-muted-foreground hover:text-foreground transition hover:bg-muted rounded-lg" :to="tool.path" exact-active-class="bg-secondary !text-foreground">
<Icon :name="tool.icon" class="mr-2 size-4" />
{{ tool.title }}
</NuxtLink>
</div>
</template>

View File

@@ -0,0 +1,27 @@
<script setup>
import { Button } from '@/src/modules/ui/components/button';
import { useToolsStore } from '../../tools/tools.store';
const localePath = useLocalePath();
</script>
<template>
<div class="w-full min-h-screen text-sm relative font-sans flex flex-col">
<div class="h-[60px] border-b">
<div class="max-w-screen-xl mx-auto py-2 px-6 w-full flex items-center gap-4 h-full">
<NuxtLink variant="link" class="text-xl font-semibold border-b border-transparent hover:no-underline h-auto px-1 rounded-none !transition-border-color-250" :as="Button" :to="localePath('/')" aria-label="Home">
<span class="font-bold text-foreground">IT</span>
<span class="text-[80%] font-extrabold border-[2px] leading-none border-current rounded-md px-1 py-0.5 ml-1.5 text-primary">TOOLS</span>
</NuxtLink>
<app-header />
</div>
</div>
<div class="flex-1 pb-6">
<slot />
</div>
<app-footer />
</div>
</template>

View File

@@ -0,0 +1,36 @@
<script setup>
import { Button } from '../../ui/components/button';
import { Sheet, SheetContent, SheetTrigger } from '../../ui/components/sheet';
</script>
<template>
<div class="w-full min-h-screen text-sm relative font-sans flex flex-row">
<div class="w-64 border-r bg-white dark:bg-background shrink-0 hidden sm:block">
<sidenav-menu />
</div>
<div class="flex-1 flex flex-col">
<div class="border-b h-[60px] flex items-center justify-between px-6 bg-white dark:bg-background">
<div class="flex items-center gap-4">
<div class="sm:hidden">
<Sheet>
<SheetTrigger>
<Button variant="ghost" size="icon">
<Icon name="i-tabler-menu-2" class="size-5" />
</Button>
</SheetTrigger>
<SheetContent side="left" class="p-0 text-sm">
<sidenav-menu />
</SheetContent>
</Sheet>
</div>
</div>
<app-header />
</div>
<div class="flex-1">
<slot />
</div>
</div>
</div>
</template>

View File

@@ -0,0 +1,34 @@
<script setup lang="ts">
import { Button } from '@/src/modules/ui/components/button';
const localePath = useLocalePath();
</script>
<template>
<div class="flex justify-center text-center mt-24">
<div>
<h1 class="text-3xl font-light text-muted-foreground">
404
</h1>
<h2 class="font-semibold text-lg my-2">
Page not found
</h2>
<p class="text-muted-foreground">
The page you are looking for does not seem to exist.
</p>
<p class="text-muted-foreground">
Please check the URL and try again.
</p>
<Button as-child variant="secondary" class="mt-4">
<NuxtLink :to="localePath('/')">
<Icon name="i-tabler-arrow-left" class="mr-2 size-4" />
Go back home
</NuxtLink>
</Button>
</div>
</div>
</template>

View File

@@ -0,0 +1,3 @@
<template>
TODO
</template>

View File

@@ -0,0 +1,74 @@
<script setup>
import { Badge } from '@/src/modules/ui/components/badge';
import { Button } from '@/src/modules/ui/components/button';
import { useCommandPaletteStore } from '../../command-palette/command-palette.store';
import { useToolsStore } from '../../tools/tools.store';
import Card from '../../ui/components/card/Card.vue';
const { tools } = useToolsStore();
const { openCommandPalette } = useCommandPaletteStore();
</script>
<template>
<grid-background>
<div class="flex gap-24 mx-auto justify-center pb-8 mt-8 items-center px-6">
<div class="max-w-xl">
<div class="flex gap-2">
<Badge class="text-primary bg-primary/10 hover:bg-primary/10 shadow-none">
{{ $t('home.open-source') }}
</Badge>
<Badge class="text-primary bg-primary/10 hover:bg-primary/10 shadow-none">
{{ $t('home.free') }}
</Badge>
<Badge class="text-primary bg-primary/10 hover:bg-primary/10 shadow-none">
{{ $t('home.self-hostable') }}
</Badge>
</div>
<h1 class="text-5xl font-semibold border-b border-transparent hover:no-underline h-auto py-0 px-1 ml--1 rounded-none !transition-border-color-250 my-6">
<span class="font-bold ">IT</span>
<span class="text-[90%] text-primary font-extrabold border-[5px] leading-none border-current rounded-xl px-2 py-0.5 ml-3">TOOLS</span>
</h1>
<p class="text-xl text-gray-400 mb-4">
{{ $t('app.description') }}
</p>
<div class="flex gap-4">
<Button>
{{ $t('home.all-the-tools') }}
<Icon name="i-tabler-arrow-right" class="ml-2 size-4" />
</Button>
<Button variant="outline" @click="openCommandPalette">
<Icon name="i-tabler-search" class="mr-2 size-4" />
{{ $t('home.search-tools') }}
</Button>
</div>
</div>
<div class="relative hidden sm:block">
<div class="absolute top-4 left-0 w-full h-full flex items-center justify-center blur-2xl rounded-full opacity-20 bg-gradient-to-br from-primary to-transparent" />
<Icon name="i-tabler-terminal" class="text-9xl text-primary m-8" />
</div>
</div>
</grid-background>
<div class="max-w-screen-xl mx-auto px-6">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-12">
<NuxtLink v-for="tool in tools" :key="tool.key" :to="tool.path">
<Card class="p-6 h-full cursor-pointer hover:shadow-lg transition hover:translate-y-[-2px]">
<Icon :name="tool.icon" class="size-12 text-muted-foreground/60" />
<div class="font-semibold text-base">
{{ tool.title }}
</div>
<p class="text-muted-foreground mt-2">
{{ tool.description }}
</p>
</Card>
</NuxtLink>
</div>
</div>
</template>

View File

@@ -0,0 +1,16 @@
export const useCommandPaletteStore = defineStore('command-palette', () => {
const isCommandPaletteOpen = ref(false);
return {
isCommandPaletteOpen,
toggleCommandPalette() {
isCommandPaletteOpen.value = !isCommandPaletteOpen.value;
},
closeCommandPalette() {
isCommandPaletteOpen.value = false;
},
openCommandPalette() {
isCommandPaletteOpen.value = true;
},
};
});

View File

@@ -0,0 +1,77 @@
<script setup lang="ts">
import { useToolsStore } from '../../tools/tools.store';
import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../../ui/components/command';
import { useCommandPaletteStore } from '../command-palette.store';
const commandPaletteStore = useCommandPaletteStore();
const { tools } = useToolsStore();
onKeyStroke('k', (e) => {
e.preventDefault();
if (!e.ctrlKey && !e.metaKey) {
return;
}
commandPaletteStore.toggleCommandPalette();
});
const commandSections = computed(() => [
{
title: 'Tools',
items: [
...tools.map(tool => ({
label: tool.title,
icon: tool.icon,
action: () => navigateTo(tool.path),
})),
],
},
]);
function handleSelectCommand({ item }: { item: { label: string; action: () => void; keepOpen?: boolean } }) {
item.action();
if (!item.keepOpen) {
commandPaletteStore.closeCommandPalette();
}
}
</script>
<template>
<CommandDialog v-model:open="commandPaletteStore.isCommandPaletteOpen">
<CommandInput placeholder="Type a command or search..." />
<CommandList>
<CommandEmpty>{{ $t('command-palette.no-result') }}</CommandEmpty>
<!-- <CommandGroup heading="Suggestions">
<CommandItem value="calendar">
Calendar
</CommandItem>
<CommandItem value="search-emoji">
Search Emoji
</CommandItem>
<CommandItem value="calculator">
Calculator
</CommandItem>
</CommandGroup>
<CommandSeparator />
<CommandGroup heading="Settings">
<CommandItem value="profile">
Profile
</CommandItem>
<CommandItem value="billing">
Billing
</CommandItem>
<CommandItem value="settings">
Settings
</CommandItem>
</CommandGroup> -->
<CommandGroup v-for="section in commandSections" :key="section.title" :heading="section.title">
<CommandItem v-for="item in section.items" :key="item.label" :value="item.label" @select="handleSelectCommand({ item })">
<Icon :name="item.icon" class="mr-2 size-4" />
{{ item.label }}
</CommandItem>
</CommandGroup>
</CommandList>
</CommandDialog>
</template>

View File

@@ -0,0 +1,21 @@
// @vitest-environment nuxt
import { describe, expect, test } from 'vitest';
import { useRefreshableState } from './useRefreshableState';
describe('useRefreshableState composables', () => {
describe('useRefreshableState', () => {
test('the tuple provided by useRefreshableState contain the state that is the result of the provided function and a refresh function', () => {
let index = 0;
const [state, refresh] = useRefreshableState('key', () => ++index);
expect(state.value).to.equal(1);
expect(index).to.equal(1);
refresh();
expect(state.value).to.equal(2);
expect(index).to.equal(2);
});
});
});

View File

@@ -0,0 +1,12 @@
import { get } from '@vueuse/core';
export function useRefreshableState<T>(key: string, getState: () => T | Ref<T>) {
const state = useState(key, getState);
const refresh = () => {
const value = getState();
state.value = get(value);
};
return [state, refresh] as const;
}

View File

@@ -0,0 +1,4 @@
import { type ClassValue, clsx } from 'clsx';
import { twMerge } from 'tailwind-merge';
export const cn = (...classLists: ClassValue[]) => twMerge(clsx(classLists));

View File

@@ -0,0 +1,33 @@
import { sample as sampleImpl, times } from 'lodash-es';
export function createToken({
withUppercase = true,
withLowercase = true,
withNumbers = true,
withSymbols = false,
length = 64,
alphabet,
exclude,
sample = sampleImpl,
}: {
withUppercase?: boolean;
withLowercase?: boolean;
withNumbers?: boolean;
withSymbols?: boolean;
length?: number;
alphabet?: string;
exclude?: string | string[];
sample?: (str: string) => string;
}) {
const allAlphabet = alphabet ?? [
withUppercase ? 'ABCDEFGHIJKLMOPQRSTUVWXYZ' : '',
withLowercase ? 'abcdefghijklmopqrstuvwxyz' : '',
withNumbers ? '0123456789' : '',
withSymbols ? '.,;:!?./-"\'#{([-|\\@)]=}*+' : '',
].join('');
const charsToExclude = exclude ? (Array.isArray(exclude) ? exclude.join('') : exclude) : '';
const filteredAlphabet = allAlphabet.split('').filter(char => !charsToExclude.includes(char)).join('');
return times(length, () => sample(filteredAlphabet)).join('');
}

View File

@@ -0,0 +1,9 @@
import { defineTool } from '../../tools.models';
export const tokenGeneratorTool = defineTool({
slug: 'token-generator',
entryFile: './token-generator.vue',
icon: 'i-tabler-key',
createdAt: new Date('2024-02-13'),
currentDirUrl: import.meta.url,
});

View File

@@ -0,0 +1,362 @@
<script setup lang="ts">
import { times } from 'lodash-es';
import { useRefreshableState } from '~/src/modules/shared/composables/useRefreshableState';
import { cn } from '~/src/modules/shared/style/cn';
import { Button } from '~/src/modules/ui/components/button';
import { Checkbox } from '~/src/modules/ui/components/checkbox';
import NumberField from '~/src/modules/ui/components/number-field/NumberField.vue';
import NumberFieldContent from '~/src/modules/ui/components/number-field/NumberFieldContent.vue';
import NumberFieldDecrement from '~/src/modules/ui/components/number-field/NumberFieldDecrement.vue';
import NumberFieldIncrement from '~/src/modules/ui/components/number-field/NumberFieldIncrement.vue';
import NumberFieldInput from '~/src/modules/ui/components/number-field/NumberFieldInput.vue';
import Slider from '~/src/modules/ui/components/slider/Slider.vue';
import { Textarea } from '~/src/modules/ui/components/textarea';
import ToggleGroup from '~/src/modules/ui/components/toggle-group/ToggleGroup.vue';
import ToggleGroupItem from '~/src/modules/ui/components/toggle-group/ToggleGroupItem.vue';
import { createToken } from './token-generator.models';
definePageMeta({
layout: 'sidenav',
});
const formats = {
raw: {
label: 'Raw',
format: ({ tokens }: { tokens: string[] }) => tokens.join('\n'),
},
JSON: {
label: 'JSON',
format: ({ tokens }: { tokens: string[] }) => JSON.stringify(tokens),
},
};
const similarChars = ['I', 'l', '1', 'O', '0'];
const withUppercase = ref(true);
const withLowercase = ref(true);
const withNumbers = ref(true);
const withSymbols = ref(false);
const excludeSimilar = ref(false);
const length = ref(64);
const format = ref<keyof typeof formats>('raw');
const quantity = ref(1);
const tab = ref<'generator' | 'about'>('generator');
function reset() {
withUppercase.value = true;
withLowercase.value = true;
withNumbers.value = true;
withSymbols.value = false;
excludeSimilar.value = false;
length.value = 64;
format.value = 'raw';
quantity.value = 1;
}
function generateToken() {
return createToken({
withUppercase: withUppercase.value,
withLowercase: withLowercase.value,
withNumbers: withNumbers.value,
withSymbols: withSymbols.value,
length: length.value,
exclude: excludeSimilar.value ? similarChars : [],
});
}
const [token, refreshToken] = useRefreshableState(
'token-generator:token',
() => {
const tokens = times(
quantity.value,
generateToken,
);
return formats[format.value].format({ tokens });
},
);
watch([
withUppercase,
withLowercase,
withNumbers,
withSymbols,
length,
format,
quantity,
excludeSimilar,
], refreshToken);
// const { copy: copyToken } = useCopy({ source: token, notificationText: 'Token copied to clipboard' });
</script>
<template>
<div class="flex flex-col h-full">
<div class="p-6 pb-0 bg-white dark:bg-background border-b">
<h1 class="text-2xl">
{{ $t('tools.token-generator.title') }}
</h1>
<p class="text-muted-foreground">
{{ $t('tools.token-generator.description') }}
</p>
<div class="mt-2 flex gap-4">
<Button variant="link" :class="cn('text-muted-foreground font-sm pb-0 px-0 rounded-none hover:no-underline', { 'border-b border-b-foreground text-foreground': tab === 'generator' })" @click="tab = 'generator'">
Generator
</Button>
<Button variant="link" :class="cn('border-b border-b-transparent text-muted-foreground font-sm pb-0 px-0 rounded-none hover:no-underline transition', { 'border-b-foreground text-foreground': tab === 'about' })" @click="tab = 'about'">
About
</Button>
</div>
</div>
<div v-if="tab === 'about'" class="p-6 bg-white dark:bg-background">
<div class="prose dark:prose-invert mx-auto mb-20">
<h2 id="about-the-random-token-generator">
About The Random Token Generator
</h2>
<p>
The Random Token Generator on Crucials.tools is designed to meet the
modern developers need for quick, secure, and customizable tokens.
Whether you&#39;re working on web applications, software development, system
administration, or creating secure passwords, our tool provides a
straightforward solution to create tokens that fit your specifications
perfectly.
</p>
<h2 id="why-are-tokens-important-">
Why Are Tokens Important?
</h2>
<p>
In the realm of software development and IT, tokens play a crucial role in
maintaining security and user authentication. They are essential for:
</p>
<ul>
<li>
<p>
<strong>Session Management:</strong> Tokens are used to manage user sessions,
allowing systems to recognize and verify users over multiple requests.
</p>
</li>
<li>
<p>
<strong>API Security:</strong> Securely accessing APIs often requires tokens to
ensure that the requestor has the necessary permissions.
</p>
</li>
<li>
<p>
<strong>Randomized Data Generation:</strong> Tokens can be used in testing
environments to generate randomized data inputs, helping developers
identify potential issues.
</p>
</li>
</ul>
<h2 id="ideal-for-generating-secure-passwords">
Ideal for Generating Secure Passwords
</h2>
<p>
In addition to creating tokens, our Random Token Generator is an excellent
tool for generating strong, secure passwords. With options to include a
mix of uppercase letters, lowercase letters, numbers, and special symbols,
you can create robust passwords that enhance security for any application
or service.
</p>
<h2 id="how-to-use-the-token-generator">
How to Use the Token Generator
</h2>
<p>Using our Token Generator is simple:</p>
<ol>
<li>
<p>
<strong>Select the characters you want:</strong> Choose from uppercase letters,
lowercase letters, numbers, and special symbols based on your token or
password requirements.
</p>
</li>
<li>
<p>
<strong>Choose the length:</strong> Determine how long you want your token or
password to be, depending on the level of complexity and security needed.
</p>
</li>
<li>
<p>
<strong>Generate with a click:</strong> Once your options are set, click &#39;Generate&#39;
to receive your token or password instantly.
</p>
</li>
</ol>
<h2 id="benefits-of-using-crucials-tools-token-generator">
Benefits of Using Crucials.tools Token Generator
</h2>
<ul>
<li>
<p>
<strong>Customization:</strong> Our tool allows for extensive customization, ensuring
you get exactly what you need for your project or personal security.
</p>
</li>
<li>
<p>
<strong>Speed:</strong> Generate tokens or passwords in seconds, speeding up your
development process and enhancing your security posture.
</p>
</li>
<li>
<p>
<strong>No Installation Required:</strong> As a web-based tool, there is no need to
install any software, making it accessible from anywhere at any time.
</p>
</li>
</ul>
<h2 id="perfect-tool-for-developers-and-people-in-it">
Perfect Tool For Developers and people in IT
</h2>
<p>
Whether you are developing a new application, testing existing
functionality, needing to ensure secure access, or generating a strong
password, our Random Token Generator is the perfect tool. It is built to
be reliable and secure, providing peace of mind in various development and
personal security scenarios.
</p>
</div>
</div>
<div v-if="tab === 'generator'" class="h-full flex-1 flex flex-col md:flex-row">
<div class="md:max-w-[360px] bg-white dark:bg-background h-full border-b md:border-b-none md:border-r">
<div class="px-6 pt-4 pb-6 ">
<div class="text-muted-foreground mb-3">
Token configuration
</div>
<div class="flex gap-2 items-center mb-1">
<Checkbox id="use-uppercase" v-model:checked="withUppercase" />
<label for="use-uppercase">
{{ $t('tools.token-generator.use-uppercase') }}
<span class="text-muted-foreground">
(A-Z)
</span>
</label>
</div>
<div class="flex gap-2 items-center mb-1">
<Checkbox id="use-lowercase" v-model:checked="withLowercase" />
<label for="use-lowercase">
{{ $t('tools.token-generator.use-lowercase') }}
<span class="text-muted-foreground">
(a-z)
</span>
</label>
</div>
<div class="flex gap-2 items-center mb-1">
<Checkbox id="use-numbers" v-model:checked="withNumbers" />
<label for="use-numbers">
{{ $t('tools.token-generator.use-numbers') }}
<span class="text-muted-foreground">
(0-9)
</span>
</label>
</div>
<div class="flex gap-2 items-center mb-1">
<Checkbox id="use-symbols" v-model:checked="withSymbols" />
<label for="use-symbols">
{{ $t('tools.token-generator.use-symbols') }}
<span class="text-muted-foreground">
(!@,]*...)
</span>
</label>
</div>
<div class="flex gap-2 items-center mb-1">
<Checkbox id="exclude-similar" v-model:checked="excludeSimilar" />
<label for="exclude-similar">
{{ $t('tools.token-generator.exclude-similar') }}
<span class="text-muted-foreground">
({{ similarChars.join('') }})
</span>
</label>
</div>
<div class="flex gap-4 items-center mb-3 mt-4">
<label for="length" class="w-20 shrink-0">{{ $t('tools.token-generator.length') }}</label>
<NumberField id="length" v-model="length" :min="1" :max="1024">
<NumberFieldContent class="flex-1">
<NumberFieldDecrement />
<NumberFieldInput />
<NumberFieldIncrement />
</NumberFieldContent>
</NumberField>
</div>
<Slider
:model-value="[length]"
:max="512"
:min="1"
:step="1"
@update:model-value="(v) => length = v?.[0] ?? 1"
/>
</div>
<hr>
<div class="px-6 pt-4 pb-6 border-b">
<div class="text-muted-foreground mb-3">
Output configuration
</div>
<div class="flex items-center mb-2 gap-4">
<div class="w-20 shrink-0">
{{ $t('tools.token-generator.format') }}
</div>
<ToggleGroup v-model="format" type="single" variant="outline">
<ToggleGroupItem v-for="({ label }, key) in formats" :key="key" :value="key">
{{ label }}
</ToggleGroupItem>
</ToggleGroup>
</div>
<div class="flex items-center gap-4">
<div class="w-20 shrink-0">
{{ $t('tools.token-generator.quantity') }}
</div>
<NumberField v-model="quantity" :min="1" :max="100">
<NumberFieldContent class="flex-1">
<NumberFieldDecrement />
<NumberFieldInput />
<NumberFieldIncrement />
</NumberFieldContent>
</NumberField>
</div>
</div>
<div class="p-6">
<Button class="w-full" variant="secondary" @click="reset">
Reset configuration
</Button>
</div>
</div>
<div class="flex-1 p-6 pt-4 bg-white dark:bg-background pb-20">
<div class="text-muted-foreground mb-3">
Generated token
</div>
<Textarea v-model="token" rows="12" class="font-mono" readonly :placeholder="$t('tools.token-generator.placeholder')" />
<div class="flex md:items-center mt-2 gap-2 flex-col md:flex-row">
<Button variant="secondary" @click="refreshToken">
<Icon name="i-tabler-refresh" class="mr-2" />
{{ $t('tools.token-generator.refresh') }}
</Button>
<Button variant="secondary">
<Icon name="i-tabler-copy" class="mr-2" />
Copy to clipboard
</Button>
</div>
</div>
</div>
</div>
</template>

View File

@@ -0,0 +1,22 @@
import { defineNuxtModule, extendPages } from '@nuxt/kit';
import { toolDefinitions } from '../tools.registry';
export default defineNuxtModule({
meta: {
name: 'tools',
},
setup(options, nuxt) {
nuxt.hook('pages:extend', (pages) => {
pages.push(...toolDefinitions.map((tool) => {
return {
path: `/${tool.slug}`,
file: tool.entryFile,
name: tool.slug,
meta: {
toolKey: tool.key,
},
};
}));
});
},
});

View File

@@ -0,0 +1,18 @@
export function defineTool(toolDefinition: {
slug: string;
entryFile: string;
currentDirUrl: string;
icon: string;
createdAt: Date;
}) {
const entryFile = new URL(toolDefinition.entryFile, toolDefinition.currentDirUrl).pathname;
const baseGithubUrlPath = entryFile.match(/(\/tools\/.*)$/)?.[1];
const entryFileGithubUrl = `https://github.com/CorentinTh/crucials-tools/blob/main${baseGithubUrlPath}`;
return {
...toolDefinition,
key: toolDefinition.slug,
entryFile,
entryFileGithubUrl,
};
}

View File

@@ -0,0 +1,5 @@
import { tokenGeneratorTool } from './definitions/token-generator/token-generator.tool';
export const toolDefinitions = [
tokenGeneratorTool,
];

View File

@@ -0,0 +1,36 @@
import { joinUrlPaths } from '@corentinth/chisels';
import { toolDefinitions } from './tools.registry';
export const useToolsStore = defineStore('tools', () => {
const { t, locale } = useI18n();
const localizedTools = computed(() => {
return toolDefinitions.map((tool) => {
const { key, slug } = tool;
return {
...tool,
title: t(`tools.${key}.title`),
description: t(`tools.${key}.description`),
path: `/${joinUrlPaths(locale.value, slug)}`,
};
});
});
return {
tools: localizedTools,
getToolByKey({ key }: { key: unknown }) {
if (typeof key !== 'string') {
throw new TypeError('Invalid key');
}
const tool = localizedTools.value.find(tool => tool.key === key);
if (!tool) {
throw new Error('Tool not found');
}
return tool;
},
};
});

View File

@@ -0,0 +1,16 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
import { type BadgeVariants, badgeVariants } from '.';
const props = defineProps<{
variant?: BadgeVariants['variant'];
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<div :class="cn(badgeVariants({ variant }), props.class)">
<slot />
</div>
</template>

View File

@@ -0,0 +1,25 @@
import { cva, type VariantProps } from 'class-variance-authority';
export { default as Badge } from './Badge.vue';
export const badgeVariants = cva(
'inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',
{
variants: {
variant: {
default:
'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80',
secondary:
'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',
destructive:
'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',
outline: 'text-foreground',
},
},
defaultVariants: {
variant: 'default',
},
},
);
export type BadgeVariants = VariantProps<typeof badgeVariants>;

View File

@@ -0,0 +1,26 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
import { Primitive, type PrimitiveProps } from 'radix-vue';
import { type ButtonVariants, buttonVariants } from '.';
type Props = {
variant?: ButtonVariants['variant'];
size?: ButtonVariants['size'];
class?: HTMLAttributes['class'];
} & PrimitiveProps;
const props = withDefaults(defineProps<Props>(), {
as: 'button',
});
</script>
<template>
<Primitive
:as="as"
:as-child="asChild"
:class="cn(buttonVariants({ variant, size }), props.class)"
>
<slot />
</Primitive>
</template>

View File

@@ -0,0 +1,32 @@
import { cva, type VariantProps } from 'class-variance-authority';
export { default as Button } from './Button.vue';
export const buttonVariants = cva(
'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
{
variants: {
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
ghost: 'hover:bg-accent hover:text-accent-foreground',
link: 'text-primary underline-offset-4 hover:underline',
},
size: {
default: 'h-9 px-4 py-2',
xs: 'h-7 rounded px-2',
sm: 'h-8 rounded-md px-3 text-xs',
lg: 'h-10 rounded-md px-8',
icon: 'h-9 w-9',
},
},
defaultVariants: {
variant: 'default',
size: 'default',
},
},
);
export type ButtonVariants = VariantProps<typeof buttonVariants>;

View File

@@ -0,0 +1,21 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<div
:class="
cn(
'rounded-xl border bg-card text-card-foreground',
props.class,
)
"
>
<slot />
</div>
</template>

View File

@@ -0,0 +1,14 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<div :class="cn('p-6 pt-0', props.class)">
<slot />
</div>
</template>

View File

@@ -0,0 +1,14 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<p :class="cn('text-sm text-muted-foreground', props.class)">
<slot />
</p>
</template>

View File

@@ -0,0 +1,14 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<div :class="cn('flex items-center p-6 pt-0', props.class)">
<slot />
</div>
</template>

View File

@@ -0,0 +1,14 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<div :class="cn('flex flex-col gap-y-1.5 p-6', props.class)">
<slot />
</div>
</template>

View File

@@ -0,0 +1,18 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<h3
:class="
cn('font-semibold leading-none tracking-tight', props.class)
"
>
<slot />
</h3>
</template>

View File

@@ -0,0 +1,6 @@
export { default as Card } from './Card.vue';
export { default as CardContent } from './CardContent.vue';
export { default as CardDescription } from './CardDescription.vue';
export { default as CardFooter } from './CardFooter.vue';
export { default as CardHeader } from './CardHeader.vue';
export { default as CardTitle } from './CardTitle.vue';

View File

@@ -0,0 +1,32 @@
<script setup lang="ts">
import type { CheckboxRootEmits, CheckboxRootProps } from 'radix-vue';
import { cn } from '@/src/modules/shared/style/cn';
import { CheckboxIndicator, CheckboxRoot, useForwardPropsEmits } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<CheckboxRootProps & { class?: HTMLAttributes['class'] }>();
const emits = defineEmits<CheckboxRootEmits>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<CheckboxRoot
v-bind="forwarded"
:class="
cn('peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',
props.class)"
>
<CheckboxIndicator class="flex h-full w-full items-center justify-center text-current">
<slot>
<Icon name="i-tabler-check" class="h-4 w-4" />
</slot>
</CheckboxIndicator>
</CheckboxRoot>
</template>

View File

@@ -0,0 +1 @@
export { default as Checkbox } from './Checkbox.vue';

View File

@@ -0,0 +1,30 @@
<script setup lang="ts">
import type { ComboboxRootEmits, ComboboxRootProps } from 'radix-vue';
import { cn } from '@/src/modules/shared/style/cn';
import { ComboboxRoot, useForwardPropsEmits } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = withDefaults(defineProps<ComboboxRootProps & { class?: HTMLAttributes['class'] }>(), {
open: true,
modelValue: '',
});
const emits = defineEmits<ComboboxRootEmits>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<ComboboxRoot
v-bind="forwarded"
:class="cn('flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground', props.class)"
>
<slot />
</ComboboxRoot>
</template>

View File

@@ -0,0 +1,21 @@
<script setup lang="ts">
import type { DialogRootEmits, DialogRootProps } from 'radix-vue';
import { Dialog, DialogContent } from '@/src/modules/ui/components/dialog';
import { useForwardPropsEmits } from 'radix-vue';
import Command from './Command.vue';
const props = defineProps<DialogRootProps>();
const emits = defineEmits<DialogRootEmits>();
const forwarded = useForwardPropsEmits(props, emits);
</script>
<template>
<Dialog v-bind="forwarded">
<DialogContent class="overflow-hidden p-0 shadow-lg">
<Command class="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
<slot />
</Command>
</DialogContent>
</Dialog>
</template>

View File

@@ -0,0 +1,20 @@
<script setup lang="ts">
import type { ComboboxEmptyProps } from 'radix-vue';
import { cn } from '@/src/modules/shared/style/cn';
import { ComboboxEmpty } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<ComboboxEmptyProps & { class?: HTMLAttributes['class'] }>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
</script>
<template>
<ComboboxEmpty v-bind="delegatedProps" :class="cn('py-6 text-center text-sm', props.class)">
<slot />
</ComboboxEmpty>
</template>

View File

@@ -0,0 +1,29 @@
<script setup lang="ts">
import type { ComboboxGroupProps } from 'radix-vue';
import { cn } from '@/src/modules/shared/style/cn';
import { ComboboxGroup, ComboboxLabel } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<ComboboxGroupProps & {
class?: HTMLAttributes['class'];
heading?: string;
}>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
</script>
<template>
<ComboboxGroup
v-bind="delegatedProps"
:class="cn('overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground', props.class)"
>
<ComboboxLabel v-if="heading" class="px-2 py-1.5 text-xs font-medium text-muted-foreground">
{{ heading }}
</ComboboxLabel>
<slot />
</ComboboxGroup>
</template>

View File

@@ -0,0 +1,32 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import { ComboboxInput, type ComboboxInputProps, useForwardProps } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
defineOptions({
inheritAttrs: false,
});
const props = defineProps<ComboboxInputProps & {
class?: HTMLAttributes['class'];
}>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwardedProps = useForwardProps(delegatedProps);
</script>
<template>
<div class="flex items-center border-b px-3" cmdk-input-wrapper>
<Icon name="i-tabler-search" class="mr-2 h-4 w-4 shrink-0 opacity-50" />
<ComboboxInput
v-bind="{ ...forwardedProps, ...$attrs }"
auto-focus
:class="cn('flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50', props.class)"
/>
</div>
</template>

View File

@@ -0,0 +1,26 @@
<script setup lang="ts">
import type { ComboboxItemEmits, ComboboxItemProps } from 'radix-vue';
import { cn } from '@/src/modules/shared/style/cn';
import { ComboboxItem, useForwardPropsEmits } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<ComboboxItemProps & { class?: HTMLAttributes['class'] }>();
const emits = defineEmits<ComboboxItemEmits>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<ComboboxItem
v-bind="forwarded"
:class="cn('relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', props.class)"
>
<slot />
</ComboboxItem>
</template>

View File

@@ -0,0 +1,27 @@
<script setup lang="ts">
import type { ComboboxContentEmits, ComboboxContentProps } from 'radix-vue';
import { cn } from '@/src/modules/shared/style/cn';
import { ComboboxContent, useForwardPropsEmits } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = withDefaults(defineProps<ComboboxContentProps & { class?: HTMLAttributes['class'] }>(), {
dismissable: false,
});
const emits = defineEmits<ComboboxContentEmits>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<ComboboxContent v-bind="forwarded" :class="cn('max-h-[300px] overflow-y-auto overflow-x-hidden', props.class)">
<div role="presentation">
<slot />
</div>
</ComboboxContent>
</template>

View File

@@ -0,0 +1,23 @@
<script setup lang="ts">
import type { ComboboxSeparatorProps } from 'radix-vue';
import { cn } from '@/src/modules/shared/style/cn';
import { ComboboxSeparator } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<ComboboxSeparatorProps & { class?: HTMLAttributes['class'] }>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
</script>
<template>
<ComboboxSeparator
v-bind="delegatedProps"
:class="cn('-mx-1 h-px bg-border', props.class)"
>
<slot />
</ComboboxSeparator>
</template>

View File

@@ -0,0 +1,14 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<span :class="cn('ml-auto text-xs tracking-widest text-muted-foreground', props.class)">
<slot />
</span>
</template>

View File

@@ -0,0 +1,9 @@
export { default as Command } from './Command.vue';
export { default as CommandDialog } from './CommandDialog.vue';
export { default as CommandEmpty } from './CommandEmpty.vue';
export { default as CommandGroup } from './CommandGroup.vue';
export { default as CommandInput } from './CommandInput.vue';
export { default as CommandItem } from './CommandItem.vue';
export { default as CommandList } from './CommandList.vue';
export { default as CommandSeparator } from './CommandSeparator.vue';
export { default as CommandShortcut } from './CommandShortcut.vue';

View File

@@ -0,0 +1,14 @@
<script setup lang="ts">
import { DialogRoot, type DialogRootEmits, type DialogRootProps, useForwardPropsEmits } from 'radix-vue';
const props = defineProps<DialogRootProps>();
const emits = defineEmits<DialogRootEmits>();
const forwarded = useForwardPropsEmits(props, emits);
</script>
<template>
<DialogRoot v-bind="forwarded">
<slot />
</DialogRoot>
</template>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
import { DialogClose, type DialogCloseProps } from 'radix-vue';
const props = defineProps<DialogCloseProps>();
</script>
<template>
<DialogClose v-bind="props">
<slot />
</DialogClose>
</template>

View File

@@ -0,0 +1,49 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import {
DialogClose,
DialogContent,
type DialogContentEmits,
type DialogContentProps,
DialogOverlay,
DialogPortal,
useForwardPropsEmits,
} from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<DialogContentProps & { class?: HTMLAttributes['class'] }>();
const emits = defineEmits<DialogContentEmits>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<DialogPortal>
<DialogOverlay
class="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"
/>
<DialogContent
v-bind="forwarded"
:class="
cn(
'fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 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',
props.class,
)"
>
<slot />
<DialogClose
class="absolute right-3 top-2 p-1 leading-none rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"
>
<Icon name="i-tabler-x" class="size-4" />
<span class="sr-only">Close</span>
</DialogClose>
</DialogContent>
</DialogPortal>
</template>

View File

@@ -0,0 +1,24 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import { DialogDescription, type DialogDescriptionProps, useForwardProps } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<DialogDescriptionProps & { class?: HTMLAttributes['class'] }>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwardedProps = useForwardProps(delegatedProps);
</script>
<template>
<DialogDescription
v-bind="forwardedProps"
:class="cn('text-sm text-muted-foreground', props.class)"
>
<slot />
</DialogDescription>
</template>

View File

@@ -0,0 +1,19 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{ class?: HTMLAttributes['class'] }>();
</script>
<template>
<div
:class="
cn(
'flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2',
props.class,
)
"
>
<slot />
</div>
</template>

View File

@@ -0,0 +1,16 @@
<script setup lang="ts">
import type { HTMLAttributes } from 'vue';
import { cn } from '@/src/modules/shared/style/cn';
const props = defineProps<{
class?: HTMLAttributes['class'];
}>();
</script>
<template>
<div
:class="cn('flex flex-col gap-y-1.5 text-center sm:text-left', props.class)"
>
<slot />
</div>
</template>

View File

@@ -0,0 +1,58 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import {
DialogClose,
DialogContent,
type DialogContentEmits,
type DialogContentProps,
DialogOverlay,
DialogPortal,
useForwardPropsEmits,
} from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<DialogContentProps & { class?: HTMLAttributes['class'] }>();
const emits = defineEmits<DialogContentEmits>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<DialogPortal>
<DialogOverlay
class="fixed inset-0 z-50 grid place-items-center overflow-y-auto 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"
>
<DialogContent
:class="
cn(
'relative z-50 grid w-full max-w-lg my-8 gap-4 border border-border bg-background p-6 shadow-lg duration-200 sm:rounded-lg md:w-full',
props.class,
)
"
v-bind="forwarded"
@pointer-down-outside="(event) => {
const originalEvent = event.detail.originalEvent;
const target = originalEvent.target as HTMLElement;
if (originalEvent.offsetX > target.clientWidth || originalEvent.offsetY > target.clientHeight) {
event.preventDefault();
}
}"
>
<slot />
<DialogClose
class="absolute top-4 right-4 p-0.5 transition-colors rounded-md hover:bg-secondary"
>
<Icon name="i-tabler-x" class="w-4 h-4" />
<span class="sr-only">Close</span>
</DialogClose>
</DialogContent>
</DialogOverlay>
</DialogPortal>
</template>

View File

@@ -0,0 +1,29 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import { DialogTitle, type DialogTitleProps, useForwardProps } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<DialogTitleProps & { class?: HTMLAttributes['class'] }>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwardedProps = useForwardProps(delegatedProps);
</script>
<template>
<DialogTitle
v-bind="forwardedProps"
:class="
cn(
'text-lg font-semibold leading-none tracking-tight',
props.class,
)
"
>
<slot />
</DialogTitle>
</template>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
import { DialogTrigger, type DialogTriggerProps } from 'radix-vue';
const props = defineProps<DialogTriggerProps>();
</script>
<template>
<DialogTrigger v-bind="props">
<slot />
</DialogTrigger>
</template>

View File

@@ -0,0 +1,9 @@
export { default as Dialog } from './Dialog.vue';
export { default as DialogClose } from './DialogClose.vue';
export { default as DialogContent } from './DialogContent.vue';
export { default as DialogDescription } from './DialogDescription.vue';
export { default as DialogFooter } from './DialogFooter.vue';
export { default as DialogHeader } from './DialogHeader.vue';
export { default as DialogScrollContent } from './DialogScrollContent.vue';
export { default as DialogTitle } from './DialogTitle.vue';
export { default as DialogTrigger } from './DialogTrigger.vue';

View File

@@ -0,0 +1,14 @@
<script setup lang="ts">
import { DropdownMenuRoot, type DropdownMenuRootEmits, type DropdownMenuRootProps, useForwardPropsEmits } from 'radix-vue';
const props = defineProps<DropdownMenuRootProps>();
const emits = defineEmits<DropdownMenuRootEmits>();
const forwarded = useForwardPropsEmits(props, emits);
</script>
<template>
<DropdownMenuRoot v-bind="forwarded">
<slot />
</DropdownMenuRoot>
</template>

View File

@@ -0,0 +1,39 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import {
DropdownMenuCheckboxItem,
type DropdownMenuCheckboxItemEmits,
type DropdownMenuCheckboxItemProps,
DropdownMenuItemIndicator,
useForwardPropsEmits,
} from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<DropdownMenuCheckboxItemProps & { class?: HTMLAttributes['class'] }>();
const emits = defineEmits<DropdownMenuCheckboxItemEmits>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<DropdownMenuCheckboxItem
v-bind="forwarded"
:class=" cn(
'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
props.class,
)"
>
<span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<DropdownMenuItemIndicator>
<Icon name="i-tabler-check" class="w-4 h-4" />
</DropdownMenuItemIndicator>
</span>
<slot />
</DropdownMenuCheckboxItem>
</template>

View File

@@ -0,0 +1,38 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import {
DropdownMenuContent,
type DropdownMenuContentEmits,
type DropdownMenuContentProps,
DropdownMenuPortal,
useForwardPropsEmits,
} from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = withDefaults(
defineProps<DropdownMenuContentProps & { class?: HTMLAttributes['class'] }>(),
{
sideOffset: 4,
},
);
const emits = defineEmits<DropdownMenuContentEmits>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwarded = useForwardPropsEmits(delegatedProps, emits);
</script>
<template>
<DropdownMenuPortal>
<DropdownMenuContent
v-bind="forwarded"
:class="cn('z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md 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-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', props.class)"
>
<slot />
</DropdownMenuContent>
</DropdownMenuPortal>
</template>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
import { DropdownMenuGroup, type DropdownMenuGroupProps } from 'radix-vue';
const props = defineProps<DropdownMenuGroupProps>();
</script>
<template>
<DropdownMenuGroup v-bind="props">
<slot />
</DropdownMenuGroup>
</template>

View File

@@ -0,0 +1,28 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import { DropdownMenuItem, type DropdownMenuItemProps, useForwardProps } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<DropdownMenuItemProps & { class?: HTMLAttributes['class']; inset?: boolean }>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwardedProps = useForwardProps(delegatedProps);
</script>
<template>
<DropdownMenuItem
v-bind="forwardedProps"
:class="cn(
'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
inset && 'pl-8',
props.class,
)"
>
<slot />
</DropdownMenuItem>
</template>

View File

@@ -0,0 +1,24 @@
<script setup lang="ts">
import { cn } from '@/src/modules/shared/style/cn';
import { DropdownMenuLabel, type DropdownMenuLabelProps, useForwardProps } from 'radix-vue';
import { computed, type HTMLAttributes } from 'vue';
const props = defineProps<DropdownMenuLabelProps & { class?: HTMLAttributes['class']; inset?: boolean }>();
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props;
return delegated;
});
const forwardedProps = useForwardProps(delegatedProps);
</script>
<template>
<DropdownMenuLabel
v-bind="forwardedProps"
:class="cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', props.class)"
>
<slot />
</DropdownMenuLabel>
</template>

Some files were not shown because too many files have changed in this diff Show More