Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions app/assets/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ html {
}
}

html[dir='rtl'] .rtl-flip {
transform: scale(-1, 1);
}

body {
margin: 0;
background-color: var(--bg);
Expand Down
34 changes: 18 additions & 16 deletions app/components/AppFooter.vue
Original file line number Diff line number Diff line change
@@ -1,54 +1,56 @@
<script setup lang="ts"></script>
<template>
<footer class="border-t border-border mt-auto" :aria-label="$t('footer.site_footer')">
<div class="container py-3 sm:py-8 flex flex-col gap-2 sm:gap-4 text-fg-subtle text-sm">
<div class="flex flex-col sm:flex-row items-center justify-between gap-2 sm:gap-4">
<div class="flex flex-col sm:flex-row items-center justify-start gap-2 sm:gap-4">
<p class="font-mono m-0 hidden sm:block">{{ $t('tagline') }}</p>
<div class="flex items-center gap-3 sm:gap-6">
<span aria-hidden="true" class="flex-shrink-1 flex-grow-1" />
<div class="flex items-center justify-start gap-3 sm:gap-6">
<NuxtLink
to="/about"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex items-center"
>
{{ $t('footer.about') }}
<span>{{ $t('footer.about') }}</span>
</NuxtLink>
<a
href="https://docs.npmx.dev"
target="_blank"
rel="noopener noreferrer"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex items-center gap-1"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex items-center justify-start gap-1"
>
{{ $t('footer.docs') }}
<span class="i-carbon-launch w-3 h-3" aria-hidden="true" />
<span>{{ $t('footer.docs') }}</span>
<span class="i-carbon:launch rtl-flip w-3 h-3" aria-hidden="true" />
</a>
<a
href="https://repo.npmx.dev"
target="_blank"
rel="noopener noreferrer"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex items-center gap-1"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex justify-start items-center gap-1"
>
{{ $t('footer.source') }}
<span class="i-carbon-launch w-3 h-3" aria-hidden="true" />
<span>{{ $t('footer.source') }}</span>
<span class="i-carbon:launch rtl-flip w-3 h-3" aria-hidden="true" />
</a>
<a
href="https://social.npmx.dev"
target="_blank"
rel="noopener noreferrer"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex items-center gap-1"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex items-center justify-start gap-1"
>
{{ $t('footer.social') }}
<span class="i-carbon-launch w-3 h-3" aria-hidden="true" />
<span>{{ $t('footer.social') }}</span>
<span class="i-carbon:launch rtl-flip w-3 h-3" aria-hidden="true" />
</a>
<a
href="https://chat.npmx.dev"
target="_blank"
rel="noopener noreferrer"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex items-center gap-1"
class="link-subtle font-mono text-xs min-h-8 sm:min-h-11 flex items-center justify-start gap-1"
>
{{ $t('footer.chat') }}
<span class="i-carbon-launch w-3 h-3" aria-hidden="true" />
<span>{{ $t('footer.chat') }}</span>
<span class="i-carbon:launch rtl-flip w-3 h-3" aria-hidden="true" />
</a>
</div>
</div>
<p class="text-xs text-fg-muted text-center sm:text-left m-0">
<p class="text-xs text-fg-muted text-center sm:text-start m-0">
<span class="sm:hidden">{{ $t('non_affiliation_disclaimer') }}</span>
<span class="hidden sm:inline">{{ $t('trademark_disclaimer') }}</span>
</p>
Expand Down
15 changes: 9 additions & 6 deletions app/components/AppHeader.vue
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@ onKeyStroke(',', e => {
:aria-label="$t('header.site_header')"
class="sticky top-0 z-50 bg-bg/80 backdrop-blur-md border-b border-border"
>
<nav :aria-label="$t('nav.main_navigation')" class="container h-14 flex items-center">
<!-- Left: Logo -->
<nav
:aria-label="$t('nav.main_navigation')"
class="container h-14 flex items-center justify-start"
>
<!-- Start: Logo -->
<div class="flex-shrink-0">
<NuxtLink
v-if="showLogo"
Expand Down Expand Up @@ -87,7 +90,7 @@ onKeyStroke(',', e => {
<div class="relative group" :class="{ 'is-focused': isSearchFocused }">
<div class="search-box relative flex items-center">
<span
class="absolute left-3 text-fg-subtle font-mono text-sm pointer-events-none transition-colors duration-200 motion-reduce:transition-none group-focus-within:text-accent z-1"
class="absolute inset-is-3 text-fg-subtle font-mono text-sm pointer-events-none transition-colors duration-200 motion-reduce:transition-none group-focus-within:text-accent z-1"
>
/
</span>
Expand All @@ -99,7 +102,7 @@ onKeyStroke(',', e => {
name="q"
:placeholder="$t('search.placeholder')"
v-bind="noCorrect"
class="w-full bg-bg-subtle border border-border rounded-md pl-7 pr-3 py-1.5 font-mono text-sm text-fg placeholder:text-fg-subtle transition-border-color duration-300 motion-reduce:transition-none focus:border-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50"
class="w-full bg-bg-subtle border border-border rounded-md ps-7 pe-3 py-1.5 font-mono text-sm text-fg placeholder:text-fg-subtle transition-border-color duration-300 motion-reduce:transition-none focus:border-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50"
@input="handleSearchInput"
@focus="isSearchFocused = true"
@blur="isSearchFocused = false"
Expand All @@ -123,8 +126,8 @@ onKeyStroke(',', e => {
</ul>
</div>

<!-- Right: User status + GitHub -->
<div class="flex-shrink-0 flex items-center gap-4 sm:gap-6 ml-auto sm:ml-0">
<!-- End: User status + GitHub -->
<div class="flex-shrink-0 flex items-center gap-4 sm:gap-6 ms-auto sm:ms-0">
<NuxtLink
to="/about"
class="sm:hidden link-subtle font-mono text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 rounded"
Expand Down
8 changes: 4 additions & 4 deletions app/components/AppTooltip.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ const isVisible = shallowRef(false)
const tooltipId = useId()

const positionClasses: Record<string, string> = {
top: 'bottom-full left-1/2 -translate-x-1/2 mb-1',
bottom: 'top-full left-0 mt-1',
left: 'right-full top-1/2 -translate-y-1/2 mr-2',
right: 'left-full top-1/2 -translate-y-1/2 ml-2',
top: 'bottom-full inset-is-1/2 -translate-x-1/2 mb-1',
bottom: 'top-full inset-is-0 me-1',
left: 'right-full top-1/2 -translate-y-1/2 me-2',
right: 'left-full top-1/2 -translate-y-1/2 ms-2',
}

const tooltipPosition = computed(() => positionClasses[props.position || 'bottom'])
Expand Down
2 changes: 1 addition & 1 deletion app/components/CodeDirectoryListing.vue
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ function formatBytes(bytes: number): string {
<span>{{ node.name }}</span>
</NuxtLink>
</td>
<td class="py-2 px-4 text-right font-mono text-xs text-fg-subtle">
<td class="py-2 px-4 text-end font-mono text-xs text-fg-subtle">
<span v-if="node.type === 'file' && node.size">
{{ formatBytes(node.size) }}
</span>
Expand Down
4 changes: 2 additions & 2 deletions app/components/CodeFileTree.vue
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ watch(
<template v-if="node.type === 'directory'">
<button
type="button"
class="w-full flex items-center gap-1.5 py-1.5 px-3 text-left font-mono text-sm transition-colors hover:bg-bg-muted"
class="w-full flex items-center gap-1.5 py-1.5 px-3 text-start font-mono text-sm transition-colors hover:bg-bg-muted"
:class="isNodeActive(node) ? 'text-fg' : 'text-fg-muted'"
:style="{ paddingLeft: `${depth * 12 + 12}px` }"
@click="toggleDir(node.path)"
>
<span
class="w-4 h-4 shrink-0 transition-transform"
:class="[isExpanded(node.path) ? 'i-carbon-chevron-down' : 'i-carbon-chevron-right']"
:class="[isExpanded(node.path) ? 'i-carbon:chevron-down' : 'i-carbon:chevron-right']"
/>
<span
class="w-4 h-4 shrink-0"
Expand Down
4 changes: 2 additions & 2 deletions app/components/CodeMobileTreeDrawer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ watch(isOpen, open => (isLocked.value = open))
<!-- Toggle button (mobile only) -->
<button
type="button"
class="md:hidden fixed bottom-4 right-4 z-40 w-12 h-12 bg-bg-elevated border border-border rounded-full shadow-lg flex items-center justify-center text-fg-muted hover:text-fg transition-colors"
class="md:hidden fixed bottom-4 inset-ie-4 z-40 w-12 h-12 bg-bg-elevated border border-border rounded-full shadow-lg flex items-center justify-center text-fg-muted hover:text-fg transition-colors"
:aria-label="$t('code.toggle_tree')"
@click="isOpen = !isOpen"
>
Expand Down Expand Up @@ -57,7 +57,7 @@ watch(isOpen, open => (isLocked.value = open))
>
<aside
v-if="isOpen"
class="md:hidden fixed inset-y-0 left-0 z-50 w-72 bg-bg-subtle border-r border-border overflow-y-auto"
class="md:hidden fixed inset-y-0 inset-is-0 z-50 w-72 bg-bg-subtle border-ie border-border overflow-y-auto"
>
<div
class="sticky top-0 bg-bg-subtle border-b border-border px-4 py-3 flex items-center justify-between"
Expand Down
2 changes: 1 addition & 1 deletion app/components/CodeViewer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ watch(
<div class="code-viewer flex min-h-full">
<!-- Line numbers column -->
<div
class="line-numbers shrink-0 bg-bg-subtle border-r border-border text-right select-none"
class="line-numbers shrink-0 bg-bg-subtle border-ie border-border text-end select-none"
aria-hidden="true"
>
<a
Expand Down
4 changes: 2 additions & 2 deletions app/components/ConnectorModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -124,13 +124,13 @@ watch(open, isOpen => {
class="flex items-center p-3 bg-bg-muted border border-border rounded-lg font-mono text-sm"
>
<span class="text-fg-subtle">$</span>
<span class="text-fg-subtle ml-2">{{ executeNpmxConnectorCommand }}</span>
<span class="text-fg-subtle ms-2">{{ executeNpmxConnectorCommand }}</span>
<button
type="button"
:aria-label="
copied ? $t('connector.modal.copied') : $t('connector.modal.copy_command')
"
class="ml-auto text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 rounded"
class="ms-auto text-fg-subtle hover:text-fg transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 rounded"
@click="copyCommand"
>
<span v-if="!copied" class="i-carbon-copy block w-5 h-5" aria-hidden="true" />
Expand Down
4 changes: 2 additions & 2 deletions app/components/ConnectorStatus.client.vue
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ const ariaLabel = computed(() => {
<!-- Operation count badge (overlaid) -->
<span
v-if="isConnected && operationCount > 0"
class="absolute -top-0.5 -right-0.5 min-w-[1rem] h-4 px-1 flex items-center justify-center font-mono text-[10px] rounded-full"
class="absolute -top-0.5 -inset-ie-0.5 min-w-[1rem] h-4 px-1 flex items-center justify-center font-mono text-[10px] rounded-full"
:class="hasPendingOperations ? 'bg-yellow-500 text-black' : 'bg-blue-500 text-white'"
aria-hidden="true"
>
Expand All @@ -93,7 +93,7 @@ const ariaLabel = computed(() => {
<div
v-if="showTooltip"
role="tooltip"
class="absolute right-0 top-full mt-2 px-2 py-1 font-mono text-xs text-fg bg-bg-elevated border border-border rounded shadow-lg whitespace-nowrap z-50"
class="absolute inset-ie-0 top-full mt-2 px-2 py-1 font-mono text-xs text-fg bg-bg-elevated border border-border rounded shadow-lg whitespace-nowrap z-50"
>
{{ tooltipText }}
</div>
Expand Down
4 changes: 2 additions & 2 deletions app/components/DependencyPathPopup.vue
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ function parsePackageString(pkg: string): { name: string; version: string } {
class="font-mono text-xs"
:style="{ paddingLeft: `${idx * 12}px` }"
>
<span v-if="idx > 0" class="text-fg-subtle mr-1">└─</span>
<span v-if="idx > 0" class="text-fg-subtle me-1">└─</span>
<NuxtLink
:to="{
name: 'package',
Expand All @@ -107,7 +107,7 @@ function parsePackageString(pkg: string): { name: string; version: string } {
>
{{ pathItem }}
</NuxtLink>
<span v-if="idx === path.length - 1" class="ml-1 text-amber-500">⚠</span>
<span v-if="idx === path.length - 1" class="ms-1 text-amber-500">⚠</span>
</li>
</ul>
</div>
Expand Down
4 changes: 2 additions & 2 deletions app/components/HeaderOrgsDropdown.vue
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ function handleKeydown(event: KeyboardEvent) {
enter-from-class="opacity-0 translate-y-1"
leave-to-class="opacity-0 translate-y-1"
>
<div v-if="isOpen" class="absolute right-0 top-full pt-2 w-56 z-50">
<div v-if="isOpen" class="absolute inset-ie-0 top-full pt-2 w-56 z-50">
<div class="bg-bg-elevated border border-border rounded-lg shadow-lg overflow-hidden">
<div class="px-3 py-2 border-b border-border">
<span class="font-mono text-xs text-fg-subtle">{{
Expand Down Expand Up @@ -112,7 +112,7 @@ function handleKeydown(event: KeyboardEvent) {
class="link-subtle font-mono text-xs inline-flex items-center gap-1"
>
{{ $t('header.orgs_dropdown.view_all') }}
<span class="i-carbon-arrow-right w-3 h-3" aria-hidden="true" />
<span class="i-carbon:arrow-right rtl-flip w-3 h-3" aria-hidden="true" />
</NuxtLink>
</div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions app/components/HeaderPackagesDropdown.vue
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ function handleKeydown(event: KeyboardEvent) {
enter-from-class="opacity-0 translate-y-1"
leave-to-class="opacity-0 translate-y-1"
>
<div v-if="isOpen" class="absolute right-0 top-full pt-2 w-64 z-50">
<div v-if="isOpen" class="absolute inset-ie-0 top-full pt-2 w-64 z-50">
<div class="bg-bg-elevated border border-border rounded-lg shadow-lg overflow-hidden">
<div class="px-3 py-2 border-b border-border">
<span class="font-mono text-xs text-fg-subtle">{{
Expand Down Expand Up @@ -112,7 +112,7 @@ function handleKeydown(event: KeyboardEvent) {
class="link-subtle font-mono text-xs inline-flex items-center gap-1"
>
{{ $t('header.packages_dropdown.view_all') }}
<span class="i-carbon-arrow-right w-3 h-3" aria-hidden="true" />
<span class="i-carbon:arrow-right rtl-flip w-3 h-3" aria-hidden="true" />
</NuxtLink>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/components/OperationsQueue.vue
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ watch(isExecuting, executing => {
class="flex items-center gap-2 font-mono text-xs text-fg-muted cursor-pointer hover:text-fg transition-colors duration-200 select-none"
>
<span
class="i-carbon-chevron-right block w-3 h-3 transition-transform duration-200 [[open]>&]:rotate-90"
class="i-carbon:chevron-right rtl-flip block w-3 h-3 transition-transform duration-200 [[open]>&]:rotate-90"
aria-hidden="true"
/>
{{ $t('operations.queue.log') }} ({{ completedOperations.length }})
Expand Down
6 changes: 3 additions & 3 deletions app/components/OrgMembersPanel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ watch(lastExecutionTime, () => {
<div class="flex flex-wrap items-center gap-2 p-3 border-b border-border bg-bg">
<div class="flex-1 min-w-[150px] relative">
<span
class="absolute left-2 top-1/2 -translate-y-1/2 i-carbon-search w-3.5 h-3.5 text-fg-subtle"
class="absolute inset-is-2 top-1/2 -translate-y-1/2 i-carbon-search w-3.5 h-3.5 text-fg-subtle"
aria-hidden="true"
/>
<label for="members-search" class="sr-only">{{ $t('org.members.filter_label') }}</label>
Expand All @@ -328,7 +328,7 @@ watch(lastExecutionTime, () => {
name="members-search"
:placeholder="$t('org.members.filter_placeholder')"
v-bind="noCorrect"
class="w-full pl-7 pr-2 py-1.5 font-mono text-sm bg-bg-subtle border border-border rounded text-fg placeholder:text-fg-subtle transition-colors duration-200 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50"
class="w-full ps-7 pe-2 py-1.5 font-mono text-sm bg-bg-subtle border border-border rounded text-fg placeholder:text-fg-subtle transition-colors duration-200 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50"
/>
</div>
<div
Expand Down Expand Up @@ -479,7 +479,7 @@ watch(lastExecutionTime, () => {
</div>
</div>
<!-- Team badges -->
<div v-if="member.teams.length > 0" class="flex flex-wrap gap-1 pl-0">
<div v-if="member.teams.length > 0" class="flex flex-wrap gap-1 ps-0">
<button
v-for="team in member.teams"
:key="team"
Expand Down
Loading
Loading