@birdycom/omniaui 0.11.0 → 0.11.2

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.
Files changed (214) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +21 -21
  3. package/bin/lib/add.mjs +126 -126
  4. package/bin/lib/catalog.mjs +169 -169
  5. package/bin/lib/project.mjs +90 -90
  6. package/bin/omniaui.mjs +69 -69
  7. package/dist/code-block.css +25 -25
  8. package/dist/components-extra.css +916 -914
  9. package/dist/components.css +6565 -6469
  10. package/dist/components.min.css +1 -1
  11. package/dist/data-table.d.ts +9 -9
  12. package/dist/data-table.js +505 -505
  13. package/dist/docs-ui.css +267 -265
  14. package/dist/oc-theme.css +69 -69
  15. package/dist/parts/app-accordion-accent.css +60 -60
  16. package/dist/parts/app-alpha-tabs.css +68 -68
  17. package/dist/parts/app-busy-overlay.css +25 -25
  18. package/dist/parts/app-column-menu.css +85 -85
  19. package/dist/parts/app-confirm-dialog.css +70 -70
  20. package/dist/parts/app-cookie-consent.css +63 -63
  21. package/dist/parts/app-data-table.css +174 -174
  22. package/dist/parts/app-greeting.css +47 -47
  23. package/dist/parts/app-list-toolbar.css +81 -81
  24. package/dist/parts/app-page-header.css +54 -54
  25. package/dist/parts/app-severity-card.css +91 -91
  26. package/dist/parts/app-sidebar-dark.css +15 -15
  27. package/dist/parts/app-sortable-row.css +52 -52
  28. package/dist/parts/app-stat-card.css +68 -68
  29. package/dist/parts/app-table-actions.css +71 -71
  30. package/dist/parts/app-table-compact.css +54 -54
  31. package/dist/parts/app-top-progress.css +68 -68
  32. package/dist/parts/app-tree.css +104 -104
  33. package/dist/parts/app-upgrade-banner.css +90 -90
  34. package/dist/parts/app-version-banner.css +80 -80
  35. package/dist/parts/data-chart-line.css +167 -167
  36. package/dist/parts/forms-affix-input.css +75 -75
  37. package/dist/parts/forms-barcode-input.css +75 -75
  38. package/dist/parts/forms-chip-filter.css +91 -91
  39. package/dist/parts/forms-color-select.css +97 -89
  40. package/dist/parts/forms-decimal-input.css +51 -51
  41. package/dist/parts/forms-filter-counts.css +94 -94
  42. package/dist/parts/forms-language-select.css +89 -76
  43. package/dist/parts/forms-number-input.css +98 -95
  44. package/dist/parts/forms-password-requirements.css +55 -55
  45. package/dist/parts/forms-phone-input.css +85 -85
  46. package/dist/parts/forms-time-input.css +74 -74
  47. package/dist/parts/forms-toggle-field.css +69 -69
  48. package/dist/parts/media-art.css +21 -21
  49. package/dist/parts/media-attachment.css +160 -160
  50. package/dist/parts/media-browser-frame.css +73 -73
  51. package/dist/parts/media-card.css +83 -83
  52. package/dist/parts/media-chat-composer.css +90 -90
  53. package/dist/parts/media-doc-viewer.css +151 -151
  54. package/dist/parts/media-emoji-picker.css +88 -88
  55. package/dist/parts/media-entity-card.css +52 -52
  56. package/dist/parts/media-flip-card.css +78 -78
  57. package/dist/parts/media-image-zoom.css +68 -68
  58. package/dist/parts/media-lightbox.css +131 -131
  59. package/dist/parts/media-message-thread.css +136 -136
  60. package/dist/parts/media-message.css +160 -160
  61. package/dist/parts/media-row.css +78 -78
  62. package/dist/parts/media-stack-card.css +82 -82
  63. package/dist/parts/media-terminal-log.css +76 -76
  64. package/dist/parts/media-thumb.css +71 -71
  65. package/dist/parts/site-fact-list.css +25 -25
  66. package/dist/parts/site-link-arrow.css +34 -34
  67. package/dist/parts/site-marquee.css +34 -34
  68. package/dist/parts/site-next-teaser.css +75 -75
  69. package/dist/parts/site-price-card.css +91 -75
  70. package/dist/parts/site-product-mark.css +66 -66
  71. package/dist/parts/site-project-card.css +111 -111
  72. package/dist/parts/site-prose.css +124 -124
  73. package/dist/parts/site-stack-list.css +48 -48
  74. package/dist/parts/site-timeline.css +54 -54
  75. package/dist/showcase.css +410 -404
  76. package/package.json +69 -69
  77. package/snippets/accordion-accent.html +24 -24
  78. package/snippets/accordion.html +11 -11
  79. package/snippets/affix-input.html +30 -30
  80. package/snippets/alert-dialog.html +22 -22
  81. package/snippets/alert.html +5 -5
  82. package/snippets/alpha-tabs.html +37 -37
  83. package/snippets/aspect-ratio.html +15 -15
  84. package/snippets/attachment.html +43 -43
  85. package/snippets/avatar.html +6 -6
  86. package/snippets/back-link.html +5 -5
  87. package/snippets/badge.html +5 -5
  88. package/snippets/barcode-input.html +18 -18
  89. package/snippets/breadcrumb.html +6 -6
  90. package/snippets/browser-frame.html +18 -18
  91. package/snippets/busy-overlay.html +31 -31
  92. package/snippets/button-group.html +21 -21
  93. package/snippets/button.html +8 -8
  94. package/snippets/calendar.html +43 -43
  95. package/snippets/card.html +17 -17
  96. package/snippets/carousel.html +21 -21
  97. package/snippets/chart-line.html +46 -46
  98. package/snippets/chart.html +27 -27
  99. package/snippets/chat-composer.html +21 -21
  100. package/snippets/checkbox.html +5 -5
  101. package/snippets/checklist.html +23 -23
  102. package/snippets/chip-filter.html +14 -14
  103. package/snippets/code-window.html +20 -20
  104. package/snippets/collapsible.html +19 -19
  105. package/snippets/color-field.html +13 -13
  106. package/snippets/color-select.html +18 -18
  107. package/snippets/column-menu.html +38 -38
  108. package/snippets/combobox.html +19 -19
  109. package/snippets/command.html +24 -24
  110. package/snippets/confirm-dialog.html +32 -32
  111. package/snippets/context-menu.html +25 -25
  112. package/snippets/cookie-consent.html +70 -70
  113. package/snippets/copy-field.html +19 -19
  114. package/snippets/counter.html +2 -2
  115. package/snippets/data-table.html +151 -151
  116. package/snippets/date-picker.html +32 -32
  117. package/snippets/decimal-input.html +20 -20
  118. package/snippets/definition-list.html +20 -20
  119. package/snippets/demo-panel.html +18 -18
  120. package/snippets/doc-viewer.html +58 -58
  121. package/snippets/drawer.html +30 -30
  122. package/snippets/dropdown-menu.html +27 -27
  123. package/snippets/dropdown.html +9 -9
  124. package/snippets/dropzone.html +13 -13
  125. package/snippets/emoji-picker.html +51 -51
  126. package/snippets/empty-state.html +17 -17
  127. package/snippets/entity-card.html +26 -26
  128. package/snippets/expandable-table.html +26 -26
  129. package/snippets/fact-list.html +14 -14
  130. package/snippets/filter-counts.html +30 -30
  131. package/snippets/flip-card.html +22 -22
  132. package/snippets/form-field.html +6 -6
  133. package/snippets/greeting.html +22 -22
  134. package/snippets/heading.html +14 -14
  135. package/snippets/hover-card.html +18 -18
  136. package/snippets/image-zoom.html +30 -30
  137. package/snippets/input-group.html +10 -10
  138. package/snippets/input.html +5 -5
  139. package/snippets/item.html +26 -26
  140. package/snippets/kbd.html +13 -13
  141. package/snippets/label.html +9 -9
  142. package/snippets/language-select.html +26 -26
  143. package/snippets/launcher-card.html +14 -14
  144. package/snippets/lightbox.html +50 -50
  145. package/snippets/link-arrow.html +10 -10
  146. package/snippets/list-toolbar.html +33 -33
  147. package/snippets/marquee.html +15 -15
  148. package/snippets/media-card.html +28 -28
  149. package/snippets/media-row.html +21 -21
  150. package/snippets/media-thumb.html +12 -12
  151. package/snippets/menubar.html +30 -30
  152. package/snippets/message-thread.html +123 -123
  153. package/snippets/message.html +51 -51
  154. package/snippets/modal.html +15 -15
  155. package/snippets/native-select.html +15 -15
  156. package/snippets/navmenu.html +23 -23
  157. package/snippets/next-teaser.html +15 -15
  158. package/snippets/number-input.html +27 -27
  159. package/snippets/otp-input.html +9 -9
  160. package/snippets/page-header.html +24 -24
  161. package/snippets/pagination.html +6 -6
  162. package/snippets/password-input.html +24 -24
  163. package/snippets/password-requirements.html +30 -30
  164. package/snippets/phone-input.html +22 -22
  165. package/snippets/popover.html +15 -15
  166. package/snippets/price-card.html +34 -34
  167. package/snippets/product-mark.html +13 -13
  168. package/snippets/progress.html +4 -4
  169. package/snippets/project-card.html +23 -23
  170. package/snippets/prose.html +54 -54
  171. package/snippets/radio.html +17 -17
  172. package/snippets/recovery-codes.html +20 -20
  173. package/snippets/resizable.html +16 -16
  174. package/snippets/scroll-area.html +20 -20
  175. package/snippets/search.html +8 -8
  176. package/snippets/segmented.html +11 -11
  177. package/snippets/select.html +7 -7
  178. package/snippets/separator.html +15 -15
  179. package/snippets/severity-card.html +35 -35
  180. package/snippets/sheet.html +32 -32
  181. package/snippets/sidebar-docs.html +24 -24
  182. package/snippets/sidebar.html +55 -55
  183. package/snippets/site-footer.html +6 -6
  184. package/snippets/site-header.html +26 -26
  185. package/snippets/skeleton.html +4 -4
  186. package/snippets/slider.html +17 -17
  187. package/snippets/sortable-row.html +31 -31
  188. package/snippets/spinner.html +14 -14
  189. package/snippets/stack-card.html +17 -17
  190. package/snippets/stack-list.html +16 -16
  191. package/snippets/stat-card.html +24 -24
  192. package/snippets/stepper.html +13 -13
  193. package/snippets/switch.html +6 -6
  194. package/snippets/table-actions.html +39 -39
  195. package/snippets/table-compact.html +24 -24
  196. package/snippets/table.html +29 -29
  197. package/snippets/tabs.html +9 -9
  198. package/snippets/tag-input.html +60 -17
  199. package/snippets/terminal-log.html +23 -23
  200. package/snippets/textarea.html +3 -3
  201. package/snippets/theme-switch.html +6 -6
  202. package/snippets/time-input.html +26 -26
  203. package/snippets/timeline.html +28 -28
  204. package/snippets/toast-stack.html +10 -10
  205. package/snippets/toast.html +36 -36
  206. package/snippets/toc.html +13 -13
  207. package/snippets/toggle-field.html +20 -20
  208. package/snippets/toggle.html +22 -22
  209. package/snippets/tooltip.html +4 -4
  210. package/snippets/top-progress.html +12 -12
  211. package/snippets/tree.html +38 -38
  212. package/snippets/upgrade-banner.html +28 -28
  213. package/snippets/user.html +15 -15
  214. package/snippets/version-banner.html +15 -15
@@ -1,104 +1,104 @@
1
- /* File: packages/ui/src/parts/app-tree.css | Map: wrapper (scroll box) -> head row -> lists + indent -> row -> chevron (details) -> label + icon -> sticky actions -> states -> sticky modifier */
2
- /* Tree: nested list of folders (<details>) and leaves. Names may scroll horizontally;
3
- the action column (.oc-tree-actions) stays pinned to the end edge with position: sticky.
4
- Open / close is native <details>; no JavaScript. Selected row: aria-current="true" or .is-selected. */
5
-
6
- /* Scroll box around the whole tree. Card look by default. */
7
- .oc-tree {
8
- --oc-tree-row: 2rem;
9
- --oc-tree-indent: 1rem;
10
- --oc-tree-bg: var(--oc-card);
11
- overflow: auto;
12
- max-block-size: var(--oc-tree-height, none);
13
- font-size: 0.875rem;
14
- color: var(--oc-foreground);
15
- background: var(--oc-tree-bg);
16
- border: 1px solid var(--oc-border);
17
- border-radius: var(--oc-radius);
18
- }
19
-
20
- /* Optional head row (root of the tree, e.g. "All projects"). Sticks to the top while scrolling. */
21
- .oc-tree-head {
22
- position: sticky;
23
- inset-block-start: 0;
24
- z-index: 2;
25
- font-weight: 600;
26
- background: var(--oc-tree-bg);
27
- border-block-end: 1px solid var(--oc-border);
28
- }
29
-
30
- /* Lists: no bullets; each nested list moves one indent step inward. */
31
- .oc-tree-list { margin: 0; padding: 0.25rem 0; list-style: none; min-inline-size: max-content; }
32
- .oc-tree-list .oc-tree-list { padding-block: 0; padding-inline-start: var(--oc-tree-indent); }
33
-
34
- /* One row: chevron + icon + label, then the actions. Works on <summary>, <div>, <a> or <button>. */
35
- .oc-tree-row {
36
- display: flex;
37
- align-items: center;
38
- gap: 0.375rem;
39
- min-block-size: var(--oc-tree-row);
40
- padding-inline: 0.5rem 0;
41
- color: inherit;
42
- text-decoration: none;
43
- list-style: none;
44
- }
45
- summary.oc-tree-row { cursor: pointer; }
46
- .oc-tree-row::-webkit-details-marker { display: none; }
47
- .oc-tree-row:hover { background: var(--oc-accent); }
48
- .oc-tree-row:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
49
-
50
- /* Chevron: drawn with borders. Folders rotate it when open; leaves keep an empty spacer. */
51
- .oc-tree-row::before {
52
- content: "";
53
- flex-shrink: 0;
54
- inline-size: 0.4rem;
55
- block-size: 0.4rem;
56
- margin-inline: 0.2rem 0.35rem;
57
- border-inline-end: 1.5px solid currentColor;
58
- border-block-end: 1.5px solid currentColor;
59
- color: var(--oc-muted-foreground);
60
- rotate: -45deg;
61
- transition: rotate var(--oc-transition-fast);
62
- }
63
- .oc-tree-node[open] > .oc-tree-row::before { rotate: 45deg; }
64
- .oc-tree-row:not(summary)::before { visibility: hidden; }
65
-
66
- /* Icon and label. The label never wraps; long names make the box scroll sideways. */
67
- .oc-tree-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-muted-foreground); }
68
- .oc-tree-icon svg { inline-size: 1rem; block-size: 1rem; }
69
- .oc-tree-label { flex: 1 0 auto; white-space: nowrap; padding-inline-end: 0.75rem; color: inherit; text-decoration: none; }
70
- /* A leaf row is a div; its label may be a link (no buttons inside links). */
71
- a.oc-tree-label:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; border-radius: 2px; }
72
- .oc-tree-count { margin-inline-end: 0.5rem; font-size: 0.75rem; color: var(--oc-muted-foreground); font-variant-numeric: tabular-nums; }
73
-
74
- /* Actions: pinned to the end edge, with the row background behind it so names slide underneath. */
75
- .oc-tree-actions {
76
- position: sticky;
77
- inset-inline-end: 0;
78
- z-index: 1;
79
- display: inline-flex;
80
- align-items: center;
81
- gap: 0.125rem;
82
- margin-inline-start: auto;
83
- padding-inline: 0.5rem 0.375rem;
84
- background: var(--oc-tree-bg);
85
- box-shadow: -0.75rem 0 0.75rem -0.75rem oklch(from var(--color-black-60) l c h / 0.25);
86
- }
87
- .oc-tree-row:hover > .oc-tree-actions { background: linear-gradient(var(--oc-accent), var(--oc-accent)), var(--oc-tree-bg); }
88
- /* Hide actions until hover or focus (optional): .oc-tree--quiet */
89
- .oc-tree--quiet .oc-tree-actions { opacity: 0; }
90
- .oc-tree--quiet .oc-tree-row:is(:hover, :focus-within) > .oc-tree-actions { opacity: 1; }
91
-
92
- /* Selected row: tinted with the primary token. */
93
- .oc-tree-row:is([aria-current="true"], .is-selected, :has(> .oc-tree-label[aria-current="true"])) { color: var(--oc-primary); font-weight: 500; background: oklch(from var(--oc-primary) l c h / 0.1); }
94
- .oc-tree-row:is([aria-current="true"], .is-selected, :has(> .oc-tree-label[aria-current="true"])) > .oc-tree-actions { background: linear-gradient(oklch(from var(--oc-primary) l c h / 0.1), oklch(from var(--oc-primary) l c h / 0.1)), var(--oc-tree-bg); }
95
- /* Muted row (archived, empty folder). */
96
- .oc-tree-row.is-muted { color: var(--oc-muted-foreground); }
97
-
98
- /* Flush: no frame, for use inside a card or sidebar. */
99
- .oc-tree--flush { border: 0; border-radius: 0; --oc-tree-bg: transparent; }
100
- .oc-tree--flush .oc-tree-actions { background: var(--oc-card); }
101
-
102
- @media (prefers-reduced-motion: reduce) {
103
- .oc-tree-row::before { transition: none; }
104
- }
1
+ /* File: packages/ui/src/parts/app-tree.css | Map: wrapper (scroll box) -> head row -> lists + indent -> row -> chevron (details) -> label + icon -> sticky actions -> states -> sticky modifier */
2
+ /* Tree: nested list of folders (<details>) and leaves. Names may scroll horizontally;
3
+ the action column (.oc-tree-actions) stays pinned to the end edge with position: sticky.
4
+ Open / close is native <details>; no JavaScript. Selected row: aria-current="true" or .is-selected. */
5
+
6
+ /* Scroll box around the whole tree. Card look by default. */
7
+ .oc-tree {
8
+ --oc-tree-row: 2rem;
9
+ --oc-tree-indent: 1rem;
10
+ --oc-tree-bg: var(--oc-card);
11
+ overflow: auto;
12
+ max-block-size: var(--oc-tree-height, none);
13
+ font-size: 0.875rem;
14
+ color: var(--oc-foreground);
15
+ background: var(--oc-tree-bg);
16
+ border: 1px solid var(--oc-border);
17
+ border-radius: var(--oc-radius);
18
+ }
19
+
20
+ /* Optional head row (root of the tree, e.g. "All projects"). Sticks to the top while scrolling. */
21
+ .oc-tree-head {
22
+ position: sticky;
23
+ inset-block-start: 0;
24
+ z-index: 2;
25
+ font-weight: 600;
26
+ background: var(--oc-tree-bg);
27
+ border-block-end: 1px solid var(--oc-border);
28
+ }
29
+
30
+ /* Lists: no bullets; each nested list moves one indent step inward. */
31
+ .oc-tree-list { margin: 0; padding: 0.25rem 0; list-style: none; min-inline-size: max-content; }
32
+ .oc-tree-list .oc-tree-list { padding-block: 0; padding-inline-start: var(--oc-tree-indent); }
33
+
34
+ /* One row: chevron + icon + label, then the actions. Works on <summary>, <div>, <a> or <button>. */
35
+ .oc-tree-row {
36
+ display: flex;
37
+ align-items: center;
38
+ gap: 0.375rem;
39
+ min-block-size: var(--oc-tree-row);
40
+ padding-inline: 0.5rem 0;
41
+ color: inherit;
42
+ text-decoration: none;
43
+ list-style: none;
44
+ }
45
+ summary.oc-tree-row { cursor: pointer; }
46
+ .oc-tree-row::-webkit-details-marker { display: none; }
47
+ .oc-tree-row:hover { background: var(--oc-accent); }
48
+ .oc-tree-row:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
49
+
50
+ /* Chevron: drawn with borders. Folders rotate it when open; leaves keep an empty spacer. */
51
+ .oc-tree-row::before {
52
+ content: "";
53
+ flex-shrink: 0;
54
+ inline-size: 0.4rem;
55
+ block-size: 0.4rem;
56
+ margin-inline: 0.2rem 0.35rem;
57
+ border-inline-end: 1.5px solid currentColor;
58
+ border-block-end: 1.5px solid currentColor;
59
+ color: var(--oc-muted-foreground);
60
+ rotate: -45deg;
61
+ transition: rotate var(--oc-transition-fast);
62
+ }
63
+ .oc-tree-node[open] > .oc-tree-row::before { rotate: 45deg; }
64
+ .oc-tree-row:not(summary)::before { visibility: hidden; }
65
+
66
+ /* Icon and label. The label never wraps; long names make the box scroll sideways. */
67
+ .oc-tree-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-muted-foreground); }
68
+ .oc-tree-icon svg { inline-size: 1rem; block-size: 1rem; }
69
+ .oc-tree-label { flex: 1 0 auto; white-space: nowrap; padding-inline-end: 0.75rem; color: inherit; text-decoration: none; }
70
+ /* A leaf row is a div; its label may be a link (no buttons inside links). */
71
+ a.oc-tree-label:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; border-radius: 2px; }
72
+ .oc-tree-count { margin-inline-end: 0.5rem; font-size: 0.75rem; color: var(--oc-muted-foreground); font-variant-numeric: tabular-nums; }
73
+
74
+ /* Actions: pinned to the end edge, with the row background behind it so names slide underneath. */
75
+ .oc-tree-actions {
76
+ position: sticky;
77
+ inset-inline-end: 0;
78
+ z-index: 1;
79
+ display: inline-flex;
80
+ align-items: center;
81
+ gap: 0.125rem;
82
+ margin-inline-start: auto;
83
+ padding-inline: 0.5rem 0.375rem;
84
+ background: var(--oc-tree-bg);
85
+ box-shadow: -0.75rem 0 0.75rem -0.75rem oklch(from var(--color-black-60) l c h / 0.25);
86
+ }
87
+ .oc-tree-row:hover > .oc-tree-actions { background: linear-gradient(var(--oc-accent), var(--oc-accent)), var(--oc-tree-bg); }
88
+ /* Hide actions until hover or focus (optional): .oc-tree--quiet */
89
+ .oc-tree--quiet .oc-tree-actions { opacity: 0; }
90
+ .oc-tree--quiet .oc-tree-row:is(:hover, :focus-within) > .oc-tree-actions { opacity: 1; }
91
+
92
+ /* Selected row: tinted with the primary token. */
93
+ .oc-tree-row:is([aria-current="true"], .is-selected, :has(> .oc-tree-label[aria-current="true"])) { color: var(--oc-primary); font-weight: 500; background: oklch(from var(--oc-primary) l c h / 0.1); }
94
+ .oc-tree-row:is([aria-current="true"], .is-selected, :has(> .oc-tree-label[aria-current="true"])) > .oc-tree-actions { background: linear-gradient(oklch(from var(--oc-primary) l c h / 0.1), oklch(from var(--oc-primary) l c h / 0.1)), var(--oc-tree-bg); }
95
+ /* Muted row (archived, empty folder). */
96
+ .oc-tree-row.is-muted { color: var(--oc-muted-foreground); }
97
+
98
+ /* Flush: no frame, for use inside a card or sidebar. */
99
+ .oc-tree--flush { border: 0; border-radius: 0; --oc-tree-bg: transparent; }
100
+ .oc-tree--flush .oc-tree-actions { background: var(--oc-card); }
101
+
102
+ @media (prefers-reduced-motion: reduce) {
103
+ .oc-tree-row::before { transition: none; }
104
+ }
@@ -1,90 +1,90 @@
1
- /* File: packages/ui/src/parts/app-upgrade-banner.css | Map: callout -> icon -> body (title + plan badge, text) -> usage meter -> actions + dismiss -> modifiers (premium, compact) */
2
- /* Upgrade banner: soft callout for a free plan with limits ("3 of 5 projects used - upgrade").
3
- Usage is a native <meter> element. Tone follows --oc-upgrade-color (warning by default). */
4
-
5
- .oc-upgrade-banner {
6
- --oc-upgrade-color: var(--oc-warning);
7
- position: relative;
8
- display: flex;
9
- flex-wrap: wrap;
10
- align-items: flex-start;
11
- gap: 0.75rem 1rem;
12
- padding: 1rem 1.25rem;
13
- font-size: 0.875rem;
14
- color: var(--oc-foreground);
15
- background: color-mix(in oklch, var(--oc-upgrade-color) 8%, var(--oc-card));
16
- border: 1px solid oklch(from var(--oc-upgrade-color) l c h / 0.35);
17
- border-radius: calc(var(--oc-radius) + 4px);
18
- }
19
-
20
- /* Icon (sparkle, crown, lock) in the tone color. */
21
- .oc-upgrade-banner-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-upgrade-color); }
22
- .oc-upgrade-banner-icon svg { inline-size: 1.25rem; block-size: 1.25rem; }
23
-
24
- /* Text column. */
25
- .oc-upgrade-banner-body { flex: 1 1 18rem; min-inline-size: 0; }
26
- .oc-upgrade-banner-title { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin: 0; font-size: 0.9375rem; font-weight: 600; }
27
- .oc-upgrade-banner-plan {
28
- padding: 0.125rem 0.5rem;
29
- font-size: 0.6875rem;
30
- font-weight: 600;
31
- color: var(--oc-upgrade-color);
32
- background: oklch(from var(--oc-upgrade-color) l c h / 0.14);
33
- border-radius: 999px;
34
- }
35
- .oc-upgrade-banner-text { margin: 0.25rem 0 0; line-height: 1.55; color: var(--oc-muted-foreground); }
36
- .oc-upgrade-banner-text a { color: var(--oc-primary); }
37
-
38
- /* Usage row: label + <meter> + "3 / 5". */
39
- .oc-upgrade-banner-usage { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 0.5rem; margin-block-start: 0.625rem; font-size: 0.75rem; color: var(--oc-muted-foreground); }
40
- .oc-upgrade-banner-meter {
41
- inline-size: 100%;
42
- block-size: 0.375rem;
43
- appearance: none;
44
- background: var(--oc-surface-strong);
45
- border: 0;
46
- border-radius: 999px;
47
- }
48
- .oc-upgrade-banner-meter::-webkit-meter-bar { background: var(--oc-surface-strong); border: 0; border-radius: 999px; block-size: 0.375rem; }
49
- .oc-upgrade-banner-meter::-webkit-meter-optimum-value,
50
- .oc-upgrade-banner-meter::-webkit-meter-suboptimum-value,
51
- .oc-upgrade-banner-meter::-webkit-meter-even-less-good-value { background: var(--oc-upgrade-color); border-radius: 999px; }
52
- .oc-upgrade-banner-meter::-moz-meter-bar { background: var(--oc-upgrade-color); border-radius: 999px; }
53
-
54
- /* Actions: upgrade button (+ secondary link). */
55
- .oc-upgrade-banner-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; align-self: center; }
56
-
57
- /* Dismiss (X) in the top corner; the app hides the banner (hidden attribute). */
58
- .oc-upgrade-banner-dismiss {
59
- position: absolute;
60
- inset-block-start: 0.5rem;
61
- inset-inline-end: 0.5rem;
62
- display: grid;
63
- place-items: center;
64
- inline-size: 1.75rem;
65
- block-size: 1.75rem;
66
- padding: 0;
67
- font-size: 1.1rem;
68
- line-height: 1;
69
- color: var(--oc-muted-foreground);
70
- background: none;
71
- border: 0;
72
- border-radius: var(--oc-radius);
73
- cursor: pointer;
74
- }
75
- .oc-upgrade-banner-dismiss:hover { color: var(--oc-foreground); background: var(--oc-accent); }
76
- .oc-upgrade-banner-dismiss:focus-visible { outline: 2px solid var(--oc-ring); }
77
- .oc-upgrade-banner:has(.oc-upgrade-banner-dismiss) { padding-inline-end: 2.75rem; }
78
- .oc-upgrade-banner[hidden] { display: none; }
79
-
80
- /* Premium: brand gradient frame and primary tone. */
81
- .oc-upgrade-banner--premium {
82
- --oc-upgrade-color: var(--oc-primary);
83
- border-color: transparent;
84
- background: linear-gradient(color-mix(in oklch, var(--oc-primary) 6%, var(--oc-card)), color-mix(in oklch, var(--oc-primary) 6%, var(--oc-card))) padding-box, var(--oc-gradient-brand) border-box;
85
- }
86
-
87
- /* Compact: one line (title + text inline), smaller padding. */
88
- .oc-upgrade-banner--compact { align-items: center; padding: 0.5rem 0.75rem; }
89
- .oc-upgrade-banner--compact .oc-upgrade-banner-body { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.25rem 0.5rem; }
90
- .oc-upgrade-banner--compact .oc-upgrade-banner-text { margin: 0; }
1
+ /* File: packages/ui/src/parts/app-upgrade-banner.css | Map: callout -> icon -> body (title + plan badge, text) -> usage meter -> actions + dismiss -> modifiers (premium, compact) */
2
+ /* Upgrade banner: soft callout for a free plan with limits ("3 of 5 projects used - upgrade").
3
+ Usage is a native <meter> element. Tone follows --oc-upgrade-color (warning by default). */
4
+
5
+ .oc-upgrade-banner {
6
+ --oc-upgrade-color: var(--oc-warning);
7
+ position: relative;
8
+ display: flex;
9
+ flex-wrap: wrap;
10
+ align-items: flex-start;
11
+ gap: 0.75rem 1rem;
12
+ padding: 1rem 1.25rem;
13
+ font-size: 0.875rem;
14
+ color: var(--oc-foreground);
15
+ background: color-mix(in oklch, var(--oc-upgrade-color) 8%, var(--oc-card));
16
+ border: 1px solid oklch(from var(--oc-upgrade-color) l c h / 0.35);
17
+ border-radius: calc(var(--oc-radius) + 4px);
18
+ }
19
+
20
+ /* Icon (sparkle, crown, lock) in the tone color. */
21
+ .oc-upgrade-banner-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-upgrade-color); }
22
+ .oc-upgrade-banner-icon svg { inline-size: 1.25rem; block-size: 1.25rem; }
23
+
24
+ /* Text column. */
25
+ .oc-upgrade-banner-body { flex: 1 1 18rem; min-inline-size: 0; }
26
+ .oc-upgrade-banner-title { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin: 0; font-size: 0.9375rem; font-weight: 600; }
27
+ .oc-upgrade-banner-plan {
28
+ padding: 0.125rem 0.5rem;
29
+ font-size: 0.6875rem;
30
+ font-weight: 600;
31
+ color: var(--oc-upgrade-color);
32
+ background: oklch(from var(--oc-upgrade-color) l c h / 0.14);
33
+ border-radius: 999px;
34
+ }
35
+ .oc-upgrade-banner-text { margin: 0.25rem 0 0; line-height: 1.55; color: var(--oc-muted-foreground); }
36
+ .oc-upgrade-banner-text a { color: var(--oc-primary); }
37
+
38
+ /* Usage row: label + <meter> + "3 / 5". */
39
+ .oc-upgrade-banner-usage { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 0.5rem; margin-block-start: 0.625rem; font-size: 0.75rem; color: var(--oc-muted-foreground); }
40
+ .oc-upgrade-banner-meter {
41
+ inline-size: 100%;
42
+ block-size: 0.375rem;
43
+ appearance: none;
44
+ background: var(--oc-surface-strong);
45
+ border: 0;
46
+ border-radius: 999px;
47
+ }
48
+ .oc-upgrade-banner-meter::-webkit-meter-bar { background: var(--oc-surface-strong); border: 0; border-radius: 999px; block-size: 0.375rem; }
49
+ .oc-upgrade-banner-meter::-webkit-meter-optimum-value,
50
+ .oc-upgrade-banner-meter::-webkit-meter-suboptimum-value,
51
+ .oc-upgrade-banner-meter::-webkit-meter-even-less-good-value { background: var(--oc-upgrade-color); border-radius: 999px; }
52
+ .oc-upgrade-banner-meter::-moz-meter-bar { background: var(--oc-upgrade-color); border-radius: 999px; }
53
+
54
+ /* Actions: upgrade button (+ secondary link). */
55
+ .oc-upgrade-banner-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; align-self: center; }
56
+
57
+ /* Dismiss (X) in the top corner; the app hides the banner (hidden attribute). */
58
+ .oc-upgrade-banner-dismiss {
59
+ position: absolute;
60
+ inset-block-start: 0.5rem;
61
+ inset-inline-end: 0.5rem;
62
+ display: grid;
63
+ place-items: center;
64
+ inline-size: 1.75rem;
65
+ block-size: 1.75rem;
66
+ padding: 0;
67
+ font-size: 1.1rem;
68
+ line-height: 1;
69
+ color: var(--oc-muted-foreground);
70
+ background: none;
71
+ border: 0;
72
+ border-radius: var(--oc-radius);
73
+ cursor: pointer;
74
+ }
75
+ .oc-upgrade-banner-dismiss:hover { color: var(--oc-foreground); background: var(--oc-accent); }
76
+ .oc-upgrade-banner-dismiss:focus-visible { outline: 2px solid var(--oc-ring); }
77
+ .oc-upgrade-banner:has(.oc-upgrade-banner-dismiss) { padding-inline-end: 2.75rem; }
78
+ .oc-upgrade-banner[hidden] { display: none; }
79
+
80
+ /* Premium: brand gradient frame and primary tone. */
81
+ .oc-upgrade-banner--premium {
82
+ --oc-upgrade-color: var(--oc-primary);
83
+ border-color: transparent;
84
+ background: linear-gradient(color-mix(in oklch, var(--oc-primary) 6%, var(--oc-card)), color-mix(in oklch, var(--oc-primary) 6%, var(--oc-card))) padding-box, var(--oc-gradient-brand) border-box;
85
+ }
86
+
87
+ /* Compact: one line (title + text inline), smaller padding. */
88
+ .oc-upgrade-banner--compact { align-items: center; padding: 0.5rem 0.75rem; }
89
+ .oc-upgrade-banner--compact .oc-upgrade-banner-body { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.25rem 0.5rem; }
90
+ .oc-upgrade-banner--compact .oc-upgrade-banner-text { margin: 0; }
@@ -1,80 +1,80 @@
1
- /* File: packages/ui/src/parts/app-version-banner.css | Map: chip -> icon + text (long / short) -> action -> tone modifiers -> floating modifier -> entry animation -> reduced motion */
2
- /* Version banner: small "New version available - reload" chip, e.g. at the end of the app header.
3
- Reload without JavaScript: the action is a link with href="" (the current page).
4
- Show it only when your app detects a newer build (remove the hidden attribute). */
5
-
6
- .oc-version-banner {
7
- --oc-version-banner-color: var(--oc-warning);
8
- display: inline-flex;
9
- align-items: center;
10
- gap: 0.5rem;
11
- min-inline-size: 0;
12
- max-inline-size: 100%;
13
- padding: 0.25rem 0.25rem 0.25rem 0.625rem;
14
- font-size: 0.75rem;
15
- line-height: 1.3;
16
- color: var(--oc-foreground);
17
- background: oklch(from var(--oc-version-banner-color) l c h / 0.12);
18
- border: 1px solid oklch(from var(--oc-version-banner-color) l c h / 0.4);
19
- border-radius: 999px;
20
- transition: opacity var(--oc-transition-normal), translate var(--oc-transition-normal);
21
- @starting-style { opacity: 0; translate: 0 -0.25rem; }
22
- }
23
- .oc-version-banner[hidden] { display: none; }
24
-
25
- /* Small dot in the tone color (pulses gently). */
26
- .oc-version-banner-dot {
27
- flex-shrink: 0;
28
- inline-size: 0.5rem;
29
- block-size: 0.5rem;
30
- border-radius: 50%;
31
- background: var(--oc-version-banner-color);
32
- animation: oc-version-banner-pulse 2s ease-in-out infinite;
33
- }
34
- @keyframes oc-version-banner-pulse { 50% { box-shadow: 0 0 0 4px oklch(from var(--oc-version-banner-color) l c h / 0.2); } }
35
-
36
- /* Text: the long text hides on small screens, the short one shows instead. */
37
- .oc-version-banner-text { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
38
- .oc-version-banner-short { display: none; white-space: nowrap; }
39
- @media (max-width: 40rem) {
40
- .oc-version-banner-text:has(+ .oc-version-banner-short) { display: none; }
41
- .oc-version-banner-short { display: inline; }
42
- }
43
-
44
- /* Action (link or button): compact pill button. */
45
- .oc-version-banner-action {
46
- flex-shrink: 0;
47
- display: inline-flex;
48
- align-items: center;
49
- gap: 0.25rem;
50
- padding: 0.25rem 0.625rem;
51
- font: inherit;
52
- font-weight: 600;
53
- color: var(--oc-foreground);
54
- text-decoration: none;
55
- background: var(--oc-background);
56
- border: 1px solid oklch(from var(--oc-version-banner-color) l c h / 0.4);
57
- border-radius: 999px;
58
- cursor: pointer;
59
- }
60
- .oc-version-banner-action:hover { background: oklch(from var(--oc-version-banner-color) l c h / 0.15); }
61
- .oc-version-banner-action:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
62
-
63
- /* Tone modifiers. */
64
- .oc-version-banner--info { --oc-version-banner-color: var(--oc-primary); }
65
- .oc-version-banner--success { --oc-version-banner-color: var(--oc-success); }
66
-
67
- /* Floating: fixed at the bottom end of the window (for apps without a header slot). */
68
- .oc-version-banner--floating {
69
- position: fixed;
70
- inset-block-end: 1rem;
71
- inset-inline-end: 1rem;
72
- z-index: 900;
73
- background: var(--oc-popover);
74
- box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
75
- }
76
-
77
- @media (prefers-reduced-motion: reduce) {
78
- .oc-version-banner { transition: none; }
79
- .oc-version-banner-dot { animation: none; }
80
- }
1
+ /* File: packages/ui/src/parts/app-version-banner.css | Map: chip -> icon + text (long / short) -> action -> tone modifiers -> floating modifier -> entry animation -> reduced motion */
2
+ /* Version banner: small "New version available - reload" chip, e.g. at the end of the app header.
3
+ Reload without JavaScript: the action is a link with href="" (the current page).
4
+ Show it only when your app detects a newer build (remove the hidden attribute). */
5
+
6
+ .oc-version-banner {
7
+ --oc-version-banner-color: var(--oc-warning);
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: 0.5rem;
11
+ min-inline-size: 0;
12
+ max-inline-size: 100%;
13
+ padding: 0.25rem 0.25rem 0.25rem 0.625rem;
14
+ font-size: 0.75rem;
15
+ line-height: 1.3;
16
+ color: var(--oc-foreground);
17
+ background: oklch(from var(--oc-version-banner-color) l c h / 0.12);
18
+ border: 1px solid oklch(from var(--oc-version-banner-color) l c h / 0.4);
19
+ border-radius: 999px;
20
+ transition: opacity var(--oc-transition-normal), translate var(--oc-transition-normal);
21
+ @starting-style { opacity: 0; translate: 0 -0.25rem; }
22
+ }
23
+ .oc-version-banner[hidden] { display: none; }
24
+
25
+ /* Small dot in the tone color (pulses gently). */
26
+ .oc-version-banner-dot {
27
+ flex-shrink: 0;
28
+ inline-size: 0.5rem;
29
+ block-size: 0.5rem;
30
+ border-radius: 50%;
31
+ background: var(--oc-version-banner-color);
32
+ animation: oc-version-banner-pulse 2s ease-in-out infinite;
33
+ }
34
+ @keyframes oc-version-banner-pulse { 50% { box-shadow: 0 0 0 4px oklch(from var(--oc-version-banner-color) l c h / 0.2); } }
35
+
36
+ /* Text: the long text hides on small screens, the short one shows instead. */
37
+ .oc-version-banner-text { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
38
+ .oc-version-banner-short { display: none; white-space: nowrap; }
39
+ @media (max-width: 40rem) {
40
+ .oc-version-banner-text:has(+ .oc-version-banner-short) { display: none; }
41
+ .oc-version-banner-short { display: inline; }
42
+ }
43
+
44
+ /* Action (link or button): compact pill button. */
45
+ .oc-version-banner-action {
46
+ flex-shrink: 0;
47
+ display: inline-flex;
48
+ align-items: center;
49
+ gap: 0.25rem;
50
+ padding: 0.25rem 0.625rem;
51
+ font: inherit;
52
+ font-weight: 600;
53
+ color: var(--oc-foreground);
54
+ text-decoration: none;
55
+ background: var(--oc-background);
56
+ border: 1px solid oklch(from var(--oc-version-banner-color) l c h / 0.4);
57
+ border-radius: 999px;
58
+ cursor: pointer;
59
+ }
60
+ .oc-version-banner-action:hover { background: oklch(from var(--oc-version-banner-color) l c h / 0.15); }
61
+ .oc-version-banner-action:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
62
+
63
+ /* Tone modifiers. */
64
+ .oc-version-banner--info { --oc-version-banner-color: var(--oc-primary); }
65
+ .oc-version-banner--success { --oc-version-banner-color: var(--oc-success); }
66
+
67
+ /* Floating: fixed at the bottom end of the window (for apps without a header slot). */
68
+ .oc-version-banner--floating {
69
+ position: fixed;
70
+ inset-block-end: 1rem;
71
+ inset-inline-end: 1rem;
72
+ z-index: 900;
73
+ background: var(--oc-popover);
74
+ box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
75
+ }
76
+
77
+ @media (prefers-reduced-motion: reduce) {
78
+ .oc-version-banner { transition: none; }
79
+ .oc-version-banner-dot { animation: none; }
80
+ }