@tapizlabs/ui 0.2.7 → 0.2.10

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,17 @@ interface LogoMarkProps {
102
102
  bgClassName?: string;
103
103
  bgFill?: string;
104
104
  bgOpacity?: number;
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
+ */
113
+ variant?: "lms" | "boards" | "playground" | "whiteboard" | "cloud";
105
114
  }
106
- declare const LogoMark: ({ size, className, }: LogoMarkProps) => react.JSX.Element;
115
+ declare const LogoMark: ({ size, className, bgClassName, bgFill, bgOpacity, variant, }: LogoMarkProps) => react.JSX.Element;
107
116
 
108
117
  declare const FormIcon: ({ size, className, style }: IconProps) => react.JSX.Element;
109
118
  declare const CalendarWeek: ({ size, className, style }: IconProps) => react.JSX.Element;
package/dist/index.js CHANGED
@@ -491,27 +491,88 @@ 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
- className
497
+ className,
498
+ bgClassName,
499
+ bgFill = "#1496b3",
500
+ bgOpacity = 1,
501
+ variant = "lms"
498
502
  }) => /* @__PURE__ */ jsxs6(
499
503
  "svg",
500
504
  {
501
505
  width: size,
502
506
  height: size,
503
- className: `${className} w-[${size}px] h-[${size}px]`,
504
- viewBox: "0 0 32 32",
507
+ className,
508
+ viewBox: "0 0 64 64",
505
509
  fill: "none",
506
510
  children: [
507
- /* @__PURE__ */ jsx6("rect", { width: "32", height: "32", rx: "8", fill: "none" }),
508
- /* @__PURE__ */ jsx6("path", { d: "M5 9 L5 5 L9 5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "square" }),
509
- /* @__PURE__ */ jsx6("path", { d: "M23 5 L27 5 L27 9", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "square" }),
510
- /* @__PURE__ */ jsx6("path", { d: "M5 23 L5 27 L9 27", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "square" }),
511
- /* @__PURE__ */ jsx6("path", { d: "M23 27 L27 27 L27 23", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "square", className: "opacity-50" }),
512
- /* @__PURE__ */ jsxs6("g", { fill: "currentColor", children: [
513
- /* @__PURE__ */ jsx6("rect", { x: "15", y: "10", width: "2", height: "14" }),
514
- /* @__PURE__ */ jsx6("rect", { x: "10", y: "10", width: "12", height: "2" })
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: [
513
+ /* @__PURE__ */ jsx6("rect", { x: "14", y: "14", width: "36", height: "10", rx: "3" }),
514
+ /* @__PURE__ */ jsx6("rect", { x: "27", y: "14", width: "10", height: "36", rx: "3" })
515
+ ] }),
516
+ variant === "boards" && /* @__PURE__ */ jsxs6("g", { fill: "#fff", children: [
517
+ /* @__PURE__ */ jsx6("rect", { x: "13", y: "15", width: "10", height: "26", rx: "5" }),
518
+ /* @__PURE__ */ jsx6("rect", { x: "27", y: "15", width: "10", height: "34", rx: "5" }),
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
+ ] })
515
576
  ] })
516
577
  ]
517
578
  }
@@ -1773,7 +1834,7 @@ function StatusBadge({ label, variant = "default", className = "" }) {
1773
1834
  // src/components/shared/ActionMenu.tsx
1774
1835
  import { useEffect as useEffect2, useLayoutEffect, useRef as useRef2, useState as useState5 } from "react";
1775
1836
  import { createPortal as createPortal4 } from "react-dom";
1776
- import { Fragment, jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
1837
+ import { Fragment as Fragment2, jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
1777
1838
  var defaultMenuStyle = {
1778
1839
  background: "var(--color-ink-200)",
1779
1840
  border: "1px solid var(--color-border-hi)",
@@ -1857,7 +1918,7 @@ function ActionMenu({
1857
1918
  document.removeEventListener("keydown", handle);
1858
1919
  };
1859
1920
  }, [open]);
1860
- const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment, { children: [
1921
+ const menuNode = open && pos ? /* @__PURE__ */ jsxs28(Fragment2, { children: [
1861
1922
  /* @__PURE__ */ jsx41("div", { className: "fixed inset-0 z-9998", onClick: () => setOpen(false) }),
1862
1923
  /* @__PURE__ */ jsx41(
1863
1924
  "div",
@@ -2235,7 +2296,7 @@ function Breadcrumbs({ items, separator = "/", className = "" }) {
2235
2296
  }
2236
2297
 
2237
2298
  // src/components/navigation/SidebarNav.tsx
2238
- import { Fragment as Fragment2, jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
2299
+ import { Fragment as Fragment3, jsx as jsx56, jsxs as jsxs39 } from "react/jsx-runtime";
2239
2300
  function SidebarNav({ groups, header, footer, className = "" }) {
2240
2301
  return /* @__PURE__ */ jsxs39("div", { className: `flex h-full min-h-screen flex-col bg-[var(--tapiz-bg-surface)] ${className}`, children: [
2241
2302
  header ? /* @__PURE__ */ jsx56("div", { className: "border-b border-[var(--tapiz-border-subtle)] p-4", children: header }) : null,
@@ -2252,7 +2313,7 @@ function SidebarNavLink({ item }) {
2252
2313
  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)]",
2253
2314
  item.disabled ? "pointer-events-none opacity-40" : ""
2254
2315
  ].filter(Boolean).join(" ");
2255
- const content = /* @__PURE__ */ jsxs39(Fragment2, { children: [
2316
+ const content = /* @__PURE__ */ jsxs39(Fragment3, { children: [
2256
2317
  item.icon ? /* @__PURE__ */ jsx56("span", { className: "grid size-5 place-items-center text-[var(--tapiz-text-muted)]", children: item.icon }) : null,
2257
2318
  /* @__PURE__ */ jsx56("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
2258
2319
  item.badge ? /* @__PURE__ */ jsx56("span", { children: item.badge }) : null
@@ -2858,9 +2919,9 @@ function DataToolbar({ title, description, search, filters, actions, className =
2858
2919
  }
2859
2920
 
2860
2921
  // src/components/framework/ResourceCard.tsx
2861
- import { Fragment as Fragment3, jsx as jsx88, jsxs as jsxs65 } from "react/jsx-runtime";
2922
+ import { Fragment as Fragment4, jsx as jsx88, jsxs as jsxs65 } from "react/jsx-runtime";
2862
2923
  function ResourceCard({ title, description, eyebrow, icon, meta, status, actions, href, className = "" }) {
2863
- const content = /* @__PURE__ */ jsxs65(Fragment3, { children: [
2924
+ const content = /* @__PURE__ */ jsxs65(Fragment4, { children: [
2864
2925
  /* @__PURE__ */ jsxs65("div", { className: "flex items-start justify-between gap-4", children: [
2865
2926
  /* @__PURE__ */ jsxs65("div", { className: "flex min-w-0 items-start gap-3", children: [
2866
2927
  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,
@@ -3155,12 +3216,12 @@ function MasonryGrid({ children, columns = 3, gap = "md", className = "", style
3155
3216
  }
3156
3217
 
3157
3218
  // src/components/layout/PageRail.tsx
3158
- import { Fragment as Fragment4, jsx as jsx103, jsxs as jsxs79 } from "react/jsx-runtime";
3219
+ import { Fragment as Fragment5, jsx as jsx103, jsxs as jsxs79 } from "react/jsx-runtime";
3159
3220
  function PageRail({ title, items, actions, className = "", style }) {
3160
3221
  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: [
3161
3222
  title ? /* @__PURE__ */ jsx103("div", { className: "kicker mb-3 px-2", children: title }) : null,
3162
3223
  /* @__PURE__ */ jsx103("nav", { className: "flex flex-col gap-1", children: items.map((item, index) => {
3163
- const content = /* @__PURE__ */ jsxs79(Fragment4, { children: [
3224
+ const content = /* @__PURE__ */ jsxs79(Fragment5, { children: [
3164
3225
  /* @__PURE__ */ jsx103("span", { className: "truncate", children: item.label }),
3165
3226
  item.meta ? /* @__PURE__ */ jsx103("span", { className: "font-mono text-[10px] text-[var(--tapiz-text-muted)]", children: item.meta }) : null
3166
3227
  ] });