diff --git a/biome.json b/biome.json index d3a0a08..bce0c15 100644 --- a/biome.json +++ b/biome.json @@ -8,7 +8,8 @@ "rules": { "all": true, "suspicious": { - "noConsole": "off" + "noConsole": "off", + "noExplicitAny": "off" }, "performance": { "noBarrelFile": "off" diff --git a/bun.lock b/bun.lock index 78c0384..f064092 100644 --- a/bun.lock +++ b/bun.lock @@ -8,6 +8,7 @@ "@nuxtjs/color-mode": "3.5.2", "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.1.4", + "@tanstack/vue-table": "^8.21.3", "@tiptap/extension-highlight": "^2.11.7", "@tiptap/extension-image": "^2.11.7", "@tiptap/extension-link": "^2.11.7", @@ -47,6 +48,7 @@ "tw-animate-css": "^1.2.8", "vaul-vue": "^0.4.1", "vee-validate": "^4.15.0", + "virtua": "^0.40.4", "vue": "^3.5.13", "vue-router": "^4.5.1", "vue-sonner": "^1.3.2", @@ -620,8 +622,12 @@ "@tailwindcss/vite": ["@tailwindcss/vite@4.1.4", "", { "dependencies": { "@tailwindcss/node": "4.1.4", "@tailwindcss/oxide": "4.1.4", "tailwindcss": "4.1.4" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A=="], + "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], + "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.5", "", {}, "sha512-gMLNylxhJdUlfRR1G3U9rtuwUh2IjdrrniJIDcekVJN3/3i+bluvdMi3+eodnxzJq5nKnxnigo9h0lIpaqV6HQ=="], + "@tanstack/vue-table": ["@tanstack/vue-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "vue": ">=3.2" } }, "sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw=="], + "@tanstack/vue-virtual": ["@tanstack/vue-virtual@3.13.5", "", { "dependencies": { "@tanstack/virtual-core": "3.13.5" }, "peerDependencies": { "vue": "^2.7.0 || ^3.0.0" } }, "sha512-1hhUA6CUjmKc5JDyKLcYOV6mI631FaKKxXh77Ja4UtIy6EOofYaLPk8vVgvK6vLMUSfHR2vI3ZpPY9ibyX60SA=="], "@tiptap/core": ["@tiptap/core@2.11.7", "", { "peerDependencies": { "@tiptap/pm": "^2.7.0" } }, "sha512-zN+NFFxLsxNEL8Qioc+DL6b8+Tt2bmRbXH22Gk6F6nD30x83eaUSFlSv3wqvgyCq3I1i1NO394So+Agmayx6rQ=="], @@ -2064,6 +2070,8 @@ "videojs-vtt.js": ["videojs-vtt.js@0.15.5", "", { "dependencies": { "global": "^4.3.1" } }, "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ=="], + "virtua": ["virtua@0.40.4", "", { "peerDependencies": { "react": ">=16.14.0", "react-dom": ">=16.14.0", "solid-js": ">=1.0", "svelte": ">=5.0", "vue": ">=3.2" }, "optionalPeers": ["react", "react-dom", "solid-js", "svelte", "vue"] }, "sha512-eV55eOm2b5Lzc9upivqIcAFPgfBrfcVrppW9T4vhTH+QAbaxfw5ypq25apkG83T5FuiFEoQYnefix1fQyx/GXQ=="], + "vite": ["vite@6.2.6", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw=="], "vite-dev-rpc": ["vite-dev-rpc@1.0.7", "", { "dependencies": { "birpc": "^2.0.19", "vite-hot-client": "^2.0.4" }, "peerDependencies": { "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1" } }, "sha512-FxSTEofDbUi2XXujCA+hdzCDkXFG1PXktMjSk1efq9Qb5lOYaaM9zNSvKvPPF7645Bak79kSp1PTooMW2wktcA=="], diff --git a/components/preferences2/category.vue b/components/preferences2/category.vue new file mode 100644 index 0000000..264483e --- /dev/null +++ b/components/preferences2/category.vue @@ -0,0 +1,45 @@ + + + + {{ name }} + + + + + + + + + + + + + + + + diff --git a/components/preferences2/dialog.vue b/components/preferences2/dialog.vue new file mode 100644 index 0000000..72bd28e --- /dev/null +++ b/components/preferences2/dialog.vue @@ -0,0 +1,148 @@ + + + + + + + + + + Preferences + + + Make changes to your preferences here. + + + + + {{ page }} + + + + + + + + + + + + + + + + + + {{ pkg.description }} + + + + + + + Developers + + + + + + + + + Dependencies + + + + {{ dep }}@{{ version }} + + + + + + + + + + diff --git a/components/preferences2/emojis/batch-dropdown.vue b/components/preferences2/emojis/batch-dropdown.vue new file mode 100644 index 0000000..8217ac6 --- /dev/null +++ b/components/preferences2/emojis/batch-dropdown.vue @@ -0,0 +1,72 @@ + + + + + + + + + {{ m.tense_quick_cod_favor() }} + + + + + + diff --git a/components/preferences2/emojis/dropdown.vue b/components/preferences2/emojis/dropdown.vue new file mode 100644 index 0000000..ec69beb --- /dev/null +++ b/components/preferences2/emojis/dropdown.vue @@ -0,0 +1,107 @@ + + + + + + + + + + + {{ m.cuddly_such_swallow_hush() }} + + + + + {{ m.tense_quick_cod_favor() }} + + + + + + diff --git a/components/preferences2/emojis/index.vue b/components/preferences2/emojis/index.vue new file mode 100644 index 0000000..e2a036c --- /dev/null +++ b/components/preferences2/emojis/index.vue @@ -0,0 +1,51 @@ + + + + + + + diff --git a/components/preferences2/emojis/table.vue b/components/preferences2/emojis/table.vue new file mode 100644 index 0000000..132f204 --- /dev/null +++ b/components/preferences2/emojis/table.vue @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + Columns + + + + + { + column.toggleVisibility(!!value) + }"> + {{ column.id }} + + + + + + + + + + + + + + + + + + + + + + + + {{ JSON.stringify(row.original) }} + + + + + + + + No results. + + + + + + + + + {{ table.getFilteredSelectedRowModel().rows.length }} of + {{ table.getFilteredRowModel().rows.length }} row(s) selected. + + + + Previous + + + Next + + + + + diff --git a/components/preferences2/emojis/uploader.vue b/components/preferences2/emojis/uploader.vue new file mode 100644 index 0000000..f2eb68d --- /dev/null +++ b/components/preferences2/emojis/uploader.vue @@ -0,0 +1,303 @@ + + + + + + + + {{ m.whole_icy_puffin_smile() }} + + + {{ m.frail_great_marten_pet() }} + + + + + + + + + + + + + + + + + + + + + {{ m.active_direct_bear_compose() }} + + + { + handleChange(e); + + if (!values.shortcode) { + setFieldValue('shortcode', e.target.files[0].name.replace(/\.[^/.]+$/, '')); + } + }" + @blur="handleBlur" + :disabled="isSubmitting" + /> + + + {{ m.lime_late_millipede_urge() }} + + + + + + + + + {{ m.happy_mild_fox_gleam() }} + + + + + + {{ m.glad_day_kestrel_amaze() }} + + + + + + + + + {{ m.short_cute_jackdaw_comfort() }} + + + + + + + + + + + + {{ m.watery_left_shrimp_bless() }} + + + + + + {{ m.weird_fun_jurgen_arise() }} + + + + + + + + + + {{ m.pink_sharp_carp_work() }} + + + {{ m.dark_pretty_hyena_link() }} + + + + + + + + + + + + + {{ m.soft_bold_ant_attend() }} + + + + {{ m.flat_safe_haddock_gaze() }} + + + + + + + + diff --git a/components/preferences2/index.vue b/components/preferences2/index.vue new file mode 100644 index 0000000..82b83d4 --- /dev/null +++ b/components/preferences2/index.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/components/preferences2/page.vue b/components/preferences2/page.vue new file mode 100644 index 0000000..048299c --- /dev/null +++ b/components/preferences2/page.vue @@ -0,0 +1,15 @@ + + + + {{ title }} + + + + + + + diff --git a/components/preferences2/preferences.ts b/components/preferences2/preferences.ts new file mode 100644 index 0000000..22bea5c --- /dev/null +++ b/components/preferences2/preferences.ts @@ -0,0 +1,150 @@ +import * as m from "~/paraglide/messages.js"; +import { + BooleanPreference, + CodePreference, + MultiSelectPreference, + NumberPreference, + SelectPreference, + UrlPreference, +} from "./types"; + +export const preferences = { + render_mfm: new BooleanPreference({ + name: m.quaint_clear_boar_attend(), + description: m.aloof_helpful_larva_spur(), + defaultValue: true, + category: "Behaviour/Notes", + }), + default_visibility: new SelectPreference< + "public" | "unlisted" | "private" | "direct" + >({ + name: m.loud_tense_kitten_exhale(), + description: m.vivid_last_crocodile_offer(), + defaultValue: "public", + options: { + public: m.lost_trick_dog_grace(), + unlisted: m.funny_slow_jannes_walk(), + private: m.grassy_empty_raven_startle(), + direct: m.pretty_bold_baboon_wave(), + }, + category: "Behaviour/Posting", + }), + language: new SelectPreference<"en" | "fr">({ + name: m.pretty_born_jackal_dial(), + description: m.tired_happy_lobster_pet(), + defaultValue: "en", + options: { + en: m.keen_aware_goldfish_thrive( + {}, + { + locale: "en", + }, + ), + fr: m.vivid_mellow_sawfish_approve( + {}, + { + locale: "fr", + }, + ), + }, + category: "Behaviour/Globals", + }), + border_radius: new NumberPreference({ + name: "Border radius", + description: + "Global border radius that all elements inheritt from (rem units).", + defaultValue: 0.625, + step: 0.025, + min: 0, + max: 2, + category: "Appearance/Globals", + }), + custom_css: new CodePreference({ + name: m.smart_awake_dachshund_view(), + description: m.loved_topical_rat_coax(), + defaultValue: "", + language: "css", + category: "Appearance/Globals", + }), + color_theme: new SelectPreference<"dark" | "light" | "system">({ + name: m.hour_elegant_mink_grip(), + defaultValue: "system", + options: { + dark: m.wise_neat_ox_buzz(), + light: m.each_strong_snail_aid(), + system: m.helpful_raw_seal_nurture(), + }, + category: "Appearance/Globals", + }), + custom_emojis: new BooleanPreference({ + name: m.loud_raw_sheep_imagine(), + description: m.inclusive_pink_tuna_enjoy(), + defaultValue: true, + category: "Behaviour/Notes", + }), + show_content_warning: new BooleanPreference({ + name: m.fair_swift_elephant_hunt(), + description: m.gray_minor_bee_endure(), + defaultValue: true, + category: "Behaviour/Notes", + }), + popup_avatar_hover: new BooleanPreference({ + name: m.north_nimble_turkey_transform(), + description: m.bold_moving_fly_savor(), + defaultValue: false, + category: "Behaviour/Timelines", + }), + infinite_scroll: new BooleanPreference({ + name: m.sleek_this_earthworm_hug(), + description: m.plane_dark_salmon_pout(), + defaultValue: true, + category: "Behaviour/Timelines", + }), + confirm_actions: new MultiSelectPreference< + "delete" | "follow" | "like" | "reblog" + >({ + name: "Confirm actions", + description: "Confirm actions before performing them.", + defaultValue: ["delete"], + options: { + delete: m.trite_salty_eel_race(), + follow: m.jolly_empty_bullock_mend(), + like: m.patchy_basic_alligator_inspire(), + reblog: m.honest_great_rooster_taste(), + }, + category: "Behaviour/Notes", + }), + ctrl_enter_send: new BooleanPreference({ + name: m.equal_blue_zebra_launch(), + description: m.heavy_pink_meerkat_affirm(), + defaultValue: true, + category: "Behaviour/Posting", + }), + emoji_theme: new SelectPreference< + "native" | "twemoji" | "noto" | "fluent" | "fluent-flat" + >({ + name: m.weak_bad_martin_glow(), + description: m.warm_round_dove_skip(), + defaultValue: "native", + options: { + native: m.slimy_sound_termite_hug(), + twemoji: m.new_brave_maggot_relish(), + noto: m.shy_clear_spider_cook(), + fluent: m.many_tasty_midge_zoom(), + "fluent-flat": m.less_early_lionfish_honor(), + }, + category: "Appearance/Globals", + }), + background_url: new UrlPreference({ + name: m.stock_large_marten_comfort(), + description: m.mean_weird_donkey_stab(), + defaultValue: "", + category: "Appearance/Globals", + }), + display_notifications_sidebar: new BooleanPreference({ + name: m.tired_jumpy_rook_slurp(), + description: m.wide_new_robin_empower(), + defaultValue: true, + category: "Appearance/Globals", + }), +} as const; diff --git a/components/preferences2/stats.vue b/components/preferences2/stats.vue new file mode 100644 index 0000000..fe18dca --- /dev/null +++ b/components/preferences2/stats.vue @@ -0,0 +1,38 @@ + + + + + + {{ key }} + + {{ value }} + + + + + + + + + diff --git a/components/preferences2/types.ts b/components/preferences2/types.ts new file mode 100644 index 0000000..0a29873 --- /dev/null +++ b/components/preferences2/types.ts @@ -0,0 +1,71 @@ +export interface PreferenceOptions { + name: string; + description?: string; + category?: string; + defaultValue: ValueType; +} + +export abstract class Preference { + public abstract options: PreferenceOptions; +} + +export class TextPreference extends Preference { + constructor(public options: PreferenceOptions) { + super(); + } +} + +export class NumberPreference extends Preference { + constructor( + public options: PreferenceOptions & { + integer?: boolean; + step?: number; + min?: number; + max?: number; + }, + ) { + super(); + } +} + +export class BooleanPreference extends Preference { + constructor(public options: PreferenceOptions) { + super(); + } +} + +export class SelectPreference extends Preference { + constructor( + public options: PreferenceOptions & { + options: Record; + }, + ) { + super(); + } +} + +export class CodePreference extends Preference { + constructor( + public options: PreferenceOptions & { + language?: "css"; + }, + ) { + super(); + } +} + +export class MultiSelectPreference extends Preference { + constructor( + public options: PreferenceOptions & { + options: Record; + }, + ) { + super(); + } +} + +export class UrlPreference extends Preference { + constructor(public options: PreferenceOptions) { + super(); + } +} diff --git a/components/preferences2/types/base.vue b/components/preferences2/types/base.vue new file mode 100644 index 0000000..4bcdc47 --- /dev/null +++ b/components/preferences2/types/base.vue @@ -0,0 +1,37 @@ + + + + {{ pref.options.name }} + {{ + pref.options.description }} + + + + + + + + + diff --git a/components/preferences2/types/boolean.vue b/components/preferences2/types/boolean.vue new file mode 100644 index 0000000..582c657 --- /dev/null +++ b/components/preferences2/types/boolean.vue @@ -0,0 +1,15 @@ + + + + + + + diff --git a/components/preferences2/types/code.vue b/components/preferences2/types/code.vue new file mode 100644 index 0000000..b8e89bb --- /dev/null +++ b/components/preferences2/types/code.vue @@ -0,0 +1,34 @@ + + + + + + + Open code + + + + + + + + + + + + + diff --git a/components/preferences2/types/multiselect.vue b/components/preferences2/types/multiselect.vue new file mode 100644 index 0000000..9dbde53 --- /dev/null +++ b/components/preferences2/types/multiselect.vue @@ -0,0 +1,39 @@ + + + + + + Pick + + + + { + if (checked) { + setValue([...value, option]); + } else { + setValue(value.filter((v: any) => v !== option)); + } + }"> + {{ title }} + + + + + + + diff --git a/components/preferences2/types/number.vue b/components/preferences2/types/number.vue new file mode 100644 index 0000000..9c66b8d --- /dev/null +++ b/components/preferences2/types/number.vue @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/components/preferences2/types/select.vue b/components/preferences2/types/select.vue new file mode 100644 index 0000000..59b55cf --- /dev/null +++ b/components/preferences2/types/select.vue @@ -0,0 +1,33 @@ + + + + + + + + + + {{ title }} + + + + + + + + diff --git a/components/preferences2/types/text.vue b/components/preferences2/types/text.vue new file mode 100644 index 0000000..4660901 --- /dev/null +++ b/components/preferences2/types/text.vue @@ -0,0 +1,15 @@ + + + + + + + diff --git a/components/preferences2/types/url.vue b/components/preferences2/types/url.vue new file mode 100644 index 0000000..c8491a3 --- /dev/null +++ b/components/preferences2/types/url.vue @@ -0,0 +1,34 @@ + + + + + + + Edit URL + + + + + + + + + + + + + diff --git a/components/ui/checkbox/Checkbox.vue b/components/ui/checkbox/Checkbox.vue index 9d1b2dc..7f69669 100644 --- a/components/ui/checkbox/Checkbox.vue +++ b/components/ui/checkbox/Checkbox.vue @@ -35,5 +35,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits); + + diff --git a/components/ui/dialog/DialogContent.vue b/components/ui/dialog/DialogContent.vue index 4571b1f..6120bdf 100644 --- a/components/ui/dialog/DialogContent.vue +++ b/components/ui/dialog/DialogContent.vue @@ -37,7 +37,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits); v-bind="forwarded" :class=" cn( - 'bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg', + 'bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] max-h-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg', props.class, )" > diff --git a/components/ui/number-field/NumberField.vue b/components/ui/number-field/NumberField.vue new file mode 100644 index 0000000..b6717c5 --- /dev/null +++ b/components/ui/number-field/NumberField.vue @@ -0,0 +1,25 @@ + + + + + + + diff --git a/components/ui/number-field/NumberFieldContent.vue b/components/ui/number-field/NumberFieldContent.vue new file mode 100644 index 0000000..bc5f9a4 --- /dev/null +++ b/components/ui/number-field/NumberFieldContent.vue @@ -0,0 +1,14 @@ + + + + + + + diff --git a/components/ui/number-field/NumberFieldDecrement.vue b/components/ui/number-field/NumberFieldDecrement.vue new file mode 100644 index 0000000..c0c2282 --- /dev/null +++ b/components/ui/number-field/NumberFieldDecrement.vue @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/components/ui/number-field/NumberFieldIncrement.vue b/components/ui/number-field/NumberFieldIncrement.vue new file mode 100644 index 0000000..710fe71 --- /dev/null +++ b/components/ui/number-field/NumberFieldIncrement.vue @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/components/ui/number-field/NumberFieldInput.vue b/components/ui/number-field/NumberFieldInput.vue new file mode 100644 index 0000000..045994f --- /dev/null +++ b/components/ui/number-field/NumberFieldInput.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/components/ui/number-field/index.ts b/components/ui/number-field/index.ts new file mode 100644 index 0000000..2d61fbc --- /dev/null +++ b/components/ui/number-field/index.ts @@ -0,0 +1,5 @@ +export { default as NumberField } from "./NumberField.vue"; +export { default as NumberFieldContent } from "./NumberFieldContent.vue"; +export { default as NumberFieldDecrement } from "./NumberFieldDecrement.vue"; +export { default as NumberFieldIncrement } from "./NumberFieldIncrement.vue"; +export { default as NumberFieldInput } from "./NumberFieldInput.vue"; diff --git a/components/ui/switch/Switch.vue b/components/ui/switch/Switch.vue index 8a18033..e42d7e7 100644 --- a/components/ui/switch/Switch.vue +++ b/components/ui/switch/Switch.vue @@ -29,7 +29,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits); data-slot="switch" v-bind="forwarded" :class="cn( - 'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50', + 'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] hover:cursor-pointer disabled:cursor-not-allowed disabled:opacity-50', props.class, )" > diff --git a/components/ui/table/Table.vue b/components/ui/table/Table.vue new file mode 100644 index 0000000..418423d --- /dev/null +++ b/components/ui/table/Table.vue @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/components/ui/table/TableBody.vue b/components/ui/table/TableBody.vue new file mode 100644 index 0000000..41d6b9c --- /dev/null +++ b/components/ui/table/TableBody.vue @@ -0,0 +1,17 @@ + + + + + + + diff --git a/components/ui/table/TableCaption.vue b/components/ui/table/TableCaption.vue new file mode 100644 index 0000000..064dfb5 --- /dev/null +++ b/components/ui/table/TableCaption.vue @@ -0,0 +1,17 @@ + + + + + + + diff --git a/components/ui/table/TableCell.vue b/components/ui/table/TableCell.vue new file mode 100644 index 0000000..6898cda --- /dev/null +++ b/components/ui/table/TableCell.vue @@ -0,0 +1,22 @@ + + + + + + + diff --git a/components/ui/table/TableEmpty.vue b/components/ui/table/TableEmpty.vue new file mode 100644 index 0000000..a822f44 --- /dev/null +++ b/components/ui/table/TableEmpty.vue @@ -0,0 +1,40 @@ + + + + + + + + + + + diff --git a/components/ui/table/TableFooter.vue b/components/ui/table/TableFooter.vue new file mode 100644 index 0000000..d5ee81d --- /dev/null +++ b/components/ui/table/TableFooter.vue @@ -0,0 +1,17 @@ + + + + + + + diff --git a/components/ui/table/TableHead.vue b/components/ui/table/TableHead.vue new file mode 100644 index 0000000..c791e60 --- /dev/null +++ b/components/ui/table/TableHead.vue @@ -0,0 +1,17 @@ + + + + + + + diff --git a/components/ui/table/TableHeader.vue b/components/ui/table/TableHeader.vue new file mode 100644 index 0000000..400daa1 --- /dev/null +++ b/components/ui/table/TableHeader.vue @@ -0,0 +1,17 @@ + + + + + + + diff --git a/components/ui/table/TableRow.vue b/components/ui/table/TableRow.vue new file mode 100644 index 0000000..221d70a --- /dev/null +++ b/components/ui/table/TableRow.vue @@ -0,0 +1,17 @@ + + + + + + + diff --git a/components/ui/table/index.ts b/components/ui/table/index.ts new file mode 100644 index 0000000..0afab4c --- /dev/null +++ b/components/ui/table/index.ts @@ -0,0 +1,9 @@ +export { default as Table } from "./Table.vue"; +export { default as TableBody } from "./TableBody.vue"; +export { default as TableCaption } from "./TableCaption.vue"; +export { default as TableCell } from "./TableCell.vue"; +export { default as TableEmpty } from "./TableEmpty.vue"; +export { default as TableFooter } from "./TableFooter.vue"; +export { default as TableHead } from "./TableHead.vue"; +export { default as TableHeader } from "./TableHeader.vue"; +export { default as TableRow } from "./TableRow.vue"; diff --git a/components/ui/table/utils.ts b/components/ui/table/utils.ts new file mode 100644 index 0000000..045e0dd --- /dev/null +++ b/components/ui/table/utils.ts @@ -0,0 +1,12 @@ +import type { Updater } from "@tanstack/vue-table"; +import type { Ref } from "vue"; + +export function valueUpdater>( + updaterOrValue: T, + ref: Ref, +) { + ref.value = + typeof updaterOrValue === "function" + ? updaterOrValue(ref.value) + : updaterOrValue; +} diff --git a/components/ui/tabs/TabsList.vue b/components/ui/tabs/TabsList.vue index 7021820..1ebe4b7 100644 --- a/components/ui/tabs/TabsList.vue +++ b/components/ui/tabs/TabsList.vue @@ -19,7 +19,7 @@ const delegatedProps = computed(() => { data-slot="tabs-list" v-bind="delegatedProps" :class="cn( - 'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]', + 'bg-muted text-muted-foreground inline-flex w-fit items-center justify-center rounded-lg p-1 overflow-x-auto', props.class, )" > diff --git a/components/ui/tabs/TabsTrigger.vue b/components/ui/tabs/TabsTrigger.vue index 356b40b..f3bb35a 100644 --- a/components/ui/tabs/TabsTrigger.vue +++ b/components/ui/tabs/TabsTrigger.vue @@ -21,7 +21,7 @@ const forwardedProps = useForwardProps(delegatedProps); data-slot="tabs-trigger" v-bind="forwardedProps" :class="cn( - `data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`, + `data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`, props.class, )" > diff --git a/layouts/app.vue b/layouts/app.vue index 405cad3..cc4e153 100644 --- a/layouts/app.vue +++ b/layouts/app.vue @@ -8,6 +8,7 @@ + @@ -15,6 +16,7 @@ import ComposerDialog from "~/components/composer/dialog.vue"; import AuthRequired from "~/components/errors/AuthRequired.vue"; import MobileNavbar from "~/components/navigation/mobile-navbar.vue"; +import Preferences from "~/components/preferences2/index.vue"; import AppSidebar from "~/components/sidebars/sidebar.vue"; import { SidebarProvider } from "~/components/ui/sidebar"; import { SettingIds } from "~/settings"; diff --git a/messages/en-pt.json b/messages/en-pt.json index 6da5a2e..f27e869 100644 --- a/messages/en-pt.json +++ b/messages/en-pt.json @@ -275,7 +275,6 @@ "wise_neat_ox_buzz": "Dark as the depths", "each_strong_snail_aid": "Bright as sail canvas", "helpful_raw_seal_nurture": "As the sea decides", - "male_stout_florian_feast": "Ship's appearance.", "hour_elegant_mink_grip": "Ship's look", "loud_raw_sheep_imagine": "Render deck decorations", "inclusive_pink_tuna_enjoy": "Render deck decorations. Requires resetting yer sails to apply.", diff --git a/messages/en.json b/messages/en.json index 8d27190..f1150ce 100644 --- a/messages/en.json +++ b/messages/en.json @@ -275,8 +275,7 @@ "wise_neat_ox_buzz": "Dark", "each_strong_snail_aid": "Light", "helpful_raw_seal_nurture": "System", - "male_stout_florian_feast": "UI theme.", - "hour_elegant_mink_grip": "Theme", + "hour_elegant_mink_grip": "Color theme", "loud_raw_sheep_imagine": "Render custom emojis", "inclusive_pink_tuna_enjoy": "Render custom emojis. Requires a page reload to apply.", "fair_swift_elephant_hunt": "Blur sensitive content", @@ -352,5 +351,7 @@ "sunny_small_warbler_express": "URL is valid", "teal_late_grebe_blend": "URL is invalid", "sharp_alive_anteater_fade": "Which instance?", - "noble_misty_rook_slide": "Put your instance's domain name here." + "noble_misty_rook_slide": "Put your instance's domain name here.", + "next_hour_jurgen_sprout": "Are you sure you want to delete {amount} emojis?", + "equal_only_crow_file": "Deleting {amount} emojis..." } diff --git a/messages/fr.json b/messages/fr.json index 1457cbd..9bd8668 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -257,8 +257,7 @@ "wise_neat_ox_buzz": "Sombre", "each_strong_snail_aid": "Clair", "helpful_raw_seal_nurture": "Système", - "male_stout_florian_feast": "Thème de l'interface.", - "hour_elegant_mink_grip": "Thème", + "hour_elegant_mink_grip": "Thème de couleurs", "loud_raw_sheep_imagine": "Afficher les émojis personnalisés", "inclusive_pink_tuna_enjoy": "Afficher les émojis personnalisés. Nécessite un rechargement de la page.", "fair_swift_elephant_hunt": "Flouter les contenus sensibles", @@ -333,5 +332,6 @@ "sunny_small_warbler_express": "L'URL est valide", "teal_late_grebe_blend": "L'URL n'est pas valide", "sharp_alive_anteater_fade": "Quelle instance ?", - "noble_misty_rook_slide": "Mettez le nom de domaine de votre instance ici." + "noble_misty_rook_slide": "Mettez le nom de domaine de votre instance ici.", + "next_hour_jurgen_sprout": "" } diff --git a/nix/package.nix b/nix/package.nix index 6141446..5726aa1 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -10,14 +10,14 @@ packageJson = builtins.fromJSON (builtins.readFile ../package.json); in stdenv.mkDerivation (finalAttrs: { - pname = packageJson.name; + pname = "versia-fe"; version = packageJson.version; src = ../.; pnpmDeps = pnpm.fetchDeps { inherit (finalAttrs) pname version src; - hash = "sha256-Z8eZiCJ3wfk/RyMnqmbk9UhJbnfYHv1k9tusNwoOgB0="; + hash = "sha256-JGZTMusNZf3PQqGcAhsO2J1q6Tj55BgNcgxAUqMN6S0="; }; nativeBuildInputs = [ diff --git a/package.json b/package.json index 06bec3d..2ff32aa 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "versia-fe", - "version": "0.1.0", + "name": "@versia/frontend", + "version": "0.8.0-alpha", "private": true, - "description": " Versia Server frontend, designed with Nuxt.", + "description": "Beautiful, powerful and responsive web client for Versia Server.", "type": "module", "license": "AGPL-3.0", "author": { @@ -36,6 +36,7 @@ "@nuxtjs/color-mode": "3.5.2", "@tailwindcss/typography": "^0.5.16", "@tailwindcss/vite": "^4.1.4", + "@tanstack/vue-table": "^8.21.3", "@tiptap/extension-highlight": "^2.11.7", "@tiptap/extension-image": "^2.11.7", "@tiptap/extension-link": "^2.11.7", @@ -75,6 +76,7 @@ "tw-animate-css": "^1.2.8", "vaul-vue": "^0.4.1", "vee-validate": "^4.15.0", + "virtua": "^0.40.4", "vue": "^3.5.13", "vue-router": "^4.5.1", "vue-sonner": "^1.3.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d12a38f..dbb6ecc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@tailwindcss/vite': specifier: ^4.1.4 version: 4.1.4(vite@6.2.6(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)) + '@tanstack/vue-table': + specifier: ^8.21.3 + version: 8.21.3(vue@3.5.13(typescript@5.8.3)) '@tiptap/extension-highlight': specifier: ^2.11.7 version: 2.11.7(@tiptap/core@2.11.7(@tiptap/pm@2.11.7)) @@ -137,6 +140,9 @@ importers: vee-validate: specifier: ^4.15.0 version: 4.15.0(vue@3.5.13(typescript@5.8.3)) + virtua: + specifier: ^0.40.4 + version: 0.40.4(vue@3.5.13(typescript@5.8.3)) vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.8.3) @@ -1627,9 +1633,19 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 + '@tanstack/table-core@8.21.3': + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} + '@tanstack/virtual-core@3.13.6': resolution: {integrity: sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg==} + '@tanstack/vue-table@8.21.3': + resolution: {integrity: sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==} + engines: {node: '>=12'} + peerDependencies: + vue: '>=3.2' + '@tanstack/vue-virtual@3.13.6': resolution: {integrity: sha512-GYdZ3SJBQPzgxhuCE2fvpiH46qzHiVx5XzBSdtESgiqh4poj8UgckjGWYEhxaBbcVt1oLzh1m3Ql4TyH32TOzQ==} peerDependencies: @@ -4843,6 +4859,26 @@ packages: videojs-vtt.js@0.15.5: resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==} + virtua@0.40.4: + resolution: {integrity: sha512-eV55eOm2b5Lzc9upivqIcAFPgfBrfcVrppW9T4vhTH+QAbaxfw5ypq25apkG83T5FuiFEoQYnefix1fQyx/GXQ==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + solid-js: '>=1.0' + svelte: '>=5.0' + vue: '>=3.2' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + solid-js: + optional: true + svelte: + optional: true + vue: + optional: true + vite-dev-rpc@1.0.7: resolution: {integrity: sha512-FxSTEofDbUi2XXujCA+hdzCDkXFG1PXktMjSk1efq9Qb5lOYaaM9zNSvKvPPF7645Bak79kSp1PTooMW2wktcA==} peerDependencies: @@ -6847,8 +6883,15 @@ snapshots: tailwindcss: 4.1.4 vite: 6.2.6(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1) + '@tanstack/table-core@8.21.3': {} + '@tanstack/virtual-core@3.13.6': {} + '@tanstack/vue-table@8.21.3(vue@3.5.13(typescript@5.8.3))': + dependencies: + '@tanstack/table-core': 8.21.3 + vue: 3.5.13(typescript@5.8.3) + '@tanstack/vue-virtual@3.13.6(vue@3.5.13(typescript@5.8.3))': dependencies: '@tanstack/virtual-core': 3.13.6 @@ -10583,6 +10626,10 @@ snapshots: dependencies: global: 4.4.0 + virtua@0.40.4(vue@3.5.13(typescript@5.8.3)): + optionalDependencies: + vue: 3.5.13(typescript@5.8.3) + vite-dev-rpc@1.0.7(vite@6.2.6(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.1)): dependencies: birpc: 2.3.0
+ {{ pkg.description }} +
+ {{ dep }}@{{ version }} +