@sveltekitchen/sveltekitchen 0.0.0-stage → 1.0.1

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 (142) hide show
  1. package/README.md +137 -2
  2. package/dist/components/Accordion.svelte +36 -0
  3. package/dist/components/Accordion.svelte.d.ts +15 -0
  4. package/dist/components/AccordionItem.svelte +73 -0
  5. package/dist/components/AccordionItem.svelte.d.ts +21 -0
  6. package/dist/components/Alert.svelte +23 -0
  7. package/dist/components/Alert.svelte.d.ts +15 -0
  8. package/dist/components/Badge.svelte +16 -0
  9. package/dist/components/Badge.svelte.d.ts +15 -0
  10. package/dist/components/Button.svelte +43 -0
  11. package/dist/components/Button.svelte.d.ts +25 -0
  12. package/dist/components/Calendar.svelte +88 -0
  13. package/dist/components/Calendar.svelte.d.ts +13 -0
  14. package/dist/components/Card.svelte +68 -0
  15. package/dist/components/Card.svelte.d.ts +25 -0
  16. package/dist/components/Chevron.svelte +36 -0
  17. package/dist/components/Chevron.svelte.d.ts +19 -0
  18. package/dist/components/Collapsible.svelte +46 -0
  19. package/dist/components/Collapsible.svelte.d.ts +19 -0
  20. package/dist/components/ConfirmDialog.svelte +70 -0
  21. package/dist/components/ConfirmDialog.svelte.d.ts +27 -0
  22. package/dist/components/DatePicker.svelte +60 -0
  23. package/dist/components/DatePicker.svelte.d.ts +17 -0
  24. package/dist/components/Divider.svelte +25 -0
  25. package/dist/components/Divider.svelte.d.ts +17 -0
  26. package/dist/components/Dropdown.svelte +100 -0
  27. package/dist/components/Dropdown.svelte.d.ts +21 -0
  28. package/dist/components/Form/Checkbox.svelte +37 -0
  29. package/dist/components/Form/Checkbox.svelte.d.ts +19 -0
  30. package/dist/components/Form/Field.svelte +28 -0
  31. package/dist/components/Form/Field.svelte.d.ts +21 -0
  32. package/dist/components/Form/Input.svelte +56 -0
  33. package/dist/components/Form/Input.svelte.d.ts +29 -0
  34. package/dist/components/Form/MaskedInput.svelte +152 -0
  35. package/dist/components/Form/MaskedInput.svelte.d.ts +25 -0
  36. package/dist/components/Form/Radio.svelte +28 -0
  37. package/dist/components/Form/Radio.svelte.d.ts +19 -0
  38. package/dist/components/Form/RadioGroup.svelte +28 -0
  39. package/dist/components/Form/RadioGroup.svelte.d.ts +19 -0
  40. package/dist/components/Form/Select.svelte +20 -0
  41. package/dist/components/Form/Select.svelte.d.ts +19 -0
  42. package/dist/components/Form/Textarea.svelte +30 -0
  43. package/dist/components/Form/Textarea.svelte.d.ts +25 -0
  44. package/dist/components/Form/Toggle.svelte +21 -0
  45. package/dist/components/Form/Toggle.svelte.d.ts +17 -0
  46. package/dist/components/Modal.svelte +77 -0
  47. package/dist/components/Modal.svelte.d.ts +27 -0
  48. package/dist/components/Pagination.svelte +77 -0
  49. package/dist/components/Pagination.svelte.d.ts +17 -0
  50. package/dist/components/Progress.svelte +34 -0
  51. package/dist/components/Progress.svelte.d.ts +21 -0
  52. package/dist/components/Spinner.svelte +24 -0
  53. package/dist/components/Spinner.svelte.d.ts +13 -0
  54. package/dist/components/Table.svelte +100 -0
  55. package/dist/components/Table.svelte.d.ts +21 -0
  56. package/dist/components/ThemeToggle.svelte +22 -0
  57. package/dist/components/ThemeToggle.svelte.d.ts +11 -0
  58. package/dist/components/Tooltip.svelte +45 -0
  59. package/dist/components/Tooltip.svelte.d.ts +15 -0
  60. package/dist/css/base/root.css +103 -0
  61. package/dist/css/base.css +47 -0
  62. package/dist/css/components/accordion.css +151 -0
  63. package/dist/css/components/alert.css +56 -0
  64. package/dist/css/components/badge.css +56 -0
  65. package/dist/css/components/button.css +171 -0
  66. package/dist/css/components/calendar.css +105 -0
  67. package/dist/css/components/card.css +128 -0
  68. package/dist/css/components/checkbox-radio.css +105 -0
  69. package/dist/css/components/collapsible.css +61 -0
  70. package/dist/css/components/divider.css +42 -0
  71. package/dist/css/components/dock-layout.css +111 -0
  72. package/dist/css/components/dropdown.css +68 -0
  73. package/dist/css/components/floating-shell.css +93 -0
  74. package/dist/css/components/form.css +286 -0
  75. package/dist/css/components/login.css +145 -0
  76. package/dist/css/components/modal.css +179 -0
  77. package/dist/css/components/nav.css +190 -0
  78. package/dist/css/components/nestable.css +187 -0
  79. package/dist/css/components/pagination.css +50 -0
  80. package/dist/css/components/progress.css +50 -0
  81. package/dist/css/components/sidebar.css +78 -0
  82. package/dist/css/components/spinner.css +36 -0
  83. package/dist/css/components/table.css +98 -0
  84. package/dist/css/components/tooltip.css +77 -0
  85. package/dist/css/components/topbar-layout.css +108 -0
  86. package/dist/css/icons/icons.css +52 -0
  87. package/dist/css/index.css +20 -0
  88. package/dist/css/layout/container.css +12 -0
  89. package/dist/css/layout/grid.css +40 -0
  90. package/dist/css/layout/shell.css +185 -0
  91. package/dist/css/overlay/default.css +27 -0
  92. package/dist/css/tokens/colors.css +81 -0
  93. package/dist/css/tokens/radius.css +8 -0
  94. package/dist/css/tokens/shadows.css +23 -0
  95. package/dist/css/tokens/spacing.css +30 -0
  96. package/dist/css/tokens/transitions.css +10 -0
  97. package/dist/css/tokens/typography.css +44 -0
  98. package/dist/index.d.ts +43 -0
  99. package/dist/index.js +52 -0
  100. package/dist/layout/NavItem.svelte +84 -0
  101. package/dist/layout/NavItem.svelte.d.ts +25 -0
  102. package/dist/layout/Shell.svelte +7 -0
  103. package/dist/layout/Shell.svelte.d.ts +13 -0
  104. package/dist/layout/SidebarProfile.svelte +31 -0
  105. package/dist/layout/SidebarProfile.svelte.d.ts +19 -0
  106. package/dist/layouts/AppShell.svelte +60 -0
  107. package/dist/layouts/AppShell.svelte.d.ts +21 -0
  108. package/dist/layouts/BarLayout.svelte +60 -0
  109. package/dist/layouts/BarLayout.svelte.d.ts +21 -0
  110. package/dist/layouts/BottomBarLayout.svelte +23 -0
  111. package/dist/layouts/BottomBarLayout.svelte.d.ts +15 -0
  112. package/dist/layouts/DockLayout.svelte +81 -0
  113. package/dist/layouts/DockLayout.svelte.d.ts +15 -0
  114. package/dist/layouts/FloatingDockLayout.svelte +56 -0
  115. package/dist/layouts/FloatingDockLayout.svelte.d.ts +13 -0
  116. package/dist/layouts/FloatingLayout.svelte +80 -0
  117. package/dist/layouts/FloatingLayout.svelte.d.ts +19 -0
  118. package/dist/layouts/FloatingLeftLayout.svelte +59 -0
  119. package/dist/layouts/FloatingLeftLayout.svelte.d.ts +15 -0
  120. package/dist/layouts/FloatingShell.svelte +80 -0
  121. package/dist/layouts/FloatingShell.svelte.d.ts +19 -0
  122. package/dist/layouts/FloatingTopLayout.svelte +68 -0
  123. package/dist/layouts/FloatingTopLayout.svelte.d.ts +15 -0
  124. package/dist/layouts/HybridLayout.svelte +20 -0
  125. package/dist/layouts/HybridLayout.svelte.d.ts +17 -0
  126. package/dist/layouts/IconRailLayout.svelte +75 -0
  127. package/dist/layouts/IconRailLayout.svelte.d.ts +15 -0
  128. package/dist/layouts/LeftBarLayout.svelte +19 -0
  129. package/dist/layouts/LeftBarLayout.svelte.d.ts +15 -0
  130. package/dist/layouts/RightBarLayout.svelte +21 -0
  131. package/dist/layouts/RightBarLayout.svelte.d.ts +15 -0
  132. package/dist/layouts/SideBar.svelte +86 -0
  133. package/dist/layouts/SideBar.svelte.d.ts +17 -0
  134. package/dist/layouts/SidebarLayout.svelte +11 -0
  135. package/dist/layouts/SidebarLayout.svelte.d.ts +15 -0
  136. package/dist/layouts/TopBar.svelte +90 -0
  137. package/dist/layouts/TopBar.svelte.d.ts +21 -0
  138. package/dist/layouts/TopBarLayout.svelte +26 -0
  139. package/dist/layouts/TopBarLayout.svelte.d.ts +15 -0
  140. package/dist/theme/theme.svelte.d.ts +11 -0
  141. package/dist/theme/theme.svelte.js +48 -0
  142. package/package.json +56 -4
@@ -0,0 +1,179 @@
1
+ /* components/modal.css */
2
+
3
+ /* --- Backdrop --- */
4
+
5
+ .modal-backdrop {
6
+ position: fixed;
7
+ inset: 0;
8
+ background-color: rgb(15 23 42 / 0.5);
9
+ z-index: 200;
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ padding: var(--space-4);
14
+ animation: modal-backdrop-in var(--duration-normal) var(--ease-out);
15
+ }
16
+
17
+ .modal-backdrop.closing {
18
+ animation: modal-backdrop-out var(--duration-normal) var(--ease-in) forwards;
19
+ }
20
+
21
+
22
+ /* --- Modal container --- */
23
+
24
+ .modal {
25
+ background-color: var(--color-surface);
26
+ border: 1px solid var(--color-border);
27
+ border-radius: var(--radius-md);
28
+ box-shadow: var(--shadow-lg);
29
+ width: 100%;
30
+ max-width: 32rem;
31
+ max-height: calc(100vh - var(--space-8));
32
+ display: flex;
33
+ flex-direction: column;
34
+ animation: modal-in var(--duration-normal) var(--ease-out);
35
+ }
36
+
37
+ .modal-backdrop.closing .modal {
38
+ animation: modal-out var(--duration-normal) var(--ease-in) forwards;
39
+ }
40
+
41
+
42
+ /* --- Sizes --- */
43
+
44
+ .modal-sm { max-width: 24rem; }
45
+ .modal-lg { max-width: 48rem; }
46
+ .modal-xl { max-width: 64rem; }
47
+ .modal-full { max-width: none; width: calc(100vw - var(--space-8)); max-height: calc(100vh - var(--space-8)); }
48
+
49
+
50
+ /* --- Header --- */
51
+
52
+ .modal-header {
53
+ display: flex;
54
+ align-items: flex-start;
55
+ justify-content: space-between;
56
+ padding: var(--space-5) var(--space-6);
57
+ border-bottom: 1px solid var(--color-border);
58
+ gap: var(--space-4);
59
+ flex-shrink: 0;
60
+ }
61
+
62
+ .modal-title {
63
+ font-size: var(--text-base);
64
+ font-weight: var(--font-semibold);
65
+ color: var(--color-text);
66
+ margin: 0;
67
+ line-height: var(--leading-snug);
68
+ }
69
+
70
+ .modal-subtitle {
71
+ font-size: var(--text-sm);
72
+ color: var(--color-text-muted);
73
+ margin: var(--space-1) 0 0 0;
74
+ }
75
+
76
+ .modal-close { flex-shrink: 0; }
77
+
78
+
79
+ /* --- Body --- */
80
+
81
+ .modal-body { padding: var(--space-6); overflow-y: auto; flex: 1; }
82
+ .modal-body-sm { padding: var(--space-4); }
83
+ .modal-body-lg { padding: var(--space-8); }
84
+
85
+
86
+ /* --- Footer --- */
87
+
88
+ .modal-footer {
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: flex-end;
92
+ padding: var(--space-4) var(--space-6);
93
+ border-top: 1px solid var(--color-border);
94
+ gap: var(--space-2);
95
+ flex-shrink: 0;
96
+ background-color: var(--color-bg-subtle);
97
+ border-radius: 0 0 var(--radius-md) var(--radius-md);
98
+ }
99
+
100
+ .modal-footer-left { justify-content: flex-start; }
101
+ .modal-footer-split { justify-content: space-between; }
102
+
103
+
104
+ /* --- Confirm dialog --- */
105
+
106
+ .modal-confirm .modal-body {
107
+ display: flex;
108
+ gap: var(--space-4);
109
+ align-items: flex-start;
110
+ }
111
+
112
+ .modal-confirm-icon {
113
+ width: 2.5rem;
114
+ height: 2.5rem;
115
+ border-radius: var(--radius-full);
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ flex-shrink: 0;
120
+ font-size: 1.25rem;
121
+ }
122
+
123
+ .modal-confirm-icon-warning { background-color: var(--color-warning-bg); color: var(--color-warning); }
124
+ .modal-confirm-icon-danger { background-color: var(--color-error-bg); color: var(--color-error); }
125
+ .modal-confirm-icon-info { background-color: var(--color-info-bg); color: var(--color-info); }
126
+ .modal-confirm-icon-success { background-color: var(--color-success-bg); color: var(--color-success); }
127
+
128
+ .modal-confirm-title {
129
+ font-size: var(--text-base);
130
+ font-weight: var(--font-semibold);
131
+ color: var(--color-text);
132
+ margin: 0 0 var(--space-1) 0;
133
+ }
134
+
135
+ .modal-confirm-message {
136
+ font-size: var(--text-sm);
137
+ color: var(--color-text-muted);
138
+ margin: 0;
139
+ }
140
+
141
+
142
+ /* --- Drawer variant --- */
143
+
144
+ .modal-backdrop-drawer {
145
+ align-items: stretch;
146
+ justify-content: flex-end;
147
+ padding: 0;
148
+ }
149
+
150
+ .modal-drawer {
151
+ max-width: 28rem;
152
+ max-height: none;
153
+ height: 100vh;
154
+ border-radius: var(--radius-md) 0 0 var(--radius-md);
155
+ animation: drawer-in var(--duration-slow) var(--ease-out);
156
+ }
157
+
158
+ .modal-backdrop-drawer.closing .modal-drawer {
159
+ animation: drawer-out var(--duration-normal) var(--ease-in) forwards;
160
+ }
161
+
162
+
163
+ /* --- Animations --- */
164
+
165
+ @keyframes modal-backdrop-in { from { opacity: 0; } to { opacity: 1; } }
166
+ @keyframes modal-backdrop-out { from { opacity: 1; } to { opacity: 0; } }
167
+
168
+ @keyframes modal-in {
169
+ from { opacity: 0; transform: translateY(-0.5rem) scale(0.98); }
170
+ to { opacity: 1; transform: translateY(0) scale(1); }
171
+ }
172
+
173
+ @keyframes modal-out {
174
+ from { opacity: 1; transform: translateY(0) scale(1); }
175
+ to { opacity: 0; transform: translateY(-0.5rem) scale(0.98); }
176
+ }
177
+
178
+ @keyframes drawer-in { from { transform: translateX(100%); } to { transform: translateX(0); } }
179
+ @keyframes drawer-out { from { transform: translateX(0); } to { transform: translateX(100%); } }
@@ -0,0 +1,190 @@
1
+ /* components/nav.css */
2
+
3
+ .nav-item {
4
+ display: flex;
5
+ align-items: center;
6
+ gap: var(--space-3);
7
+ padding: var(--space-2) var(--space-3);
8
+ border-radius: var(--radius-full);
9
+ font-size: var(--text-sm);
10
+ font-weight: var(--font-medium);
11
+ color: var(--color-text-muted);
12
+ cursor: pointer;
13
+ text-decoration: none;
14
+ transition: background-color var(--duration-fast) var(--ease-default),
15
+ color var(--duration-fast) var(--ease-default);
16
+ user-select: none;
17
+ white-space: nowrap;
18
+ overflow: hidden;
19
+ /* reset button defaults so <button> and <a> look identical */
20
+ width: 100%;
21
+ border: none;
22
+ background: none;
23
+ text-align: left;
24
+ box-sizing: border-box;
25
+ font-family: var(--font-sans);
26
+ line-height: var(--leading-normal);
27
+ -webkit-appearance: none;
28
+ }
29
+
30
+ .nav-item:hover {
31
+ background-color: var(--color-slate-100);
32
+ color: var(--color-text);
33
+ }
34
+
35
+ .nav-item.active {
36
+ background-color: var(--color-primary);
37
+ color: var(--color-primary-text);
38
+ }
39
+
40
+ .nav-item.active:hover {
41
+ background-color: var(--color-primary-hover);
42
+ }
43
+
44
+ .nav-icon {
45
+ font-size: 1.25rem;
46
+ flex-shrink: 0;
47
+ opacity: 0.8;
48
+ }
49
+
50
+ .nav-item.active .nav-icon { opacity: 1; }
51
+
52
+ .nav-label {
53
+ flex: 1;
54
+ overflow: hidden;
55
+ text-overflow: ellipsis;
56
+ }
57
+
58
+ .nav-badge {
59
+ margin-left: auto;
60
+ background-color: var(--color-slate-200);
61
+ color: var(--color-text-muted);
62
+ font-size: var(--text-xs);
63
+ font-weight: var(--font-semibold);
64
+ padding: 0 var(--space-2);
65
+ border-radius: var(--radius-full);
66
+ flex-shrink: 0;
67
+ line-height: 1.6;
68
+ }
69
+
70
+ .nav-item.active .nav-badge {
71
+ background-color: rgb(255 255 255 / 0.2);
72
+ color: var(--color-primary-text);
73
+ }
74
+
75
+
76
+ /* --- Nav group --- */
77
+
78
+ .nav-group-trigger {
79
+ width: 100%;
80
+ background: none;
81
+ border: none;
82
+ }
83
+
84
+ .nav-group-trigger .nav-chevron {
85
+ margin-left: auto;
86
+ font-size: 1rem;
87
+ flex-shrink: 0;
88
+ transition: transform var(--duration-normal) var(--ease-default);
89
+ opacity: 0.6;
90
+ }
91
+
92
+ .nav-group-trigger[aria-expanded="true"] .nav-chevron {
93
+ transform: rotate(180deg);
94
+ }
95
+
96
+ .nav-group-children {
97
+ overflow: hidden;
98
+ height: 0;
99
+ transition: height var(--duration-normal) var(--ease-default);
100
+ }
101
+
102
+ .nav-group-children.open {
103
+ height: auto;
104
+ }
105
+
106
+ .nav-group-children .nav-item {
107
+ padding-left: calc(var(--space-3) + 1rem + var(--space-3));
108
+ font-weight: var(--font-normal);
109
+ }
110
+
111
+
112
+ /* --- Divider --- */
113
+
114
+ .nav-divider {
115
+ height: 1px;
116
+ background: var(--color-border);
117
+ margin: var(--space-2) var(--space-3);
118
+ }
119
+
120
+ /* --- Second level (vertical, expand inline) --- */
121
+
122
+ .nav-item-wrap {
123
+ display: flex;
124
+ flex-direction: column;
125
+ }
126
+
127
+ .nav-chevron {
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ flex-shrink: 0;
132
+ margin-left: auto;
133
+ width: 1.5rem;
134
+ height: 1.5rem;
135
+ border: none;
136
+ background: none;
137
+ cursor: pointer;
138
+ border-radius: var(--radius-sm);
139
+ color: inherit;
140
+ opacity: 0.7;
141
+ transition: transform var(--duration-fast) var(--ease-default),
142
+ opacity var(--duration-fast) var(--ease-default),
143
+ background-color var(--duration-fast) var(--ease-default);
144
+ }
145
+
146
+ .nav-chevron .material-symbols-outlined { font-size: 1.15rem; }
147
+ .nav-chevron:hover { opacity: 1; background-color: rgb(0 0 0 / 0.06); }
148
+ .nav-chevron.open { transform: rotate(90deg); }
149
+
150
+ /* When the parent row is a link, the chevron sits after the badge */
151
+ .nav-item .nav-chevron { margin-left: var(--space-1); }
152
+
153
+ .nav-subitems {
154
+ display: flex;
155
+ flex-direction: column;
156
+ gap: 2px;
157
+ margin: 2px 0 var(--space-1) 0;
158
+ padding-left: var(--space-3);
159
+ /* guide line for the nested group */
160
+ margin-left: var(--space-4);
161
+ border-left: 1px solid var(--color-border);
162
+ }
163
+
164
+ .nav-subitem {
165
+ display: flex;
166
+ align-items: center;
167
+ gap: var(--space-2);
168
+ padding: var(--space-2) var(--space-3);
169
+ border-radius: var(--radius-md);
170
+ font-size: var(--text-sm);
171
+ color: var(--color-text-muted);
172
+ text-decoration: none;
173
+ white-space: nowrap;
174
+ overflow: hidden;
175
+ transition: background-color var(--duration-fast) var(--ease-default),
176
+ color var(--duration-fast) var(--ease-default);
177
+ }
178
+
179
+ .nav-subitem:hover {
180
+ background-color: var(--color-slate-100);
181
+ color: var(--color-text);
182
+ }
183
+
184
+ .nav-subitem.active {
185
+ color: var(--color-primary);
186
+ font-weight: var(--font-semibold);
187
+ background-color: var(--color-info-bg);
188
+ }
189
+
190
+ .nav-subicon { font-size: 1.1rem; flex-shrink: 0; opacity: 0.8; }
@@ -0,0 +1,187 @@
1
+ /* layouts/nestable.css — scaffolding for single-region nestable layouts */
2
+
3
+ /* Root fills its parent completely, so nesting works at any depth.
4
+ The outermost one is sized by its container (e.g. 100vh wrapper). */
5
+ .nl {
6
+ display: flex;
7
+ width: 100%;
8
+ height: 100%;
9
+ min-height: 0;
10
+ min-width: 0;
11
+ }
12
+ .nl-col { flex-direction: column; }
13
+ .nl-row { flex-direction: row; }
14
+
15
+ /* The content area that a child layout (or page) fills. flex:1 + min-0 is what
16
+ lets a nested .nl inside expand to the available space instead of collapsing. */
17
+ .nl-fill {
18
+ flex: 1;
19
+ min-width: 0;
20
+ min-height: 0;
21
+ display: flex;
22
+ flex-direction: column;
23
+ }
24
+ .nl-scroll { overflow: auto; }
25
+
26
+ /* When a plain page (not another layout) is the content, give it padding.
27
+ A nested .nl fills edge-to-edge; direct page content gets breathing room. */
28
+ .nl-fill > :not(.nl):not(.nl-passthrough) {
29
+ padding: var(--space-6);
30
+ }
31
+
32
+ /* Right sidebar wrapper keeps SideBar's border on the correct edge */
33
+ .nl-right .sb { border-right: none; border-left: 1px solid var(--color-border); }
34
+
35
+ /* Bottom bar wrapper: horizontal bar pinned below content */
36
+ .nl-bottom .tb { border-bottom: none; border-top: 1px solid var(--color-border); }
37
+
38
+ /* An outer wrapper helper for the top-level layout to establish full height */
39
+ .nl-app { height: 100vh; }
40
+
41
+ /* ─── Icon rail ─── */
42
+ .ir {
43
+ width: 3.5rem; flex-shrink: 0; display: flex; flex-direction: column; align-items: center;
44
+ gap: var(--space-2); padding: var(--space-3) 0;
45
+ background: var(--color-surface); border-right: 1px solid var(--color-border);
46
+ }
47
+ .ir-brand {
48
+ display: inline-flex; align-items: center; justify-content: center;
49
+ width: 2.25rem; height: 2.25rem; border-radius: var(--radius-md);
50
+ color: var(--color-accent-light, var(--color-primary)); text-decoration: none;
51
+ margin-bottom: var(--space-2);
52
+ }
53
+ .ir-brand .material-symbols-outlined { font-size: 1.5rem; }
54
+ .ir-nav { flex: 1; display: flex; flex-direction: column; gap: var(--space-1); align-items: center; }
55
+ .ir-item {
56
+ position: relative; display: inline-flex; align-items: center; justify-content: center;
57
+ width: 2.5rem; height: 2.5rem; border-radius: var(--radius-md);
58
+ color: var(--color-text-muted); text-decoration: none;
59
+ transition: background var(--duration-fast) var(--ease-default), color var(--duration-fast) var(--ease-default);
60
+ }
61
+ .ir-item .material-symbols-outlined { font-size: 1.4rem; }
62
+ .ir-item:hover { background: var(--color-bg-subtle); color: var(--color-text); }
63
+ .ir-item.active { background: var(--color-primary-subtle, var(--color-bg-subtle)); color: var(--color-primary); }
64
+ .ir-tip {
65
+ position: absolute; left: calc(100% + var(--space-2)); top: 50%; transform: translateY(-50%);
66
+ padding: var(--space-1) var(--space-2); background: var(--color-text, #1e293b); color: var(--color-surface, #fff);
67
+ font-size: var(--text-xs); white-space: nowrap; border-radius: var(--radius-sm);
68
+ opacity: 0; pointer-events: none; transition: opacity var(--duration-fast) var(--ease-default); z-index: 300;
69
+ }
70
+ .ir-item:hover .ir-tip { opacity: 1; }
71
+ .ir-dot { position: absolute; top: 0.5rem; right: 0.5rem; width: 0.45rem; height: 0.45rem; border-radius: var(--radius-full); background: var(--color-primary); }
72
+ .ir-foot { display: flex; align-items: center; justify-content: center; }
73
+
74
+ /* ─── Floating nestable (top / left cards) ─── */
75
+ .nlf-pad { padding: var(--space-4); gap: var(--space-4); background: var(--color-bg); }
76
+ .nlf-topcard {
77
+ display: flex; align-items: center; gap: var(--space-6);
78
+ padding: var(--space-2) var(--space-4); background: var(--color-surface);
79
+ border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-md);
80
+ flex-shrink: 0;
81
+ }
82
+ .nlf-brand { display: inline-flex; align-items: center; gap: var(--space-2); font-weight: var(--font-bold); font-size: var(--text-lg); color: var(--color-text); white-space: nowrap; }
83
+ .nlf-brand-icon { color: var(--color-accent-light, var(--color-primary)); }
84
+ .nlf-topnav { display: flex; align-items: center; gap: var(--space-1); flex: 1; }
85
+ .nlf-toplink, .nlf-sidelink {
86
+ display: inline-flex; align-items: center; gap: var(--space-2);
87
+ padding: var(--space-2) var(--space-3); border-radius: var(--radius-md);
88
+ font-size: var(--text-sm); font-weight: var(--font-medium); color: var(--color-text-muted);
89
+ text-decoration: none; white-space: nowrap;
90
+ transition: background var(--duration-fast) var(--ease-default), color var(--duration-fast) var(--ease-default);
91
+ }
92
+ .nlf-toplink .material-symbols-outlined, .nlf-sidelink .material-symbols-outlined { font-size: 1.2rem; }
93
+ .nlf-toplink:hover, .nlf-sidelink:hover { background: var(--color-bg-subtle); color: var(--color-text); }
94
+ .nlf-toplink.active, .nlf-sidelink.active { background: var(--color-primary-subtle, var(--color-bg-subtle)); color: var(--color-primary); }
95
+ .nlf-actions { display: inline-flex; align-items: center; gap: var(--space-3); }
96
+
97
+ /* Fills the row's height (the flex default is `stretch`), matching the
98
+ non-floating .sb sidebar. */
99
+ .nlf-sidecard {
100
+ width: 14rem; flex-shrink: 0; display: flex; flex-direction: column; padding: var(--space-3);
101
+ background: var(--color-surface); border: 1px solid var(--color-border);
102
+ border-radius: var(--radius-lg); box-shadow: var(--shadow-md); max-height: 100%; overflow-y: auto;
103
+ }
104
+ .nlf-side-brand { padding: var(--space-2) var(--space-2) var(--space-3); }
105
+ /* flex:1 takes the free space, so .nlf-side-foot (e.g. a SidebarProfile) sits
106
+ at the bottom of the card rather than directly under the last nav item —
107
+ same arrangement as .sb-nav / .sb-footer. */
108
+ .nlf-sidenav { display: flex; flex-direction: column; gap: 1px; flex: 1; }
109
+ .nlf-sidelink { justify-content: flex-start; }
110
+ .nlf-sidelabel { flex: 1; }
111
+ .nlf-side-label { font-size: var(--text-xs); font-weight: var(--font-semibold); text-transform: uppercase; letter-spacing: var(--tracking-wide); color: var(--color-text-subtle); padding: var(--space-3) var(--space-2) var(--space-1); }
112
+ .nlf-badge { font-size: var(--text-xs); font-weight: var(--font-semibold); background: var(--color-primary); color: var(--color-primary-text); border-radius: var(--radius-full); padding: 0 var(--space-2); min-width: 1.25rem; text-align: center; }
113
+ .nlf-side-foot { margin-top: var(--space-3); padding-top: var(--space-3); border-top: 1px solid var(--color-border); }
114
+ .nlf-content { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
115
+
116
+ /* ─── Floating dock (nestable) ─── */
117
+ .nldk { position: relative; }
118
+ .nldk-content { padding-bottom: 6rem; }
119
+ .nldk-dockwrap { position: absolute; bottom: var(--space-6); left: 0; right: 0; display: flex; justify-content: center; pointer-events: none; }
120
+ .nldk-dock {
121
+ display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-2);
122
+ background: var(--color-surface); border: 1px solid var(--color-border);
123
+ border-radius: var(--radius-xl, 1rem); box-shadow: var(--shadow-lg); pointer-events: auto;
124
+ }
125
+ .nldk-item {
126
+ position: relative; display: inline-flex; align-items: center; justify-content: center;
127
+ width: 2.75rem; height: 2.75rem; border-radius: var(--radius-md); color: var(--color-text-muted);
128
+ text-decoration: none; transition: background var(--duration-fast) var(--ease-default), color var(--duration-fast) var(--ease-default), transform var(--duration-fast) var(--ease-default);
129
+ }
130
+ .nldk-item .material-symbols-outlined { font-size: 1.5rem; }
131
+ .nldk-item:hover { background: var(--color-bg-subtle); color: var(--color-text); transform: translateY(-4px); }
132
+ .nldk-item.active { color: var(--color-primary); background: var(--color-primary-subtle, var(--color-bg-subtle)); }
133
+ .nldk-label {
134
+ position: absolute; bottom: calc(100% + var(--space-2)); left: 50%; transform: translateX(-50%);
135
+ padding: var(--space-1) var(--space-2); background: var(--color-text, #1e293b); color: var(--color-surface, #fff);
136
+ font-size: var(--text-xs); white-space: nowrap; border-radius: var(--radius-sm);
137
+ opacity: 0; pointer-events: none; transition: opacity var(--duration-fast) var(--ease-default);
138
+ }
139
+ .nldk-item:hover .nldk-label { opacity: 1; }
140
+
141
+ /* ─── Submenus across nestable layouts ─── */
142
+
143
+ /* Floating-left: expandable subnav (like SideBar) */
144
+ .nlf-parent { width: 100%; border: none; background: none; font: inherit; cursor: pointer; text-align: left; }
145
+ .nlf-chevron { font-size: 1.1rem; margin-left: auto; color: var(--color-text-subtle); transition: transform var(--duration-fast) var(--ease-default); }
146
+ .nlf-chevron.open { transform: rotate(90deg); }
147
+ .nlf-subnav { display: flex; flex-direction: column; gap: 1px; margin: 1px 0 1px var(--space-3); padding-left: var(--space-2); border-left: 1px solid var(--color-border); }
148
+ .nlf-sublink {
149
+ display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3);
150
+ border-radius: var(--radius-md); font-size: var(--text-sm); color: var(--color-text-muted); text-decoration: none;
151
+ transition: background var(--duration-fast) var(--ease-default), color var(--duration-fast) var(--ease-default);
152
+ }
153
+ .nlf-sublink .material-symbols-outlined { font-size: 1.05rem; }
154
+ .nlf-sublink:hover { background: var(--color-bg-subtle); color: var(--color-text); }
155
+ .nlf-sublink.active { background: var(--color-primary-subtle, var(--color-bg-subtle)); color: var(--color-primary); }
156
+
157
+ /* Floating-top: flyout (like TopBar) */
158
+ .nlf-flywrap { position: relative; display: inline-flex; align-items: center; }
159
+ .nlf-flybtn { display: inline-flex; align-items: center; justify-content: center; border: none; background: none; cursor: pointer; color: var(--color-text-subtle); padding: var(--space-1); border-radius: var(--radius-sm); }
160
+ .nlf-flybtn:hover { background: var(--color-bg-subtle); }
161
+ .nlf-flyout, .ir-flyout, .nldk-flyout {
162
+ position: absolute; z-index: 300; min-width: 12rem; display: flex; flex-direction: column; gap: 1px;
163
+ padding: var(--space-2); background: var(--color-surface); border: 1px solid var(--color-border);
164
+ border-radius: var(--radius-md); box-shadow: var(--shadow-lg);
165
+ }
166
+ .nlf-flyout { top: calc(100% + var(--space-2)); left: 0; }
167
+ .nlf-flyout-item, .ir-flyout-item, .nldk-flyout-item {
168
+ display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3);
169
+ border-radius: var(--radius-sm); font-size: var(--text-sm); color: var(--color-text); text-decoration: none; white-space: nowrap;
170
+ }
171
+ .nlf-flyout-item .material-symbols-outlined, .ir-flyout-item .material-symbols-outlined, .nldk-flyout-item .material-symbols-outlined { font-size: 1.1rem; color: var(--color-text-muted); }
172
+ .nlf-flyout-item:hover, .ir-flyout-item:hover, .nldk-flyout-item:hover { background: var(--color-bg-subtle); }
173
+
174
+ /* Icon rail: flyout to the right */
175
+ .ir-flywrap { position: relative; display: inline-flex; }
176
+ .ir-flyout { left: calc(100% + var(--space-2)); top: 0; }
177
+ .ir-flyout-head { font-size: var(--text-xs); font-weight: var(--font-semibold); color: var(--color-text-subtle); text-transform: uppercase; letter-spacing: var(--tracking-wide); padding: var(--space-1) var(--space-3) var(--space-2); }
178
+ .ir-flyout-item.active { background: var(--color-primary-subtle, var(--color-bg-subtle)); color: var(--color-primary); }
179
+
180
+ /* Dock: flyout upward */
181
+ .nldk-flywrap { position: relative; display: inline-flex; }
182
+ .nldk-flyout { bottom: calc(100% + var(--space-2)); left: 50%; transform: translateX(-50%); }
183
+
184
+ /* Floating-top parent (opens flyout on whole-item click) */
185
+ .nlf-parent { border: none; background: none; font: inherit; cursor: pointer; }
186
+ .nlf-caret { font-size: 1.05rem; transition: transform var(--duration-fast) var(--ease-default); }
187
+ .nlf-caret.open { transform: rotate(180deg); }
@@ -0,0 +1,50 @@
1
+ /* components/pagination.css */
2
+
3
+ .pagination {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ gap: var(--space-1);
7
+ }
8
+
9
+ .pagination-btn {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ min-width: 2.25rem;
14
+ height: 2.25rem;
15
+ padding: 0 var(--space-2);
16
+ border: 1px solid transparent;
17
+ background: none;
18
+ border-radius: var(--radius-md);
19
+ font: inherit;
20
+ font-size: var(--text-sm);
21
+ font-weight: var(--font-medium);
22
+ color: var(--color-text);
23
+ cursor: pointer;
24
+ transition: background var(--duration-fast) var(--ease-default),
25
+ border-color var(--duration-fast) var(--ease-default),
26
+ color var(--duration-fast) var(--ease-default);
27
+ }
28
+ .pagination-btn:hover:not(:disabled):not(.active) {
29
+ background: var(--color-bg-subtle);
30
+ }
31
+ .pagination-btn.active {
32
+ background: var(--color-primary);
33
+ color: var(--color-primary-text);
34
+ font-weight: var(--font-semibold);
35
+ }
36
+ .pagination-btn:disabled {
37
+ opacity: 0.4;
38
+ cursor: not-allowed;
39
+ }
40
+ .pagination-arrow .material-symbols-outlined { font-size: 1.25rem; }
41
+
42
+ .pagination-ellipsis {
43
+ display: inline-flex;
44
+ align-items: flex-end;
45
+ justify-content: center;
46
+ min-width: 2rem;
47
+ height: 2.25rem;
48
+ color: var(--color-text-subtle);
49
+ padding-bottom: var(--space-1);
50
+ }
@@ -0,0 +1,50 @@
1
+ /* components/progress.css */
2
+
3
+ .progress-container {
4
+ display: flex;
5
+ align-items: center;
6
+ gap: var(--space-3);
7
+ width: 100%;
8
+ }
9
+
10
+ .progress {
11
+ flex: 1;
12
+ overflow: hidden;
13
+ background: var(--color-bg-subtle);
14
+ border-radius: var(--radius-full);
15
+ }
16
+ .progress-sm { height: 0.375rem; }
17
+ .progress-md { height: 0.5rem; }
18
+ .progress-lg { height: 0.75rem; }
19
+
20
+ .progress-bar {
21
+ height: 100%;
22
+ border-radius: var(--radius-full);
23
+ transition: width var(--duration-normal) var(--ease-default);
24
+ }
25
+ .progress-primary { background: var(--color-primary); }
26
+ .progress-success { background: var(--color-success, #16a34a); }
27
+ .progress-warning { background: var(--color-warning, #d97706); }
28
+ .progress-error { background: var(--color-error, #dc2626); }
29
+
30
+ .progress-label {
31
+ font-size: var(--text-xs);
32
+ font-weight: var(--font-semibold);
33
+ color: var(--color-text-muted);
34
+ min-width: 2.5rem;
35
+ text-align: right;
36
+ font-variant-numeric: tabular-nums;
37
+ }
38
+
39
+ /* Indeterminate: a sliding chunk */
40
+ .progress-indeterminate {
41
+ width: 40%;
42
+ animation: progress-slide 1.2s ease-in-out infinite;
43
+ }
44
+ @keyframes progress-slide {
45
+ 0% { margin-left: -40%; }
46
+ 100% { margin-left: 100%; }
47
+ }
48
+ @media (prefers-reduced-motion: reduce) {
49
+ .progress-indeterminate { animation-duration: 2.5s; }
50
+ }