@naeil/ui 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/DESIGN.md +186 -0
- package/LICENSE +21 -0
- package/README.md +85 -22
- package/THIRD_PARTY_NOTICES.md +49 -0
- package/dist/chunk-JBTDRVZ7.js +46 -0
- package/dist/chunk-QKVN6Q6C.js +438 -0
- package/dist/components/index.d.ts +87 -0
- package/dist/components/index.js +832 -0
- package/dist/components/ui/index.d.ts +105 -0
- package/dist/components/ui/index.js +736 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +7 -0
- package/dist/source/components/footer.d.ts +15 -0
- package/dist/source/components/footer.js +172 -0
- package/dist/source/components/index.d.ts +11 -0
- package/dist/source/components/index.js +26 -0
- package/dist/source/components/locale-switcher.d.ts +17 -0
- package/dist/source/components/locale-switcher.js +66 -0
- package/dist/source/components/logo.d.ts +9 -0
- package/dist/source/components/logo.js +52 -0
- package/dist/source/components/nav.d.ts +39 -0
- package/dist/source/components/nav.js +412 -0
- package/dist/source/components/theme-provider.d.ts +6 -0
- package/dist/source/components/theme-provider.js +45 -0
- package/dist/source/components/theme-toggle-icon.d.ts +5 -0
- package/dist/source/components/theme-toggle-icon.js +62 -0
- package/dist/source/components/theme-toggle.d.ts +5 -0
- package/dist/source/components/theme-toggle.js +34 -0
- package/dist/source/components/typography.d.ts +12 -0
- package/dist/source/components/typography.js +49 -0
- package/dist/source/components/ui/avatar.d.ts +14 -0
- package/dist/source/components/ui/avatar.js +137 -0
- package/dist/source/components/ui/badge.d.ts +13 -0
- package/dist/source/components/ui/badge.js +76 -0
- package/dist/source/components/ui/button.d.ts +14 -0
- package/dist/source/components/ui/button.js +88 -0
- package/dist/source/components/ui/card.d.ts +13 -0
- package/dist/source/components/ui/card.js +135 -0
- package/dist/source/components/ui/checkbox.d.ts +7 -0
- package/dist/source/components/ui/checkbox.js +58 -0
- package/dist/source/components/ui/dialog.d.ts +20 -0
- package/dist/source/components/ui/dialog.js +182 -0
- package/dist/source/components/ui/dropdown-menu.d.ts +28 -0
- package/dist/source/components/ui/dropdown-menu.js +282 -0
- package/dist/source/components/ui/index.d.ts +19 -0
- package/dist/source/components/ui/index.js +131 -0
- package/dist/source/components/ui/input.d.ts +6 -0
- package/dist/source/components/ui/input.js +49 -0
- package/dist/source/components/ui/select.d.ts +16 -0
- package/dist/source/components/ui/select.js +197 -0
- package/dist/source/components/ui/sonner.d.ts +6 -0
- package/dist/source/components/ui/sonner.js +80 -0
- package/dist/source/components/ui/switch.d.ts +7 -0
- package/dist/source/components/ui/switch.js +54 -0
- package/dist/source/components/ui/tabs.d.ts +10 -0
- package/dist/source/components/ui/tabs.js +57 -0
- package/dist/source/components/ui/textarea.d.ts +6 -0
- package/dist/source/components/ui/textarea.js +46 -0
- package/dist/source/i18n/config.d.ts +6 -0
- package/dist/source/i18n/config.js +12 -0
- package/dist/source/i18n/routing.d.ts +371 -0
- package/dist/source/i18n/routing.js +17 -0
- package/dist/source/lib/design/modal-inert.d.ts +6 -0
- package/dist/source/lib/design/modal-inert.js +73 -0
- package/dist/source/lib/utils.d.ts +5 -0
- package/dist/source/lib/utils.js +8 -0
- package/dist/tokens.ts +217 -0
- package/docs/components/README.md +21 -0
- package/docs/components/avatar.md +47 -0
- package/docs/components/badge.md +29 -0
- package/docs/components/button.md +39 -0
- package/docs/components/card.md +32 -0
- package/docs/components/checkbox.md +35 -0
- package/docs/components/common.md +31 -0
- package/docs/components/composition.md +68 -0
- package/docs/components/dialog.md +41 -0
- package/docs/components/dropdown-menu.md +38 -0
- package/docs/components/input.md +32 -0
- package/docs/components/select.md +39 -0
- package/docs/components/sonner.md +37 -0
- package/docs/components/switch.md +33 -0
- package/docs/components/tabs.md +40 -0
- package/docs/components/textarea.md +35 -0
- package/docs/design/component-demand.md +30 -0
- package/docs/design/public-ui-final-verification.md +96 -0
- package/docs/design/public-ui-release-validation.md +86 -0
- package/docs/design/public-ui-stage3-verification.md +98 -0
- package/docs/design/public-ui-stage4-verification.md +129 -0
- package/docs/design/public-ui-support.md +40 -0
- package/docs/design/v2-migration.md +199 -0
- package/docs/package-release.md +89 -0
- package/licenses/Noto-Sans-JP-OFL.txt +93 -0
- package/licenses/Nunito-Sans-OFL.txt +93 -0
- package/licenses/Pretendard-OFL.txt +94 -0
- package/licenses/React-MIT.txt +21 -0
- package/licenses/Storybook-MIT.txt +21 -0
- package/licenses/popper-MIT.txt +25 -0
- package/licenses/react-remove-scroll-bar-MIT.txt +21 -0
- package/licenses/store2-MIT.txt +22 -0
- package/licenses/toggle-selection-MIT.txt +21 -0
- package/package.json +215 -26
- package/src/styles/components.css +276 -0
- package/src/styles/globals.css +18 -0
- package/src/styles/theme.css +293 -0
- package/messages/en.json +0 -221
- package/messages/ja.json +0 -221
- package/messages/ko.json +0 -221
- package/postcss.config.mjs +0 -7
- package/src/app/[locale]/(content)/baby-agent/page.tsx +0 -30
- package/src/app/[locale]/(content)/blog/page.tsx +0 -68
- package/src/app/[locale]/(content)/cc/page.tsx +0 -216
- package/src/app/[locale]/(content)/design/page.tsx +0 -703
- package/src/app/[locale]/(content)/layout.tsx +0 -7
- package/src/app/[locale]/(content)/pkm/page.tsx +0 -31
- package/src/app/[locale]/(content)/projects/page.tsx +0 -100
- package/src/app/[locale]/(content)/sa/page.tsx +0 -179
- package/src/app/[locale]/(landing)/page.tsx +0 -157
- package/src/app/[locale]/layout.tsx +0 -72
- package/src/app/[locale]/login/actions.ts +0 -10
- package/src/app/[locale]/login/oauth-buttons.tsx +0 -78
- package/src/app/[locale]/login/page.tsx +0 -85
- package/src/app/auth/callback/route.ts +0 -78
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +0 -32
- package/src/app/layout.tsx +0 -22
- package/src/app/sitemap.ts +0 -26
- package/src/components/accent-picker.tsx +0 -62
- package/src/components/auth-slot.tsx +0 -96
- package/src/components/footer-wrapper.tsx +0 -8
- package/src/components/footer.tsx +0 -193
- package/src/components/hero-scene.tsx +0 -948
- package/src/components/hero-section.tsx +0 -57
- package/src/components/locale-switcher.tsx +0 -74
- package/src/components/logo.tsx +0 -51
- package/src/components/nav-server-wrapper.tsx +0 -22
- package/src/components/nav-wrapper.tsx +0 -45
- package/src/components/nav.tsx +0 -550
- package/src/components/paraglider-cursor.tsx +0 -112
- package/src/components/project-layout.tsx +0 -194
- package/src/components/theme-provider.tsx +0 -10
- package/src/components/theme-toggle-icon.tsx +0 -62
- package/src/components/theme-toggle.tsx +0 -39
- package/src/components/typography.tsx +0 -27
- package/src/components/ui/avatar.tsx +0 -109
- package/src/components/ui/badge.tsx +0 -47
- package/src/components/ui/button.tsx +0 -65
- package/src/components/ui/card.tsx +0 -106
- package/src/components/ui/dialog.tsx +0 -158
- package/src/components/ui/dropdown-menu.tsx +0 -257
- package/src/components/ui/input.tsx +0 -21
- package/src/components/ui/sonner.tsx +0 -54
- package/src/components/workflow-diagram.tsx +0 -414
- package/src/i18n/config.ts +0 -8
- package/src/i18n/request.ts +0 -16
- package/src/i18n/routing.ts +0 -12
- package/src/lib/supabase/client.ts +0 -18
- package/src/lib/supabase/middleware.ts +0 -42
- package/src/lib/supabase/server.ts +0 -37
- package/src/lib/utils.ts +0 -6
- package/src/proxy.ts +0 -62
- package/src/tokens/.gitkeep +0 -0
- package/src/tokens/color.json +0 -56
- package/src/tokens/radius.json +0 -9
- package/src/tokens/semantic.json +0 -81
- package/src/tokens/shadow.json +0 -7
- package/src/tokens/spacing.json +0 -16
- package/src/tokens/typography.json +0 -34
- package/src/types/i18n.d.ts +0 -6
- package/src/utils/.gitkeep +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.3.0 — 2026-10-02
|
|
4
|
+
|
|
5
|
+
- Demand-led Radix Tabs and native Textarea with exact shared deep entries, standalone guides/Docs/Usage and packed behavior checks. Native field/radio composition remains consumer-owned; no FormField/RadioGroup API or dependency added.
|
|
6
|
+
|
|
7
|
+
- Shared UI v2: approved neutral light/dark tokens, typography, density, content widths, restrained motion, and Radix Select/Switch/Checkbox. The design generation name “v2” is independent of npm versioning.
|
|
8
|
+
- `/ui` is the React core entry. React and ReactDOM come from the host; Next.js and next-intl are optional compatibility peers. Next themes remains a React runtime dependency.
|
|
9
|
+
- Preserve root brand/theme/heading names and documented shared deep imports. Replace open-ended deep exports with an explicit allowlist and compiled JavaScript/types.
|
|
10
|
+
- Exclude website authentication/Supabase, MDX/blog code, hero/Three/cursor scenes, application wrappers and website messages from the tarball and installed runtime dependencies. See the [migration guide](docs/design/v2-migration.md#03-package-boundary).
|
|
11
|
+
- Include CSS side-effect metadata, migration/design guidance and third-party notices/licenses. Verify isolated tarball consumers and add package/site/Storybook/browser CI.
|
|
12
|
+
- Version-scoped installation and consumer font/theme/density guidance, plus a dispatch-only hosted Docs workflow. Hosted Docs and the brand website have separate deployment scopes; native/manual coverage is recorded separately from automated browser checks.
|
|
13
|
+
|
|
14
|
+
This entry describes the 0.3.0 release scope; registry availability and tags are verified separately during publication. The historical registry baseline on 2026-10-02 was npm `latest` at `0.2.0`. Changes to the 0.x API boundary use a minor increment; there is no npm 2.0 release implied by UI v2.
|
|
15
|
+
|
|
16
|
+
## 0.2.0 — published 2026-03-22
|
|
17
|
+
|
|
18
|
+
Registry baseline: root, `/ui`, `/utils`, theme/global CSS, and declared wildcard component/lib/i18n paths. The actual 15-file tarball did not contain the source targets for its wildcard exports. It installed website dependencies and marked all files side-effect-free. These registry facts are distinct from later repository-only implementation work.
|
package/DESIGN.md
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# naeil UI v2 — Design brief
|
|
2
|
+
|
|
3
|
+
Status: Visual direction accepted on 2026-09-29: neutral palette, Pretendard, larger text, purpose-specific widths, comfortable spacing by default, compact spacing for dense views, and short restrained transitions respecting reduced motion. Implemented in the shared package and actual-component Storybook examples. Independent review findings have been addressed; validation evidence and remaining limits are in [the verification report](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/docs/design/v2-verification.md). See [the v2 specification](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/docs/superpowers/specs/2026-09-29-shared-ui-v2-design.md) for scope. Publishing and deployment are separate.
|
|
4
|
+
|
|
5
|
+
## Purpose and scope
|
|
6
|
+
|
|
7
|
+
Build a shared design system that gives naeil products a precise, calm, coherent interface. The deliverables are design rules, tokens, reusable React components, composition examples, and instructions for consumers and coding agents.
|
|
8
|
+
|
|
9
|
+
The design must work for settings, forms, lists, and information panels across products. naeil.dev page composition, project illustrations, hero scenes, and other site content are outside this brief. Existing brand components in the public package require an explicit migration decision before their API changes.
|
|
10
|
+
|
|
11
|
+
## Reference and provenance
|
|
12
|
+
|
|
13
|
+
- Selected by the user: Linear, on 2026-09-29.
|
|
14
|
+
- Source: https://github.com/VoltAgent/awesome-design-md/blob/main/design-md/linear.app/DESIGN.md
|
|
15
|
+
- Workflow reference: https://www.threads.com/@automation_claire/post/Dd1GZoREhnt
|
|
16
|
+
- Follow-up constraints: https://www.threads.com/@automation_claire/post/Dd1GcQGkpbL
|
|
17
|
+
|
|
18
|
+
The source is a third-party analysis of Linear's marketing pages, not an official specification of Linear's application. Its light theme, form validation, and complete application state palette are not documented. Source values are reference material, not verified accessibility results.
|
|
19
|
+
|
|
20
|
+
Adopt from the reference:
|
|
21
|
+
|
|
22
|
+
- Neutral surfaces with a slight cool tint and a consistent hierarchy of surface levels.
|
|
23
|
+
- A restrained accent for important actions, selection, links, and focus.
|
|
24
|
+
- Fine borders and surface differences to establish grouping and depth.
|
|
25
|
+
- Medium and semibold typography with explicit roles.
|
|
26
|
+
- A 4px spacing foundation and role-specific corner radii.
|
|
27
|
+
|
|
28
|
+
Adapt for naeil:
|
|
29
|
+
|
|
30
|
+
- Support both light and dark modes; the source's dark-only marketing rule does not apply.
|
|
31
|
+
- Use available fonts with Korean, Japanese, and Latin coverage, rather than Linear's proprietary fonts.
|
|
32
|
+
- Define success, warning, error, information, loading, empty, disabled, and selected states for product workflows.
|
|
33
|
+
- Establish product UI sizes rather than adopting marketing display sizes and section spacing.
|
|
34
|
+
- Keep the accent replaceable through a documented, accessible theme contract.
|
|
35
|
+
|
|
36
|
+
## Visual direction
|
|
37
|
+
|
|
38
|
+
Precision comes from consistent alignment, spacing, hierarchy, and interaction states. Group related information through proximity and separators; use a panel when it represents a meaningful group. Give the main task the strongest visual emphasis.
|
|
39
|
+
|
|
40
|
+
Use restrained rounding and quiet surface treatments. Gradients, glow, backdrop blur, and animated decoration are not default component treatments. Motion should communicate a state change or spatial relationship.
|
|
41
|
+
|
|
42
|
+
## Selected visual foundation
|
|
43
|
+
|
|
44
|
+
The neutral palette, larger-text direction, Pretendard, and the reviewed content-width recommendations are selected. The user also accepted the recommended comfortable spacing, demonstrated state direction, and short transitions. Engineering and compatibility decisions are consolidated in the linked specification. These are naeil decisions, not assertions about Linear's product UI.
|
|
45
|
+
|
|
46
|
+
### Color and surfaces
|
|
47
|
+
|
|
48
|
+
Define semantic roles before choosing final palette values:
|
|
49
|
+
|
|
50
|
+
| Role | Purpose |
|
|
51
|
+
| --- | --- |
|
|
52
|
+
| canvas | Application background |
|
|
53
|
+
| surface | Grouped content and panels |
|
|
54
|
+
| surface-raised | Menus, popovers, dialogs |
|
|
55
|
+
| surface-hover | Pointer hover on interactive surfaces |
|
|
56
|
+
| surface-selected | Persistent selection, distinct from hover |
|
|
57
|
+
| text-primary / secondary / disabled | Text hierarchy with explicit use restrictions |
|
|
58
|
+
| border / border-strong | Group boundaries and control boundaries |
|
|
59
|
+
| action / action-hover / action-pressed / on-action | Primary action colors |
|
|
60
|
+
| focus | Keyboard focus indicator |
|
|
61
|
+
| success / warning / error / info | Feedback, each with text and subtle-surface companions |
|
|
62
|
+
|
|
63
|
+
Use neutral surfaces, neutral selection backgrounds, and a neutral action palette as the shared default. The user selected neutral over blue and teal after comparing the revised study. Purple actions and purple selection backgrounds were rejected. Blue and teal remain comparison history, not required shipped themes. Provide complete light/dark roles and validate actual text and control states before publishing.
|
|
64
|
+
|
|
65
|
+
Brand/action, muted surface, and focus are separate semantic decisions even when some share a color. A project accent override must include its foreground and interaction states; replacing a single hue must not silently break legibility.
|
|
66
|
+
|
|
67
|
+
Normal text must meet 4.5:1 contrast, large text 3:1, and essential control boundaries and state indicators 3:1 against adjacent colors. Validate rendered combinations, including opacity. Decorative separators need not be treated as control boundaries. Disabled styles must not be reused for readable metadata.
|
|
68
|
+
|
|
69
|
+
### Typography
|
|
70
|
+
|
|
71
|
+
Selected UI family: Pretendard for Korean/Latin UI, with Noto Sans JP used for Japanese in the reviewed samples. JetBrains Mono for code and identifiers is still a proposal; it was not part of the font comparison. Font delivery must be documented for package consumers. Verify all three languages in specimens.
|
|
72
|
+
|
|
73
|
+
| Role | Size / line height | Weight |
|
|
74
|
+
| --- | --- | --- |
|
|
75
|
+
| Page title | 32 / 42px | 600 |
|
|
76
|
+
| Section title | 20 / 29px | 600 |
|
|
77
|
+
| Component title | 16 / 25px | 600 |
|
|
78
|
+
| UI body | 16 / 25px | 400 |
|
|
79
|
+
| Reading body | 16 / 30px | 400 |
|
|
80
|
+
| Label and control | 16 / 25px | 500 |
|
|
81
|
+
| Supporting text | 14 / 22px | 400 |
|
|
82
|
+
| Metadata | 13 / 20px | 400 |
|
|
83
|
+
|
|
84
|
+
Do not tighten body letter spacing to imitate a marketing headline. Metadata remains readable. Form labels, errors, and essential information must not shrink to badge-sized text. Preserve mobile input sizing where needed to avoid browser auto-zoom.
|
|
85
|
+
|
|
86
|
+
### Size, spacing, and shape
|
|
87
|
+
|
|
88
|
+
- Foundation: 4, 8, 12, 16, 24, 32, 48, 64px; allow named 2px optical adjustments for icons and indicators.
|
|
89
|
+
- Default control height: 40px. Compact control height: 36px, for deliberate dense layouts. Touch interaction areas: at least 44px, without overlapping adjacent targets.
|
|
90
|
+
- Default form/panel padding: 24px; compact form padding: 20px. Use 8px within a field and 24px between field groups, reduced to 16px in compact forms. Explicitly small surfaces may use 16px padding.
|
|
91
|
+
- Small tags: 4px radius. Buttons and inputs: 8px. Panels and dialogs: 12px. Circular avatars remain circular.
|
|
92
|
+
- Layout density must be consistent within a control group; individual consumers should not invent independent padding scales.
|
|
93
|
+
|
|
94
|
+
### Motion
|
|
95
|
+
|
|
96
|
+
Use named fast (120ms) and standard (180ms) transitions for color and opacity, with at most a small movement for notifications. Reduced-motion mode removes transitions and spatial movement. Do not add default spring, bounce, magnetic, or decorative motion. Kinetics was inspected as a reference; its effects were not adopted.
|
|
97
|
+
|
|
98
|
+
## Components and composition
|
|
99
|
+
|
|
100
|
+
First implement the foundation and existing eight families: Button, Input, Card, Dialog, DropdownMenu, Badge, Avatar, and Toaster. Align shared title primitives and theme controls with the same foundation.
|
|
101
|
+
|
|
102
|
+
- Button: clear primary/secondary/quiet/destructive hierarchy; specified hover, pressed, focus, disabled, and loading behavior.
|
|
103
|
+
- Input: visible field boundaries, label/help/error composition, and clear focus/invalid states.
|
|
104
|
+
- Card: grouping and surface role, without implying that every content block needs a card. Distinguish static and interactive examples.
|
|
105
|
+
- Dialog and menu: coherent raised surfaces, keyboard interaction, visible focus, and appropriate dismissal behavior.
|
|
106
|
+
- Badge and toast: status meaning conveyed by text or icon as well as color.
|
|
107
|
+
- Avatar: readable fallback initials; imagery supplied by the consumer.
|
|
108
|
+
|
|
109
|
+
Demonstrate the system in three neutral compositions: a settings form, a selectable list with metadata, and a detail panel with actions. These are library examples, not a redesign of a particular website. Additional public components require a demonstrated composition need.
|
|
110
|
+
|
|
111
|
+
### Application frame and content widths
|
|
112
|
+
|
|
113
|
+
The application frame owns navigation placement and outer gutters; each content region owns its purpose-specific width. A narrow settings form inside that frame must not move the shared navigation. For routes using the same frame, keep navigation anchors stable at the same viewport, language and theme, including loading and changing summary counts. A shared Header import alone does not establish this consistency.
|
|
114
|
+
|
|
115
|
+
Choose a product's frame width from its tasks, information density and representative content. A dashboard name or a wide monitor alone does not justify filling all available space. Inspect sparse as well as dense content before selecting a cap or fluid layout. The shared reading/settings/list defaults remain content rules, not a universal application maximum; RelayDock's 1600px decision is not a shared token.
|
|
116
|
+
|
|
117
|
+
Internal columns must respond to the space available inside their region. Use container queries or an equivalent content-aware layout when viewport breakpoints no longer represent that space. Keep wide tables locally scrollable; check localized labels, wrapping and controls inside cells as well as page overflow. See the [consumer composition guide](docs/design/v2-migration.md#앱-전체-틀과-콘텐츠-폭) for application ownership and checks.
|
|
118
|
+
|
|
119
|
+
## Connection to implementation
|
|
120
|
+
|
|
121
|
+
Use one canonical token source to generate the CSS that the package actually exports and that contrast checks inspect. Wire typography, radii, spacing, elevation, and motion into that same system. The visual design brief explains roles; numeric implementation values must be synchronized with the token source.
|
|
122
|
+
|
|
123
|
+
Preserve Radix interaction behavior and the existing React/Tailwind integration unless a concrete requirement warrants a change. Inventory current public exports before migration. Existing Nav, Footer, Logo, project colors, and deep import contracts need explicit compatibility decisions; do not silently remove them during a visual pass.
|
|
124
|
+
|
|
125
|
+
Consumer and repository agent guidance must explicitly point to this design document and the component APIs. External examples may fill an identified gap, and their adopted rules or code must be attributed. No custom skill or plugin is required to deliver v2. Installing a tool is a separate decision from selecting a design reference.
|
|
126
|
+
|
|
127
|
+
## Evaluation and acceptance
|
|
128
|
+
|
|
129
|
+
Compare the same compositions and content in light/dark themes, desktop/mobile widths, and Korean/Japanese/English. Include long labels, multiline content, keyboard focus, errors, disabled controls, and loading examples.
|
|
130
|
+
|
|
131
|
+
Before release, verify generated token consistency, public-package consumption, component behavior and accessibility, and visual results. Review actual screenshots or a working preview; a token table alone does not establish visual quality.
|
|
132
|
+
|
|
133
|
+
For application layout changes, compare affected routes side by side under the same conditions and verify the frame invariants separately from each page's component checks. Record functional checks, shared-design compliance and visual composition as distinct results. Keep prior findings open until remeasured or explicitly scoped out; a layout review does not close unrelated contrast, nested-control or touch findings.
|
|
134
|
+
|
|
135
|
+
The visual comparisons and implementation scope are accepted. Token generation, component behavior, packed consumption, and actual browser examples have been implemented and checked; see the verification report for results and limits.
|
|
136
|
+
|
|
137
|
+
## Historical design studies
|
|
138
|
+
|
|
139
|
+
The sections below record prototype-stage decisions and checks as they occurred. Their references to pending production work describe that earlier stage; current implementation status is above.
|
|
140
|
+
|
|
141
|
+
## Accepted direction — typography and content widths
|
|
142
|
+
|
|
143
|
+
The accepted comparison artifact is `docs/design/v2-typography-width.html`. It retains the selected neutral palette and compares font family and width independently. The original composition study remains in `docs/design/v2-preview.html`. These review screens do not modify the production library.
|
|
144
|
+
|
|
145
|
+
- Compare Pretendard (current recommendation) and Noto Sans KR with identical Korean/English text, 16px body, 14px supporting text, 20px headings, and matching weights/spacing. Both use explicitly loaded Noto Sans JP for Japanese samples; this is a shared Japanese companion, not a comparison between Japanese font candidates. Monospace font selection is outside this review.
|
|
146
|
+
- Let either font drive the same reading, settings, and task-table examples. Font loading status is visible; a fallback rendering must not be presented as a successful candidate comparison.
|
|
147
|
+
- Compare maximum outer content widths: reading 560/640/800px, settings 480/640/800px, and task lists 960/1,200px/available width. The user accepted 640px for reading and settings, and 1,200px for task lists as design defaults. These still need to be implemented as tokens. Short forms may use 480px; data-heavy layouts may need available width.
|
|
148
|
+
- Maximum widths shrink to available space on small screens. The comparison stage and its padding are review-page scaffolding, not a proposed universal application shell. A wide table scrolls inside its region on mobile, while reading and forms reflow.
|
|
149
|
+
|
|
150
|
+
Sources: [Pretendard](https://github.com/orioncactus/pretendard), [Noto Sans KR](https://fonts.google.com/noto/specimen/Noto+Sans+KR), and [Noto Sans JP](https://fonts.google.com/noto/specimen/Noto+Sans+JP). The prototype loads fonts through jsDelivr and Google Fonts; production delivery remains to be decided.
|
|
151
|
+
|
|
152
|
+
Browser checks at 1440px confirmed candidate font loads and all nine width choices. At 390px the three layouts fit without page-level horizontal overflow, the table retains internal scrolling, and form inputs retain 16px text. These checks support the visual review and do not replace production accessibility or cross-browser testing. Subsequent spacing/state/motion recommendations have also been accepted; production coverage and verification remain outstanding.
|
|
153
|
+
|
|
154
|
+
## Accepted direction — spacing, states, and motion
|
|
155
|
+
|
|
156
|
+
`docs/design/v2-spacing-states.html` reuses the interactive neutral composition, with an independent settings example capped at 640px and a list/detail example capped at 1,200px. It preserves 16px main text and compares comfortable/compact spacing (40/36px controls, minimum 72/60px list rows). Mobile targets keep their larger sizes.
|
|
157
|
+
|
|
158
|
+
Review controls expose normal, loading, empty, and recoverable error list states. The existing email validation/recovery, simulated save, selected task, disabled action, language combobox, dialog, and toast remain available. Scenario data is simulated and resets on reload.
|
|
159
|
+
|
|
160
|
+
The user accepted the motion recommendation: short color transitions (120ms), menu entrance opacity (120ms), and dialog/toast transitions (180ms), alongside an explicit no-motion option. OS reduced-motion settings take priority. These are our selected rules, not adaptations from Kinetics or output from Impeccable. A subsequent reference review confirmed the Select gap and retained Radix as the implementation basis; see the specification for sources. Production component coverage, accessibility checks, and polish remain outstanding.
|
|
161
|
+
|
|
162
|
+
Browser verification confirmed the 640/1,200px example widths, all four list scenarios, error retry, task creation from the empty-state action, invalid email and recovery, and simulated save completion. Density retained 16px task titles; the compact two-line rows grew above their 60px minimum to fit their content. Motion-off disabled the dialog animation. At 390px there was no page overflow and inputs remained 44px high. OS reduced-motion behavior is specified in CSS but was not separately emulated in this browser check.
|
|
163
|
+
|
|
164
|
+
## Composition study — selected neutral direction
|
|
165
|
+
|
|
166
|
+
The standalone review artifact is `docs/design/v2-preview.html`. It is a disposable HTML/CSS/JavaScript prototype; the package implementation is unchanged. Open it directly or serve it locally. The specimen uses CDN-hosted Pretendard with system fallbacks. Form saves and tasks are simulated in memory and reset on reload.
|
|
167
|
+
|
|
168
|
+
The user requested larger typography, alternatives to the purple action and selected surfaces, and a coherent language dropdown. The current study uses 16px body/control/label text, 14px supporting text, and 13px metadata. Default/compact controls are 40/36px and task rows 72/60px; mobile controls remain at least 44px. Density changes spacing, not font size.
|
|
169
|
+
|
|
170
|
+
The current preview uses the selected neutral palette and retains light/dark and density controls. Palette comparison controls have been removed. Selected surfaces are #262626 in dark mode and #ebebeb in light mode. Selected-list indicators use the accent-text role for contrast against the selected surface. The comparison values below are retained as decision history.
|
|
171
|
+
|
|
172
|
+
| Palette | Dark action / foreground | Light action / foreground | Action text contrast, dark / light |
|
|
173
|
+
| --- | --- | --- | --- |
|
|
174
|
+
| Neutral (selected default) | #e5e5e5 / #171717 | #292929 / #ffffff | 14.23 / 14.55 |
|
|
175
|
+
| Blue (comparison only) | #3269ce / #ffffff | #245ec7 / #ffffff | 5.19 / 6.00 |
|
|
176
|
+
| Teal (comparison only) | #16756b / #ffffff | #116e64 / #ffffff | 5.54 / 6.11 |
|
|
177
|
+
|
|
178
|
+
The neutral default includes hover, focus, and accent-text roles; the earlier comparisons also supplied these roles. These measured button text pairs are not a complete accessibility certification. Semantic success/warning/error colors remain distinct from the replaceable action palette.
|
|
179
|
+
|
|
180
|
+
The language control now demonstrates a styled select-only combobox and opaque listbox in the browser's popover top layer. The menu matches the trigger width, marks the selected option, and opens above when space below is insufficient. It supports arrows, Home/End, Enter/Space, Escape, Tab dismissal, and text lookup. Selection updates a hidden form value; it does not translate the page. This is a visual/interaction probe: production implementation should use the established accessible primitives and undergo assistive-technology testing.
|
|
181
|
+
|
|
182
|
+
The prototype also demonstrates a settings form, searchable task list, detail panel, new-task dialog, toast, status badges, disabled controls, and invalid/recovered input. The revised dark desktop and light mobile layouts, menu visibility, and primary button text contrast were inspected in a browser. Broader component, language, and accessibility verification belongs to implementation.
|
|
183
|
+
|
|
184
|
+
### Previous study
|
|
185
|
+
|
|
186
|
+
Study 01 proposed purple actions (#6863dc dark / #6057cf light), purple selected surfaces, 14px controls and 12px metadata, and a native language select. Those choices have been superseded by study 02 in response to user feedback. Linear remains the structural reference; its brand color is not prescribed.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 naeil-dev contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,36 +1,99 @@
|
|
|
1
|
-
|
|
1
|
+
# @naeil/ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
React components, semantic design tokens, and shared styles for naeil products. The approved system uses a neutral light/dark palette, Pretendard, 16px controls, comfortable or compact density, purpose-specific content widths, and restrained motion. Radix supplies interaction behavior.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
This repository also contains the **naeil.dev brand/example website** and an **optional agent reference workflow**. Choose the path you need:
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
| Path | Start here | Tools / keys |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Use the UI in an app | [Consumer guide](docs/design/v2-migration.md) | React 19, Tailwind 4; **no Next.js or API keys** for `/ui` |
|
|
10
|
+
| Develop the shared UI | Commands below and [contributing](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/CONTRIBUTING.md) | Node.js 22+, pnpm; no Supabase or 21st key |
|
|
11
|
+
| Use frontend references with an agent | [Optional workflow setup](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/docs/design/frontend-tooling.md) | Supported agent; Python for bundled helpers; your own 21st key only for optional MCP |
|
|
12
|
+
| Develop the brand/example website | [Site setup](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/docs/site-development.md) | Next.js and a separate Supabase project for site authentication |
|
|
13
|
+
|
|
14
|
+
## Use the UI
|
|
15
|
+
|
|
16
|
+
This guide targets **@naeil/ui 0.3.0** with React 19 / ReactDOM 19 and Tailwind 4. UI v2 names the design generation, independently of npm versioning. Install the exact version in your app:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
pnpm add --save-exact @naeil/ui@0.3.0
|
|
20
|
+
# npm install --save-exact @naeil/ui@0.3.0
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The command requires that version to be available in your registry. For source checkout validation before publication, use the local package workflow below. The [changelog](CHANGELOG.md) describes this version's changes; this guide does not assert the registry's current `latest` tag.
|
|
24
|
+
|
|
25
|
+
Import primitives from the dedicated entrypoint:
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
import { Input } from '@naeil/ui/ui';
|
|
29
|
+
|
|
30
|
+
export function NameField() {
|
|
31
|
+
return <label>Name <Input name="name" /></label>;
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
In a Tailwind 4 app, load the styles once and register the package's classes (adjust the source path relative to your CSS file):
|
|
36
|
+
|
|
37
|
+
```css
|
|
38
|
+
@import "@naeil/ui/globals.css";
|
|
39
|
+
@source "../node_modules/@naeil/ui/dist";
|
|
15
40
|
```
|
|
16
41
|
|
|
17
|
-
|
|
42
|
+
If your app already owns its Tailwind/base styles, import both `@naeil/ui/theme.css` and `@naeil/ui/components.css` instead of globals, and keep the same `@source` registration.
|
|
18
43
|
|
|
19
|
-
|
|
44
|
+
Fonts are consumer-owned. One locally bundled option is:
|
|
20
45
|
|
|
21
|
-
|
|
46
|
+
```sh
|
|
47
|
+
pnpm add --save-exact pretendard@1.3.9 @fontsource/noto-sans-jp@5.3.0
|
|
48
|
+
```
|
|
22
49
|
|
|
23
|
-
|
|
50
|
+
```tsx
|
|
51
|
+
// In the app entrypoint; choose the faces your content needs.
|
|
52
|
+
import 'pretendard/dist/web/static/pretendard.css';
|
|
53
|
+
import '@fontsource/noto-sans-jp/400.css';
|
|
54
|
+
import '@fontsource/noto-sans-jp/500.css';
|
|
55
|
+
import '@fontsource/noto-sans-jp/600.css';
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Mark Japanese content with `lang="ja"`. Keep font OFL notices with redistributed builds; shared CSS uses system fallbacks when fonts fail. The package adds no font runtime dependency.
|
|
59
|
+
|
|
60
|
+
Shared CSS follows the OS theme unless the document root has `class="light"` or `class="dark"`. For compact spacing, set `data-ui-density="compact"` on that root; omit it for comfortable spacing. Density changes spacing while retaining 16px control text and minimum mobile touch sizes. React apps can also use `ThemeProvider` from `@naeil/ui/components/theme-provider` with `attribute="class"`.
|
|
61
|
+
|
|
62
|
+
The [13 component guides](docs/components/README.md) cover exact APIs, state composition and accessibility responsibilities. Each has a built Storybook Docs page and runnable Usage example. The [consumer guide](docs/design/v2-migration.md) covers peer dependencies, fonts, themes, density, Select versus DropdownMenu, overrides, and layout ownership. Fonts are delivered by the consumer; shared CSS does not fetch them automatically. `/ui` and `/utils` work without Next.js. The legacy root remains a framework compatibility entry with static Next/next-intl imports; install those optional peers when using it, Nav, Footer or i18n/routing. ThemeProvider/controls and Toaster retain the React library next-themes. Shared deep imports use the exact [allowlist and migration](docs/design/v2-migration.md#03-package-boundary); website-only paths belong in your application.
|
|
63
|
+
|
|
64
|
+
## Develop the shared UI
|
|
65
|
+
|
|
66
|
+
From the repository root:
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
pnpm install --frozen-lockfile
|
|
70
|
+
pnpm storybook
|
|
71
|
+
# http://localhost:6006 — UI v2 / Workspace
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Storybook uses the actual public components with simulated example data. It needs no Supabase project or external design API. For local package consumption:
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
pnpm build:pkg
|
|
78
|
+
pnpm pack --pack-destination /tmp
|
|
79
|
+
# In your consumer app: pnpm add /tmp/naeil-ui-0.3.0.tgz
|
|
80
|
+
```
|
|
24
81
|
|
|
25
|
-
|
|
82
|
+
| Command | Purpose |
|
|
83
|
+
| --- | --- |
|
|
84
|
+
| `pnpm build:tokens` | Generate theme CSS from `src/tokens/*.json` |
|
|
85
|
+
| `pnpm check:contrast` | Check declared light/dark color combinations |
|
|
86
|
+
| `pnpm test` / `pnpm check:types` / `pnpm lint` | Unit tests / types / lint |
|
|
87
|
+
| `pnpm build:storybook` / `pnpm test:browser` | Build Docs/examples / Chromium, Firefox and WebKit checks (install configured Playwright engines first) |
|
|
88
|
+
| `pnpm build:pkg` / `pnpm check:package` | Build package / inspect package boundary and independently install/build packed React + Next consumers |
|
|
89
|
+
| `pnpm dev` / `pnpm build` | Brand/example website development / build |
|
|
26
90
|
|
|
27
|
-
- [
|
|
28
|
-
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
91
|
+
A [reusable React consumer example](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/examples/react/README.md) shows a settings form. [Release policy](docs/package-release.md) and [changelog](CHANGELOG.md) distinguish implementation, publication and deployment. CI verifies the package and separate website/Storybook. Downloadable preview artifacts include notices and local fonts. The hosted Docs destination is [naeil-dev.github.io/naeil-ui](https://naeil-dev.github.io/naeil-ui/), configured for workflow builds and main-only deployment. See [Docs deployment status](https://github.com/naeil-dev/naeil-ui/actions/workflows/publish-docs-manual.yml); live availability is confirmed separately in [release evidence](https://github.com/naeil-dev/naeil-ui/releases) with deployment and hosted HTTP/navigation results. See [preview instructions](docs/package-release.md#storybook-preview-artifact) and [support limits](docs/design/public-ui-support.md).
|
|
29
92
|
|
|
30
|
-
|
|
93
|
+
Read [DESIGN.md](DESIGN.md) before shared UI changes. Numeric values live in `src/tokens/`; generated CSS is not edited by hand. Shared styles live in `src/styles/`, site-only styles in `src/app/`. Hero art, 3D scenes, cursor effects, and site content belong to the example website.
|
|
31
94
|
|
|
32
|
-
|
|
95
|
+
[Documentation index](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/docs/README.md) separates maintained guides from dated implementation/review evidence. Historical checks describe their recorded revision and scope; publishing, merging, and site deployment are separate actions.
|
|
33
96
|
|
|
34
|
-
|
|
97
|
+
## Project and license
|
|
35
98
|
|
|
36
|
-
|
|
99
|
+
Maintained in [naeil-dev/naeil-ui](https://github.com/naeil-dev/naeil-ui). See [contributing](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/CONTRIBUTING.md), [security reporting](https://github.com/naeil-dev/naeil-ui/blob/81fd395031dc5b20074c4d915a8585360ce2d28a/SECURITY.md), [MIT license](LICENSE), and [third-party notices](THIRD_PARTY_NOTICES.md). Third-party code, fonts, and brand assets have their own attribution and scope limits.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Third-party notices and provenance
|
|
2
|
+
|
|
3
|
+
Original repository software is MIT licensed. Upstream code and fonts retain their notices. Brand names/logos and assets with unknown provenance are not relicensed by the repository's MIT notice.
|
|
4
|
+
|
|
5
|
+
## Copied/adapted component code
|
|
6
|
+
|
|
7
|
+
Setup commit `8e614421eee6a1a3c6b148fe12d5af2b8446abab` explicitly records shadcn/ui and its Button. Commit `2965e3b976002056a1181305ea7b93543cf64f51` adds the eight-family customization (Avatar, Badge, Button, Card, Dialog, DropdownMenu, Input, Sonner). Current `src/components/ui/` files are customized descendants and newer Radix wrappers. No exact upstream registry revision was recorded; this notice does not invent one. Preserve the following shadcn notice when distributing adapted components.
|
|
8
|
+
|
|
9
|
+
Original license read 2026-10-02: https://github.com/shadcn-ui/ui/blob/main/LICENSE.md. It matches the installed shadcn package notice.
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
MIT License
|
|
13
|
+
|
|
14
|
+
Copyright (c) 2023 shadcn
|
|
15
|
+
|
|
16
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
17
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
18
|
+
in the Software without restriction, including without limitation the rights
|
|
19
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
20
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
21
|
+
furnished to do so, subject to the following conditions:
|
|
22
|
+
|
|
23
|
+
The above copyright notice and this permission notice shall be included in all
|
|
24
|
+
copies or substantial portions of the Software.
|
|
25
|
+
|
|
26
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
27
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
28
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
29
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
30
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
31
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
32
|
+
SOFTWARE.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Fonts
|
|
36
|
+
|
|
37
|
+
Shared package styles declare families; consumers own font delivery. The website imports Pretendard Variable from `pretendard`; Storybook imports Pretendard static CSS and `@fontsource/noto-sans-jp` 400/500/600. Both installed packages carry SIL Open Font License 1.1. Exact installed notices are preserved in [Pretendard](licenses/Pretendard-OFL.txt) and [Noto Sans JP](licenses/Noto-Sans-JP-OFL.txt). Keep the notice/license when redistributing font files; modified fonts must follow reserved-name rules.
|
|
38
|
+
|
|
39
|
+
Storybook 10.4.6 also bundles Nunito Sans for its manager interface. The original Google Fonts OFL body was read on 2026-10-02 and is preserved in [Nunito Sans](licenses/Nunito-Sans-OFL.txt), including the original project-author notice; documentation preview output carries this notice as well. This manager font is Storybook tooling, not a new shared UI font choice.
|
|
40
|
+
|
|
41
|
+
The site's `src/app/layout.tsx` separately requests JetBrains Mono via `next/font/google`; no copied font binary is tracked here. Before redistributing fetched site-build fonts, retain the original license/notice supplied with that font (https://github.com/JetBrains/JetBrainsMono). This audit did not inspect the fetched Google font binary/license and does not certify a deployed site's font-notice bundle. Prototype HTML uses external CDNs separately from packed UI styles.
|
|
42
|
+
|
|
43
|
+
## Dependencies and references
|
|
44
|
+
|
|
45
|
+
Radix, Sonner, Lucide, React, Next.js and other npm dependencies carry licenses in their own distributions. They are not newly attributed as copied sources here; preserve their notices if bundling their code. DESIGN.md's Linear analysis is design reference material, not an official Linear specification or a component license. The optional workflow grants no blanket license to 21st catalog code; inspect each retrieved original before adoption.
|
|
46
|
+
|
|
47
|
+
## Website-only assets: unresolved provenance
|
|
48
|
+
|
|
49
|
+
`public/images/`, `public/svg/`, and `public/coral-concepts.html` contain brand/hero art. History records additions and normalization (`8252a3e`, `9a15ff0`, `e57c21c`) but does not establish each original artist, generation service, source license or redistribution permission. No such provenance is invented here. `public/next.svg`, `public/vercel.svg` and other starter SVGs entered during Next.js setup; logos remain the respective owners' marks. These assets are outside shared UI requirements and the current npm file allowlist. Establish their rights or replace them before a separate public asset/site redistribution claim. This unresolved site-art audit is not package release approval.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
+
var __objRest = (source, exclude) => {
|
|
22
|
+
var target = {};
|
|
23
|
+
for (var prop in source)
|
|
24
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
if (source != null && __getOwnPropSymbols)
|
|
27
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
28
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// src/lib/utils.ts
|
|
35
|
+
import { clsx } from "clsx";
|
|
36
|
+
import { twMerge } from "tailwind-merge";
|
|
37
|
+
function cn(...inputs) {
|
|
38
|
+
return twMerge(clsx(inputs));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
__spreadValues,
|
|
43
|
+
__spreadProps,
|
|
44
|
+
__objRest,
|
|
45
|
+
cn
|
|
46
|
+
};
|