@construct-space/ui 0.1.0 → 0.2.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/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # @construct-space/ui
2
+
3
+ Vue 3 component library for Construct services. 43 production components, shared layouts, composables, and design tokens.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @construct-space/ui
9
+ # or
10
+ bun add @construct-space/ui
11
+ ```
12
+
13
+ ### Peer Dependencies
14
+
15
+ ```bash
16
+ npm install vue reka-ui @iconify/vue
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ```ts
22
+ // Import components individually
23
+ import { CButton, CInput, CModal, CToast } from '@construct-space/ui'
24
+
25
+ // Import shared styles (tokens + utility classes)
26
+ import '@construct-space/ui/style.css'
27
+
28
+ // Or register all components globally
29
+ import { createApp } from 'vue'
30
+ import ConstructUI from '@construct-space/ui'
31
+
32
+ const app = createApp(App)
33
+ app.use(ConstructUI)
34
+ ```
35
+
36
+ ## Components
37
+
38
+ | Category | Components |
39
+ |----------|-----------|
40
+ | **Form** | `CButton`, `CInput`, `CTextarea`, `CSelect`, `CSelectMenu`, `CCheckbox`, `CRadioGroup`, `CSwitch`, `CSlider`, `CColorPicker`, `CFormField` |
41
+ | **Layout** | `CCard`, `CModal`, `CDrawer`, `CSlideover`, `CPopover`, `CDashboardPanel`, `CPanelSection`, `CPropRow`, `CSeparator`, `CScrollArea` |
42
+ | **Data** | `CTable`, `CCalendar`, `CTree`, `CTimeline`, `CPagination` |
43
+ | **Feedback** | `CAlert`, `CBadge`, `CChip`, `CProgress`, `CSkeleton`, `CEmpty`, `CToast` |
44
+ | **Menu** | `CDropdown`, `CDropdownMenu`, `CDropdownMenuItem`, `CContextMenu` |
45
+ | **Display** | `CIcon`, `CAvatar`, `CAccordion`, `CTabs`, `CTooltip`, `CKbd` |
46
+
47
+ ## Layouts
48
+
49
+ ```vue
50
+ <!-- 60px icon sidebar (billing, delivery pattern) -->
51
+ <SidebarLayout
52
+ :nav-items="[{ icon: 'home', label: 'Dashboard', to: '/', active: true }]"
53
+ user-name="John"
54
+ @navigate="router.push($event)"
55
+ @logout="auth.logout()"
56
+ >
57
+ <router-view />
58
+ </SidebarLayout>
59
+
60
+ <!-- Top header bar -->
61
+ <HeaderLayout
62
+ service-name="domains"
63
+ :nav-items="[{ label: 'Dashboard', to: '/' }]"
64
+ >
65
+ <router-view />
66
+ </HeaderLayout>
67
+ ```
68
+
69
+ ## Composables
70
+
71
+ ```ts
72
+ import { useToast, useAuth } from '@construct-space/ui'
73
+
74
+ // Toast notifications
75
+ const { add, remove, clear } = useToast()
76
+ add({ title: 'Saved', color: 'success' })
77
+
78
+ // Auth session management
79
+ const { user, login, logout, checkSession } = useAuth({
80
+ mePath: '/api/auth/me',
81
+ loginPath: '/api/auth/login',
82
+ })
83
+ ```
84
+
85
+ ## Theming
86
+
87
+ Override CSS variables to customize colors per service:
88
+
89
+ ```css
90
+ :root {
91
+ --app-accent: #d4a843; /* billing: gold */
92
+ --app-accent: #ec4899; /* domains: pink */
93
+ --app-accent: #FF2D55; /* delivery: red */
94
+ --app-background: #18181b;
95
+ --app-foreground: #fafafa;
96
+ --app-border: #27272a;
97
+ }
98
+ ```
99
+
100
+ ## License
101
+
102
+ MIT
@@ -12764,7 +12764,7 @@ var Qu = /* @__PURE__ */ _({
12764
12764
  M(() => {
12765
12765
  document.addEventListener("keydown", c);
12766
12766
  }), N(() => {
12767
- document.removeEventListener("keydown", c);
12767
+ document.removeEventListener("keydown", c), document.body.style.overflow = "";
12768
12768
  }), U(() => n.open, (e) => {
12769
12769
  document.body.style.overflow = e ? "hidden" : "";
12770
12770
  });
@@ -15097,16 +15097,16 @@ var eg = { class: "fixed top-4 right-4 z-[100] flex flex-col gap-2 w-80" }, tg =
15097
15097
  "drop-position"
15098
15098
  ]))), 128))], 544));
15099
15099
  }
15100
- }), yg = /* @__PURE__ */ q({ default: () => bg }), bg = /* @__PURE__ */ bm(vg, [["__scopeId", "data-v-9be5dd89"]]), xg = { class: "cui-sidebar-layout" }, Sg = { class: "cui-sidebar" }, Cg = { class: "cui-sidebar-logo" }, wg = ["innerHTML"], Tg = {
15100
+ }), yg = /* @__PURE__ */ q({ default: () => bg }), bg = /* @__PURE__ */ bm(vg, [["__scopeId", "data-v-9be5dd89"]]), xg = { class: "cui-sidebar-layout" }, Sg = { class: "cui-sidebar" }, Cg = { class: "cui-sidebar-logo" }, wg = { key: 0 }, Tg = {
15101
15101
  key: 1,
15102
15102
  class: "cui-sidebar-logo-text"
15103
- }, Eg = { class: "cui-sidebar-nav" }, Dg = ["onClick", "onMouseenter"], Og = ["innerHTML"], kg = {
15103
+ }, Eg = { class: "cui-sidebar-nav" }, Dg = ["onClick", "onMouseenter"], Og = {
15104
15104
  key: 0,
15105
15105
  class: "cui-sidebar-tooltip"
15106
- }, Ag = { class: "cui-sidebar-user" }, jg = ["src", "alt"], Mg = { key: 1 }, Ng = {
15106
+ }, kg = { class: "cui-sidebar-user" }, Ag = ["src", "alt"], jg = { key: 1 }, Mg = {
15107
15107
  key: 0,
15108
15108
  class: "cui-sidebar-user-menu"
15109
- }, Pg = { class: "cui-sidebar-main" }, Fg = /* @__PURE__ */ _({
15109
+ }, Ng = { class: "cui-sidebar-main" }, Pg = /* @__PURE__ */ _({
15110
15110
  __name: "SidebarLayout",
15111
15111
  props: {
15112
15112
  navItems: { default: () => [] },
@@ -15118,37 +15118,41 @@ var eg = { class: "fixed top-4 right-4 z-[100] flex flex-col gap-2 w-80" }, tg =
15118
15118
  },
15119
15119
  emits: ["navigate", "logout"],
15120
15120
  setup(e, { emit: t }) {
15121
- let r = e, i = t, a = I(!1), o = I(null), s = c(() => r.userName ? r.userName.split(" ").map((e) => e[0]).join("").toUpperCase().slice(0, 2) : "?");
15122
- return (t, r) => (P(), d("div", xg, [f("aside", Sg, [
15123
- f("div", Cg, [R(t.$slots, "logo", {}, () => [e.serviceIcon ? (P(), d("span", {
15124
- key: 0,
15125
- innerHTML: e.serviceIcon
15126
- }, null, 8, wg)) : (P(), d("span", Tg, "C"))])]),
15121
+ function r(e) {
15122
+ return e.includes(":") ? e : e.startsWith("lucide-") ? e.replace("-", ":") : `lucide:${e}`;
15123
+ }
15124
+ let i = e, a = t, o = I(!1), s = I(null), l = c(() => i.userName ? i.userName.split(" ").map((e) => e[0]).join("").toUpperCase().slice(0, 2) : "?");
15125
+ return (t, i) => (P(), d("div", xg, [f("aside", Sg, [
15126
+ f("div", Cg, [R(t.$slots, "logo", {}, () => [e.serviceIcon ? (P(), d("span", wg, z(e.serviceIcon), 1)) : (P(), d("span", Tg, "C"))])]),
15127
15127
  f("nav", Eg, [(P(!0), d(n, null, L(e.navItems, (e) => (P(), d("div", {
15128
15128
  key: e.to,
15129
15129
  class: k(["cui-sidebar-nav-item", { active: e.active }]),
15130
- onClick: (t) => i("navigate", e.to),
15131
- onMouseenter: (t) => o.value = e.to,
15132
- onMouseleave: r[0] ||= (e) => o.value = null
15133
- }, [f("span", { innerHTML: e.icon }, null, 8, Og), o.value === e.to ? (P(), d("div", kg, z(e.label), 1)) : u("", !0)], 42, Dg))), 128))]),
15134
- f("div", Ag, [f("div", {
15130
+ onClick: (t) => a("navigate", e.to),
15131
+ onMouseenter: (t) => s.value = e.to,
15132
+ onMouseleave: i[0] ||= (e) => s.value = null
15133
+ }, [h(H(J), {
15134
+ icon: r(e.icon),
15135
+ width: "20",
15136
+ height: "20"
15137
+ }, null, 8, ["icon"]), s.value === e.to ? (P(), d("div", Og, z(e.label), 1)) : u("", !0)], 42, Dg))), 128))]),
15138
+ f("div", kg, [f("div", {
15135
15139
  class: "cui-sidebar-avatar",
15136
15140
  style: j({ background: e.accentColor }),
15137
- onClick: r[1] ||= (e) => a.value = !a.value
15141
+ onClick: i[1] ||= (e) => o.value = !o.value
15138
15142
  }, [e.userAvatar ? (P(), d("img", {
15139
15143
  key: 0,
15140
15144
  src: e.userAvatar,
15141
15145
  alt: e.userName
15142
- }, null, 8, jg)) : (P(), d("span", Mg, z(s.value), 1))], 4), a.value ? (P(), d("div", Ng, [R(t.$slots, "user-menu", {}, () => [f("div", {
15146
+ }, null, 8, Ag)) : (P(), d("span", jg, z(l.value), 1))], 4), o.value ? (P(), d("div", Mg, [R(t.$slots, "user-menu", {}, () => [f("div", {
15143
15147
  class: "cui-sidebar-user-menu-item",
15144
- onClick: r[2] ||= (e) => i("logout")
15148
+ onClick: i[2] ||= (e) => a("logout")
15145
15149
  }, " Sign out ")])])) : u("", !0)])
15146
- ]), f("main", Pg, [R(t.$slots, "default")])]));
15150
+ ]), f("main", Ng, [R(t.$slots, "default")])]));
15147
15151
  }
15148
- }), Ig = { class: "cui-header-layout" }, Lg = { class: "cui-header" }, Rg = { class: "cui-header-container" }, zg = { class: "cui-header-left" }, Bg = { class: "cui-header-logo-sub" }, Vg = {
15152
+ }), Fg = { class: "cui-header-layout" }, Ig = { class: "cui-header" }, Lg = { class: "cui-header-container" }, Rg = { class: "cui-header-left" }, zg = { class: "cui-header-logo-sub" }, Bg = {
15149
15153
  key: 0,
15150
15154
  class: "cui-header-nav"
15151
- }, Hg = ["onClick"], Ug = { class: "cui-header-right" }, Wg = ["src", "alt"], Gg = { key: 1 }, Kg = { class: "cui-header-main" }, qg = /* @__PURE__ */ _({
15155
+ }, Vg = ["onClick"], Hg = { class: "cui-header-right" }, Ug = ["src", "alt"], Wg = { key: 1 }, Gg = { class: "cui-header-main" }, Kg = /* @__PURE__ */ _({
15152
15156
  __name: "HeaderLayout",
15153
15157
  props: {
15154
15158
  serviceName: { default: "" },
@@ -15168,14 +15172,14 @@ var eg = { class: "fixed top-4 right-4 z-[100] flex flex-col gap-2 w-80" }, tg =
15168
15172
  ],
15169
15173
  setup(e, { emit: t }) {
15170
15174
  let r = e, i = t, a = c(() => r.userName ? r.userName.split(" ").map((e) => e[0]).join("").toUpperCase().slice(0, 2) : "?");
15171
- return (t, r) => (P(), d("div", Ig, [f("header", Lg, [f("div", Rg, [f("div", zg, [R(t.$slots, "logo", {}, () => [f("span", {
15175
+ return (t, r) => (P(), d("div", Fg, [f("header", Ig, [f("div", Lg, [f("div", Rg, [R(t.$slots, "logo", {}, () => [f("span", {
15172
15176
  class: "cui-header-logo",
15173
15177
  onClick: r[0] ||= (e) => i("navigate", "/")
15174
- }, [r[3] ||= m(" construct ", -1), f("span", Bg, "/ " + z(e.serviceName), 1)])]), e.navItems.length ? (P(), d("nav", Vg, [(P(!0), d(n, null, L(e.navItems, (e) => (P(), d("a", {
15178
+ }, [r[3] ||= m(" construct ", -1), f("span", zg, "/ " + z(e.serviceName), 1)])]), e.navItems.length ? (P(), d("nav", Bg, [(P(!0), d(n, null, L(e.navItems, (e) => (P(), d("a", {
15175
15179
  key: e.to,
15176
15180
  class: k({ active: e.active }),
15177
15181
  onClick: K((t) => i("navigate", e.to), ["prevent"])
15178
- }, z(e.label), 11, Hg))), 128))])) : u("", !0)]), f("div", Ug, [R(t.$slots, "actions"), e.showAuth && e.userName ? (P(), d("div", {
15182
+ }, z(e.label), 11, Vg))), 128))])) : u("", !0)]), f("div", Hg, [R(t.$slots, "actions"), e.showAuth && e.userName ? (P(), d("div", {
15179
15183
  key: 0,
15180
15184
  class: "cui-header-avatar",
15181
15185
  style: j({ background: e.accentColor }),
@@ -15184,22 +15188,22 @@ var eg = { class: "fixed top-4 right-4 z-[100] flex flex-col gap-2 w-80" }, tg =
15184
15188
  key: 0,
15185
15189
  src: e.userAvatar,
15186
15190
  alt: e.userName
15187
- }, null, 8, Wg)) : (P(), d("span", Gg, z(a.value), 1))], 4)) : e.showAuth ? (P(), d("button", {
15191
+ }, null, 8, Ug)) : (P(), d("span", Wg, z(a.value), 1))], 4)) : e.showAuth ? (P(), d("button", {
15188
15192
  key: 1,
15189
15193
  class: "cui-header-signin",
15190
15194
  onClick: r[2] ||= (e) => i("login")
15191
- }, " Sign in ")) : u("", !0)])])]), f("main", Kg, [R(t.$slots, "default")])]));
15195
+ }, " Sign in ")) : u("", !0)])])]), f("main", Gg, [R(t.$slots, "default")])]));
15192
15196
  }
15193
- }), Jg = {
15197
+ }), qg = {
15194
15198
  apiBase: "",
15195
15199
  mePath: "/api/auth/me",
15196
15200
  loginPath: "/api/auth/login",
15197
15201
  logoutPath: "/api/auth/logout",
15198
15202
  autoCheck: !0
15199
15203
  };
15200
- function Yg(e = {}) {
15204
+ function Jg(e = {}) {
15201
15205
  let t = {
15202
- ...Jg,
15206
+ ...qg,
15203
15207
  ...e
15204
15208
  }, n = I(null), r = I(!0), i = I(null);
15205
15209
  async function a() {
@@ -15234,7 +15238,7 @@ function Yg(e = {}) {
15234
15238
  }
15235
15239
  //#endregion
15236
15240
  //#region src/index.ts
15237
- var Xg = { install(e) {
15241
+ var Yg = { install(e) {
15238
15242
  let t = /* @__PURE__ */ Object.assign({
15239
15243
  "./components/Accordion.vue": vd,
15240
15244
  "./components/Alert.vue": wd,
@@ -15286,4 +15290,4 @@ var Xg = { install(e) {
15286
15290
  }
15287
15291
  } };
15288
15292
  //#endregion
15289
- export { yd as CAccordion, Td as CAlert, Od as CAvatar, jd as CBadge, Fd as CButton, _f as CCalendar, Tf as CCard, kf as CCheckbox, Mf as CChip, Hf as CColorPicker, Gf as CContextMenu, Jf as CDashboardPanel, ep as CDrawer, rp as CDropdown, cp as CDropdownMenu, dp as CDropdownMenuItem, _p as CEmpty, jp as CFormField, Pp as CIcon, Rp as CInput, Hp as CKbd, Yp as CModal, rm as CPagination, um as CPanelSection, pm as CPopover, Sm as CProgress, Dm as CPropRow, Mm as CRadioGroup, Fm as CScrollArea, Vm as CSelect, Km as CSelectMenu, th as CSeparator, ih as CSkeleton, uh as CSlideover, ph as CSlider, vh as CSwitch, Nh as CTable, Ih as CTabs, Bh as CTextarea, qh as CTimeline, pg as CToast, gg as CTooltip, bg as CTree, Xg as ConstructUI, Xg as default, qg as HeaderLayout, Fg as SidebarLayout, Yg as useAuth, $h as useToast };
15293
+ export { yd as CAccordion, Td as CAlert, Od as CAvatar, jd as CBadge, Fd as CButton, _f as CCalendar, Tf as CCard, kf as CCheckbox, Mf as CChip, Hf as CColorPicker, Gf as CContextMenu, Jf as CDashboardPanel, ep as CDrawer, rp as CDropdown, cp as CDropdownMenu, dp as CDropdownMenuItem, _p as CEmpty, jp as CFormField, Pp as CIcon, Rp as CInput, Hp as CKbd, Yp as CModal, rm as CPagination, um as CPanelSection, pm as CPopover, Sm as CProgress, Dm as CPropRow, Mm as CRadioGroup, Fm as CScrollArea, Vm as CSelect, Km as CSelectMenu, th as CSeparator, ih as CSkeleton, uh as CSlideover, ph as CSlider, vh as CSwitch, Nh as CTable, Ih as CTabs, Bh as CTextarea, qh as CTimeline, pg as CToast, gg as CTooltip, bg as CTree, Yg as ConstructUI, Yg as default, Kg as HeaderLayout, Pg as SidebarLayout, Jg as useAuth, $h as useToast };
@@ -1,4 +1,5 @@
1
1
  export interface NavItem {
2
+ /** Iconify icon name, e.g. "lucide:home" or shorthand "home" */
2
3
  icon: string;
3
4
  label: string;
4
5
  to: string;
@@ -12,13 +13,13 @@ type __VLS_Props = {
12
13
  userAvatar?: string;
13
14
  accentColor?: string;
14
15
  };
15
- declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {};
16
+ declare var __VLS_1: {}, __VLS_7: {}, __VLS_9: {};
16
17
  type __VLS_Slots = {} & {
17
18
  logo?: (props: typeof __VLS_1) => any;
18
19
  } & {
19
- 'user-menu'?: (props: typeof __VLS_3) => any;
20
+ 'user-menu'?: (props: typeof __VLS_7) => any;
20
21
  } & {
21
- default?: (props: typeof __VLS_5) => any;
22
+ default?: (props: typeof __VLS_9) => any;
22
23
  };
23
24
  declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
24
25
  navigate: (to: string) => any;
package/dist/style.css CHANGED
@@ -1,2 +1,2 @@
1
- @import "https://fonts.googleapis.com/css2?family=Rubik:wght@300;400;500;600;700&display=swap";@keyframes progress-indeterminate-f944cf9d{0%{transform:translate(-100%)}to{transform:translate(350%)}}.animate-progress-indeterminate[data-v-f944cf9d]{animation:1.5s ease-in-out infinite progress-indeterminate-f944cf9d}.toast-enter-active[data-v-98416c66]{transition:all .3s cubic-bezier(.4,0,.2,1)}.toast-leave-active[data-v-98416c66]{transition:all .2s cubic-bezier(.4,0,1,1)}.toast-enter-from[data-v-98416c66],.toast-leave-to[data-v-98416c66]{opacity:0;transform:translate(100%)}.toast-move[data-v-98416c66]{transition:transform .3s cubic-bezier(.4,0,.2,1)}.tree-root[data-v-9be5dd89]:focus-visible{outline:none}.cui-sidebar-layout{min-height:100vh;display:flex}.cui-sidebar{background:var(--app-background,#18181b);border-right:1px solid var(--app-border,#27272a);z-index:100;flex-direction:column;align-items:center;width:60px;padding:16px 0;display:flex;position:fixed;top:0;bottom:0;left:0}.cui-sidebar-logo{color:var(--app-foreground,#fafafa);margin-bottom:24px;font-size:20px;font-weight:700}.cui-sidebar-logo-text{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.cui-sidebar-nav{flex-direction:column;flex:1;align-items:center;gap:4px;display:flex}.cui-sidebar-nav-item{cursor:pointer;width:40px;height:40px;color:var(--app-muted,#71717a);border-radius:8px;justify-content:center;align-items:center;transition:all .15s;display:flex;position:relative}.cui-sidebar-nav-item:hover{color:var(--app-foreground,#fafafa);background:#ffffff0f}.cui-sidebar-nav-item.active{color:var(--app-accent,#ff2d55);background:#ffffff0f}.cui-sidebar-tooltip{background:var(--app-foreground,#fafafa);color:var(--app-background,#18181b);white-space:nowrap;pointer-events:none;z-index:200;border-radius:6px;padding:5px 10px;font-size:12px;font-weight:500;position:absolute;top:50%;left:52px;transform:translateY(-50%)}.cui-sidebar-user{position:relative}.cui-sidebar-avatar{color:#fff;cursor:pointer;border-radius:50%;justify-content:center;align-items:center;width:32px;height:32px;font-size:12px;font-weight:600;display:flex;overflow:hidden}.cui-sidebar-avatar img{object-fit:cover;width:100%;height:100%}.cui-sidebar-user-menu{background:var(--app-background,#18181b);border:1px solid var(--app-border,#27272a);z-index:200;border-radius:8px;min-width:160px;padding:4px;position:absolute;bottom:0;left:52px}.cui-sidebar-user-menu-item{color:var(--app-foreground,#fafafa);cursor:pointer;border-radius:6px;padding:8px 12px;font-size:13px;transition:background .15s}.cui-sidebar-user-menu-item:hover{background:#ffffff0f}.cui-sidebar-main{flex:1;min-height:100vh;margin-left:60px}.cui-header-layout{flex-direction:column;min-height:100vh;display:flex}.cui-header{border-bottom:1px solid var(--app-border,#27272a);z-index:100;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#12121eeb;padding:14px 0;position:sticky;top:0}.cui-header-container{justify-content:space-between;align-items:center;max-width:1200px;margin:0 auto;padding:0 24px;display:flex}.cui-header-left{align-items:center;gap:24px;display:flex}.cui-header-logo{color:var(--app-foreground,#fafafa);cursor:pointer;letter-spacing:.02em;font-size:16px;font-weight:700}.cui-header-logo-sub{color:var(--app-muted,#71717a);font-weight:400}.cui-header-nav{align-items:center;gap:16px;display:flex}.cui-header-nav a{color:var(--app-muted,#71717a);cursor:pointer;font-size:13px;text-decoration:none;transition:color .15s}.cui-header-nav a:hover,.cui-header-nav a.active{color:var(--app-foreground,#fafafa)}.cui-header-right{align-items:center;gap:12px;display:flex}.cui-header-avatar{color:#fff;cursor:pointer;border-radius:50%;justify-content:center;align-items:center;width:32px;height:32px;font-size:13px;font-weight:600;display:flex;overflow:hidden}.cui-header-avatar img{object-fit:cover;width:100%;height:100%}.cui-header-signin{background:var(--app-accent,#ff2d55);color:#fff;cursor:pointer;border:none;border-radius:6px;padding:6px 16px;font-family:inherit;font-size:13px;font-weight:500;transition:opacity .15s}.cui-header-signin:hover{opacity:.9}.cui-header-main{flex:1}:root{--app-background:#fff;--app-foreground:#1e293b;--app-muted:#94a3b8;--app-accent:#ff2d55;--app-accent-hover:#ff1744;--app-accent-foreground:#fff;--app-border:#e2e8f0;--app-canvas-bg:#f1f5f9;--app-status-bg:#f8fafc;--app-card-bg:#fff;--app-card-hover:#f8fafc;--app-input-bg:#fff;--green:#22c55e;--green-bg:#22c55e1a;--red:#ef4444;--red-bg:#ef44441a;--yellow:#eab308;--radius:8px;--radius-lg:12px;--radius-xl:16px;--font-sans:"Rubik", ui-sans-serif, system-ui, sans-serif}.dark,:root.dark,[data-theme=dark]{--app-background:#18181b;--app-foreground:#fafafa;--app-muted:#71717a;--app-accent:#ff2d55;--app-accent-hover:#ff1744;--app-accent-foreground:#fff;--app-border:#27272a;--app-canvas-bg:#09090b;--app-status-bg:#18181b;--app-card-bg:#1e1e22;--app-card-hover:#27272b;--app-input-bg:#18181b}@media (prefers-color-scheme:dark){:root:not(.light):not([data-theme=light]){--app-background:#18181b;--app-foreground:#fafafa;--app-muted:#71717a;--app-accent:#ff2d55;--app-accent-hover:#ff1744;--app-accent-foreground:#fff;--app-border:#27272a;--app-canvas-bg:#09090b;--app-status-bg:#18181b;--app-card-bg:#1e1e22;--app-card-hover:#27272b;--app-input-bg:#18181b}}*,:before,:after{box-sizing:border-box}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[data-state=checked].bg-primary,[data-state=checked].bg-neutral,button[role=switch][data-state=checked]{background-color:var(--app-accent)!important}button[role=checkbox][data-state=checked],[role=checkbox][data-state=checked]{background-color:var(--app-accent)!important;border-color:var(--app-accent)!important}[data-radix-slider-range],[role=slider] [data-orientation]>span:first-child{background-color:var(--app-accent)!important}[data-radix-slider-thumb],[role=slider] span[role=slider]{border-color:var(--app-accent)!important}input:focus-visible,textarea:focus-visible,select:focus-visible{border-color:var(--app-accent)!important;outline:none!important}label{text-transform:uppercase;letter-spacing:.05em;font-size:.75rem;font-weight:600}input:not([type=checkbox]):not([type=radio]):not([type=range]),textarea,select{color:var(--app-foreground)!important;caret-color:var(--app-foreground)!important}input::placeholder,textarea::placeholder{color:var(--app-muted)!important;opacity:1!important}.btn{border:1px solid var(--app-border);border-radius:var(--radius);background:var(--app-input-bg);color:var(--app-foreground);cursor:pointer;align-items:center;gap:6px;padding:8px 18px;font-family:inherit;font-size:13px;font-weight:500;text-decoration:none;transition:all .15s;display:inline-flex}.btn:hover{background:var(--app-card-hover);border-color:var(--app-muted)}.btn-primary{background:var(--app-accent);border-color:var(--app-accent);color:#fff}.btn-primary:hover{background:var(--app-accent-hover);border-color:var(--app-accent-hover)}.btn-sm{padding:5px 12px;font-size:12px}.btn-lg{border-radius:var(--radius-lg);padding:12px 28px;font-size:15px;font-weight:600}.btn-ghost{color:var(--app-muted);background:0 0;border-color:#0000}.btn-ghost:hover{color:var(--app-foreground);background:var(--app-card-bg)}.btn-icon{color:var(--app-muted);cursor:pointer;border-radius:var(--radius);background:0 0;border:none;padding:6px;font-size:14px}.btn-icon:hover{background:var(--app-card-hover);color:var(--app-foreground)}.btn-danger{color:var(--red)}.btn-danger:hover{background:var(--red-bg);color:var(--red)}.container{max-width:1200px;margin:0 auto;padding:0 24px}.page{padding:32px 0}.page-title{letter-spacing:-.02em;margin-bottom:4px;font-size:22px;font-weight:600}.page-subtitle{color:var(--app-muted);margin-bottom:28px;font-size:14px}.card{background:var(--app-card-bg);border:1px solid var(--app-border);border-radius:var(--radius-lg);overflow:hidden}.card-header{border-bottom:1px solid var(--app-border);justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.card-title{font-size:14px;font-weight:600}.card-body{padding:20px}.form-group{margin-bottom:16px}.form-label{color:var(--app-muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px;font-size:12px;font-weight:500;display:block}.form-input{background:var(--app-input-bg);border:1px solid var(--app-border);border-radius:var(--radius);width:100%;color:var(--app-foreground);outline:none;padding:9px 12px;font-family:inherit;font-size:13px;transition:border-color .15s}.form-input:focus{border-color:var(--app-accent)}.form-input::placeholder{color:var(--app-muted)}.form-row{grid-template-columns:1fr 1fr;gap:12px;display:grid}.badge{text-transform:uppercase;letter-spacing:.05em;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}.spinner{border:2px solid var(--app-border);border-top-color:var(--app-accent);border-radius:50%;width:18px;height:18px;animation:.6s linear infinite cui-spin;display:inline-block}@keyframes cui-spin{to{transform:rotate(360deg)}}.loading-state{color:var(--app-muted);justify-content:center;align-items:center;gap:10px;padding:60px 0;font-size:14px;display:flex}.empty-state{text-align:center;color:var(--app-muted);padding:60px 20px}.empty-state p{margin-bottom:16px;font-size:14px}.cui-toast{background:var(--app-card-bg);border:1px solid var(--app-border);border-radius:var(--radius);z-index:2000;padding:12px 20px;font-size:13px;animation:.2s cui-slideUp;position:fixed;bottom:24px;right:24px}.cui-toast.error{border-color:var(--red);color:var(--red)}.cui-toast.success{border-color:var(--green);color:var(--green)}@keyframes cui-slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.tabs{border-bottom:1px solid var(--app-border);margin-bottom:24px;display:flex}.tab{color:var(--app-muted);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:10px 20px;font-family:inherit;font-size:13px;font-weight:500;transition:all .15s}.tab:hover{color:var(--app-foreground)}.tab.active{color:var(--app-foreground);border-bottom-color:var(--app-accent)}.modal-overlay{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0009;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{background:var(--app-card-bg);border:1px solid var(--app-border);border-radius:var(--radius-lg);width:480px;max-width:90vw;max-height:85vh;overflow-y:auto}.modal-header{justify-content:space-between;align-items:center;padding:20px 24px 16px;display:flex}.modal-title{font-size:16px;font-weight:600}.modal-body{padding:0 24px 24px}.modal-footer{border-top:1px solid var(--app-border);justify-content:flex-end;gap:8px;padding:16px 24px;display:flex}.info-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px;display:grid}.info-item{background:var(--app-input-bg);border-radius:var(--radius);padding:16px}.info-label{text-transform:uppercase;letter-spacing:.05em;color:var(--app-muted);margin-bottom:6px;font-size:11px;font-weight:600}.info-value{font-size:14px;font-weight:500}.toggle{background:var(--app-border);cursor:pointer;border:none;border-radius:11px;width:40px;height:22px;transition:background .2s;position:relative}.toggle.active{background:var(--app-accent)}.toggle:after{content:"";background:#fff;border-radius:50%;width:16px;height:16px;transition:transform .2s;position:absolute;top:3px;left:3px}.toggle.active:after{transform:translate(18px)}.badge-a{color:#60a5fa;background:#60a5fa1f}.badge-aaaa{color:#a78bfa;background:#a78bfa1f}.badge-cname{color:#34d399;background:#34d3991f}.badge-mx{color:#fbbf24;background:#fbbf241f}.badge-txt{color:#f87171;background:#f871711f}.badge-ns{color:#38bdf8;background:#38bdf81f}.badge-srv{color:#fb923c;background:#fb923c1f}.badge-default{color:var(--app-muted);background:#8888a01f}.dns-table{border-collapse:collapse;width:100%}.dns-table th{text-align:left;text-transform:uppercase;letter-spacing:.05em;color:var(--app-muted);border-bottom:1px solid var(--app-border);padding:10px 16px;font-size:11px;font-weight:600}.dns-table td{border-bottom:1px solid var(--app-border);vertical-align:middle;padding:12px 16px;font-size:13px}.dns-table tr:last-child td{border-bottom:none}.dns-table tr:hover td{background:var(--app-card-hover)}.back-link{color:var(--app-muted);align-items:center;gap:6px;margin-bottom:20px;font-size:13px;text-decoration:none;transition:color .15s;display:inline-flex}.back-link:hover{color:var(--app-foreground)}@media (width<=768px){.form-row,.info-grid{grid-template-columns:1fr}}
1
+ @import "https://fonts.googleapis.com/css2?family=Rubik:wght@300;400;500;600;700&display=swap";@keyframes progress-indeterminate-f944cf9d{0%{transform:translate(-100%)}to{transform:translate(350%)}}.animate-progress-indeterminate[data-v-f944cf9d]{animation:1.5s ease-in-out infinite progress-indeterminate-f944cf9d}.toast-enter-active[data-v-98416c66]{transition:all .3s cubic-bezier(.4,0,.2,1)}.toast-leave-active[data-v-98416c66]{transition:all .2s cubic-bezier(.4,0,1,1)}.toast-enter-from[data-v-98416c66],.toast-leave-to[data-v-98416c66]{opacity:0;transform:translate(100%)}.toast-move[data-v-98416c66]{transition:transform .3s cubic-bezier(.4,0,.2,1)}.tree-root[data-v-9be5dd89]:focus-visible{outline:none}.cui-sidebar-layout{min-height:100vh;display:flex}.cui-sidebar{background:var(--app-background,#18181b);border-right:1px solid var(--app-border,#27272a);z-index:100;flex-direction:column;align-items:center;width:60px;padding:16px 0;display:flex;position:fixed;top:0;bottom:0;left:0}.cui-sidebar-logo{color:var(--app-foreground,#fafafa);margin-bottom:24px;font-size:20px;font-weight:700}.cui-sidebar-logo-text{justify-content:center;align-items:center;width:32px;height:32px;display:flex}.cui-sidebar-nav{flex-direction:column;flex:1;align-items:center;gap:4px;display:flex}.cui-sidebar-nav-item{cursor:pointer;width:40px;height:40px;color:var(--app-muted,#71717a);border-radius:8px;justify-content:center;align-items:center;transition:all .15s;display:flex;position:relative}.cui-sidebar-nav-item:hover{color:var(--app-foreground,#fafafa);background:#ffffff0f}.cui-sidebar-nav-item.active{color:var(--app-accent,#ff2d55);background:#ffffff0f}.cui-sidebar-tooltip{background:var(--app-foreground,#fafafa);color:var(--app-background,#18181b);white-space:nowrap;pointer-events:none;z-index:200;border-radius:6px;padding:5px 10px;font-size:12px;font-weight:500;position:absolute;top:50%;left:52px;transform:translateY(-50%)}.cui-sidebar-user{position:relative}.cui-sidebar-avatar{color:#fff;cursor:pointer;border-radius:50%;justify-content:center;align-items:center;width:32px;height:32px;font-size:12px;font-weight:600;display:flex;overflow:hidden}.cui-sidebar-avatar img{object-fit:cover;width:100%;height:100%}.cui-sidebar-user-menu{background:var(--app-background,#18181b);border:1px solid var(--app-border,#27272a);z-index:200;border-radius:8px;min-width:160px;padding:4px;position:absolute;bottom:0;left:52px}.cui-sidebar-user-menu-item{color:var(--app-foreground,#fafafa);cursor:pointer;border-radius:6px;padding:8px 12px;font-size:13px;transition:background .15s}.cui-sidebar-user-menu-item:hover{background:#ffffff0f}.cui-sidebar-main{flex:1;min-height:100vh;margin-left:60px}.cui-header-layout{flex-direction:column;min-height:100vh;display:flex}.cui-header{border-bottom:1px solid var(--app-border,#27272a);z-index:100;background:color-mix(in srgb, var(--app-background) 92%, transparent);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);padding:14px 0;position:sticky;top:0}.cui-header-container{justify-content:space-between;align-items:center;max-width:1200px;margin:0 auto;padding:0 24px;display:flex}.cui-header-left{align-items:center;gap:24px;display:flex}.cui-header-logo{color:var(--app-foreground,#fafafa);cursor:pointer;letter-spacing:.02em;font-size:16px;font-weight:700}.cui-header-logo-sub{color:var(--app-muted,#71717a);font-weight:400}.cui-header-nav{align-items:center;gap:16px;display:flex}.cui-header-nav a{color:var(--app-muted,#71717a);cursor:pointer;font-size:13px;text-decoration:none;transition:color .15s}.cui-header-nav a:hover,.cui-header-nav a.active{color:var(--app-foreground,#fafafa)}.cui-header-right{align-items:center;gap:12px;display:flex}.cui-header-avatar{color:#fff;cursor:pointer;border-radius:50%;justify-content:center;align-items:center;width:32px;height:32px;font-size:13px;font-weight:600;display:flex;overflow:hidden}.cui-header-avatar img{object-fit:cover;width:100%;height:100%}.cui-header-signin{background:var(--app-accent,#ff2d55);color:#fff;cursor:pointer;border:none;border-radius:6px;padding:6px 16px;font-family:inherit;font-size:13px;font-weight:500;transition:opacity .15s}.cui-header-signin:hover{opacity:.9}.cui-header-main{flex:1}:root{--app-background:#fff;--app-foreground:#1e293b;--app-muted:#94a3b8;--app-accent:#ff2d55;--app-accent-hover:#ff1744;--app-accent-foreground:#fff;--app-border:#e2e8f0;--app-canvas-bg:#f1f5f9;--app-status-bg:#f8fafc;--app-card-bg:#fff;--app-card-hover:#f8fafc;--app-input-bg:#fff;--green:#22c55e;--green-bg:#22c55e1a;--red:#ef4444;--red-bg:#ef44441a;--yellow:#eab308;--radius:8px;--radius-lg:12px;--radius-xl:16px;--font-sans:"Rubik", ui-sans-serif, system-ui, sans-serif}.dark,:root.dark,[data-theme=dark]{--app-background:#18181b;--app-foreground:#fafafa;--app-muted:#71717a;--app-accent:#ff2d55;--app-accent-hover:#ff1744;--app-accent-foreground:#fff;--app-border:#27272a;--app-canvas-bg:#09090b;--app-status-bg:#18181b;--app-card-bg:#1e1e22;--app-card-hover:#27272b;--app-input-bg:#18181b}@media (prefers-color-scheme:dark){:root:not(.light):not([data-theme=light]){--app-background:#18181b;--app-foreground:#fafafa;--app-muted:#71717a;--app-accent:#ff2d55;--app-accent-hover:#ff1744;--app-accent-foreground:#fff;--app-border:#27272a;--app-canvas-bg:#09090b;--app-status-bg:#18181b;--app-card-bg:#1e1e22;--app-card-hover:#27272b;--app-input-bg:#18181b}}*,:before,:after{box-sizing:border-box}body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[data-state=checked].bg-primary,[data-state=checked].bg-neutral,button[role=switch][data-state=checked]{background-color:var(--app-accent)!important}button[role=checkbox][data-state=checked],[role=checkbox][data-state=checked]{background-color:var(--app-accent)!important;border-color:var(--app-accent)!important}[data-radix-slider-range],[role=slider] [data-orientation]>span:first-child{background-color:var(--app-accent)!important}[data-radix-slider-thumb],[role=slider] span[role=slider]{border-color:var(--app-accent)!important}input:focus-visible,textarea:focus-visible,select:focus-visible{border-color:var(--app-accent)!important;outline:none!important}.cui-label{text-transform:uppercase;letter-spacing:.05em;font-size:.75rem;font-weight:600}input:not([type=checkbox]):not([type=radio]):not([type=range]),textarea,select{color:var(--app-foreground)!important;caret-color:var(--app-foreground)!important}input::placeholder,textarea::placeholder{color:var(--app-muted)!important;opacity:1!important}.btn{border:1px solid var(--app-border);border-radius:var(--radius);background:var(--app-input-bg);color:var(--app-foreground);cursor:pointer;align-items:center;gap:6px;padding:8px 18px;font-family:inherit;font-size:13px;font-weight:500;text-decoration:none;transition:all .15s;display:inline-flex}.btn:hover{background:var(--app-card-hover);border-color:var(--app-muted)}.btn-primary{background:var(--app-accent);border-color:var(--app-accent);color:#fff}.btn-primary:hover{background:var(--app-accent-hover);border-color:var(--app-accent-hover)}.btn-sm{padding:5px 12px;font-size:12px}.btn-lg{border-radius:var(--radius-lg);padding:12px 28px;font-size:15px;font-weight:600}.btn-ghost{color:var(--app-muted);background:0 0;border-color:#0000}.btn-ghost:hover{color:var(--app-foreground);background:var(--app-card-bg)}.btn-icon{color:var(--app-muted);cursor:pointer;border-radius:var(--radius);background:0 0;border:none;padding:6px;font-size:14px}.btn-icon:hover{background:var(--app-card-hover);color:var(--app-foreground)}.btn-danger{color:var(--red)}.btn-danger:hover{background:var(--red-bg);color:var(--red)}.container{max-width:1200px;margin:0 auto;padding:0 24px}.page{padding:32px 0}.page-title{letter-spacing:-.02em;margin-bottom:4px;font-size:22px;font-weight:600}.page-subtitle{color:var(--app-muted);margin-bottom:28px;font-size:14px}.card{background:var(--app-card-bg);border:1px solid var(--app-border);border-radius:var(--radius-lg);overflow:hidden}.card-header{border-bottom:1px solid var(--app-border);justify-content:space-between;align-items:center;padding:16px 20px;display:flex}.card-title{font-size:14px;font-weight:600}.card-body{padding:20px}.form-group{margin-bottom:16px}.form-label{color:var(--app-muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px;font-size:12px;font-weight:500;display:block}.form-input{background:var(--app-input-bg);border:1px solid var(--app-border);border-radius:var(--radius);width:100%;color:var(--app-foreground);outline:none;padding:9px 12px;font-family:inherit;font-size:13px;transition:border-color .15s}.form-input:focus{border-color:var(--app-accent)}.form-input::placeholder{color:var(--app-muted)}.form-row{grid-template-columns:1fr 1fr;gap:12px;display:grid}.badge{text-transform:uppercase;letter-spacing:.05em;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}.spinner{border:2px solid var(--app-border);border-top-color:var(--app-accent);border-radius:50%;width:18px;height:18px;animation:.6s linear infinite cui-spin;display:inline-block}@keyframes cui-spin{to{transform:rotate(360deg)}}.loading-state{color:var(--app-muted);justify-content:center;align-items:center;gap:10px;padding:60px 0;font-size:14px;display:flex}.empty-state{text-align:center;color:var(--app-muted);padding:60px 20px}.empty-state p{margin-bottom:16px;font-size:14px}.cui-toast{background:var(--app-card-bg);border:1px solid var(--app-border);border-radius:var(--radius);z-index:2000;padding:12px 20px;font-size:13px;animation:.2s cui-slideUp;position:fixed;bottom:24px;right:24px}.cui-toast.error{border-color:var(--red);color:var(--red)}.cui-toast.success{border-color:var(--green);color:var(--green)}@keyframes cui-slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.tabs{border-bottom:1px solid var(--app-border);margin-bottom:24px;display:flex}.tab{color:var(--app-muted);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:10px 20px;font-family:inherit;font-size:13px;font-weight:500;transition:all .15s}.tab:hover{color:var(--app-foreground)}.tab.active{color:var(--app-foreground);border-bottom-color:var(--app-accent)}.modal-overlay{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1000;background:#0009;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{background:var(--app-card-bg);border:1px solid var(--app-border);border-radius:var(--radius-lg);width:480px;max-width:90vw;max-height:85vh;overflow-y:auto}.modal-header{justify-content:space-between;align-items:center;padding:20px 24px 16px;display:flex}.modal-title{font-size:16px;font-weight:600}.modal-body{padding:0 24px 24px}.modal-footer{border-top:1px solid var(--app-border);justify-content:flex-end;gap:8px;padding:16px 24px;display:flex}.info-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px;display:grid}.info-item{background:var(--app-input-bg);border-radius:var(--radius);padding:16px}.info-label{text-transform:uppercase;letter-spacing:.05em;color:var(--app-muted);margin-bottom:6px;font-size:11px;font-weight:600}.info-value{font-size:14px;font-weight:500}.toggle{background:var(--app-border);cursor:pointer;border:none;border-radius:11px;width:40px;height:22px;transition:background .2s;position:relative}.toggle.active{background:var(--app-accent)}.toggle:after{content:"";background:#fff;border-radius:50%;width:16px;height:16px;transition:transform .2s;position:absolute;top:3px;left:3px}.toggle.active:after{transform:translate(18px)}.badge-a{color:#60a5fa;background:#60a5fa1f}.badge-aaaa{color:#a78bfa;background:#a78bfa1f}.badge-cname{color:#34d399;background:#34d3991f}.badge-mx{color:#fbbf24;background:#fbbf241f}.badge-txt{color:#f87171;background:#f871711f}.badge-ns{color:#38bdf8;background:#38bdf81f}.badge-srv{color:#fb923c;background:#fb923c1f}.badge-default{color:var(--app-muted);background:#8888a01f}.dns-table{border-collapse:collapse;width:100%}.dns-table th{text-align:left;text-transform:uppercase;letter-spacing:.05em;color:var(--app-muted);border-bottom:1px solid var(--app-border);padding:10px 16px;font-size:11px;font-weight:600}.dns-table td{border-bottom:1px solid var(--app-border);vertical-align:middle;padding:12px 16px;font-size:13px}.dns-table tr:last-child td{border-bottom:none}.dns-table tr:hover td{background:var(--app-card-hover)}.back-link{color:var(--app-muted);align-items:center;gap:6px;margin-bottom:20px;font-size:13px;text-decoration:none;transition:color .15s;display:inline-flex}.back-link:hover{color:var(--app-foreground)}@media (width<=768px){.form-row,.info-grid{grid-template-columns:1fr}}
2
2
  /*$vite$:1*/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@construct-space/ui",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Construct UI — Vue 3 component library for Construct services",
5
5
  "type": "module",
6
6
  "main": "./dist/construct-ui.js",
@@ -11,7 +11,6 @@
11
11
  "import": "./dist/construct-ui.js",
12
12
  "types": "./dist/index.d.ts"
13
13
  },
14
- "./tokens": "./dist/tokens.css",
15
14
  "./style.css": "./dist/style.css"
16
15
  },
17
16
  "files": [
@@ -44,14 +43,15 @@
44
43
  "release": "bun run build && npm publish"
45
44
  },
46
45
  "peerDependencies": {
47
- "vue": "^3.5.0"
48
- },
49
- "dependencies": {
46
+ "vue": "^3.5.0",
50
47
  "reka-ui": "^2.0.0",
51
48
  "@iconify/vue": "^4.0.0"
52
49
  },
50
+ "dependencies": {},
53
51
  "devDependencies": {
54
52
  "vue": "^3.5.28",
53
+ "reka-ui": "^2.0.0",
54
+ "@iconify/vue": "^4.0.0",
55
55
  "typescript": "^5.9.3",
56
56
  "vite": "^8.0.0",
57
57
  "@vitejs/plugin-vue": "^6.0.5",