Skip to content

feat: port structure and behavior from carhartt-kr-app - #58

Merged
LESANF merged 12 commits into
0.0.9from
feat/port-carhartt
Sep 22, 2026
Merged

LESANF merged 12 commits into
0.0.9from
feat/port-carhartt

Conversation

@LESANF

@LESANF LESANF commented Sep 22, 2026

Copy link
Copy Markdown
Owner

Ports the structure and behavior settled in carhartt-kr-app. Carhartt design values (colors, type scale, shapes, icon SVGs) are not carried over; the template keeps its own tokens and shapes.

One commit per concern, each type-checks:

  • useColors() reads every color token through one subscription and follows the theme; colors.css is primitives only, semantic.css registers tokens with light values and overrides for dark. Lint blocks hex literals, useCSSVariable outside the hook, and getCSSVariable.
  • useDismissKeyboardOnBackground (called from the root layout) and useDebouncedValue.
  • UnderlineText / StrikethroughText drawn as views.
  • constants/motion durations, curves and springs.
  • Lint forbids ../ imports; the three existing ones move to @/.
  • Button: textClassName, one-line label, ghost/link keep their label while loading, Lottie dots recolored per variant. size stays.
  • Input: wrapper owns height/border/background, input has font size only, hint and left/right slots, disabled replaces editable. Look unchanged.
  • Icon base with optional press target; tab icons move onto it.
  • lib/dayjs (locale from DEFAULT_LANGUAGE) and locale-neutral utils/format.
  • Docs: UI principles, migration notes, changelog. No version bump.

Verified: check-all green (78 tests); Android export succeeds with the @/global.css entry, both theme tables and the text-size-md utility present in the bundle.

Not ported: selection controls, dialog/toast specs, catalog screens, hairline and MIN_TOUCH_TARGET (no consumers yet), KR-specific format helpers, use-countdown, the ESLint config test (#46).

🤖 Generated with Claude Code

LESANF and others added 12 commits September 22, 2026 12:21
colors.css holds only the brand primitives; semantic.css registers the
semantic tokens with light values and overrides them for dark. useColors
reads every token through one useCSSVariable subscription and follows the
theme, replacing the per-component reads and the tab-bar constant. ESLint
now also fails on useCSSVariable outside use-colors.ts. use-colors.test
checks token names, @theme static, and light/dark parity.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…alue

iOS hides the keyboard on background but keeps the input focused, so
tapping it after returning does nothing. Keyboard.dismiss() from the root
layout clears the focus; keyboard-controller's dismiss() runs a frame late
and has no effect here.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
textDecorationLine cannot set thickness or color and lands differently on
iOS and Android. Both components draw the line as a view; the strikethrough
sits at 50% minus half its height with no per-platform offset.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The three ../ imports (root layout css entry, tab button, deep-link gates)
move to the alias. Same-folder ./ imports stay allowed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… dots

Adds textClassName for the label alone, clamps the label to one line,
skips the 60px Lottie for ghost/link so inline rows keep their layout,
and recolors the white Lottie asset per variant through colorFilters read
from useColors. The size variant and the template's shape are unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The h-11 box, border and background move from the TextInput to the
wrapping view; the input keeps only font size (text-size-md, no line
height) so Android does not push glyphs below the line box and out of
alignment with the slots. Adds hint (shown when there is no error) and
left/right slots, drops editable from the props in favor of disabled.
Label and the template's shape stay.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Icon wraps the Svg and, when onPress is given, a Pressable with a 16pt
default hitSlop. Pressable comes from react-native directly: importing the
ui barrel from here creates a barrel/icons import cycle. The tab icons
move onto it; their SVG paths are unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
lib/dayjs applies DEFAULT_LANGUAGE from lib/i18n once; callers import it
instead of the dayjs package. formatUtils keeps only the locale-neutral
helpers (number, signedNumber, parseNumber, optional, compactJoin, and
date with a caller-supplied format). Currency, phone and address formats
belong to each app.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- eslint.config.test.ts: stdin 과 가상 경로로 규칙 발동을 확인한다. 픽스처 파일이 없어 Metro 를 건드리지 않는다
- ui 배럴의 StyledSvg 삭제 — 사용처가 없고 SVG 색은 useColors() 문자열로 넘긴다
- global-overlays 의 View 를 @/components/ui 에서 가져온다

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@LESANF
LESANF merged commit b45ed78 into 0.0.9 Sep 22, 2026
1 check passed
@LESANF
LESANF deleted the feat/port-carhartt branch September 22, 2026 05:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant