@iyulab/modern-app 0.9.0 โ†’ 0.11.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,87 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.11.0] - 2026-08-04
4
+
5
+ ### Fixed
6
+
7
+ - ๐Ÿ”ด**`u-action-bar[sticky]` ๊ฐ€ ๋ถ€๋ชจ ๋ฐ–์œผ๋กœ ๋„˜์ณค๋‹ค โ€” ๊ฐ€๋กœ ์Šคํฌ๋กค๋ฐ”๊ฐ€ ์ƒ๊ธฐ๊ณ  ์ฃผ ์•ก์…˜์ด ์ž˜๋ ธ๋‹ค.**
8
+ ์ขŒ์šฐ ์Œ์ˆ˜ ๋งˆ์ง„(`margin: 0 calc(-1 * var(--u-space-md))`)์œผ๋กœ ยซ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ยป ๋Š˜๋ฆฌ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ,
9
+ ๊ทธ๊ฒƒ์€ ***๋ถ€๋ชจ๊ฐ€ ์ •ํ™•ํžˆ ๊ทธ๋งŒํผ์˜ ๊ฐ€๋กœ ํŒจ๋”ฉ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค***๋Š” ๊ฐ€์ •์ด๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์†Œ๋น„์ž์˜
10
+ ์—ฌ๋ฐฑ์„ ์•Œ ์ˆ˜๋Š” ์—†๋‹ค โ‡’ ์Œ์ˆ˜ ๋งˆ์ง„์„ ์ œ๊ฑฐํ•˜๊ณ  ์„ธ๋กœ ํŒจ๋”ฉ๋งŒ ๋‚จ๊ฒผ๋‹ค.
11
+ ์‹ค์ธก: 1034px ๋ทฐํฌํŠธ์—์„œ ์šฐ์ธก 12px ์ดˆ๊ณผ โ†’ ์ €์žฅ ๋ฒ„ํŠผ ํด๋ฆฌํ•‘.
12
+
13
+ ### Added
14
+
15
+ - ๐Ÿ”ด**๋‚ด๋น„๊ฒŒ์ด์…˜ ํ•ญ๋ชฉ์— ์•„์ด์ฝ˜์ด ์—†๊ฑฐ๋‚˜ ํ•ด์„์— ์‹คํŒจํ•˜๋ฉด ๊ธฐ๋ณธ ์•„์ด์ฝ˜(ํ๋ธŒ)์„ ๊ทธ๋ฆฐ๋‹ค.**
16
+ ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ์ ‘ํžˆ๋ฉด ๋ผ๋ฒจ์ด ์ˆจ๊ณ  ์•„์ด์ฝ˜๋งŒ ๋‚จ๋Š”๋ฐ, ๊ทธ ์•„์ด์ฝ˜์ด ์—†์œผ๋ฉด ๊ทธ ๋ฉ”๋‰ด๋Š” **๋†’์ด๋งŒ ์žˆ๊ณ 
17
+ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๋นˆ ์ค„**์ด ๋˜์–ด ***๊ทธ ํ™”๋ฉด์œผ๋กœ ๊ฐˆ ์ˆ˜๋‹จ์ด ํ†ต์งธ๋กœ ์‚ฌ๋ผ์ง„๋‹ค.***
18
+ โš ยซ์ด๋ฆ„์ด ์—†์„ ๋•Œยป๋งŒ ๋ง‰์œผ๋ฉด ๋ถ€์กฑํ•˜๋‹ค โ€” ์‹ค์ธก ์‚ฌ๋ก€๋Š” *์ด๋ฆ„์€ ์žˆ๋Š”๋ฐ ํŒŒ์ผ์ด ์—†๋Š”* ์ชฝ์ด์—ˆ๋‹ค.
19
+ ๊ทธ๋ž˜์„œ ํด๋ฐฑ์€ `u-icon` ์˜ **ํ•ด์„ ์‹คํŒจ ์ง€์ **์— ๊ฑธ๋ฆฐ๋‹ค(`u-icon[fallback]`, `@iyulab/components`).
20
+ ํด๋ฐฑ SVG ๋Š” **์ธ๋ผ์ธ**์ด๋‹ค โ€” ๋‹ค์‹œ ๋„คํŠธ์›Œํฌ์— ์˜์กดํ•˜๋ฉด ๊ฐ™์€ ์‹คํŒจ๊ฐ€ ์žฌํ˜„๋œ๋‹ค.
21
+
22
+ ๐Ÿ”ด**๊ทธ๋ฆฌ๊ณ  ๊ทธ ํด๋ฐฑ์ด ํ˜ธ์ถœ๋ถ€ ์…‹ ์ค‘ ๋‘˜์—๋งŒ ๊ฑธ๋ ค ์žˆ์—ˆ๋‹ค** โ€” `u-sidebar-group` ์€
23
+ `?hidden` ์œผ๋กœ ํด๋ฐฑ์„ ๋ฌด๋ ฅํ™”ํ•œ ์ฑ„์˜€๊ณ , ์ ‘ํžŒ ์ƒํƒœ์—์„œ๋Š” ๋ผ๋ฒจ๊ณผ ์บ๋Ÿฟ๋„ ํ•จ๊ป˜ ์ˆจ์œผ๋ฏ€๋กœ
24
+ ***๊ทธ๋ฃน ๋ฒ„ํŠผ์ด ํ†ต์งธ๋กœ ๋น„์–ด ์žˆ์—ˆ๋‹ค.*** ์„ธ ์ข…๋ฅ˜๋ฅผ ํ•œ ๋ชฉ๋ก์œผ๋กœ ๋„๋Š” ํšŒ๊ท€ 7๊ฑด์„ ์‹ ์„คํ–ˆ๋‹ค
25
+ (์ข…์ „์—๋Š” ์ด ์ถ•์˜ ํ…Œ์ŠคํŠธ๊ฐ€ **0๊ฑด**์ด์—ˆ๊ณ , ๊ทธ๋ž˜์„œ ๋ˆ„๋ฝ์ด ์กฐ์šฉํ–ˆ๋‹ค).
26
+
27
+ ### Documentation
28
+
29
+ - ๐Ÿ”ด**LOB ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ 6์ข…์ด ์Šคํ‚ฌ ๋ฌธ์„œ์— ์•„์˜ˆ ์—†์—ˆ๋‹ค** โ€” `u-page-header`ยท`u-group-box`ยท
30
+ `u-info-section`ยท`u-info-field`ยท`u-empty-state`ยท`u-action-bar`. ์—ฌ์„ฏ ๋‹ค `index.ts` ์—์„œ
31
+ **๊ณต๊ฐœ**๋˜๊ณ  ํ™”๋ฉด์ด ๊ทธ๊ฒƒ์œผ๋กœ ์„œ๋Š”๋ฐ, ์Šคํ‚ฌ์€ `app.load()` ์„ค์ •๋งŒ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
32
+ ์Šคํ‚ฌ์€ ์†Œ๋น„์ž(๊ทธ๋ฆฌ๊ณ  ์—์ด์ „ํŠธ)๊ฐ€ API ๋ฅผ ์ฐพ๋Š” ์ž๋ฆฌ์ด๋ฏ€๋กœ **๊ฑฐ๊ธฐ ์—†์œผ๋ฉด ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.**
33
+ โ‡’ `references/components/*.md` ์—ฌ์„ฏ๊ณผ ๋ชฉ์ฐจ ์ ˆ์„ ๋”ํ–ˆ๋‹ค.
34
+
35
+ ### Changed
36
+
37
+ - **์…ธ ํฌ๋กฌ์˜ ํƒ€์ดํฌ๊ฐ€ ๋””์ž์ธ ํ† ํฐ ์Šค์ผ€์ผ์˜ ๋‹จ์„ ์ฝ๋Š”๋‹ค**(`--u-text-*`).
38
+ ์ข…์ „์—๋Š” ์‚ฌ์ด๋“œ๋ฐ” ๊ณ„์—ด 5๊ฐœ ํŒŒ์ผ์ด **20๊ฑด ์ „๋ถ€ ๋ฆฌํ„ฐ๋Ÿด**์ด์—ˆ๊ณ , ๊ฐ™์€ ํŒจํ‚ค์ง€์˜ ์ฝ˜ํ…์ธ 
39
+ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(`u-page-header`ยท`u-group-box`ยท`u-info-field`ยท`u-empty-state`)๋Š” **23๊ฑด ์ „๋ถ€
40
+ ํ† ํฐ**์ด์—ˆ๋‹ค โ€” ์Šค์ผ€์ผ์ด ์žˆ๋Š”๋ฐ ์…ธ์—๋Š” ๋‹ฟ์ง€ ์•Š๋Š” ์ƒํƒœ์˜€๋‹ค.
41
+ ๋‹จ ๋ฐฐ์ •์€ ๊ด€์ธก๊ฐ’ ๊ทผ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ **์šฉ๋„**๋กœ ํ–ˆ๋‹ค: ์•ฑ ์ œ๋ชฉ โ†’ `subtitle` ยท ์„น์…˜ ์ œ๋ชฉ โ†’
42
+ `overline` ยท ์„น์…˜ ๋ถ€์ œ โ†’ `caption` ยท ๋‚ด๋น„ ํ•ญ๋ชฉ โ†’ `label`.
43
+
44
+ โš **์†Œ๋น„์ž ์˜ํ–ฅ โ€” ์‚ฌ์ด๋“œ๋ฐ” ๊ธ€์ž๊ฐ€ ๋ฐ”๋€๋‹ค**: ๋‚ด๋น„ ํ•ญ๋ชฉ `14px/500` โ†’ `13px/600`(์ž‘๊ณ  ๊ตต๊ฒŒ),
45
+ ์•ฑ ์ œ๋ชฉ `18px/700` โ†’ `16px/600`, ์„น์…˜ ์ œ๋ชฉ `12px` โ†’ `11px`.
46
+ โ˜…**๋ฐฐ์น˜๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค** โ€” ๋‚ด๋น„ ํ–‰ ๋†’์ด(๋ผ๋ฒจ ์ค„ ๋ฐ•์Šค 19.5px๊ฐ€ 20px ์•„์ด์ฝ˜ ์•„๋ž˜์— ๋“ค์–ด๊ฐ„๋‹ค)์™€
47
+ ํ—ค๋” ์ œ๋ชฉ ์ค„ ๋ฐ•์Šค(16 ร— 1.5 = 24px, ์ข…์ „ `line-height` ์™€ ๋™์ผ)๋ฅผ ์‹ค์ธก์œผ๋กœ ๊ณ ์ •ํ–ˆ๋‹ค.
48
+ โš **์•„์ด์ฝ˜ ํฌ๊ธฐ๋Š” ํƒ€์ดํฌ๊ฐ€ ์•„๋‹ˆ๋‹ค** โ€” `u-icon`ยท`.caret`ยท`.logo`ยท`.toggler` ์˜ `font-size` ๋Š”
49
+ ๋„ํ˜• ํฌ๊ธฐ๋ผ ๊ทธ๋Œ€๋กœ ๋‘์—ˆ๋‹ค.
50
+
51
+ ### Added
52
+
53
+ - **`u-action-bar` โ€” ์ƒ์„ธยทํŽธ์ง‘ ํ™”๋ฉด์˜ ํ‘ธํ„ฐ ์•ก์…˜ ๋ฐ”.** ์ดˆ์•ˆ R4 ์˜ ์ž”์—ฌ์˜€๋‹ค.
54
+
55
+ ```html
56
+ <u-action-bar sticky>
57
+ <u-button slot="danger" color="danger" variant="ghost">์‚ญ์ œ</u-button>
58
+ <u-button variant="ghost">์ทจ์†Œ</u-button>
59
+ <u-button color="primary">์ €์žฅ</u-button>
60
+ </u-action-bar>
61
+ ```
62
+
63
+ **์œ„ํ—˜ ์•ก์…˜์€ ์™ผ์ชฝ ๋, ์ฃผ ์•ก์…˜์€ ์˜ค๋ฅธ์ชฝ ๋** โ€” ๊ฐ™์€ ๋ฌด๋ฆฌ์— ๋‘๋ฉด ยซ์ €์žฅยป์„ ๋ˆ„๋ฅด๋ ค๋‹ค
64
+ ยซ์‚ญ์ œยป๋ฅผ ๋ˆ„๋ฅธ๋‹ค. **๊ฑฐ๋ฆฌ๊ฐ€ ์•ˆ์ „์žฅ์น˜**์ด๋ฏ€๋กœ ์ด ๋ถ„๋ฆฌ๋Š” ์ทจํ–ฅ์ด ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์ด๋‹ค.
65
+ ์ข์•„์ง€๋ฉด ๋‘ ๋ฌด๋ฆฌ๊ฐ€ ๊ฐ์ž ํ•œ ์ค„์„ ๊ฐ–๊ณ  **์ฃผ ์•ก์…˜์ด ์œ„๋กœ** ์˜จ๋‹ค(์—„์ง€ ์œ„์น˜์— ์œ„ํ—˜ ์•ก์…˜์„
66
+ ๋‘์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋‹ค). `sticky` ๋กœ ์Šคํฌ๋กค ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‹จ์— ๊ณ ์ •ํ•œ๋‹ค.
67
+
68
+ ### Changed
69
+
70
+ - ๐Ÿ”ด**์ ‘ํž˜ ๊ธฐ์ค€์ด ยซํ™”๋ฉดยป์—์„œ ยซ์ž๊ธฐ ํญยป์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค** โ€” `u-page-header` ยท `u-group-box`.
71
+
72
+ ์ข…์ „์—๋Š” `@media (max-width: โ€ฆ)` ์˜€๊ณ , ๊ทธ๋Ÿฌ๋ฉด ์ด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋“ค์ด **์ž๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ข์€์ง€์™€
73
+ ๋ฌด๊ด€ํ•˜๊ฒŒ** ์ ‘ํ˜”๋‹ค: ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ์—ด๋ ค ๋ณธ๋ฌธ์ด 500px ์ธ 1280px ํ™”๋ฉด์—์„œ๋Š” ์ ‘ํžˆ์ง€ ์•Š๊ณ , ๋„“์€
74
+ ๋ณธ๋ฌธ์„ ๊ฐ€์ง„ ์ข์€ ํ™”๋ฉด์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ ‘ํ˜”๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์Šค์Šค๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€
75
+ **์ž๊ธฐ ์ปจํ…Œ์ด๋„ˆ ํญ**๋ฟ์ด๋‹ค โ‡’ `@container` ๋กœ ์˜ฎ๊ฒผ๋‹ค(`container-type: inline-size`).
76
+
77
+ โš **์‹œ๊ฐ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค** โ€” ์ข์€ ์ปฌ๋Ÿผ ์•ˆ์˜ ํŽ˜์ด์ง€ ํ—ค๋”๋Š” ์ด์ œ ์ ‘ํžˆ๊ณ (์ข…์ „์—๋Š” ํ™”๋ฉด์ด
78
+ ๋„“์œผ๋ฉด ์ ‘ํžˆ์ง€ ์•Š์•˜๋‹ค), ๋„“์€ ๋ณธ๋ฌธ์„ ๊ฐ€์ง„ ํƒœ๋ธ”๋ฆฟ์—์„œ๋Š” ์ ‘ํžˆ์ง€ ์•Š๋Š”๋‹ค(์ข…์ „์—๋Š” ์ ‘ํ˜”๋‹ค).
79
+
80
+ - **`u-group-box` ์˜ ํ—ค๋” ํˆด๋ฐ”๊ฐ€ ์ข์„ ๋•Œ ์ œ๋ชฉ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค**(์ปจํ…Œ์ด๋„ˆ 480px ์ดํ•˜).
81
+ ์ œ๋ชฉ๊ณผ ํˆด๋ฐ”๊ฐ€ ํ•œ ์ค„์— ๋‚จ์œผ๋ฉด ์ œ๋ชฉ์€ ์ž˜๋ฆฌ๊ณ  ์ž…๋ ฅ์€ ์†๊ฐ€๋ฝ๋ณด๋‹ค ์ข์•„์ง„๋‹ค โ€” ์ดˆ์•ˆ R4 ๊ฐ€
82
+ *"์ข์€ ํ™”๋ฉด์—์„œ ์ ‘ํžˆ๋Š” ๊ทœ์น™์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ •ํ•œ๋‹ค"* ๋กœ ์š”๊ตฌํ•œ ์ž๋ฆฌ๋‹ค.
83
+
84
+
3
85
  ## [0.9.0] - 2026-08-03
4
86
 
5
87
  > **LOB ๋ ˆ์ด์•„์›ƒ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์‹ ์„ค.** ์ด ํŒจํ‚ค์ง€๋Š” ์ข…์ „์— **์…ธ ๋ฐ”๊นฅ ๊ป๋ฐ๊ธฐ**(์‚ฌ์ด๋“œ๋ฐ”ยท๋ผ์šฐํŒ…ยท
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Iyulab, Inc.
3
+ Copyright (c) 2025 iyulab
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,45 @@
1
+ import { StyledElement } from '../internals/StyledElement.js';
2
+ type ElementParts = 'host' | 'danger' | 'main';
3
+ /**
4
+ * ํ‘ธํ„ฐ ์•ก์…˜ ๋ฐ” โ€” ์ƒ์„ธยทํŽธ์ง‘ ํ™”๋ฉด ๋งจ ์•„๋ž˜์˜ ๊ฐ™์€ ๊ณจ๊ฒฉ.
5
+ *
6
+ * โ˜…**์™œ ์ด๊ฒƒ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋‚˜**: ํ™”๋ฉด๋งˆ๋‹ค ์†์œผ๋กœ ์งœ๋ฉด โ‘ดยซ์ €์žฅยป์˜ ์œ„์น˜๊ฐ€ ํ™”๋ฉด๋งˆ๋‹ค
7
+ * ๋‹ฌ๋ผ์ง€๊ณ  โ‘ต์œ„ํ—˜ ์•ก์…˜(์‚ญ์ œ)์ด ์ฃผ ์•ก์…˜ **์˜†์—** ๋†“์—ฌ ์˜ค์กฐ์ž‘์„ ๋ถ€๋ฅด๊ณ  โ‘ถ๊ธด ํผ์—์„œ
8
+ * ๋ฒ„ํŠผ์„ ์ฐพ์•„ ๋๊นŒ์ง€ ์Šคํฌ๋กคํ•ด์•ผ ํ•œ๋‹ค. ์…‹ ๋‹ค ๊ฐœ๋ณ„๋กœ๋Š” ์‚ฌ์†Œํ•ด ๋ณด์ด์ง€๋งŒ **์˜ค์กฐ์ž‘์€
9
+ * ๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋‹ค.**
10
+ *
11
+ * ```html
12
+ * <u-action-bar sticky>
13
+ * <u-button slot="danger" color="danger" variant="ghost">์‚ญ์ œ</u-button>
14
+ * <u-button variant="ghost">์ทจ์†Œ</u-button>
15
+ * <u-button color="primary">์ €์žฅ</u-button>
16
+ * </u-action-bar>
17
+ * ```
18
+ *
19
+ * ๋ฐฐ์น˜ ๊ทœ์น™: **์œ„ํ—˜ ์•ก์…˜์€ ์™ผ์ชฝ ๋, ์ฃผ ์•ก์…˜์€ ์˜ค๋ฅธ์ชฝ ๋** โ€” ๊ฑฐ๋ฆฌ๊ฐ€ ์•ˆ์ „์žฅ์น˜๋‹ค.
20
+ * ์ข์•„์ง€๋ฉด ๋‘ ๋ฌด๋ฆฌ๊ฐ€ ๊ฐ์ž ํ•œ ์ค„์„ ๊ฐ–๊ณ  **์ฃผ ์•ก์…˜์ด ์œ„๋กœ** ์˜จ๋‹ค(์—„์ง€ ์œ„์น˜์— ์œ„ํ—˜ ์•ก์…˜์„
21
+ * ๋‘์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋‹ค).
22
+ *
23
+ * ์˜ค๋ฒ„๋ผ์ด๋“œ: `part`(hostยทdangerยทmain) + slot ์น˜ํ™˜.
24
+ */
25
+ export declare class ActionBar extends StyledElement<ElementParts> {
26
+ static styles: import('lit').CSSResultGroup[];
27
+ /**
28
+ * ํ™”๋ฉด ํ•˜๋‹จ์— ๊ณ ์ •ํ•œ๋‹ค(`position: sticky`).
29
+ * โš ์Šคํฌ๋กค ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค โ€” ๋ถ€๋ชจ๊ฐ€ `overflow: auto` ์—ฌ์•ผ ํ•œ๋‹ค.
30
+ */
31
+ sticky: boolean;
32
+ /**
33
+ * ์œ„ํ—˜ ์•ก์…˜ ์Šฌ๋กฏ ๋ฐฐ์ • ์ƒํƒœ.
34
+ * โ˜…CSS `:has()` ๋กœ๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค โ€” `<slot>` ์ž์‹ ์ด ์ž์‹์ด๋ผ ํ•ญ์ƒ ์ฐธ์ด๋‹ค
35
+ * (`internals/slotted.ts` ์ฐธ์กฐ). ๋นˆ ๋ž˜ํผ๊ฐ€ ๋‚จ์œผ๋ฉด ์ฃผ ์•ก์…˜์ด ๊ฐ€์šด๋ฐ๋กœ ๋ฐ€๋ฆฐ๋‹ค.
36
+ */
37
+ private hasDanger;
38
+ render(): import('lit-html').TemplateResult<1>;
39
+ }
40
+ declare global {
41
+ interface HTMLElementTagNameMap {
42
+ 'u-action-bar': ActionBar;
43
+ }
44
+ }
45
+ export {};
@@ -0,0 +1,32 @@
1
+ import e from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
+ import t from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
+ import { StyledElement as n } from "../internals/StyledElement.js";
4
+ import { slotHasContent as r } from "../internals/slotted.js";
5
+ import { styles as i } from "./ActionBar.styles.js";
6
+ import { html as a } from "lit";
7
+ import { customElement as o, property as s, state as c } from "lit/decorators.js";
8
+ //#region src/components/ActionBar.ts
9
+ var l = class extends n {
10
+ constructor(...e) {
11
+ super(...e), this.sticky = !1, this.hasDanger = !1;
12
+ }
13
+ static {
14
+ this.styles = [super.styles, i];
15
+ }
16
+ render() {
17
+ return a`
18
+ <div class="danger ${this.hasDanger ? "" : "empty"}" part="danger">
19
+ <slot name="danger"
20
+ @slotchange=${(e) => this.hasDanger = r(e.target)}
21
+ ></slot>
22
+ </div>
23
+ <div class="main" part="main"><slot></slot></div>
24
+ `;
25
+ }
26
+ };
27
+ t([s({
28
+ type: Boolean,
29
+ reflect: !0
30
+ }), e("design:type", Object)], l.prototype, "sticky", void 0), t([c(), e("design:type", Object)], l.prototype, "hasDanger", void 0), l = t([o("u-action-bar")], l);
31
+ //#endregion
32
+ export { l as ActionBar };
@@ -0,0 +1 @@
1
+ export declare const styles: import('lit').CSSResult;
@@ -0,0 +1,71 @@
1
+ import { css as e } from "lit";
2
+ //#region src/components/ActionBar.styles.ts
3
+ var t = e`
4
+ :host {
5
+ display: flex;
6
+ align-items: center;
7
+ gap: var(--u-space-sm, 8px);
8
+ padding: var(--u-space-md, 12px) 0;
9
+ /* ์ž๊ธฐ ํญ์œผ๋กœ ์ ‘ํžŒ๋‹ค โ€” ์•„๋ž˜ ์งˆ์˜์˜ ๊ธฐ์ค€. ํ™”๋ฉด ํญ์ด ์•„๋‹ˆ๋ผ ์ž๊ธฐ ์ƒํ™ฉ์„ ๋ณธ๋‹ค.
10
+ โš **์ปจํ…Œ์ด๋„ˆ๋Š” ยซ์ž์†ยป์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค** โ€” @container ์•ˆ์—์„œ :host ์ž์‹ ์„ ๊ฒจ๋ƒฅํ•˜๋ฉด
11
+ ๊ทธ ์งˆ์˜๋Š” ์ด ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ **๋ฐ”๊นฅ์˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ**๋ฅผ ๋ณธ๋‹ค(์‹ค์ธก์œผ๋กœ ๋ฐŸ์•˜๋‹ค:
12
+ 360px ์—์„œ ์ ‘ํžˆ์ง€ ์•Š์•˜๋‹ค). ๊ทธ๋ž˜์„œ ์ค„๋ฐ”๊ฟˆ ์ž์ฒด๋Š” ์—ฌ๊ธฐ์„œ ํ•ญ์ƒ ํ—ˆ์šฉํ•˜๊ณ , ์ข์„ ๋•Œ์˜
13
+ ยซํญ ์ฑ„์šฐ๊ธฐยป๋งŒ ์ž์† ๊ทœ์น™์œผ๋กœ ๊ฑด๋‹ค. */
14
+ flex-wrap: wrap;
15
+ container-type: inline-size;
16
+ }
17
+
18
+ /* ์œ„ํ—˜ ์•ก์…˜(์‚ญ์ œ ๋“ฑ)์€ **์™ผ์ชฝ ๋**, ์ฃผ ์•ก์…˜์€ ์˜ค๋ฅธ์ชฝ ๋.
19
+ โ˜…๊ฐ™์€ ๋ฌด๋ฆฌ์— ๋‘๋ฉด ยซ์ €์žฅยป์„ ๋ˆ„๋ฅด๋ ค๋‹ค ยซ์‚ญ์ œยป๋ฅผ ๋ˆ„๋ฅธ๋‹ค โ€” ๊ฑฐ๋ฆฌ๊ฐ€ ์•ˆ์ „์žฅ์น˜๋‹ค.
20
+ ์ดˆ์•ˆ(R4)์ด *"์œ„ํ—˜ ์•ก์…˜์€ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„๋ฆฌ"* ๋กœ ์š”๊ตฌํ•œ ๊ฒƒ์ด ์ด ๋ฐฐ์น˜๋‹ค. */
21
+ .danger {
22
+ display: flex;
23
+ align-items: center;
24
+ gap: var(--u-space-sm, 8px);
25
+ margin-right: auto;
26
+ }
27
+ /* ๋นˆ ์Šฌ๋กฏ ๋ž˜ํผ๋Š” ์ ‘๋Š”๋‹ค โ€” ์Šฌ๋กฏ ๋ฐฐ์ •์€ slotchange ๋กœ ์ถ”์ ํ•œ๋‹ค(internals/slotted.ts).
28
+ โš CSS :has() ๋กœ๋Š” ๋ชป ํ•œ๋‹ค: <slot> ์ž์‹ ์ด ์ž์‹์ด๋ผ :has(*) ๊ฐ€ ํ•ญ์ƒ ์ฐธ์ด๋‹ค. */
29
+ .danger.empty {
30
+ display: none;
31
+ }
32
+
33
+ .main {
34
+ display: flex;
35
+ align-items: center;
36
+ gap: var(--u-space-sm, 8px);
37
+ margin-left: auto;
38
+ }
39
+
40
+ /* ํ™”๋ฉด ํ•˜๋‹จ์— ๊ณ ์ • โ€” ๊ธด ํผ์—์„œ ์ €์žฅ ๋ฒ„ํŠผ์„ ์ฐพ์•„ ์Šคํฌ๋กคํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
41
+
42
+ ๐Ÿ”ด**์Œ์ˆ˜ ๋งˆ์ง„์œผ๋กœ ยซ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ ๋Š˜๋ฆฌ๋Š”ยป ๊ฒƒ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์ฒซ ํŒ์ด
43
+ margin: 0 calc(-1 * var(--u-space-md, 12px)) ๋กœ ์ขŒ์šฐ๋ฅผ ๋„˜๊ฒผ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€
44
+ ***๋ถ€๋ชจ๊ฐ€ ์ •ํ™•ํžˆ ๊ทธ๋งŒํผ์˜ ๊ฐ€๋กœ ํŒจ๋”ฉ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค***๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์‹ค์ธก์—์„œ
45
+ ๊ทธ ๊ฐ€์ •์ด ๊นจ์กŒ๋‹ค โ€” ์ƒ˜ํ”Œ ํ™”๋ฉด์—์„œ ์ขŒ์šฐ 12px ์”ฉ ๋„˜์ณ **๊ฐ€๋กœ ์Šคํฌ๋กค๋ฐ”๊ฐ€ ์ƒ๊ธฐ๊ณ 
46
+ ์ฃผ ์•ก์…˜(์ €์žฅ)์ด ์ž˜๋ ธ๋‹ค.** ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์†Œ๋น„์ž์˜ ์—ฌ๋ฐฑ์„ ์•Œ ์ˆ˜๋Š” ์—†๋‹ค.
47
+ โš ์ด ์ฃผ์„์— ๋ฐฑํ‹ฑ์„ ์“ฐ์ง€ ๋ง ๊ฒƒ โ€” css ํƒœ๊ทธ๋“œ ํ…œํ”Œ๋ฆฟ์„ ๊ทธ ์ž๋ฆฌ์—์„œ ๋๋‚ธ๋‹ค. */
48
+ :host([sticky]) {
49
+ position: sticky;
50
+ bottom: 0;
51
+ background-color: var(--u-bg-color, #FFFFFF);
52
+ border-top: 1px solid var(--u-border-color-weak, #EEEEEE);
53
+ padding: var(--u-space-md, 12px) 0;
54
+ }
55
+
56
+ /* ์ข์„ ๋•Œ: ๋‘ ๋ฌด๋ฆฌ๊ฐ€ ๊ฐ์ž ํ•œ ์ค„์„ ์ฐจ์ง€ํ•˜๊ณ  ์ฃผ ์•ก์…˜์ด ์œ„๋กœ ์˜จ๋‹ค.
57
+ โš ์ฃผ ์•ก์…˜์„ ์•„๋ž˜์— ๋‘๋ฉด ์œ„ํ—˜ ์•ก์…˜์ด ์—„์ง€ ์œ„์น˜์— ์˜จ๋‹ค โ€” ์ˆœ์„œ๋ฅผ ๋’ค์ง‘๋Š” ์ด์œ ๋‹ค. */
58
+ @container (max-width: 420px) {
59
+ .main {
60
+ order: -1;
61
+ width: 100%;
62
+ margin-left: 0;
63
+ }
64
+ .danger {
65
+ width: 100%;
66
+ margin-right: 0;
67
+ }
68
+ }
69
+ `;
70
+ //#endregion
71
+ export { t as styles };
@@ -17,7 +17,13 @@ type ElementParts = 'host' | 'icon' | 'title' | 'description' | 'actions';
17
17
  * <u-empty-state variant="no-results"></u-empty-state>
18
18
  * ```
19
19
  *
20
- * โš ๊ธฐ๋ณธ ๋ฌธ๊ตฌ๋Š” ํ•œ๊ตญ์–ด๋‹ค โ€” ๋‹ค๊ตญ์–ด ์†Œ๋น„์ž๋Š” `title`ยท`description` ์„ ์ค€๋‹ค.
20
+ * โš **๊ธฐ๋ณธ ๋ฌธ๊ตฌ๋Š” ์˜์–ด๋‹ค** โ€” ์ด ํŒจํ‚ค์ง€๋Š” ๋ฒ”์šฉ ์ธต์ด๋ผ ํŠน์ • ์–ธ์–ด๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
21
+ * ํ•œ๊ตญ์–ด๋Š” `registerLocale('ko', โ€ฆ)` ๋กœ ์†Œ๋น„์ž๊ฐ€ ๋“ฑ๋กํ•˜๊ณ , ํ™”๋ฉด๋ณ„๋กœ ๋ฎ์œผ๋ ค๋ฉด
22
+ * `title`ยท`description` ์„ ์ค€๋‹ค.
23
+ *
24
+ * โ˜…์ด ์ค„์€ ยซํ•œ๊ตญ์–ด๋‹คยป๋ผ๊ณ  ์ ํ˜€ ์žˆ์—ˆ๊ณ  **๊ฐ™์€ ํŒŒ์ผ์˜ `locale` ํ”„๋กœํผํ‹ฐ ์ฃผ์„์ด ยซ์˜์–ด๋‹คยป๋ผ๊ณ 
25
+ * ๋งํ•˜๊ณ  ์žˆ์—ˆ๋‹ค** โ€” ๋กœ์ผ€์ผ ์ด์ฃผ(0.9.0) ๋•Œ ํด๋ž˜์Šค ์ฃผ์„๋งŒ ๋‚ก์€ ๊ฒƒ์ด๋‹ค. ์ด JSDoc ์€
26
+ * `dist/**.d.ts` ๋กœ ๊ฒŒ์‹œ๋˜๋ฏ€๋กœ, ์†Œ๋น„์ž๋Š” **์‚ฌ์‹ค๊ณผ ๋ฐ˜๋Œ€์ธ ๋ฌธ์žฅ**์„ ์ฝ๊ณ  ์žˆ์—ˆ๋‹ค.
21
27
  */
22
28
  export declare class EmptyState extends StyledElement<ElementParts> {
23
29
  static styles: import('lit').CSSResultGroup[];
@@ -3,6 +3,10 @@ import { css as e } from "lit";
3
3
  var t = e`
4
4
  :host {
5
5
  display: block;
6
+ /* ์•„๋ž˜ @container ์งˆ์˜์˜ ๊ธฐ์ค€ โ€” ์นด๋“œ๋Š” ยซํ™”๋ฉดยป์ด ์•„๋‹ˆ๋ผ ยซ์ž๊ธฐ ํญยป์œผ๋กœ ์ ‘ํžŒ๋‹ค.
7
+ ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ์—ด๋ฆฐ 1280px ํ™”๋ฉด์˜ ์ข์€ ๋ณธ๋ฌธ์—์„œ๋„, ๋„“์€ ๋ณธ๋ฌธ์„ ๊ฐ€์ง„ ํƒœ๋ธ”๋ฆฟ์—์„œ๋„
8
+ ๊ฐ™์€ ํŒ๋‹จ์„ ํ•˜๋ ค๋ฉด ๊ธฐ์ค€์ด ์ž๊ธฐ ํญ์ด์–ด์•ผ ํ•œ๋‹ค. */
9
+ container-type: inline-size;
6
10
  background-color: var(--u-panel-bg-color, #FFFFFF);
7
11
  border: 1px solid var(--u-border-color-weak, #EEEEEE);
8
12
  /* ๋ฉด(surface) ๋‹จ โ€” ์ปจํŠธ๋กค๊ณผ ๊ฐ™์€ ๋ฐ˜๊ฒฝ์„ ์“ฐ๋ฉด ํฐ ์‚ฌ๊ฐํ˜•์ด ๊ฐ์ ธ ๋ณด์ธ๋‹ค. */
@@ -55,8 +59,30 @@ var t = e`
55
59
  display: none;
56
60
  }
57
61
 
62
+ /* ๐Ÿ”ด**๋ณธ๋ฌธ์€ ์„ธ๋กœ ํ๋ฆ„์ด๊ณ , ๊ทธ ๋ฆฌ๋“ฌ์„ ์—ฌ๊ธฐ์„œ ์ •ํ•œ๋‹ค.**
63
+ ์ข…์ „์—๋Š” padding ๋งŒ ์žˆ์–ด ๋ธ”๋ก ์ž์‹์ด **๊ฐ„๊ฒฉ ์—†์ด ๋ถ™์—ˆ๊ณ **, ๊ทธ๋ณด๋‹ค ๋‚˜์˜๊ฒŒ๋Š”
64
+ shrink-to-fit ์š”์†Œ๋“ค์ด ๊ฐ์ž ๋‹ค๋ฅธ ํญ์œผ๋กœ ์•‰์•„ **์™ผ์ชฝ ๋์ด ์–ด๊ธ‹๋‚ฌ๋‹ค**(์‹ค์ธก: ์•Œ๋ฆผ ๋„ท์„
65
+ ๋‚˜๋ž€ํžˆ ๋‘๋ฉด ๊ณ„๋‹จ์ฒ˜๋Ÿผ ๋‚ด๋ ค๊ฐ”๋‹ค). ์†Œ๋น„์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋ ค๋ฉด ์ž๊ธฐ CSS ๋ฅผ ์“ฐ๊ฒŒ ๋˜๊ณ ,
66
+ ๊ทธ ์ˆœ๊ฐ„ ์ด ํŒจํ‚ค์ง€๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
67
+ โ‡’ flex column + gap. ์ž์‹์€ ํญ์„ ์ฑ„์šฐ๊ณ  ๊ฐ„๊ฒฉ์€ ํ† ํฐ์ด ์ •ํ•œ๋‹ค. */
58
68
  .body {
59
69
  padding: var(--u-space-xl, 20px);
70
+ display: flex;
71
+ flex-direction: column;
72
+ gap: var(--u-space-md, 12px);
73
+ }
74
+
75
+ /* ์ข์„ ๋•Œ: ํ—ค๋”์˜ ํˆด๋ฐ”(๊ฒ€์ƒ‰ยทํ•„ํ„ฐ)๊ฐ€ ์ œ๋ชฉ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๊ณ  ํญ์„ ์ฑ„์šด๋‹ค.
76
+ โš **์ œ๋ชฉ๊ณผ ํˆด๋ฐ”๊ฐ€ ํ•œ ์ค„์— ๋‚จ์œผ๋ฉด ๋‘˜ ๋‹ค ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค** โ€” ์ œ๋ชฉ์€ ์ž˜๋ฆฌ๊ณ  ์ž…๋ ฅ์€
77
+ ์†๊ฐ€๋ฝ๋ณด๋‹ค ์ข์•„์ง„๋‹ค. ์ดˆ์•ˆ(R4)์ด *"์ข์€ ํ™”๋ฉด์—์„œ ์ ‘ํžˆ๋Š” ๊ทœ์น™์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ •ํ•œ๋‹ค"*
78
+ ๋กœ ์š”๊ตฌํ•œ ๊ฒƒ์ด ์ด ์ž๋ฆฌ๋‹ค. 480px ๋Š” ยซ์ œ๋ชฉ + ์ž…๋ ฅยป์ด ํ•จ๊ป˜ ์„ค ์ˆ˜ ์žˆ๋Š” ํ•˜ํ•œ์ด๋‹ค. */
79
+ @container (max-width: 480px) {
80
+ .header {
81
+ flex-wrap: wrap;
82
+ }
83
+ .actions {
84
+ width: 100%;
85
+ }
60
86
  }
61
87
  /* ํ‘œ๋ฅผ ์นด๋“œ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ ๋ถ™์ผ ๋•Œ. ํ—ค๋”๊ฐ€ ์žˆ์œผ๋ฉด ์œ„ ์—ฌ๋ฐฑ๋งŒ ๋‚จ๊ธด๋‹ค โ€”
62
88
  0 ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์ œ๋ชฉ๊ณผ ํ‘œ๊ฐ€ ๋ถ™์–ด ์ฝ๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. */
@@ -7,6 +7,8 @@ var t = e`
7
7
  gap: var(--u-space-md, 12px);
8
8
  flex-wrap: wrap;
9
9
  margin-bottom: var(--u-space-2xl, 24px);
10
+ /* ์•„๋ž˜ @container ์งˆ์˜์˜ ๊ธฐ์ค€ โ€” ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ยซํ™”๋ฉดยป์ด ์•„๋‹ˆ๋ผ ยซ์ž๊ธฐ ํญยป์œผ๋กœ ์ ‘ํžŒ๋‹ค. */
11
+ container-type: inline-size;
10
12
  }
11
13
 
12
14
  .heading {
@@ -76,9 +78,16 @@ var t = e`
76
78
  display: none;
77
79
  }
78
80
 
79
- /* ์ข์€ ํ™”๋ฉด: ์•ก์…˜์ด ์ œ๋ชฉ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๊ณ  **์™ผ์ชฝ ์ •๋ ฌ**์ด ๋œ๋‹ค.
80
- โ˜…์˜ค๋ฅธ์ชฝ ์ •๋ ฌ์„ ์œ ์ง€ํ•˜๋ฉด ์†๊ฐ€๋ฝ์ด ๋‹ฟ๊ธฐ ์–ด๋ ค์šด ์ชฝ์œผ๋กœ ๋ชฐ๋ฆฐ๋‹ค. */
81
- @media (max-width: 640px) {
81
+ /* ์ข์„ ๋•Œ: ์•ก์…˜์ด ์ œ๋ชฉ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€๊ณ  **์™ผ์ชฝ ์ •๋ ฌ**์ด ๋œ๋‹ค.
82
+ โ˜…์˜ค๋ฅธ์ชฝ ์ •๋ ฌ์„ ์œ ์ง€ํ•˜๋ฉด ์†๊ฐ€๋ฝ์ด ๋‹ฟ๊ธฐ ์–ด๋ ค์šด ์ชฝ์œผ๋กœ ๋ชฐ๋ฆฐ๋‹ค.
83
+
84
+ ๐Ÿ”ด**ยซํ™”๋ฉดยป์ด ์•„๋‹ˆ๋ผ ยซ์ž๊ธฐ ํญยป์„ ๋ณธ๋‹ค(@container).** ์ข…์ „์—๋Š” @media ์˜€๊ณ , ๊ทธ๋Ÿฌ๋ฉด
85
+ ์ด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ **์ž๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ข์€์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ** ์ ‘ํ˜”๋‹ค โ€” ์…ธ ์•ˆ์—์„œ ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ์—ด๋ ค
86
+ ๋ณธ๋ฌธ์ด 500px ์ธ 1280px ํ™”๋ฉด์—์„œ๋Š” ์ ‘ํžˆ์ง€ ์•Š๊ณ , ๋ฐ˜๋Œ€๋กœ ๋„“์€ ๋ณธ๋ฌธ์„ ๊ฐ€์ง„ ์ข์€ ํ™”๋ฉด์—์„œ๋Š”
87
+ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ ‘ํ˜”๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์Šค์Šค๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ **์ž๊ธฐ ์ปจํ…Œ์ด๋„ˆ ํญ**๋ฟ์ด๋‹ค.
88
+ โš container-type: inline-size ๋Š” ์ธ๋ผ์ธ ์ถ• containment ๋ฅผ ๋งŒ๋“ ๋‹ค โ€” ์ด ํ˜ธ์ŠคํŠธ๋Š” ๋ธ”๋ก
89
+ ๋ ˆ๋ฒจ์ด๊ณ  ์ž์‹์ด ํ˜ธ์ŠคํŠธ ํญ์— ๊ธฐ๋Œ€๋ฏ€๋กœ ๋ฌดํ•ดํ•˜๋‹ค(ํญ๋ณ„ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ์‹œํ•œ๋‹ค). */
90
+ @container (max-width: 640px) {
82
91
  .actions {
83
92
  margin-left: 0;
84
93
  width: 100%;
@@ -1,23 +1,25 @@
1
1
  import e from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
2
  import t from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
- import { styles as r } from "./SidebarButton.styles.js";
5
- import { html as i } from "lit";
6
- import { customElement as a, property as o } from "lit/decorators.js";
4
+ import { DEFAULT_NAV_ICON as r } from "../internals/nav-icon.js";
5
+ import { styles as i } from "./SidebarButton.styles.js";
6
+ import { html as a } from "lit";
7
+ import { customElement as o, property as s } from "lit/decorators.js";
7
8
  import "@iyulab/components/dist/components/icon/UIcon.js";
8
9
  //#region src/components/SidebarButton.ts
9
- var s = class extends n {
10
+ var c = class extends n {
10
11
  constructor(...e) {
11
12
  super(...e), this.compact = !1;
12
13
  }
13
14
  static {
14
- this.styles = [super.styles, r];
15
+ this.styles = [super.styles, i];
15
16
  }
16
17
  render() {
17
- return i`
18
+ return a`
18
19
  <button part="base" ?compact=${this.compact}>
19
- <u-icon part="icon" ?hidden=${!this.icon}
20
+ <u-icon part="icon"
20
21
  .name=${this.icon}
22
+ .fallback=${r}
21
23
  ></u-icon>
22
24
  <span part="label" ?hidden=${this.compact}>
23
25
  ${this.label}
@@ -26,9 +28,9 @@ var s = class extends n {
26
28
  `;
27
29
  }
28
30
  };
29
- t([o({
31
+ t([s({
30
32
  type: Boolean,
31
33
  reflect: !0
32
- }), e("design:type", Object)], s.prototype, "compact", void 0), t([o({ type: String }), e("design:type", String)], s.prototype, "icon", void 0), t([o({ type: String }), e("design:type", Object)], s.prototype, "label", void 0), s = t([a("u-sidebar-button")], s);
34
+ }), e("design:type", Object)], c.prototype, "compact", void 0), t([s({ type: String }), e("design:type", String)], c.prototype, "icon", void 0), t([s({ type: String }), e("design:type", Object)], c.prototype, "label", void 0), c = t([o("u-sidebar-button")], c);
33
35
  //#endregion
34
- export { s as SidebarButton };
36
+ export { c as SidebarButton };
@@ -45,11 +45,12 @@ var t = e`
45
45
  font-size: 20px;
46
46
  }
47
47
 
48
+ /* โ˜…SidebarLink ์™€ ๊ฐ™์€ ์ž๋ฆฌยท๊ฐ™์€ ๋‹จ(label). ๋‘ ๊ณณ์ด ์–ด๊ธ‹๋‚˜๋ฉด ๋ชฉ๋ก์ด ๊ณ„๋‹จ์ด ๋œ๋‹ค. */
48
49
  span {
49
50
  flex: 1;
50
- font-size: 14px;
51
- font-weight: 500;
52
- line-height: 20px;
51
+ font-size: var(--u-text-label-size, 13px);
52
+ font-weight: var(--u-text-label-weight, 600);
53
+ line-height: var(--u-text-label-leading, 1.5);
53
54
  white-space: nowrap;
54
55
  overflow: hidden;
55
56
  text-overflow: ellipsis;
@@ -1,29 +1,37 @@
1
1
  import e from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
2
  import t from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
- import { SidebarLink as r } from "./SidebarLink.js";
5
- import { styles as i } from "./SidebarGroup.styles.js";
6
- import { html as a } from "lit";
7
- import { customElement as o, property as s } from "lit/decorators.js";
4
+ import { DEFAULT_NAV_ICON as r } from "../internals/nav-icon.js";
5
+ import { SidebarLink as i } from "./SidebarLink.js";
6
+ import { styles as a } from "./SidebarGroup.styles.js";
7
+ import { html as o } from "lit";
8
+ import { customElement as s, property as c } from "lit/decorators.js";
8
9
  import "@iyulab/components/dist/components/icon/UIcon.js";
9
10
  //#region src/components/SidebarGroup.ts
10
- var c = class extends n {
11
+ var l = class extends n {
11
12
  constructor(...e) {
12
13
  super(...e), this.compact = !1, this.selected = !1, this.collapsed = !0, this.handleButtonClick = (e) => {
13
- this.compact ? ((this.shadowRoot?.querySelector("slot")?.assignedElements({ flatten: !0 }).find((e) => e instanceof r))?.renderRoot.querySelector("u-link"))?.click() : this.collapsed = !this.collapsed;
14
+ this.compact ? ((this.shadowRoot?.querySelector("slot")?.assignedElements({ flatten: !0 }).find((e) => e instanceof i))?.renderRoot.querySelector("u-link"))?.click() : this.collapsed = !this.collapsed;
14
15
  };
15
16
  }
16
17
  static {
17
- this.styles = [super.styles, i];
18
+ this.styles = [super.styles, a];
18
19
  }
19
20
  render() {
20
- return a`
21
+ return o`
21
22
  <button part="header"
22
23
  ?compact=${this.compact}
23
24
  ?selected=${this.selected}
24
25
  @click=${this.handleButtonClick}>
25
- <u-icon class="icon" part="icon" ?hidden=${!this.icon}
26
+ <!--
27
+ โš  ?hidden ์„ ๊ฑธ์ง€ ์•Š๋Š”๋‹ค. ์ ‘ํžŒ ์ƒํƒœ์—์„œ๋Š” ๋ผ๋ฒจ๊ณผ ์บ๋Ÿฟ์ด ๋ชจ๋‘ ์ˆจ์œผ๋ฏ€๋กœ,
28
+ ์•„์ด์ฝ˜๊นŒ์ง€ ์ˆจ๊ธฐ๋ฉด **๋ฒ„ํŠผ์ด ํ†ต์งธ๋กœ ๋น„์–ด ๋ˆ„๋ฅผ ๊ฒƒ์ด ์—†์–ด์ง„๋‹ค** โ€” ์ด๊ฒƒ์ด
29
+ SidebarLinkยทSidebarButton ์—์„œ ํด๋ฐฑ์„ ๋„์ž…ํ•œ ๋ฐ”๋กœ ๊ทธ ๊ฒฐํ•จ์ด๊ณ , ์ด ์ž๋ฆฌ๋งŒ
30
+ ๋น ์ ธ ์žˆ์—ˆ๋‹ค.
31
+ -->
32
+ <u-icon class="icon" part="icon"
26
33
  .name=${this.icon}
34
+ .fallback=${r}
27
35
  ></u-icon>
28
36
  <span class="label" part="label" ?hidden=${this.compact}>
29
37
  ${this.label}
@@ -42,15 +50,15 @@ var c = class extends n {
42
50
  `;
43
51
  }
44
52
  };
45
- t([s({
53
+ t([c({
46
54
  type: Boolean,
47
55
  reflect: !0
48
- }), e("design:type", Boolean)], c.prototype, "compact", void 0), t([s({
56
+ }), e("design:type", Boolean)], l.prototype, "compact", void 0), t([c({
49
57
  type: Boolean,
50
58
  reflect: !0
51
- }), e("design:type", Boolean)], c.prototype, "selected", void 0), t([s({
59
+ }), e("design:type", Boolean)], l.prototype, "selected", void 0), t([c({
52
60
  type: Boolean,
53
61
  reflect: !0
54
- }), e("design:type", Boolean)], c.prototype, "collapsed", void 0), t([s({ type: String }), e("design:type", String)], c.prototype, "icon", void 0), t([s({ type: String }), e("design:type", Object)], c.prototype, "label", void 0), c = t([o("u-sidebar-group")], c);
62
+ }), e("design:type", Boolean)], l.prototype, "collapsed", void 0), t([c({ type: String }), e("design:type", String)], l.prototype, "icon", void 0), t([c({ type: String }), e("design:type", Object)], l.prototype, "label", void 0), l = t([s("u-sidebar-group")], l);
55
63
  //#endregion
56
- export { c as SidebarGroup };
64
+ export { l as SidebarGroup };
@@ -53,11 +53,16 @@ var t = e`
53
53
  font-size: 20px;
54
54
  }
55
55
 
56
+ /*
57
+ * โ˜…๊ทธ๋ฃน๋„ ์ž์‹ ๋งํฌ์™€ ๊ฐ™์€ label ๋‹จ์ด๋‹ค. ์ข…์ „์—๋Š” ๊ตต๊ธฐ๋กœ ์œ„๊ณ„๋ฅผ ๋ƒˆ์ง€๋งŒ(600 vs 500),
58
+ * ์ž์‹์€ ์ด๋ฏธ **32px ๋“ค์—ฌ์“ฐ๊ธฐ + 2px ๋ ˆ์ผ + ์บ๋Ÿฟ**์œผ๋กœ ๊ฐˆ๋ฆฐ๋‹ค โ€” ๊ตต๊ธฐ ํ•œ ๋‹จ์„ ์œ„๊ณ„์—
59
+ * ๋” ์“ฐ๋ฉด ์Šค์ผ€์ผ ๋ฐ–์˜ ๋‹ค์„ฏ ๋ฒˆ์งธ ๊ฐ’์ด ์ƒ๊ธด๋‹ค. ์œ„๊ณ„๋Š” ๋ฐฐ์น˜๊ฐ€ ์ง€๊ณ  ๋‹จ์€ ์šฉ๋„๊ฐ€ ์ง„๋‹ค.
60
+ */
56
61
  .label {
57
62
  flex: 1;
58
- font-size: 14px;
59
- line-height: 20px;
60
- font-weight: 600;
63
+ font-size: var(--u-text-label-size, 13px);
64
+ line-height: var(--u-text-label-leading, 1.5);
65
+ font-weight: var(--u-text-label-weight, 600);
61
66
  overflow: hidden;
62
67
  white-space: nowrap;
63
68
  text-overflow: ellipsis;
@@ -1,24 +1,26 @@
1
1
  import e from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
2
  import t from "../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
3
  import { StyledElement as n } from "../internals/StyledElement.js";
4
- import { styles as r } from "./SidebarLink.styles.js";
5
- import { html as i } from "lit";
6
- import { customElement as a, property as o } from "lit/decorators.js";
4
+ import { DEFAULT_NAV_ICON as r } from "../internals/nav-icon.js";
5
+ import { styles as i } from "./SidebarLink.styles.js";
6
+ import { html as a } from "lit";
7
+ import { customElement as o, property as s } from "lit/decorators.js";
7
8
  import "@iyulab/components/dist/components/icon/UIcon.js";
8
9
  //#region src/components/SidebarLink.ts
9
- var s = class extends n {
10
+ var c = class extends n {
10
11
  constructor(...e) {
11
12
  super(...e), this.selected = !1, this.compact = !1;
12
13
  }
13
14
  static {
14
- this.styles = [super.styles, r];
15
+ this.styles = [super.styles, i];
15
16
  }
16
17
  render() {
17
- return i`
18
+ return a`
18
19
  <u-link .href=${this.href || "#"}>
19
20
  <div class="container" part="base" ?compact=${this.compact}>
20
- <u-icon part="icon" ?hidden=${!this.icon}
21
+ <u-icon part="icon"
21
22
  .name=${this.icon}
23
+ .fallback=${r}
22
24
  ></u-icon>
23
25
  <span part="label" ?hidden=${this.compact}>
24
26
  ${this.label}
@@ -28,9 +30,9 @@ var s = class extends n {
28
30
  `;
29
31
  }
30
32
  };
31
- t([o({
33
+ t([s({
32
34
  type: Boolean,
33
35
  reflect: !0
34
- }), e("design:type", Object)], s.prototype, "selected", void 0), t([o({ type: Boolean }), e("design:type", Object)], s.prototype, "compact", void 0), t([o({ type: String }), e("design:type", String)], s.prototype, "icon", void 0), t([o({ type: String }), e("design:type", Object)], s.prototype, "label", void 0), t([o({ type: String }), e("design:type", String)], s.prototype, "href", void 0), t([o({ type: String }), e("design:type", Object)], s.prototype, "pattern", void 0), s = t([a("u-sidebar-link")], s);
36
+ }), e("design:type", Object)], c.prototype, "selected", void 0), t([s({ type: Boolean }), e("design:type", Object)], c.prototype, "compact", void 0), t([s({ type: String }), e("design:type", String)], c.prototype, "icon", void 0), t([s({ type: String }), e("design:type", Object)], c.prototype, "label", void 0), t([s({ type: String }), e("design:type", String)], c.prototype, "href", void 0), t([s({ type: String }), e("design:type", Object)], c.prototype, "pattern", void 0), c = t([o("u-sidebar-link")], c);
35
37
  //#endregion
36
- export { s as SidebarLink };
38
+ export { c as SidebarLink };
@@ -50,11 +50,16 @@ var t = e`
50
50
  font-size: 20px;
51
51
  }
52
52
 
53
+ /*
54
+ * โ˜…๋‚ด๋น„ ํ•ญ๋ชฉ์€ ยซ๋Œ€์ƒ์˜ ์งง์€ ์ด๋ฆ„ยป = label ๋‹จ์ด๋‹ค(์šฉ๋„ ๋ฐฐ์ • โ€” DL-157-4).
55
+ * โš ํ–‰ ๋†’์ด๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค: 13 x 1.5 = 19.5px < ์•„์ด์ฝ˜ 20px ์ด๋ผ ํ–‰์„ ์žก๋Š” ๊ฒƒ์€
56
+ * ์—ฌ์ „ํžˆ ์•„์ด์ฝ˜์ด๋‹ค. ์ ‘ํžŒ ์‚ฌ์ด๋“œ๋ฐ”(์•„์ด์ฝ˜๋งŒ)์™€ ํŽผ์นœ ์‚ฌ์ด๋“œ๋ฐ”์˜ ํ–‰ ๋†’์ด๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
57
+ */
53
58
  span {
54
59
  flex: 1;
55
- font-size: 14px;
56
- line-height: 20px;
57
- font-weight: 500;
60
+ font-size: var(--u-text-label-size, 13px);
61
+ line-height: var(--u-text-label-leading, 1.5);
62
+ font-weight: var(--u-text-label-weight, 600);
58
63
  white-space: nowrap;
59
64
  overflow: hidden;
60
65
  text-overflow: ellipsis;
@@ -19,20 +19,28 @@ var t = e`
19
19
  ํ…์ŠคํŠธ ๋‹จ์€ --u-txt-color-weak ํ•˜๋‚˜๋ฟ์ด๊ณ  ๊ทธ ๊ฐ’์€ ํฐ ๋ฐฐ๊ฒฝ์—์„œ 2.68:1 ์ด๋ผ
20
20
  WCAG AA(4.5:1)์— ๋ฏธ๋‹ฌํ•œ๋‹ค. ํ˜„ํ–‰ ๋‘ ๊ฐ’์€ 6.19:1 ยท 4.61:1 ๋กœ ํ†ต๊ณผํ•œ๋‹ค.
21
21
  โ‡’ ์—ญํ•  ์ธต์— AA ๋ฅผ ๋„˜๋Š” ๋ณด์กฐ ํ…์ŠคํŠธ ๋‹จ์ด ์ƒ๊ธฐ๋ฉด ๊ทธ๋•Œ ์˜ฎ๊ธด๋‹ค. */
22
+ /*
23
+ * โ˜…ํฌ๊ธฐยท๊ตต๊ธฐยท์ž๊ฐ„์€ ์Šค์ผ€์ผ์˜ ๋‹จ์œผ๋กœ ์˜ฎ๊ฒผ๋‹ค(์šฉ๋„ ๋ฐฐ์ • โ€” DL-157-4). ์œ„ ์ฃผ์„์€ **์ƒ‰**์—
24
+ * ๋Œ€ํ•œ ๊ฒƒ์ด๊ณ  ๊ทธ๋Œ€๋กœ ์œ ํšจํ•˜๋‹ค: ๋‘ ์ƒ‰์€ ์—ฌ์ „ํžˆ ํŒ”๋ ˆํŠธ๋ฅผ ์ง์ ‘ ์ฝ๋Š”๋‹ค.
25
+ * โš  overline ์— ๋Œ€๋ฌธ์ž ๋ณ€ํ™˜์„ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค โ€” ์ด ์ค„์— ellipsis ๊ฐ€ ์žˆ์–ด ์ž˜๋ฆผ์ด ๋Š˜๊ณ ,
26
+ * ์„น์…˜ ์ด๋ฆ„์€ ์†Œ๋น„์ž๊ฐ€ ์“ด ๊ธ€์ž๋‹ค(CJK ์—๋Š” ํšจ๊ณผ๋„ ์—†๋‹ค).
27
+ */
22
28
  .title {
23
29
  color: var(--u-neutral-700, #616161);
24
- font-size: 12px;
25
- font-weight: 700;
26
- letter-spacing: 0.5px;
30
+ font-size: var(--u-text-overline-size, 11px);
31
+ font-weight: var(--u-text-overline-weight, 700);
32
+ line-height: var(--u-text-overline-leading, 1.45);
33
+ letter-spacing: var(--u-text-overline-tracking, 0.06em);
27
34
  white-space: nowrap;
28
35
  overflow: hidden;
29
36
  text-overflow: ellipsis;
30
37
  }
31
-
38
+
32
39
  .subtitle {
33
40
  color: var(--u-neutral-600, #757575);
34
- font-size: 11px;
35
- font-weight: 300;
41
+ font-size: var(--u-text-caption-size, 12px);
42
+ font-weight: var(--u-text-caption-weight, 400);
43
+ line-height: var(--u-text-caption-leading, 1.5);
36
44
  }
37
45
 
38
46
  .items {
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export { GroupBox } from './components/GroupBox.js';
9
9
  export { InfoSection } from './components/InfoSection.js';
10
10
  export { InfoField, isBlank } from './components/InfoField.js';
11
11
  export { EmptyState } from './components/EmptyState.js';
12
+ export { ActionBar } from './components/ActionBar.js';
12
13
  export { registerLocale, setDefaultLocale, getLocaleStrings, getDefaultLocale, } from './internals/locale.js';
13
14
  export type { ModernAppLocaleStrings } from './internals/locale.js';
14
15
  export { app };
package/dist/index.js CHANGED
@@ -6,7 +6,8 @@ import { GroupBox as s } from "./components/GroupBox.js";
6
6
  import { InfoSection as c } from "./components/InfoSection.js";
7
7
  import { InfoField as l, isBlank as u } from "./components/InfoField.js";
8
8
  import { EmptyState as d } from "./components/EmptyState.js";
9
+ import { ActionBar as f } from "./components/ActionBar.js";
9
10
  //#region src/index.ts
10
- var f = e;
11
+ var p = e;
11
12
  //#endregion
12
- export { d as EmptyState, s as GroupBox, l as InfoField, c as InfoSection, o as PageHeader, e as app, f as default, t as filterSidebarItems, n as getDefaultLocale, r as getLocaleStrings, u as isBlank, i as registerLocale, a as setDefaultLocale };
13
+ export { f as ActionBar, d as EmptyState, s as GroupBox, l as InfoField, c as InfoSection, o as PageHeader, e as app, p as default, t as filterSidebarItems, n as getDefaultLocale, r as getLocaleStrings, u as isBlank, i as registerLocale, a as setDefaultLocale };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ๋‚ด๋น„๊ฒŒ์ด์…˜ ํ•ญ๋ชฉ์˜ **๊ธฐ๋ณธ ์•„์ด์ฝ˜** โ€” ์•„์ด์ฝ˜์ด ์—†๊ฑฐ๋‚˜ ํ•ด์„์— ์‹คํŒจํ–ˆ์„ ๋•Œ ๋Œ€์‹  ๊ทธ๋ฆฐ๋‹ค.
3
+ *
4
+ * ๐Ÿ”ด**์™œ ํ•„์š”ํ•œ๊ฐ€ โ€” ยซ์•ˆ ๋ณด์ธ๋‹คยป๊ฐ€ ยซ๋ˆ„๋ฅผ ์ˆ˜ ์—†๋‹คยป๊ฐ€ ๋˜๋Š” ์ž๋ฆฌ๋‹ค.**
5
+ * ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ์ ‘ํžˆ๋ฉด(`compact`) ๋ผ๋ฒจ์ด ์ˆจ๊ณ  ์•„์ด์ฝ˜๋งŒ ๋‚จ๋Š”๋‹ค. ๊ทธ ์•„์ด์ฝ˜์ด ์—†์œผ๋ฉด ๊ทธ ๋ฉ”๋‰ด๋Š”
6
+ * **๋†’์ด๋งŒ ์žˆ๊ณ  ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๋นˆ ์ค„**์ด ๋˜์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ํ™”๋ฉด์œผ๋กœ ๊ฐˆ ์ˆ˜๋‹จ์ด ํ†ต์งธ๋กœ ์‚ฌ๋ผ์ง„๋‹ค.
7
+ * ์‹ค์ธก์œผ๋กœ ๋ฐŸ์•˜๋‹ค โ€” ์ƒ˜ํ”Œ์˜ `Items` ๋ฉ”๋‰ด๊ฐ€ `icon: 'table'` ์„ ์„ ์–ธํ–ˆ๋Š”๋ฐ ๊ทธ ํŒŒ์ผ์ด ์—†์–ด
8
+ * ์•„์ด์ฝ˜์ด ๊ทธ๋ ค์ง€์ง€ ์•Š์•˜๊ณ , ์ ‘์œผ๋ฉด ๊ณ ๋ฅผ ์ˆ˜ ์—†์—ˆ๋‹ค.
9
+ *
10
+ * โš **ยซ์ด๋ฆ„์ด ์—†์„ ๋•Œยป๋งŒ ๋ง‰์œผ๋ฉด ๋ถ€์กฑํ•˜๋‹ค.** ์‹ค์ œ ์‚ฌ๋ก€๋Š” *์ด๋ฆ„์€ ์žˆ๋Š”๋ฐ ํ•ด์„์ด ์‹คํŒจํ•œ* ์ชฝ์ด์—ˆ๋‹ค
11
+ * (404 ยท ํŒŒ์‹ฑ ์‹คํŒจ). ๊ทธ๋ž˜์„œ ํด๋ฐฑ์€ `u-icon` ์˜ **ํ•ด์„ ์‹คํŒจ ์ง€์ **์— ๊ฑธ๋ ค ์žˆ๋‹ค(`fallback` ์†์„ฑ).
12
+ *
13
+ * โš **์ด SVG ๋Š” ์ธ๋ผ์ธ์ด๋‹ค โ€” ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค์ง€ ์•Š๋Š”๋‹ค.** ํด๋ฐฑ์ด ๋‹ค์‹œ ๋„คํŠธ์›Œํฌ์— ์˜์กดํ•˜๋ฉด
14
+ * *"์•„์ด์ฝ˜ ํด๋”์— ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์†Œ๋น„์ž"* ์—๊ฒŒ ๊ฐ™์€ ์‹คํŒจ๊ฐ€ ๊ทธ๋Œ€๋กœ ์žฌํ˜„๋œ๋‹ค.
15
+ *
16
+ * ๋ชจ์–‘์€ **ํ๋ธŒ**๋‹ค โ€” ํŠน์ • ์˜๋ฏธ๋ฅผ ์ฃผ์žฅํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ยซํ•ญ๋ชฉยป์„ ๋œปํ•˜๋Š” ์ค‘๋ฆฝ ๊ธฐํ˜ธ์ด๊ณ ,
17
+ * ์ด ๋ฆฌํฌ์˜ ๋‹ค๋ฅธ ์•„์ด์ฝ˜๊ณผ ๊ฐ™์€ ๊ณ„์—ด(Bootstrap Icons, 16 viewBox, `currentColor` fill)์ด๋‹ค.
18
+ */
19
+ export declare const DEFAULT_NAV_ICON = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M8.186 1.113a.5.5 0 0 0-.372 0L1.846 3.5 8 5.961 14.154 3.5zM15 4.239l-6.5 2.6v7.922l6.5-2.6V4.24zM7.5 14.762V6.838L1 4.239v7.923zM7.443.184a1.5 1.5 0 0 1 1.114 0l7.129 2.852A.5.5 0 0 1 16 3.5v8.662a1 1 0 0 1-.629.928l-7.185 2.874a.5.5 0 0 1-.372 0L.63 13.09a1 1 0 0 1-.63-.928V3.5a.5.5 0 0 1 .314-.464z\"/></svg>";
@@ -0,0 +1,4 @@
1
+ //#region src/internals/nav-icon.ts
2
+ var e = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M8.186 1.113a.5.5 0 0 0-.372 0L1.846 3.5 8 5.961 14.154 3.5zM15 4.239l-6.5 2.6v7.922l6.5-2.6V4.24zM7.5 14.762V6.838L1 4.239v7.923zM7.443.184a1.5 1.5 0 0 1 1.114 0l7.129 2.852A.5.5 0 0 1 16 3.5v8.662a1 1 0 0 1-.629.928l-7.185 2.874a.5.5 0 0 1-.372 0L.63 13.09a1 1 0 0 1-.63-.928V3.5a.5.5 0 0 1 .314-.464z\"/></svg>";
3
+ //#endregion
4
+ export { e as DEFAULT_NAV_ICON };
@@ -29,12 +29,19 @@ var t = e`
29
29
  object-fit: contain;
30
30
  }
31
31
 
32
+ /*
33
+ * โ˜…๋‹จ ๋ฐฐ์ •์€ ยซ๊ด€์ธก๊ฐ’ ๊ทผ์‚ฌยป๊ฐ€ ์•„๋‹ˆ๋ผ ยซ์šฉ๋„ยป๋กœ ํ•œ๋‹ค(DL-157-4) โ€” ์ด ์ž๋ฆฌ๋Š” ์•ฑ์˜ ์ œ๋ชฉ์ด๋‹ค.
34
+ * ์ข…์ „ 18px ์€ ์Šค์ผ€์ผ์— ์—†๋Š” ๊ฐ’์ด์—ˆ๊ณ , ๊ฐ™์€ ํŒ์ •์„ ์ด๋ฏธ u-dialogยทu-drawer ์ œ๋ชฉ์—
35
+ * ๋‚ด๋ฆฐ ์ ์ด ์žˆ๋‹ค(L2-3, 18px โ†’ subtitle).
36
+ * โš ์ค„ ๋ฐ•์Šค๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค: 16 x 1.5 = 24px = ์ข…์ „ line-height. ํ—ค๋” ๋†’์ด ๋ถˆ๋ณ€.
37
+ */
32
38
  .title {
33
39
  flex: 1;
34
40
  color: var(--u-txt-color, #212121);
35
- font-size: 18px;
36
- line-height: 24px;
37
- font-weight: 700;
41
+ font-size: var(--u-text-subtitle-size, 16px);
42
+ line-height: var(--u-text-subtitle-leading, 1.5);
43
+ font-weight: var(--u-text-subtitle-weight, 600);
44
+ letter-spacing: var(--u-text-subtitle-tracking, 0);
38
45
  white-space: nowrap;
39
46
  overflow: hidden;
40
47
  text-overflow: ellipsis;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@iyulab/modern-app",
3
3
  "description": "web-framework by iyulab based on lit-element",
4
- "version": "0.9.0",
4
+ "version": "0.11.0",
5
5
  "keywords": [
6
6
  "iyulab",
7
7
  "web-framework",
@@ -37,8 +37,9 @@
37
37
  "test": "vitest run",
38
38
  "test:watch": "vitest",
39
39
  "start": "vite",
40
- "build": "vite build",
41
- "test:browser": "vitest run --project=browser"
40
+ "build": "npm run typecheck && vite build",
41
+ "test:browser": "vitest run --project=browser",
42
+ "typecheck": "tsc --noEmit"
42
43
  },
43
44
  "dependencies": {
44
45
  "@iyulab/components": "^1.21.0",
@@ -214,6 +214,20 @@ Sidebar states: `'default'` | `'slim'` | `'modal'` | `'mobile'` | `'mobile-open'
214
214
 
215
215
  ---
216
216
 
217
+ ## LOB primitives
218
+
219
+ Screen-building components this package registers. They exist so the same skeleton is not
220
+ re-assembled per screen โ€” that is where a product stops looking like one product.
221
+
222
+ - [`u-page-header`](./references/components/page-header.md) โ€” Screen header: back link, title, subtitle, status and action slots
223
+ - [`u-group-box`](./references/components/group-box.md) โ€” Titled card with trailing header actions; the unit detail screens are built from
224
+ - [`u-info-section`](./references/components/info-section.md) โ€” Responsive grid for label/value pairs; container width picks the column count
225
+ - [`u-info-field`](./references/components/info-field.md) โ€” Read-only label/value pair that keeps "not set" and "zero" distinct
226
+ - [`u-empty-state`](./references/components/empty-state.md) โ€” Empty list or empty search, worded differently because they are different facts
227
+ - [`u-action-bar`](./references/components/action-bar.md) โ€” Closing action row with a separated destructive group
228
+
229
+ ---
230
+
217
231
  ## Full `AppConfig` reference
218
232
 
219
233
  See [references/api.md](./references/api.md) for all TypeScript interfaces.
@@ -0,0 +1,38 @@
1
+ # u-action-bar
2
+
3
+ **Tag:** `u-action-bar`
4
+
5
+ The row of actions that closes a form or a detail screen: primary actions on the leading edge,
6
+ destructive ones separated on the trailing edge.
7
+
8
+ ```html
9
+ <u-action-bar sticky>
10
+ <u-button variant="solid">Save</u-button>
11
+ <u-button variant="outline">Cancel</u-button>
12
+ <u-button slot="danger" color="danger">Delete</u-button>
13
+ </u-action-bar>
14
+ ```
15
+
16
+ ## Slots
17
+
18
+ | Name | Description |
19
+ |------|-------------|
20
+ | *(default)* | Primary actions |
21
+ | `danger` | Destructive actions, pushed to the trailing edge |
22
+
23
+ ## Properties
24
+
25
+ | Property | Type | Default | Reflect | Description |
26
+ |----------|------|---------|---------|-------------|
27
+ | `sticky` | `boolean` | `false` | โœ“ | Pin to the bottom of the scroll container |
28
+
29
+ ## CSS Parts
30
+
31
+ | Part | Description |
32
+ |------|-------------|
33
+ | `main` | Primary action group |
34
+ | `danger` | Destructive action group |
35
+
36
+ โš  `sticky` adds **vertical** padding only. It deliberately does not stretch to the container
37
+ edges with negative margins โ€” that would assume the parent has exactly that much horizontal
38
+ padding, and when the assumption is wrong the bar overflows and clips its own buttons.
@@ -0,0 +1,43 @@
1
+ # u-empty-state
2
+
3
+ **Tag:** `u-empty-state`
4
+
5
+ Shown when a list or a search comes back with nothing.
6
+
7
+ ๐Ÿ”ด **"there is no data" and "no results matched" are different facts.** The first means
8
+ *nothing has been created yet* and the next action is **create**. The second means *nothing
9
+ matches these conditions* and the next action is **change the filter**. Show the same wording
10
+ for both and a user with a filter still applied reads it as *"my data disappeared"*.
11
+
12
+ ```html
13
+ <u-empty-state variant="no-data" title="No orders yet">
14
+ <u-button slot="actions">New order</u-button>
15
+ </u-empty-state>
16
+
17
+ <u-empty-state variant="no-results"></u-empty-state>
18
+ ```
19
+
20
+ ## Slots
21
+
22
+ | Name | Description |
23
+ |------|-------------|
24
+ | `icon` | Replaces the built-in icon |
25
+ | `actions` | Next-step buttons |
26
+
27
+ ## Properties
28
+
29
+ | Property | Type | Default | Reflect | Description |
30
+ |----------|------|---------|---------|-------------|
31
+ | `variant` | `'no-data'\|'no-results'` | `'no-data'` | | Which fact is being shown; changes the default wording |
32
+ | `title` | `string` | `''` | | Override the default title |
33
+ | `description` | `string` | `''` | | Override the default description |
34
+ | `locale` | `string` | `''` | | Locale tag override for built-in strings |
35
+
36
+ ## CSS Parts
37
+
38
+ | Part | Description |
39
+ |------|-------------|
40
+ | `icon` ยท `title` ยท `description` ยท `actions` | The four regions |
41
+
42
+ โš  Default wording is **English** โ€” register others with `registerLocale('ko', โ€ฆ)`, or pass
43
+ `title`/`description` per screen.
@@ -0,0 +1,41 @@
1
+ # u-group-box
2
+
3
+ **Tag:** `u-group-box`
4
+
5
+ A titled card โ€” the unit LOB detail screens are built from.
6
+
7
+ `u-card` gives you a surface. What actually repeats on these screens is *surface + title +
8
+ trailing actions*, and assembling that by hand is how title sizes, padding, and dividers end
9
+ up different on every screen.
10
+
11
+ ```html
12
+ <u-group-box title="Receivables">
13
+ <a slot="actions" href="/receivables">Payments</a>
14
+ โ€ฆbodyโ€ฆ
15
+ </u-group-box>
16
+ ```
17
+
18
+ The body is a flex column with token spacing, so block children get vertical rhythm and share
19
+ a left edge without any consumer CSS.
20
+
21
+ ## Slots
22
+
23
+ | Name | Description |
24
+ |------|-------------|
25
+ | *(default)* | Body content |
26
+ | `actions` | Trailing controls in the header |
27
+
28
+ ## Properties
29
+
30
+ | Property | Type | Default | Reflect | Description |
31
+ |----------|------|---------|---------|-------------|
32
+ | `title` | `string` | `''` | | Header title |
33
+ | `divider` | `boolean` | `false` | | Rule between header and body. Off by default โ€” many rules make a screen noisy |
34
+ | `flush` | `boolean` | `false` | | Remove body padding, for tables and lists that draw their own edges |
35
+
36
+ ## CSS Parts
37
+
38
+ | Part | Description |
39
+ |------|-------------|
40
+ | `header` ยท `title` ยท `actions` | Header row |
41
+ | `body` | Body wrapper |
@@ -0,0 +1,45 @@
1
+ # u-info-field
2
+
3
+ **Tag:** `u-info-field`
4
+
5
+ A read-only label/value pair.
6
+
7
+ ๐Ÿ”ด **"not set yet" and "zero" are different facts.**
8
+
9
+ ```
10
+ null ยท undefined ยท '' โ†’ blank placeholder (โ€”)
11
+ 0 ยท false ยท '0' โ†’ rendered as-is
12
+ ```
13
+
14
+ Leaving that rule to whoever writes the screen guarantees it drifts. It has: an order with
15
+ *quantity 0* and an order whose *quantity had not been decided* rendered identically as `โ€”`,
16
+ and those are different states of the business. So the component owns the rule.
17
+
18
+ ```html
19
+ <u-info-field label="Quantity" .value=${order.quantity} numeric></u-info-field>
20
+ <u-info-field label="Customer">Acme Printing</u-info-field> <!-- slot wins over value -->
21
+ ```
22
+
23
+ ## Slots
24
+
25
+ | Name | Description |
26
+ |------|-------------|
27
+ | *(default)* | Value content; takes precedence over `value` |
28
+
29
+ ## Properties
30
+
31
+ | Property | Type | Default | Reflect | Description |
32
+ |----------|------|---------|---------|-------------|
33
+ | `label` | `string` | `''` | | Field label |
34
+ | `value` | `unknown` | โ€” | | Value; property only (`attribute: false`) |
35
+ | `blank` | `string` | `'โ€”'` | | Placeholder for null/undefined/empty โ€” **not** for `0` or `false` |
36
+ | `numeric` | `boolean` | `false` | | Right-align with tabular figures so digits line up vertically |
37
+
38
+ โš  `numeric` earns its keep in **tables**, where columns of figures are compared by eye. On a
39
+ lone field it just pushes the value away from its label.
40
+
41
+ ## CSS Parts
42
+
43
+ | Part | Description |
44
+ |------|-------------|
45
+ | `label` ยท `value` | The two elements |
@@ -0,0 +1,35 @@
1
+ # u-info-section
2
+
3
+ **Tag:** `u-info-section`
4
+
5
+ Responsive grid for `u-info-field` pairs.
6
+
7
+ **You do not count the columns.** Hand-built label/value grids usually hardcode a column count
8
+ per screen, which then breaks only at tablet width โ€” on a screen nobody opens, so it stays
9
+ broken. Here the **container width** decides (`auto-fit`, not media queries), so the same
10
+ markup works inside a side panel.
11
+
12
+ ```html
13
+ <u-info-section>
14
+ <u-info-field label="Part" value="Standard"></u-info-field>
15
+ <u-info-field label="Quantity" .value=${0} numeric></u-info-field>
16
+ </u-info-section>
17
+ ```
18
+
19
+ ## Slots
20
+
21
+ | Name | Description |
22
+ |------|-------------|
23
+ | *(default)* | `u-info-field` elements |
24
+
25
+ ## Properties
26
+
27
+ | Property | Type | Default | Reflect | Description |
28
+ |----------|------|---------|---------|-------------|
29
+ | `min` | `number` | `160` | | Minimum column width in px. Raise it for domains with long labels |
30
+
31
+ ## CSS Parts
32
+
33
+ | Part | Description |
34
+ |------|-------------|
35
+ | `grid` | Grid container |
@@ -0,0 +1,46 @@
1
+ # u-page-header
2
+
3
+ **Tag:** `u-page-header`
4
+
5
+ The same skeleton at the top of every LOB screen: optional back link, title, subtitle,
6
+ a status slot, and an actions slot.
7
+
8
+ Hand-rolling this per screen is where a product stops looking like one product โ€” title sizes
9
+ drift, action alignment goes slightly off, and the narrow-viewport rule gets forgotten on the
10
+ screens nobody opens.
11
+
12
+ ```html
13
+ <u-page-header title="Order G-2026-I-0629" subtitle="Received 2026-02-24" back="/orders">
14
+ <span slot="status"><u-tag color="success">Confirmed</u-tag></span>
15
+ <span slot="actions"><u-button>Edit</u-button></span>
16
+ </u-page-header>
17
+ ```
18
+
19
+ ## Slots
20
+
21
+ | Name | Description |
22
+ |------|-------------|
23
+ | `status` | Badge or tag beside the title |
24
+ | `actions` | Buttons on the trailing edge |
25
+
26
+ ## Properties
27
+
28
+ | Property | Type | Default | Reflect | Description |
29
+ |----------|------|---------|---------|-------------|
30
+ | `title` | `string` | `''` | | Page title |
31
+ | `subtitle` | `string` | โ€” | | Secondary line under the title |
32
+ | `back` | `string` | โ€” | | Back-link href; renders a back affordance before the title |
33
+ | `backLabel` | `string` | `''` | | Back-link text (`back-label`). Empty falls back to the locale registry, then English |
34
+ | `locale` | `string` | `''` | | Locale tag override for built-in strings |
35
+
36
+ ## CSS Parts
37
+
38
+ | Part | Description |
39
+ |------|-------------|
40
+ | `back` | Back link |
41
+ | `heading` | Title + subtitle wrapper |
42
+ | `title` ยท `subtitle` | Text elements |
43
+ | `status` ยท `actions` | Slot wrappers |
44
+
45
+ โš  Built-in strings default to **English** โ€” this package is a generic layer and cannot pick a
46
+ language. Register others with `registerLocale('ko', { back: '๋’ค๋กœ' })`.