@olundot/ui 0.10.2 → 0.13.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 CHANGED
@@ -1,5 +1,150 @@
1
1
  # @olundot/ui
2
2
 
3
+ ## 0.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 0f4ad55: Card: promote `interactive` from a variant to an orthogonal boolean prop (breaking)
8
+
9
+ `interactive` is removed from the `variant` enum and becomes a standalone `interactive?: boolean` prop. A clickable card can now combine with any resting surface — `default`, `elevated`, or `notice` — whereas the old `variant="interactive"` was mutually exclusive with those.
10
+
11
+ - **Before:** `<Card variant="interactive">`
12
+ - **After:** `<Card interactive>` (and now also `<Card variant="notice" interactive>`, `<Card variant="elevated" interactive>`).
13
+
14
+ Interactive hover lifts the shadow one step above the variant's resting depth: default/notice rest at `--shadow-2` → hover `--shadow-4`; elevated rests at `--shadow-4` → hover `--shadow-8`. The pointer cursor, hover border (`--border-strong`) / background (`--action-hover`), and neutral focus-ring (`--focus-ring`) are unchanged. `selected` / `disabled` relationships are unchanged.
15
+
16
+ `notice`'s accent border is retained; it is now documented under accent rationing role ③ (read-only emphasis context only), not treated as an exception.
17
+
18
+ - 8a0bfe3: Align Card with the v0.14 flattened surface model (breaking-visual)
19
+
20
+ After v0.14 flattening (card fill == page background), Card was the one component still leaning on removed lift affordances. Its rest/selected/focus handoff is now brought back in line. Public API (`variant`, `surface`, `selected`, `disabled`, slots) is unchanged — only rendered classes/visuals change.
21
+
22
+ - **Rest edge/radius:** base border `--border-subtle` → `--border` (0.10 alpha) and corner `--radius-md` (8px) → `--radius-lg` (12px, the "cards" radius). The `default` variant now carries a resting `--shadow-2` so a flat card still reads as a bounded surface.
23
+ - **Elevated:** `--shadow-2` → `--shadow-4`, keeping its meaning as the more-raised card now that `default` owns `--shadow-2`.
24
+ - **Selected:** fill `--bg-canvas` (a lift that vanished under flattening) → `--action-selected`, the same neutral surface-lift used by DataTable/TreeView selected rows; `--border-strong` retained.
25
+ - **Focus:** `interactive` focus drops the accent border + lime glow (`--border-accent` + `--glow-sm`) for the house neutral focus-ring convention (`--focus-ring` border + `0 0 0 1px --focus-ring` ring), matching Input. The dark `hover` accent glow is also removed (hover = `--border-strong` + `--shadow-2`), honoring accent rationing (accent is never used for action/focus surfaces).
26
+
27
+ `notice` (accent border) is unchanged.
28
+
29
+ - dca4628: Remove DataTable's built-in selection bar; consolidate bulk actions on BulkActionBar (breaking)
30
+
31
+ DataTable now exposes a single bulk-action surface. The internal top selection strip is deleted and all bulk actions move to the floating bottom `BulkActionBar` — matching the "one batch-action surface, no persistent chrome" baseline.
32
+
33
+ **Breaking — DataTable:**
34
+
35
+ - Removed the `selectionBar` (`'top' | 'none'`) and `bulkActions` props, the `DataTableBulkAction` type/export, and the built-in `data-slot="data-table-selection-bar"` strip (which always reserved a 48px row and showed a "선택된 행 없음" placeholder).
36
+ - **Kept** the selection mechanism: `selectable`, `selectedIds`, `onSelectionChange`, header select-all (indeterminate) + per-row checkboxes. The selected-count announcement is preserved as a visually-hidden `aria-live` region (`data-slot="data-table-selection-status"`), so there is no accessibility regression.
37
+ - Migration: drop `bulkActions`/`selectionBar` and render a sibling `<BulkActionBar count={selectedIds.size} onClear={…} actions={…} />`. See `docs/MIGRATION-0.13.0-to-0.14.0.md` §5.
38
+
39
+ **BulkActionBar hardening:**
40
+
41
+ - Bottom offset now respects the iOS safe area: `bottom: calc(var(--space-4) + env(safe-area-inset-bottom))`.
42
+ - Subtle entrance motion when it appears (`olun-bulk-action-bar-in`: translateY 8px + fade, `var(--dur-fast) var(--ease-out)`), opted out under `prefers-reduced-motion` via `motion-reduce:animate-none` + the global reduced-motion guard.
43
+ - Do not use on the same screen as `ActionFooter` — both occupy the bottom and overlap at `z-index` 1100 (documented, not enforced in code).
44
+
45
+ - 676476c: Align internal token references to v0.14 canonical names
46
+
47
+ `@olundot/ui` now references the canonical v0.14 token names directly instead of the pre-v0.14 aliases that survive in `@olundot/tokens`' compat layer. Public component APIs are unchanged; only the token names emitted in class strings/styles change.
48
+
49
+ - **Accent:** `--accent-fg` → `--accent`, `--accent-solid` → `--accent-pop`, `--accent-on-solid` → `--accent-on-fill` (button, chip, icon-button); two-tier-badge's legacy `text-accent-fg` utility class → `text-[var(--accent)]`.
50
+ - **Elevation:** `shadow-[var(--elevation-{1,2,4})]` → `shadow-[var(--shadow-{1,2,4})]` (card, confirm-dialog, form-modal, info-modal, mode-toggle, popover, sheet-drawer, toast, theme-fab); legacy `shadow-elevation-{2,8}` utility classes → `shadow-{2,8}` (dropdown-menu, dialog).
51
+ - **Motion:** `--duration-fast` → `--dur-fast` and `theme.ts`'s `var(--duration-${d})` template → an explicit `--dur-*`/literal mapping (mode-toggle, tabs, tree-view, `lib/theme.ts`). Sheet's public `easing` prop keeps its `standard/decel/accel/sharp/bounce` surface; its internal map now uses canonical `--ease-standard/--ease-in/--ease-out`, with `decel`/`sharp` still referencing the compat-frozen `--easing-decel`/`--easing-sharp` beziers (no canonical equivalent).
52
+ - **Semantic:** the `tokens.css` `@theme` block maps `--color-semantic-*` off `--semantic-*-fg` (was `--semantic-*`).
53
+
54
+ The canonical motion tokens carry the intended v0.14 re-tuning (fast/base/slow 150/200/300 → 120/180/260ms), so transition timings shift accordingly.
55
+
56
+ - 52714f9: Rewrite TwoTierBadge to the handoff horizontal-pill model (breaking)
57
+
58
+ TwoTierBadge moves from a vertical two-box stack with dual independent intents to the design-canonical **horizontal two-segment pill**: a `primary` lead segment and an optional `secondary` qualifier split by a hairline vertical divider, clipped to a full-round pill. It now shares the Badge/StatusBadge/Chip grammar.
59
+
60
+ **Breaking API change:**
61
+
62
+ - **Removed:** `primaryIntent`, `secondaryIntent`, `align`, `primaryClassName`, `secondaryClassName`, the `brand`/`muted` intents, and the `twoTierBadgeVariants` / `twoTierBadgeLineVariants` / `TwoTierBadgeIntent` exports.
63
+ - **Added:** a single `tone` axis (`neutral` · `info` · `success` · `warning` · `error`) that colors the **lead segment only** — the qualifier always stays neutral, and the brand lime is never spent here (accent rationing). Plus `emphasis` (`subtle`/`strong`, mirrors StatusBadge), `size` (`xs`/`sm`/`md`), and `showDot`. New type exports: `TwoTierBadgeTone`, `TwoTierBadgeEmphasis`, `TwoTierBadgeSize`.
64
+ - The root element is now a `<span>` (was `<div>`); `data-slot` names are unchanged (`two-tier-badge` / `-primary` / `-secondary`).
65
+
66
+ ### Before
67
+
68
+ ```tsx
69
+ <TwoTierBadge
70
+ primary="예약"
71
+ secondary="검토 필요"
72
+ primaryIntent="brand"
73
+ secondaryIntent="warning"
74
+ />
75
+ ```
76
+
77
+ ### After
78
+
79
+ ```tsx
80
+ <TwoTierBadge primary="예약" tone="info" secondary="검토 필요" />
81
+ <TwoTierBadge primary="반려" tone="error" emphasis="strong" secondary="중복 문항" />
82
+ ```
83
+
84
+ Map old intents to tone: `brand`→(drop, use `info`/neutral — lime is never used), `muted`→`neutral`, `danger`→`error`, `success`/`warning`/`info` unchanged. The old `secondaryIntent` has no equivalent — the qualifier is always neutral by design.
85
+
86
+ ### Patch Changes
87
+
88
+ - Updated dependencies [966c3f6]
89
+ - @olundot/tokens@0.14.0
90
+
91
+ ## 0.12.0
92
+
93
+ ### Minor Changes
94
+
95
+ - **v0.13.0 "dot-only reconcile"** — design↔repo drift reconciliation: dot-only status redesign, repo bug/a11y fixes, and four gap components.
96
+
97
+ **Tokens (additive)**
98
+
99
+ - Added `--semantic-{error|warning|info|success|neutral}-fg` (dot/text/border color, aliasing the existing role tokens) and `--semantic-neutral-bg`, across all theme blocks. These back the dot-only status model.
100
+
101
+ **UI — dot-only status redesign (BREAKING)**
102
+
103
+ Status surfaces now carry color on a leading dot + text only; the surface stays neutral in the default (`subtle`) emphasis. A second `emphasis` axis (`subtle | strong`) controls weight. Lucide status icons are removed — the dot is the signal.
104
+
105
+ - **Badge** — collapsed to a single `tone` axis (`error | warning | info | success | neutral | brand`). `tone="danger"` → `tone="error"`; the old `variant` axis (`semantic | vibrant | pill | …`) is removed (use `StatusBadge emphasis="strong"` for a tinted fill). `size`/`disabled` removed.
106
+ - **StatusBadge** — adds `emphasis` (default `subtle`) and `size`. `status="active"` now maps to **info (blue)** instead of success (green) so a live cue never reads as "done". Neutral/terminal states get a hollow-ring dot.
107
+ - **Alert / InlineAlert** — adds `emphasis` (default `error`→strong, else subtle); the `icon` override prop is removed (7px dot replaces it).
108
+ - **Toast** — adds a `description` line; `icon` removed; default duration 3000→4000ms (error 7000). Capitalized `Toast` namespace alongside the `toast` alias.
109
+
110
+ **UI — repo bug / a11y fixes**
111
+
112
+ - IconButton no longer emits `aria-pressed` on non-toggle buttons. CopyButton clears its pending revert timer on rapid re-click. ConfirmDialog uses `role="alertdialog"`. FileUploadZone error text gets `role="alert"`. OtpField gains a Korean cell `aria-label`, a neutral caret, and a required marker. Input/Textarea/Select labels use `--text-secondary`; required `*` markers are bold. Button gets a 2px focus ring, an active-press scale, and a loading width-freeze. Chip's removable `×` is a separately focusable button. DataTable reserves the sort-icon slot to prevent header shift. BulkActionBar is low-chrome (borderless text/icon actions + hairline dividers) with built-in hover/focus. Pagination renders a constant 7-slot page list. Sheet defaults `showCloseButton` to false and adds `SheetBody`.
113
+
114
+ **UI — new gap components**
115
+
116
+ - **Breadcrumb** — collapsing nav (`maxItems`, root + ellipsis + tail), `aria-current="page"`.
117
+ - **PageSizeSelect** — standalone items-per-page picker; Pagination gains `showPageSize` (default true) to opt out and avoid duplication.
118
+ - **DataLayout** — pure list/table page scaffold (header / toolbar / body / footer / floating bulk-bar slots).
119
+ - **PageHeader** — adds `headingLevel` (1–6, default 1) to demote the title tag in nested contexts without changing its look.
120
+
121
+ Migration guide: `docs/MIGRATION-0.12.0-to-0.13.0.md`.
122
+
123
+ ### Patch Changes
124
+
125
+ - Updated dependencies
126
+ - @olundot/tokens@0.13.0
127
+
128
+ ## 0.11.0
129
+
130
+ ### Minor Changes
131
+
132
+ - 7b589b3: **v0.12.0 "Linear refresh"** — breaking visual + token redesign (light-first, near-monochrome, accent-rationed à la Linear).
133
+
134
+ - **Spacing rebased to the Tailwind v4 4px scale** (`--space-1`=4px … `--space-32`=128px). Legacy `--space-0-5` / `--space-1-5` removed. All `@olundot/ui` components were migrated by a value-preserving key shift, so rendered spacing is unchanged — only the token keys move (`--space-1`→`--space-2`, `--space-0-5`→`--space-1`, etc.).
135
+ - **Accent rationing (Linear-faithful)** — the signature lime/olive is reserved for the brand mark, text links, read-only signal dots (unread/new/live), and opt-in accent variants (badge/chip/icon-button accent tone); everything else is monochrome or neutral. `--primary` (near-black on light / near-white on dark) is the **monochrome fill** for the **primary CTA button**, checkbox/radio/switch checked states, and progress/loading. The **focus ring** (`--focus-ring`) is neutral — set to `--text-secondary` (light #3C4149 / dark #B4B8C0), not accent. **Selection/active** states (active tab, selected chip, current nav item, selected row) use a **neutral surface-lift** (`--action-selected` + `--border-strong` + foreground text), not an accent tint. Brand olive surfaces live on `bg-brand` only.
136
+ - **Radius squared up**: default `--radius-md` 12px→8px; `sm` 8→6, `lg` 16→12, `xl` 24→16, new `--radius-2xl` 24px.
137
+ - **Type scale reduced**: display 72→56, h1 56→40, h2 42→30, h3 32→24, h4 24→20, h5 20→17, body 16→15px. `--fs-h6` and `--fs-body-lg/md/sm` are kept as deprecated aliases mapping to the nearest new size.
138
+ - **Pretendard Variable is now the primary font** (self-hosted woff2 vendored into `dist/fonts/`), replacing the Inter-first stack. Inter is reserved for Latin subtitle/eyebrow flourishes and tabular numerals.
139
+ - Surfaces/text/borders re-tuned for a lighter near-monochrome light-first canvas; new `--gradient-app` / `--gradient-hairline` / `--scrim` atmosphere tokens; `--primary*`, `--accent-pop` added.
140
+
141
+ Migration guide: `docs/MIGRATION-0.11.0-to-0.12.0.md`.
142
+
143
+ ### Patch Changes
144
+
145
+ - Updated dependencies [7b589b3]
146
+ - @olundot/tokens@0.12.0
147
+
3
148
  ## 0.10.2
4
149
 
5
150
  ### Patch Changes
package/README.md CHANGED
@@ -36,4 +36,4 @@ This beta package is extracted from the OLUN CBT/LMS shared UI implementation. A
36
36
 
37
37
  ## Accent Contract
38
38
 
39
- Filled accent buttons must pair `--accent-solid` for the background/border with `--accent-on-solid` for text and icons. `--accent-on-fill` remains a backward-compatible alias only and is not allowed in new `Button` source.
39
+ Primary and default buttons are monochrome: pair `--primary` for the background and border with `--primary-fg` for text and icons. Brand and opt-in accent fills use the canonical `--accent-pop` + `--accent-on-fill` pair. The pre-v0.14 names `--accent-solid` and `--accent-on-solid` remain deprecated compatibility aliases and must not be used in new component source.