Commits
Signed-off-by: Seongmin Lee <git@boltless.me>
Signed-off-by: Seongmin Lee <git@boltless.me>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
- inset breadcrums
- uniform height for BlobHeader and TreeHeader
- also use catpuccin syntax hl
Signed-off-by: oppiliappan <me@oppi.li>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: eti <eti@eti.tf>
Signed-off-by: eti <eti@eti.tf>
Signed-off-by: dawn <dawn@tangled.org>
Signed-off-by: eti <eti@eti.tf>
Signed-off-by: eti <eti@eti.tf>
Signed-off-by: eti <eti@eti.tf>
Adds an authenticated appview xrpc client (mints an atproto service-auth jwt per
call) and wires the notifications and sites settings tabs to the org.tangled.temp.*
methods, replacing their mocked data. Input gains an optional suffix for the
<subdomain>.<sites-domain> claim field.
Runs the appview with TANGLED_XRPC_ENABLED and points the web frontend at the
browser-reachable appview (TANGLED_API_URL) whose host matches the service-auth
aud; SITES_DOMAIN feeds the sites claim UI suffix.
The getDomainClaim handler returned 500 for the common no-claim case because
scanClaim yields sql.ErrNoRows; treat that as an empty claim. Also sentence-case
the user-facing error messages across the temp handlers (upper case, full stops).
mechanical sweep of everything the new lint rule can fix on its own:
rounded -> rounded-sm, flex-grow -> grow, px-2 py-2 -> p-2, arbitrary px
values onto the spacing scale (size-[26px] -> size-6.5), and v4 variant
forms ([&>*]: -> *:).
left alone: max-w-screen-* keeps its breakpoint linkage, and the
text-*/leading-* pairs that collapse into typography-* utilities are a
design-system call, not a rename.
Signed-off-by: eti <eti@eti.tf>
the tailwind language server's suggestCanonicalClasses diagnostic only
runs inside an editor, so nothing catches these in CI.
eslint-plugin-better-tailwindcss exposes the same canonicalization as a
lint rule.
rootFontSize matters: without it the rule silently skips every px-based
rewrite, which is most of them.
Signed-off-by: eti <eti@eti.tf>
figma lays every one of these cards out as [row, separator, row] with an 8px
auto-layout gap, so there is only ever one value to express: py-2 on each row,
which is the spacing unit that resolves to 8px on the default scale. that
leaves the card py-1, the rest of the 12px figma puts between its edge and the
first row.
with a single value the gap variant has nothing left to vary, so it folds into
the base and SettingsSection loses the rowGap prop it only forwarded. the repo
pages drop gap="3", which was 6px either side of the hairline, and the lists
reached through SettingsSection drop 4px either side — both now 8.
figma still draws 16px on the keys, emails, knots and spindles cards and 12px
on hooks; those follow the new single value here.
Signed-off-by: eti <eti@eti.tf>
the three gap variants each repeated their own border-t and border colour on
an [&>*+*] selector; divide-y divide-border-default says it once in the base,
so a variant only has to carry spacing.
the spacing had to move with it. divide-y draws on the bottom of every row but
the last, where the old rule drew on the top of every row but the first, and
the rows carry min-h-8 — being border-box, that swallowed the old border and
top padding whole, so the hairline actually sat 12px under one row and 8px over
the next with an uneven 45/41px text pitch. giving each row half the gap as its
own padding, and leaving the card the rest of its 12px, puts the line where the
comment always claimed it was: 8/8 with an even 41px pitch. cards come out
8-11px shorter for it.
Signed-off-by: eti <eti@eti.tf>
below md the sidebar collapses into a native select and the panel goes
full-bleed, keeping only its top and bottom hairlines, matching the Mobile
section of the settings redesign.
below sm the rows drop their trailing controls onto a second line: list
entries keep theirs left-aligned under the meta, while SettingsRow and the
SettingsBlock header align theirs right, as the user and repository frames
respectively do. SettingsRow takes an opt-in `stack` since the design keeps
short label/toggle pairs on one line either way.
Signed-off-by: eti <eti@eti.tf>
The thumb was painted with foreground/on-emphasis, which resolves to
white in both colour modes, so on the white checked track in dark mode
it disappeared. The design system binds it to background/default
(#ffffff light, #1f2937 dark) in every Toggle variant.
Signed-off-by: eti <eti@eti.tf>
the star button renders both in the repo header, where it is a raised
default button, and inside repo cards, where the card already carries
the elevation — so the caller decides via a prop instead of the
component hardcoding it. the profile rss link is flat for the same
reason.
the repo header fork group follows the design system segmented control:
the leading segment is default + inset shadow, the fork count segment is
ghost.
Signed-off-by: eti <eti@eti.tf>
The size variants' min-h values are the Figma button heights (32/36/40),
but line-height plus py-1.5 and the 1px border already exceeded them, so
the floor only ever applied to icon-only buttons. A labelled button came
out 2-5px taller than an icon-only one beside it. Dropping to py-1 keeps
content under the min-h at every size; the padding still acts as the
floor if a label wraps.
Signed-off-by: eti <eti@eti.tf>
the DS navigation frame gaps its items by 4px and clips each one so a
long label cannot grow it taller. add both, with a truncating label span
so clipped text ends in an ellipsis instead of vanishing.
figma draws the item 36px tall where this renders 38px, but that 2px is
the CSS border adding to a box whose figma stroke sits inside it, and
Button md carries the same offset — leave it.
add stories too: /settings is auth-gated, so storybook is the only place
these four item states can be reviewed.
Signed-off-by: eti <eti@eti.tf>
Completes the desktop half of the Settings Redesign Figma
(TFhrx7FBh2Ue5SGH8CUeBU) that the user-settings pass left out: General,
Access, Pipelines, Hooks and Sites, plus the rename, custom-label,
collaborator, secret and webhook drill-downs.
There was no repository settings surface in the rewrite at all, so this
adds the route tree under [handle]/[repo]/settings and a Settings tab on
RepoTabs. The tab is unconditional for now -- gating it needs the
viewer's push access, which the repo layout load doesn't resolve yet.
The sidebar card, drill-down shell and row primitives are reused from
the user settings. Three of them grew to cover patterns that only appear
on the repo pages: SettingsList's gap is now named in spacing units
because the designs use all of 8/12/16px, SettingsRow takes a muted
description, and SettingsBlock is the new title+description+action
header that Access and Pipelines put above each card. Multi-line copy is
passed as an array of lines rather than a string with escapes, which
reads better and keeps the templates free of useless mustaches.
SettingsEmpty replaces EmptyState inside settings: Figma's empty state
there is a single 52px row, not the tall italic box the rest of the app
uses. SettingsSaveBar factors out the Reset / "Unsaved changes" / Save
trio now that General, Sites and Profile all carry it.
Verified light and dark against the Figma renders; navigation, card and
surface tokens plus nav width and heading size all match.
Refs TAN-575.
Signed-off-by: eti <eti@eti.tf>
Ports the desktop user-settings screens from the Settings Redesign
Figma (TFhrx7FBh2Ue5SGH8CUeBU) onto a shared set of primitives: a
sidebar Navigation matching the DS component's four Active x Hovered
states, plus header/toolbar/list/row/entry pieces and a drill-down
shell for the in-place sub-views.
Seven tabs and nine drill-downs. Keys keeps its existing
`tangled.publicKey` wiring and moves the add form from a popover to
/settings/keys/new; the rest are mocked, since nothing behind them
exists yet.
Three token pairs are new because the navigation aliases *invert*
between modes -- light recesses the frame and raises the active item,
dark does the opposite -- so they cannot be spelled with an existing
pair. Button gains per-variant disabled surfaces: Figma models
disabled as its own fill/text pair rather than a dimmed enabled state,
which is what the disabled Save and Add buttons in the designs need.
Tag grows the DS badge geometry as an additive `sm` size plus the
status colours, leaving its existing callers untouched.
Verified light and dark against the Figma renders; nav, card and
surface tokens plus nav/card geometry and heading size all match.
Refs TAN-575.
Signed-off-by: eti <eti@eti.tf>
Signed-off-by: oppiliappan <me@oppi.li>
Signed-off-by: oppiliappan <me@oppi.li>
Signed-off-by: Seongmin Lee <git@boltless.me>
mechanical sweep of everything the new lint rule can fix on its own:
rounded -> rounded-sm, flex-grow -> grow, px-2 py-2 -> p-2, arbitrary px
values onto the spacing scale (size-[26px] -> size-6.5), and v4 variant
forms ([&>*]: -> *:).
left alone: max-w-screen-* keeps its breakpoint linkage, and the
text-*/leading-* pairs that collapse into typography-* utilities are a
design-system call, not a rename.
Signed-off-by: eti <eti@eti.tf>
the tailwind language server's suggestCanonicalClasses diagnostic only
runs inside an editor, so nothing catches these in CI.
eslint-plugin-better-tailwindcss exposes the same canonicalization as a
lint rule.
rootFontSize matters: without it the rule silently skips every px-based
rewrite, which is most of them.
Signed-off-by: eti <eti@eti.tf>
figma lays every one of these cards out as [row, separator, row] with an 8px
auto-layout gap, so there is only ever one value to express: py-2 on each row,
which is the spacing unit that resolves to 8px on the default scale. that
leaves the card py-1, the rest of the 12px figma puts between its edge and the
first row.
with a single value the gap variant has nothing left to vary, so it folds into
the base and SettingsSection loses the rowGap prop it only forwarded. the repo
pages drop gap="3", which was 6px either side of the hairline, and the lists
reached through SettingsSection drop 4px either side — both now 8.
figma still draws 16px on the keys, emails, knots and spindles cards and 12px
on hooks; those follow the new single value here.
Signed-off-by: eti <eti@eti.tf>
the three gap variants each repeated their own border-t and border colour on
an [&>*+*] selector; divide-y divide-border-default says it once in the base,
so a variant only has to carry spacing.
the spacing had to move with it. divide-y draws on the bottom of every row but
the last, where the old rule drew on the top of every row but the first, and
the rows carry min-h-8 — being border-box, that swallowed the old border and
top padding whole, so the hairline actually sat 12px under one row and 8px over
the next with an uneven 45/41px text pitch. giving each row half the gap as its
own padding, and leaving the card the rest of its 12px, puts the line where the
comment always claimed it was: 8/8 with an even 41px pitch. cards come out
8-11px shorter for it.
Signed-off-by: eti <eti@eti.tf>
below md the sidebar collapses into a native select and the panel goes
full-bleed, keeping only its top and bottom hairlines, matching the Mobile
section of the settings redesign.
below sm the rows drop their trailing controls onto a second line: list
entries keep theirs left-aligned under the meta, while SettingsRow and the
SettingsBlock header align theirs right, as the user and repository frames
respectively do. SettingsRow takes an opt-in `stack` since the design keeps
short label/toggle pairs on one line either way.
Signed-off-by: eti <eti@eti.tf>
the star button renders both in the repo header, where it is a raised
default button, and inside repo cards, where the card already carries
the elevation — so the caller decides via a prop instead of the
component hardcoding it. the profile rss link is flat for the same
reason.
the repo header fork group follows the design system segmented control:
the leading segment is default + inset shadow, the fork count segment is
ghost.
Signed-off-by: eti <eti@eti.tf>
The size variants' min-h values are the Figma button heights (32/36/40),
but line-height plus py-1.5 and the 1px border already exceeded them, so
the floor only ever applied to icon-only buttons. A labelled button came
out 2-5px taller than an icon-only one beside it. Dropping to py-1 keeps
content under the min-h at every size; the padding still acts as the
floor if a label wraps.
Signed-off-by: eti <eti@eti.tf>
the DS navigation frame gaps its items by 4px and clips each one so a
long label cannot grow it taller. add both, with a truncating label span
so clipped text ends in an ellipsis instead of vanishing.
figma draws the item 36px tall where this renders 38px, but that 2px is
the CSS border adding to a box whose figma stroke sits inside it, and
Button md carries the same offset — leave it.
add stories too: /settings is auth-gated, so storybook is the only place
these four item states can be reviewed.
Signed-off-by: eti <eti@eti.tf>
Completes the desktop half of the Settings Redesign Figma
(TFhrx7FBh2Ue5SGH8CUeBU) that the user-settings pass left out: General,
Access, Pipelines, Hooks and Sites, plus the rename, custom-label,
collaborator, secret and webhook drill-downs.
There was no repository settings surface in the rewrite at all, so this
adds the route tree under [handle]/[repo]/settings and a Settings tab on
RepoTabs. The tab is unconditional for now -- gating it needs the
viewer's push access, which the repo layout load doesn't resolve yet.
The sidebar card, drill-down shell and row primitives are reused from
the user settings. Three of them grew to cover patterns that only appear
on the repo pages: SettingsList's gap is now named in spacing units
because the designs use all of 8/12/16px, SettingsRow takes a muted
description, and SettingsBlock is the new title+description+action
header that Access and Pipelines put above each card. Multi-line copy is
passed as an array of lines rather than a string with escapes, which
reads better and keeps the templates free of useless mustaches.
SettingsEmpty replaces EmptyState inside settings: Figma's empty state
there is a single 52px row, not the tall italic box the rest of the app
uses. SettingsSaveBar factors out the Reset / "Unsaved changes" / Save
trio now that General, Sites and Profile all carry it.
Verified light and dark against the Figma renders; navigation, card and
surface tokens plus nav width and heading size all match.
Refs TAN-575.
Signed-off-by: eti <eti@eti.tf>
Ports the desktop user-settings screens from the Settings Redesign
Figma (TFhrx7FBh2Ue5SGH8CUeBU) onto a shared set of primitives: a
sidebar Navigation matching the DS component's four Active x Hovered
states, plus header/toolbar/list/row/entry pieces and a drill-down
shell for the in-place sub-views.
Seven tabs and nine drill-downs. Keys keeps its existing
`tangled.publicKey` wiring and moves the add form from a popover to
/settings/keys/new; the rest are mocked, since nothing behind them
exists yet.
Three token pairs are new because the navigation aliases *invert*
between modes -- light recesses the frame and raises the active item,
dark does the opposite -- so they cannot be spelled with an existing
pair. Button gains per-variant disabled surfaces: Figma models
disabled as its own fill/text pair rather than a dimmed enabled state,
which is what the disabled Save and Add buttons in the designs need.
Tag grows the DS badge geometry as an additive `sm` size plus the
status colours, leaving its existing callers untouched.
Verified light and dark against the Figma renders; nav, card and
surface tokens plus nav/card geometry and heading size all match.
Refs TAN-575.
Signed-off-by: eti <eti@eti.tf>