@tapizlabs/ui 0.2.8 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,11 @@ The format is based on Keep a Changelog and the package follows Semantic Version
10
10
  - npm-ready README with package setup, exports, examples, and publishing guidance
11
11
  - shared support for landing icon exports such as `Star`, `AppleIcon`, and `GooglePlayIcon`
12
12
 
13
+ ## [0.2.9] - 2026-06-13
14
+
15
+ ### Added
16
+ - `LogoMark` gains a `"playground"` variant — Tapiz "T" with a shell prompt `>_` glyph (chevron in signal yellow, white cursor) for the Tapiz Playground product
17
+
13
18
  ### Changed
14
19
  - shared `Button` accepts icon component references in addition to rendered nodes
15
20
  - shared `ConfirmDialog` supports both `description` and compatibility `message` props
package/dist/index.d.ts CHANGED
@@ -102,8 +102,16 @@ interface LogoMarkProps {
102
102
  bgClassName?: string;
103
103
  bgFill?: string;
104
104
  bgOpacity?: number;
105
- /** Product glyph: "lms" = T monogram, "boards" = kanban columns */
106
- variant?: "lms" | "boards";
105
+ /**
106
+ * Product glyph:
107
+ * - "lms" = T monogram
108
+ * - "boards" = kanban columns
109
+ * - "playground" = T + shell prompt `>_` (SQL/terminal)
110
+ * - "whiteboard" = tabla sa skiciranim potezom
111
+ * - "cloud" = oblak sa T monogramom (Tapiz Cloud Platform / status)
112
+ * - "specs" = dokument/spec list sa redovima teksta i čekiranom stavkom (Tapiz Specs)
113
+ */
114
+ variant?: "lms" | "boards" | "playground" | "whiteboard" | "cloud" | "specs";
107
115
  }
108
116
  declare const LogoMark: ({ size, className, bgClassName, bgFill, bgOpacity, variant, }: LogoMarkProps) => react.JSX.Element;
109
117
 
package/dist/index.js CHANGED
@@ -491,7 +491,7 @@ var Clock = ({ size = 13, className, style }) => /* @__PURE__ */ jsxs5("svg", {
491
491
  ] });
492
492
 
493
493
  // src/components/icons/LogoIcons.tsx
494
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
494
+ import { Fragment, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
495
495
  var LogoMark = ({
496
496
  size = 28,
497
497
  className,
@@ -509,13 +509,89 @@ var LogoMark = ({
509
509
  fill: "none",
510
510
  children: [
511
511
  /* @__PURE__ */ jsx6("rect", { width: "64", height: "64", rx: "14", fill: bgFill, opacity: bgOpacity, className: bgClassName }),
512
- variant === "lms" ? /* @__PURE__ */ jsxs6("g", { fill: "#fff", children: [
512
+ variant === "lms" && /* @__PURE__ */ jsxs6("g", { fill: "#fff", children: [
513
513
  /* @__PURE__ */ jsx6("rect", { x: "14", y: "14", width: "36", height: "10", rx: "3" }),
514
514
  /* @__PURE__ */ jsx6("rect", { x: "27", y: "14", width: "10", height: "36", rx: "3" })
515
- ] }) : /* @__PURE__ */ jsxs6("g", { fill: "#fff", children: [
515
+ ] }),
516
+ variant === "boards" && /* @__PURE__ */ jsxs6("g", { fill: "#fff", children: [
516
517
  /* @__PURE__ */ jsx6("rect", { x: "13", y: "15", width: "10", height: "26", rx: "5" }),
517
518
  /* @__PURE__ */ jsx6("rect", { x: "27", y: "15", width: "10", height: "34", rx: "5" }),
518
519
  /* @__PURE__ */ jsx6("rect", { x: "41", y: "15", width: "10", height: "20", rx: "5" })
520
+ ] }),
521
+ variant === "playground" && /* @__PURE__ */ jsxs6(Fragment, { children: [
522
+ /* @__PURE__ */ jsxs6("g", { fill: "#fff", children: [
523
+ /* @__PURE__ */ jsx6("rect", { x: "13", y: "12", width: "38", height: "9", rx: "3" }),
524
+ /* @__PURE__ */ jsx6("rect", { x: "27", y: "12", width: "10", height: "30", rx: "3" })
525
+ ] }),
526
+ /* @__PURE__ */ jsx6(
527
+ "path",
528
+ {
529
+ d: "M16 46 L23 51 L16 56",
530
+ stroke: "#d4ff3a",
531
+ strokeWidth: "4.5",
532
+ strokeLinecap: "round",
533
+ strokeLinejoin: "round",
534
+ fill: "none"
535
+ }
536
+ ),
537
+ /* @__PURE__ */ jsx6("rect", { x: "30", y: "52.5", width: "14", height: "4.5", rx: "2.25", fill: "#fff" })
538
+ ] }),
539
+ variant === "whiteboard" && /* @__PURE__ */ jsxs6(Fragment, { children: [
540
+ /* @__PURE__ */ jsx6("rect", { x: "12", y: "15", width: "40", height: "28", rx: "4", fill: "#fff" }),
541
+ /* @__PURE__ */ jsx6(
542
+ "path",
543
+ {
544
+ d: "M19 35 C24 24, 30 24, 33 31 C35.5 37, 41 36, 45 27",
545
+ stroke: "#1496b3",
546
+ strokeWidth: "3.4",
547
+ strokeLinecap: "round",
548
+ strokeLinejoin: "round",
549
+ fill: "none"
550
+ }
551
+ ),
552
+ /* @__PURE__ */ jsx6("circle", { cx: "19", cy: "35", r: "2.6", fill: "#1496b3" }),
553
+ /* @__PURE__ */ jsx6("circle", { cx: "45", cy: "27", r: "2.6", fill: "#d4ff3a" }),
554
+ /* @__PURE__ */ jsx6(
555
+ "path",
556
+ {
557
+ d: "M22 43 L19 51 M42 43 L45 51",
558
+ stroke: "#fff",
559
+ strokeWidth: "4",
560
+ strokeLinecap: "round"
561
+ }
562
+ )
563
+ ] }),
564
+ variant === "cloud" && /* @__PURE__ */ jsxs6(Fragment, { children: [
565
+ /* @__PURE__ */ jsx6(
566
+ "path",
567
+ {
568
+ fill: "#fff",
569
+ d: "M23 45 q-4.6 0-7.8-3.2Q12 38.6 12 34 q0-3.95 2.5-7 2.5-3.05 6.4-3.83 1.05-4.25 4.6-6.91Q29.05 13.6 33.7 13.6 q5.75 0 9.78 3.9 4.03 3.9 4.22 9.52 3.26.29 5.38 2.69 2.12 2.4 2.12 5.63 0 3.58-2.56 6.11T46 47 H23Z"
570
+ }
571
+ ),
572
+ /* @__PURE__ */ jsxs6("g", { fill: "#1496b3", children: [
573
+ /* @__PURE__ */ jsx6("rect", { x: "25", y: "30", width: "16", height: "3.6", rx: "1.6" }),
574
+ /* @__PURE__ */ jsx6("rect", { x: "31.2", y: "30", width: "3.6", height: "12", rx: "1.6" })
575
+ ] })
576
+ ] }),
577
+ variant === "specs" && /* @__PURE__ */ jsxs6(Fragment, { children: [
578
+ /* @__PURE__ */ jsx6("rect", { x: "16", y: "12", width: "32", height: "40", rx: "4", fill: "#fff" }),
579
+ /* @__PURE__ */ jsxs6("g", { fill: "#1496b3", children: [
580
+ /* @__PURE__ */ jsx6("rect", { x: "21", y: "19", width: "22", height: "3.4", rx: "1.7" }),
581
+ /* @__PURE__ */ jsx6("rect", { x: "21", y: "26", width: "22", height: "3.4", rx: "1.7" }),
582
+ /* @__PURE__ */ jsx6("rect", { x: "21", y: "33", width: "14", height: "3.4", rx: "1.7" })
583
+ ] }),
584
+ /* @__PURE__ */ jsx6(
585
+ "path",
586
+ {
587
+ d: "M22 43 L26 47 L34 39",
588
+ stroke: "#d4ff3a",
589
+ strokeWidth: "4",
590
+ strokeLinecap: "round",
591
+ strokeLinejoin: "round",
592
+ fill: "none"
593
+ }
594
+ )
519
595
  ] })
520
596
  ]
521
597
  }
@@ -1777,7 +1853,7 @@ function StatusBadge({ label, variant = "default", className = "" }) {
1777
1853
  // src/components/shared/ActionMenu.tsx
1778
1854
  import { useEffect as useEffect2, useLayoutEffect, useRef as useRef2, useState as useState5 } from "react";
1779
1855
  import { createPortal as createPortal4 } from "react-dom";
1780
- import { Fragment, jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
1856
+ import { Fragment as Fragment2, jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
1781
1857
  var defaultMenuStyle = {
1782
1858
  background: "var(--color-ink-200)",
1783
1859
  border: "1px solid var(--color-border-hi)",
@@ -1861,7 +1937,7 @@ function ActionMenu({
1861
1937
  document.removeEventListener("keydown", handle);
1862
1938
  };
1863
1939
  }, [open]);
1864
- const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment, { children: [
1940
+ const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment2, { children: [
1865
1941
  /* @__PURE__ */ jsx41("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
1866
1942
  /* @__PURE__ */ jsx41(
1867
1943
  "div",
@@ -2239,7 +2315,7 @@ function Breadcrumbs({ items, separator = "/", className = "" }) {
2239
2315
  }
2240
2316
 
2241
2317
  // src/components/navigation/SidebarNav.tsx
2242
- import { Fragment as Fragment2, jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
2318
+ import { Fragment as Fragment3, jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
2243
2319
  function SidebarNav({ groups, header, footer, className = "" }) {
2244
2320
  return /* @__PURE__ */ jsxs39("div", { className: `flex h-full min-h-screen flex-col bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2245
2321
  header ? /* @__PURE__ */ jsx56("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-4", children: header }) : null,
@@ -2256,7 +2332,7 @@ function SidebarNavLink({ item }) {
2256
2332
  item.active ? "border-[var(--tapiz-border-strong)] bg-[var(--tapiz-accent-soft)] text-[var(--tapiz-text-primary)] shadow-[inset_3px_0_0_var(--tapiz-accent)]" : "border-transparent text-[var(--tapiz-text-secondary)] hover:border-[var(--tapiz-border-subtle)] hover:bg-[var(--tapiz-bg-surface-muted)] hover:text-[var(--tapiz-text-primary)]",
2257
2333
  item.disabled ? "pointer-events-none opacity-40" : ""
2258
2334
  ].filter(Boolean).join(" ");
2259
- const content = /* @__PURE__ */ jsxs39(Fragment2, { children: [
2335
+ const content = /* @__PURE__ */ jsxs39(Fragment3, { children: [
2260
2336
  item.icon ? /* @__PURE__ */ jsx56("span", { className: "grid size-5 place-items-center text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
2261
2337
  /* @__PURE__ */ jsx56("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
2262
2338
  item.badge ? /* @__PURE__ */ jsx56("span", { children: item.badge }) : null
@@ -2862,9 +2938,9 @@ function DataToolbar({ title, description, search, filters, actions, className =
2862
2938
  }
2863
2939
 
2864
2940
  // src/components/framework/ResourceCard.tsx
2865
- import { Fragment as Fragment3, jsx as jsx88, jsxs as jsxs65 } from "react/jsx-runtime";
2941
+ import { Fragment as Fragment4, jsx as jsx88, jsxs as jsxs65 } from "react/jsx-runtime";
2866
2942
  function ResourceCard({ title, description, eyebrow, icon, meta, status, actions, href, className = "" }) {
2867
- const content = /* @__PURE__ */ jsxs65(Fragment3, { children: [
2943
+ const content = /* @__PURE__ */ jsxs65(Fragment4, { children: [
2868
2944
  /* @__PURE__ */ jsxs65("div", { className: "flex items-start justify-between gap-4", children: [
2869
2945
  /* @__PURE__ */ jsxs65("div", { className: "flex min-w-0 items-start gap-3", children: [
2870
2946
  icon ? /* @__PURE__ */ jsx88("div", { className: "border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface-muted)] p-2 text-[var(--tapiz-accent)]", children: icon }) : null,
@@ -3159,12 +3235,12 @@ function MasonryGrid({ children, columns = 3, gap = "md", className = "", style
3159
3235
  }
3160
3236
 
3161
3237
  // src/components/layout/PageRail.tsx
3162
- import { Fragment as Fragment4, jsx as jsx103, jsxs as jsxs79 } from "react/jsx-runtime";
3238
+ import { Fragment as Fragment5, jsx as jsx103, jsxs as jsxs79 } from "react/jsx-runtime";
3163
3239
  function PageRail({ title, items, actions, className = "", style }) {
3164
3240
  return /* @__PURE__ */ jsxs79("aside", { className: ["sticky top-20 rounded-none border border-[var(--tapiz-border-subtle)] bg-[var(--tapiz-bg-surface)] p-3 shadow-[var(--tapiz-shadow-sm)]", className].filter(Boolean).join(" "), style, children: [
3165
3241
  title ? /* @__PURE__ */ jsx103("div", { className: "kicker mb-3 px-2", children: title }) : null,
3166
3242
  /* @__PURE__ */ jsx103("nav", { className: "flex flex-col gap-1", children: items.map((item, index) => {
3167
- const content = /* @__PURE__ */ jsxs79(Fragment4, { children: [
3243
+ const content = /* @__PURE__ */ jsxs79(Fragment5, { children: [
3168
3244
  /* @__PURE__ */ jsx103("span", { className: "truncate", children: item.label }),
3169
3245
  item.meta ? /* @__PURE__ */ jsx103("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3170
3246
  ] });