@fayz-ai/ui 0.18.0 → 0.19.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.
Files changed (69) hide show
  1. package/dist/analytics/derive.d.ts +1 -9
  2. package/dist/analytics/derive.d.ts.map +1 -1
  3. package/dist/{chunk-DFOAKWYB.js → chunk-5NEADAIP.js} +3 -3
  4. package/dist/{chunk-DFOAKWYB.js.map → chunk-5NEADAIP.js.map} +1 -1
  5. package/dist/{chunk-Z2ITFPGL.js → chunk-5WSKZU7M.js} +547 -74
  6. package/dist/chunk-5WSKZU7M.js.map +1 -0
  7. package/dist/{chunk-OBIU37AX.js → chunk-6YFPPK7X.js} +28 -14
  8. package/dist/chunk-6YFPPK7X.js.map +1 -0
  9. package/dist/{chunk-ZLPYNHXH.js → chunk-ERSX3C7T.js} +3 -3
  10. package/dist/{chunk-ZLPYNHXH.js.map → chunk-ERSX3C7T.js.map} +1 -1
  11. package/dist/{chunk-3OVZ5JJQ.js → chunk-GLRLWBBF.js} +4 -3
  12. package/dist/chunk-GLRLWBBF.js.map +1 -0
  13. package/dist/{chunk-AASANYXN.js → chunk-OB2ULDBD.js} +6 -4
  14. package/dist/chunk-OB2ULDBD.js.map +1 -0
  15. package/dist/chunk-SB6DWHXI.js +199 -0
  16. package/dist/chunk-SB6DWHXI.js.map +1 -0
  17. package/dist/dashboard/index.js +2 -2
  18. package/dist/icons.d.ts.map +1 -1
  19. package/dist/icons.js +1 -1
  20. package/dist/index.d.ts +2 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +11 -25
  23. package/dist/index.js.map +1 -1
  24. package/dist/layout/AppShell.d.ts +7 -1
  25. package/dist/layout/AppShell.d.ts.map +1 -1
  26. package/dist/layout/SaveBar.d.ts +10 -1
  27. package/dist/layout/SaveBar.d.ts.map +1 -1
  28. package/dist/layout/Sidebar.d.ts.map +1 -1
  29. package/dist/layout/index.js +3 -3
  30. package/dist/lib/error-message.d.ts +2 -0
  31. package/dist/lib/error-message.d.ts.map +1 -0
  32. package/dist/primitives/brand-marks.d.ts +11 -0
  33. package/dist/primitives/brand-marks.d.ts.map +1 -0
  34. package/dist/primitives/button.d.ts +1 -1
  35. package/dist/primitives/dot-badge.d.ts +27 -0
  36. package/dist/primitives/dot-badge.d.ts.map +1 -0
  37. package/dist/primitives/draft-commit-bar.d.ts +27 -0
  38. package/dist/primitives/draft-commit-bar.d.ts.map +1 -0
  39. package/dist/primitives/filter-check-list.d.ts +65 -0
  40. package/dist/primitives/filter-check-list.d.ts.map +1 -0
  41. package/dist/primitives/header-tabs.d.ts +19 -0
  42. package/dist/primitives/header-tabs.d.ts.map +1 -1
  43. package/dist/primitives/image-drop.d.ts.map +1 -1
  44. package/dist/primitives/index.d.ts +6 -0
  45. package/dist/primitives/index.d.ts.map +1 -1
  46. package/dist/primitives/index.js +4 -4
  47. package/dist/primitives/list-chrome.d.ts +5 -1
  48. package/dist/primitives/list-chrome.d.ts.map +1 -1
  49. package/dist/primitives/mini-calendar.d.ts +36 -0
  50. package/dist/primitives/mini-calendar.d.ts.map +1 -0
  51. package/dist/primitives/multi-select.d.ts +21 -0
  52. package/dist/primitives/multi-select.d.ts.map +1 -0
  53. package/dist/primitives/select.d.ts.map +1 -1
  54. package/dist/primitives/stock-entry-form.d.ts +52 -0
  55. package/dist/primitives/stock-entry-form.d.ts.map +1 -0
  56. package/dist/styles.css +100 -0
  57. package/dist/tailwind.cjs +1 -1
  58. package/dist/tailwind.cjs.map +1 -1
  59. package/dist/tailwind.js +1 -1
  60. package/dist/tailwind.js.map +1 -1
  61. package/dist/wizard/index.js +2 -2
  62. package/dist/wizard/useWizard.d.ts.map +1 -1
  63. package/package.json +2 -2
  64. package/dist/chunk-3OVZ5JJQ.js.map +0 -1
  65. package/dist/chunk-4GK6IHOI.js +0 -177
  66. package/dist/chunk-4GK6IHOI.js.map +0 -1
  67. package/dist/chunk-AASANYXN.js.map +0 -1
  68. package/dist/chunk-OBIU37AX.js.map +0 -1
  69. package/dist/chunk-Z2ITFPGL.js.map +0 -1
package/dist/styles.css CHANGED
@@ -639,6 +639,30 @@ select.bg-card,
639
639
  to { opacity: 0; transform: translateY(8px); }
640
640
  }
641
641
  @media (min-width: 640px) {
642
+ /* The desktop POSITION lives here, next to the animation that assumes it.
643
+ It used to be Tailwind utilities on the element (`sm:inset-auto
644
+ sm:left-1/2 sm:top-[15%] sm:-translate-x-1/2`) while these keyframes
645
+ hardcode translateX(-50%) — two halves of one layout with different
646
+ failure modes, because a utility only exists if Tailwind found its literal
647
+ string in a scanned file, and keyframes always ship.
648
+
649
+ In an app whose content globs missed CommandPalette.tsx, `left: 50%` was
650
+ never generated, the mobile `inset: 0` stayed, and the -50% then dragged
651
+ the panel half off-screen — in that app only, which is the worst shape a
652
+ bug can have. Doubled class for specificity (0,2,0) so it beats Tailwind's
653
+ single-class `.inset-0` and `.fixed`; not !important, which would also
654
+ beat the overrides that should win. */
655
+ .saas-cmd-palette.saas-cmd-palette {
656
+ inset: auto;
657
+ left: 50%;
658
+ top: 15%;
659
+ display: block;
660
+ width: 100%;
661
+ max-width: 36rem;
662
+ border-radius: 1rem;
663
+ border-width: 1px;
664
+ transform: translateX(-50%);
665
+ }
642
666
  .saas-cmd-palette[data-state="open"] {
643
667
  animation: saas-cmd-in 200ms ease-out both;
644
668
  }
@@ -692,6 +716,82 @@ select.bg-card,
692
716
  to { opacity: 1; }
693
717
  }
694
718
 
719
+ /* Workspace switch — the screen between two tenants.
720
+ Three parts, staged so the eye lands in order: the surface arrives, the
721
+ identity settles, then the steps report in.
722
+
723
+ The veil is OPACITY ONLY for the same reason .saas-fade-in is: it is
724
+ `fixed inset-0`, and a transform on it (or any ancestor) makes it the
725
+ containing block, so `inset-0` would stop meaning the viewport. Everything
726
+ that travels does so on an inner wrapper. */
727
+ .saas-switch-veil { animation: saas-fade-in 320ms var(--saas-transition-easing) both; }
728
+
729
+ /* 60ms behind the veil: the surface is already there when the name lands on
730
+ it, which is what makes the arrival read as one move rather than two. */
731
+ .saas-switch-rise {
732
+ animation: saas-switch-rise 420ms var(--saas-transition-easing) 60ms both;
733
+ }
734
+ @keyframes saas-switch-rise {
735
+ from { opacity: 0; transform: translateY(10px) scale(0.985); }
736
+ to { opacity: 1; transform: translateY(0) scale(1); }
737
+ }
738
+
739
+ /* A step arrives when it BECOMES the current one — the list is not laid out in
740
+ advance and dimmed, it is written as it happens. So there is no stagger delay
741
+ here: each row's cue is the state change that mounted it. */
742
+ .saas-switch-step {
743
+ animation: saas-switch-step 320ms var(--saas-transition-easing) both;
744
+ }
745
+ @keyframes saas-switch-step {
746
+ from { opacity: 0; transform: translateY(8px); }
747
+ to { opacity: 1; transform: translateY(0); }
748
+ }
749
+
750
+ /* The thread between one step and the next, drawn downward from the step above
751
+ as the new one lands. scaleY from a top origin — a height animation would
752
+ reflow the column on every frame. */
753
+ .saas-switch-link {
754
+ transform-origin: top;
755
+ animation: saas-switch-link 300ms var(--saas-transition-easing) both;
756
+ }
757
+ @keyframes saas-switch-link {
758
+ from { transform: scaleY(0); opacity: 0; }
759
+ to { transform: scaleY(1); opacity: 1; }
760
+ }
761
+
762
+ /* The current step's dot breathes while its work is in flight, and stops the
763
+ moment it is ticked off — so the one moving thing on screen is always the
764
+ thing that is actually happening. */
765
+ .saas-switch-dot { animation: saas-switch-dot 1.4s ease-in-out infinite; }
766
+ @keyframes saas-switch-dot {
767
+ 0%, 100% { opacity: 1; transform: scale(1); }
768
+ 50% { opacity: 0.45; transform: scale(0.72); }
769
+ }
770
+
771
+ /* The ring under the mark: one continuous animation on the screen, and it is
772
+ the loading indicator — which is the only thing a continuous animation is
773
+ for. Scale + opacity, never width/height. */
774
+ .saas-switch-pulse { animation: saas-switch-pulse 2s var(--saas-transition-easing) infinite; }
775
+ @keyframes saas-switch-pulse {
776
+ 0% { opacity: 0.5; transform: scale(0.92); }
777
+ 70% { opacity: 0; transform: scale(1.25); }
778
+ 100% { opacity: 0; transform: scale(1.25); }
779
+ }
780
+
781
+ @media (prefers-reduced-motion: reduce) {
782
+ /* The information still arrives in order; it just stops travelling. The
783
+ pulse goes entirely — an infinite loop is exactly what this preference is
784
+ asking us not to run. */
785
+ .saas-switch-veil, .saas-switch-rise, .saas-switch-step, .saas-switch-link {
786
+ animation-duration: 1ms;
787
+ animation-delay: 0ms;
788
+ }
789
+ /* Both loops go: an infinite animation is precisely what this preference is
790
+ asking us not to run. The steps still appear in order. */
791
+ .saas-switch-pulse { animation: none; opacity: 0; }
792
+ .saas-switch-dot { animation: none; }
793
+ }
794
+
695
795
  /* Sidebar rail push — when the whole left menu swaps context (e.g. app nav →
696
796
  settings nav) the incoming rail pulls in from one side while the outgoing
697
797
  one slides off the other, iOS-push style. The outgoing pane is absolutely
package/dist/tailwind.cjs CHANGED
@@ -200,7 +200,7 @@ var fayzUiPreset = {
200
200
  };
201
201
 
202
202
  // src/tailwind.ts
203
- var SDK_PACKAGES = ["ui", "admin", "saas", "storefront", "portal"];
203
+ var SDK_PACKAGES = ["ui", "admin", "saas", "storefront", "portal", "app-builder"];
204
204
  var GLOB = "/src/**/*.{ts,tsx}";
205
205
  var DIST_GLOB = "/dist/**/*.js";
206
206
  function fayzTailwind(opts = {}) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/preset.ts","../src/tailwind.ts"],"names":[],"mappings":";;;AASA,IAAM,YAAA,GAAgC;AAAA,EACpC,QAAA,EAAU,OAAA;AAAA,EACV,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,oBAAA;AAAA,QACR,KAAA,EAAO,mBAAA;AAAA,QACP,IAAA,EAAM,kBAAA;AAAA,QACN,UAAA,EAAY,wBAAA;AAAA,QACZ,UAAA,EAAY,wBAAA;AAAA,QACZ,OAAA,EAAS;AAAA,UACP,OAAA,EAAS,qBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,SAAA,EAAW;AAAA,UACT,OAAA,EAAS,uBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,WAAA,EAAa;AAAA,UACX,OAAA,EAAS,yBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,OAAA,EAAS;AAAA,UACP,OAAA,EAAS,qBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,OAAA,EAAS;AAAA,UACP,OAAA,EAAS,qBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,OAAA,EAAS,kBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,mBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,WAAA,EAAa;AAAA,UACX,OAAA,EAAS,uBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,cAAA,EAAgB;AAAA,UACd,OAAA,EAAS,0BAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,cAAA,EAAgB;AAAA,UACd,OAAA,EAAS,0BAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,kBAAA,EAAoB;AAAA,UAClB,OAAA,EAAS,8BAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,YAAA,EAAc;AAAA,UACZ,OAAA,EAAS,wBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,mBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS,oBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,OAAA,EAAS,kBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,QACA,OAAA,EAAS;AAAA,UACP,OAAA,EAAS,qBAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA;AAAA,QAEA,OAAA,EAAS;AAAA,UACP,OAAA,EAAS,qBAAA;AAAA,UACT,UAAA,EAAY,gCAAA;AAAA,UACZ,MAAA,EAAQ,4BAAA;AAAA,UACR,MAAA,EAAQ,4BAAA;AAAA,UACR,mBAAA,EAAqB,uCAAA;AAAA,UACrB,KAAA,EAAO;AAAA,SACT;AAAA,QACA,OAAA,EAAS;AAAA,OACX;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,MAAA,EAAQ,sBAAA;AAAA,QACR,IAAA,EAAM,oBAAA;AAAA,QACN,KAAA,EAAO,qBAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,CAAC,oBAAoB,CAAA;AAAA,QAC3B,IAAA,EAAM,CAAC,yBAAyB;AAAA,OAClC;AAAA,MACA,SAAA,EAAW;AAAA,QACT,EAAA,EAAI,kBAAA;AAAA,QACJ,EAAA,EAAI,kBAAA;AAAA,QACJ,EAAA,EAAI,kBAAA;AAAA,QACJ,MAAA,EAAQ,sBAAA;AAAA,QACR,gBAAA,EAAkB,8BAAA;AAAA,QAClB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,UACrB,EAAA,EAAI,EAAE,OAAA,EAAS,GAAA;AAAI,SACrB;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,UACrB,EAAA,EAAI,EAAE,OAAA,EAAS,GAAA;AAAI,SACrB;AAAA,QACA,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,EAAE,SAAA,EAAW,aAAA,EAAe,SAAS,GAAA,EAAI;AAAA,UAC/C,EAAA,EAAI,EAAE,SAAA,EAAW,UAAA,EAAY,SAAS,GAAA;AAAI,SAC5C;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,SAAA,EAAW,UAAA,EAAY,SAAS,GAAA,EAAI;AAAA,UAC5C,EAAA,EAAI,EAAE,SAAA,EAAW,aAAA,EAAe,SAAS,GAAA;AAAI,SAC/C;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,IAAA,EAAM,EAAE,SAAA,EAAW,kBAAA,EAAoB,SAAS,GAAA,EAAI;AAAA,UACpD,EAAA,EAAI,EAAE,SAAA,EAAW,eAAA,EAAiB,SAAS,GAAA;AAAI,SACjD;AAAA,QACA,sBAAA,EAAwB;AAAA,UACtB,IAAA,EAAM,EAAE,SAAA,EAAW,iBAAA,EAAmB,SAAS,GAAA,EAAI;AAAA,UACnD,EAAA,EAAI,EAAE,SAAA,EAAW,eAAA,EAAiB,SAAS,GAAA;AAAI,SACjD;AAAA,QACA,kBAAA,EAAoB;AAAA,UAClB,IAAA,EAAM,EAAE,SAAA,EAAW,eAAA,EAAiB,SAAS,GAAA,EAAI;AAAA,UACjD,EAAA,EAAI,EAAE,SAAA,EAAW,kBAAA,EAAoB,SAAS,GAAA;AAAI,SACpD;AAAA,QACA,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA,EAAK,WAAW,iBAAA,EAAkB;AAAA,UACnD,EAAA,EAAI,EAAE,OAAA,EAAS,GAAA,EAAK,WAAW,eAAA;AAAgB,SACjD;AAAA,QACA,qBAAA,EAAuB;AAAA,UACrB,IAAA,EAAM,EAAE,SAAA,EAAW,kBAAA,EAAmB;AAAA,UACtC,EAAA,EAAI,EAAE,SAAA,EAAW,eAAA;AAAgB,SACnC;AAAA,QACA,oBAAA,EAAsB;AAAA,UACpB,IAAA,EAAM,EAAE,SAAA,EAAW,eAAA,EAAgB;AAAA,UACnC,EAAA,EAAI,EAAE,SAAA,EAAW,kBAAA;AAAmB,SACtC;AAAA,QACA,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA,EAAK,WAAW,kBAAA,EAAmB;AAAA,UACpD,EAAA,EAAI,EAAE,OAAA,EAAS,GAAA,EAAK,WAAW,eAAA;AAAgB,SACjD;AAAA,QACA,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,EAAE,SAAA,EAAW,UAAA,EAAW;AAAA,UAC9B,EAAA,EAAI,EAAE,SAAA,EAAW,aAAA;AAAc,SACjC;AAAA,QACA,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,EAAE,SAAA,EAAW,YAAA,EAAa;AAAA,UAChC,KAAA,EAAO,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,UAClC,MAAA,EAAQ,EAAE,SAAA,EAAW,UAAA;AAAW,SAClC;AAAA,QACA,YAAA,EAAc;AAAA,UACZ,IAAA,EAAM,EAAE,mBAAA,EAAqB,IAAA,EAAK;AAAA,UAClC,EAAA,EAAI,EAAE,mBAAA,EAAqB,GAAA;AAAI,SACjC;AAAA,QACA,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,EAAE,SAAA,EAAW,UAAA,EAAY,SAAS,GAAA,EAAI;AAAA,UAC5C,KAAA,EAAO,EAAE,SAAA,EAAW,aAAA,EAAe,SAAS,GAAA,EAAI;AAAA,UAChD,MAAA,EAAQ,EAAE,SAAA,EAAW,UAAA,EAAY,SAAS,GAAA;AAAI,SAChD;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,IAAA,EAAM,EAAE,SAAA,EAAW,gCAAA,EAAkC,SAAS,GAAA,EAAI;AAAA,UAClE,MAAA,EAAQ,EAAE,SAAA,EAAW,kCAAA,EAAoC,SAAS,GAAA;AAAI,SACxE;AAAA,QACA,YAAA,EAAc;AAAA,UACZ,UAAA,EAAY,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,UAC3B,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA;AAAO;AAC3B,OACF;AAAA,MACA,SAAA,EAAW;AAAA,QACT,SAAA,EAAW,wBAAA;AAAA,QACX,UAAA,EAAY,wBAAA;AAAA,QACZ,SAAA,EAAW,wBAAA;AAAA,QACX,UAAA,EAAY,wBAAA;AAAA,QACZ,mBAAA,EAAqB,kCAAA;AAAA,QACrB,sBAAA,EAAwB,qCAAA;AAAA,QACxB,kBAAA,EAAoB,gCAAA;AAAA,QACpB,qBAAA,EAAuB,yDAAA;AAAA,QACvB,oBAAA,EAAsB,kCAAA;AAAA,QACtB,SAAA,EAAW,wBAAA;AAAA,QACX,SAAA,EAAW,kDAAA;AAAA,QACX,QAAA,EAAU,2BAAA;AAAA,QACV,WAAA,EAAa,mDAAA;AAAA,QACb,YAAA,EAAc,sCAAA;AAAA,QACd,QAAA,EAAU,qDAAA;AAAA,QACV,eAAA,EAAiB,mCAAA;AAAA,QACjB,YAAA,EAAc;AAAA;AAChB;AACF;AAEJ,CAAA;;;AClMA,IAAM,eAAe,CAAC,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,cAAc,QAAQ,CAAA;AACnE,IAAM,IAAA,GAAO,oBAAA;AAQb,IAAM,SAAA,GAAY,eAAA;AAYX,SAAS,YAAA,CAAa,IAAA,GAA4B,EAAC,EAAW;AACnE,EAAA,MAAM,GAAA,GAAM,KAAK,MAAA,IAAU,gBAAA;AAC3B,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,YAAsB,CAAA;AAAA,IAChC,QAAA,EAAU,OAAA;AAAA,IACV,OAAA,EAAS;AAAA,MACP,cAAA;AAAA,MACA,qBAAA;AAAA;AAAA,MAEA,GAAG,aAAa,GAAA,CAAI,CAAC,MAAM,CAAA,wBAAA,EAA2B,CAAC,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AAAA,MACrE,+CAAA;AAAA;AAAA;AAAA,MAGA,GAAG,aAAa,GAAA,CAAI,CAAC,MAAM,CAAA,wBAAA,EAA2B,CAAC,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAAA,MAChE,oDAAA;AAAA;AAAA,MAEA,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,GAAG,CAAA,UAAA,EAAa,CAAC,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAAA,MACxD,GAAG,GAAG,CAAA,4BAAA,CAAA;AAAA,MACN,GAAI,IAAA,CAAK,OAAA,IAAW;AAAC,KACvB;AAAA,IACA,SAAS;AAAC,GACZ;AACF","file":"tailwind.cjs","sourcesContent":["import type { Config } from 'tailwindcss'\n\n/**\n * Tailwind CSS preset for @fayz-ai/ui.\n * Include this in your tailwind.config.ts:\n *\n * import { fayzUiPreset } from '@fayz-ai/ui/theme'\n * export default { presets: [fayzUiPreset], ... }\n */\nconst fayzUiPreset: Partial<Config> = {\n darkMode: 'class',\n theme: {\n extend: {\n colors: {\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n success: {\n DEFAULT: 'hsl(var(--success))',\n foreground: 'hsl(var(--success-foreground))',\n },\n warning: {\n DEFAULT: 'hsl(var(--warning))',\n foreground: 'hsl(var(--warning-foreground))',\n },\n info: {\n DEFAULT: 'hsl(var(--info))',\n foreground: 'hsl(var(--info-foreground))',\n },\n magic: {\n DEFAULT: 'hsl(var(--magic))',\n foreground: 'hsl(var(--magic-foreground))',\n },\n 'info-soft': {\n DEFAULT: 'hsl(var(--info-soft))',\n foreground: 'hsl(var(--info-soft-foreground))',\n },\n 'success-soft': {\n DEFAULT: 'hsl(var(--success-soft))',\n foreground: 'hsl(var(--success-soft-foreground))',\n },\n 'warning-soft': {\n DEFAULT: 'hsl(var(--warning-soft))',\n foreground: 'hsl(var(--warning-soft-foreground))',\n },\n 'destructive-soft': {\n DEFAULT: 'hsl(var(--destructive-soft))',\n foreground: 'hsl(var(--destructive-soft-foreground))',\n },\n 'magic-soft': {\n DEFAULT: 'hsl(var(--magic-soft))',\n foreground: 'hsl(var(--magic-soft-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n // Layout surface tokens\n sidebar: {\n DEFAULT: 'hsl(var(--sidebar))',\n foreground: 'hsl(var(--sidebar-foreground))',\n border: 'hsl(var(--sidebar-border))',\n accent: 'hsl(var(--sidebar-accent))',\n 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',\n muted: 'hsl(var(--sidebar-muted))',\n },\n content: 'hsl(var(--content))',\n },\n borderRadius: {\n button: 'var(--button-radius)',\n card: 'var(--card-radius)',\n input: 'var(--input-radius)',\n modal: 'var(--modal-radius)',\n },\n fontFamily: {\n sans: ['var(--font-family)'],\n mono: ['var(--font-family-mono)'],\n },\n boxShadow: {\n sm: 'var(--shadow-sm)',\n md: 'var(--shadow-md)',\n lg: 'var(--shadow-lg)',\n button: 'var(--shadow-button)',\n 'button-primary': 'var(--shadow-button-primary)',\n 'button-inset': 'var(--shadow-button-inset)',\n },\n keyframes: {\n 'fade-in': {\n from: { opacity: '0' },\n to: { opacity: '1' },\n },\n 'fade-out': {\n from: { opacity: '1' },\n to: { opacity: '0' },\n },\n 'zoom-in': {\n from: { transform: 'scale(0.95)', opacity: '0' },\n to: { transform: 'scale(1)', opacity: '1' },\n },\n 'zoom-out': {\n from: { transform: 'scale(1)', opacity: '1' },\n to: { transform: 'scale(0.95)', opacity: '0' },\n },\n 'slide-in-from-top': {\n from: { transform: 'translateY(-4px)', opacity: '0' },\n to: { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-in-from-bottom': {\n from: { transform: 'translateY(4px)', opacity: '0' },\n to: { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-out-to-top': {\n from: { transform: 'translateY(0)', opacity: '1' },\n to: { transform: 'translateY(-4px)', opacity: '0' },\n },\n 'page-in': {\n from: { opacity: '0', transform: 'translateY(6px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n 'slide-in-from-right': {\n from: { transform: 'translateX(100%)' },\n to: { transform: 'translateX(0)' },\n },\n 'slide-out-to-right': {\n from: { transform: 'translateX(0)' },\n to: { transform: 'translateX(100%)' },\n },\n 'fade-up': {\n from: { opacity: '0', transform: 'translateY(18px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n kenburns: {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.07)' },\n },\n 'badge-pop': {\n '0%': { transform: 'scale(0.6)' },\n '60%': { transform: 'scale(1.25)' },\n '100%': { transform: 'scale(1)' },\n },\n 'draw-check': {\n from: { 'stroke-dashoffset': '48' },\n to: { 'stroke-dashoffset': '0' },\n },\n 'pop-in': {\n '0%': { transform: 'scale(0)', opacity: '0' },\n '70%': { transform: 'scale(1.15)', opacity: '1' },\n '100%': { transform: 'scale(1)', opacity: '1' },\n },\n 'confetti-fall': {\n '0%': { transform: 'translateY(-10px) rotate(0deg)', opacity: '1' },\n '100%': { transform: 'translateY(140px) rotate(540deg)', opacity: '0' },\n },\n 'pulse-soft': {\n '0%, 100%': { opacity: '1' },\n '50%': { opacity: '0.55' },\n },\n },\n animation: {\n 'fade-in': 'fade-in 200ms ease-out',\n 'fade-out': 'fade-out 150ms ease-in',\n 'zoom-in': 'zoom-in 200ms ease-out',\n 'zoom-out': 'zoom-out 150ms ease-in',\n 'slide-in-from-top': 'slide-in-from-top 200ms ease-out',\n 'slide-in-from-bottom': 'slide-in-from-bottom 200ms ease-out',\n 'slide-out-to-top': 'slide-out-to-top 150ms ease-in',\n 'slide-in-from-right': 'slide-in-from-right 250ms cubic-bezier(0.16, 1, 0.3, 1)',\n 'slide-out-to-right': 'slide-out-to-right 200ms ease-in',\n 'page-in': 'page-in 250ms ease-out',\n 'fade-up': 'fade-up 600ms cubic-bezier(0.16, 1, 0.3, 1) both',\n kenburns: 'kenburns 9s ease-out both',\n 'badge-pop': 'badge-pop 350ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n 'draw-check': 'draw-check 600ms ease-out 250ms both',\n 'pop-in': 'pop-in 450ms cubic-bezier(0.34, 1.56, 0.64, 1) both',\n 'confetti-fall': 'confetti-fall 1100ms ease-in both',\n 'pulse-soft': 'pulse-soft 1.6s ease-in-out infinite',\n },\n },\n },\n}\n\nexport default fayzUiPreset\nexport { fayzUiPreset }\n","import type { Config } from 'tailwindcss'\nimport { fayzUiPreset } from './theme/preset'\n\nexport interface FayzTailwindOptions {\n /** Extra app-specific content globs, appended after the SDK globs. */\n content?: string[]\n /** SDK source location relative to the app root (default ../../fayz-sdk). */\n sdkDir?: string\n}\n\n// SDK packages that ship Tailwind class names the app renders.\nconst SDK_PACKAGES = ['ui', 'admin', 'saas', 'storefront', 'portal'] as const\nconst GLOB = '/src/**/*.{ts,tsx}'\n// Published packages ship dist only. Tailwind generates a utility solely when it\n// finds the literal class name in a scanned file, so scanning an installed\n// package means scanning its built JS. tsup does not minify, so the strings\n// survive verbatim (\"flex flex-col space-y-1 p-4\") and the extractor reads them\n// exactly as it reads TSX. Scanning src/ under node_modules matched nothing\n// once packages stopped publishing source, which emitted a stylesheet with no\n// utilities — the app rendered fully unstyled.\nconst DIST_GLOB = '/dist/**/*.js'\n\n/**\n * Shared Tailwind config for Fayz dogfood apps. Applies the Fayz UI preset and\n * scans the SDK shell/UI/plugin source for class names — from node_modules (the\n * Fayz editor sandbox / published) and a sibling `../../fayz-sdk` checkout (local\n * dev). Whichever exists is scanned; missing globs are ignored. Apps no longer\n * hand-maintain content globs or the relative-vs-npm preset import.\n *\n * import { fayzTailwind } from '@fayz-ai/ui/tailwind'\n * export default fayzTailwind()\n */\nexport function fayzTailwind(opts: FayzTailwindOptions = {}): Config {\n const sdk = opts.sdkDir ?? '../../fayz-sdk'\n return {\n presets: [fayzUiPreset as Config],\n darkMode: 'class',\n content: [\n './index.html',\n './src/**/*.{ts,tsx}',\n // Published / sandbox: SDK installed in node_modules, which ships dist only.\n ...SDK_PACKAGES.map((p) => `./node_modules/@fayz-ai/${p}${DIST_GLOB}`),\n './node_modules/@fayz-ai/plugin-*/dist/**/*.js',\n // Pre-0.10.1 installs still carry src/; a glob that matches nothing is\n // ignored, so keeping these costs nothing and keeps older pins styled.\n ...SDK_PACKAGES.map((p) => `./node_modules/@fayz-ai/${p}${GLOB}`),\n './node_modules/@fayz-ai/plugin-*/src/**/*.{ts,tsx}',\n // Local dev: SDK as a sibling checkout (matches nothing in production).\n ...SDK_PACKAGES.map((p) => `${sdk}/packages/${p}${GLOB}`),\n `${sdk}/plugins/*/src/**/*.{ts,tsx}`,\n ...(opts.content ?? []),\n ],\n plugins: [],\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/theme/preset.ts","../src/tailwind.ts"],"names":[],"mappings":"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","file":"tailwind.cjs","sourcesContent":["import type { Config } from 'tailwindcss'\n\n/**\n * Tailwind CSS preset for @fayz-ai/ui.\n * Include this in your tailwind.config.ts:\n *\n * import { fayzUiPreset } from '@fayz-ai/ui/theme'\n * export default { presets: [fayzUiPreset], ... }\n */\nconst fayzUiPreset: Partial<Config> = {\n darkMode: 'class',\n theme: {\n extend: {\n colors: {\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n success: {\n DEFAULT: 'hsl(var(--success))',\n foreground: 'hsl(var(--success-foreground))',\n },\n warning: {\n DEFAULT: 'hsl(var(--warning))',\n foreground: 'hsl(var(--warning-foreground))',\n },\n info: {\n DEFAULT: 'hsl(var(--info))',\n foreground: 'hsl(var(--info-foreground))',\n },\n magic: {\n DEFAULT: 'hsl(var(--magic))',\n foreground: 'hsl(var(--magic-foreground))',\n },\n 'info-soft': {\n DEFAULT: 'hsl(var(--info-soft))',\n foreground: 'hsl(var(--info-soft-foreground))',\n },\n 'success-soft': {\n DEFAULT: 'hsl(var(--success-soft))',\n foreground: 'hsl(var(--success-soft-foreground))',\n },\n 'warning-soft': {\n DEFAULT: 'hsl(var(--warning-soft))',\n foreground: 'hsl(var(--warning-soft-foreground))',\n },\n 'destructive-soft': {\n DEFAULT: 'hsl(var(--destructive-soft))',\n foreground: 'hsl(var(--destructive-soft-foreground))',\n },\n 'magic-soft': {\n DEFAULT: 'hsl(var(--magic-soft))',\n foreground: 'hsl(var(--magic-soft-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n // Layout surface tokens\n sidebar: {\n DEFAULT: 'hsl(var(--sidebar))',\n foreground: 'hsl(var(--sidebar-foreground))',\n border: 'hsl(var(--sidebar-border))',\n accent: 'hsl(var(--sidebar-accent))',\n 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',\n muted: 'hsl(var(--sidebar-muted))',\n },\n content: 'hsl(var(--content))',\n },\n borderRadius: {\n button: 'var(--button-radius)',\n card: 'var(--card-radius)',\n input: 'var(--input-radius)',\n modal: 'var(--modal-radius)',\n },\n fontFamily: {\n sans: ['var(--font-family)'],\n mono: ['var(--font-family-mono)'],\n },\n boxShadow: {\n sm: 'var(--shadow-sm)',\n md: 'var(--shadow-md)',\n lg: 'var(--shadow-lg)',\n button: 'var(--shadow-button)',\n 'button-primary': 'var(--shadow-button-primary)',\n 'button-inset': 'var(--shadow-button-inset)',\n },\n keyframes: {\n 'fade-in': {\n from: { opacity: '0' },\n to: { opacity: '1' },\n },\n 'fade-out': {\n from: { opacity: '1' },\n to: { opacity: '0' },\n },\n 'zoom-in': {\n from: { transform: 'scale(0.95)', opacity: '0' },\n to: { transform: 'scale(1)', opacity: '1' },\n },\n 'zoom-out': {\n from: { transform: 'scale(1)', opacity: '1' },\n to: { transform: 'scale(0.95)', opacity: '0' },\n },\n 'slide-in-from-top': {\n from: { transform: 'translateY(-4px)', opacity: '0' },\n to: { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-in-from-bottom': {\n from: { transform: 'translateY(4px)', opacity: '0' },\n to: { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-out-to-top': {\n from: { transform: 'translateY(0)', opacity: '1' },\n to: { transform: 'translateY(-4px)', opacity: '0' },\n },\n 'page-in': {\n from: { opacity: '0', transform: 'translateY(6px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n 'slide-in-from-right': {\n from: { transform: 'translateX(100%)' },\n to: { transform: 'translateX(0)' },\n },\n 'slide-out-to-right': {\n from: { transform: 'translateX(0)' },\n to: { transform: 'translateX(100%)' },\n },\n 'fade-up': {\n from: { opacity: '0', transform: 'translateY(18px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n kenburns: {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.07)' },\n },\n 'badge-pop': {\n '0%': { transform: 'scale(0.6)' },\n '60%': { transform: 'scale(1.25)' },\n '100%': { transform: 'scale(1)' },\n },\n 'draw-check': {\n from: { 'stroke-dashoffset': '48' },\n to: { 'stroke-dashoffset': '0' },\n },\n 'pop-in': {\n '0%': { transform: 'scale(0)', opacity: '0' },\n '70%': { transform: 'scale(1.15)', opacity: '1' },\n '100%': { transform: 'scale(1)', opacity: '1' },\n },\n 'confetti-fall': {\n '0%': { transform: 'translateY(-10px) rotate(0deg)', opacity: '1' },\n '100%': { transform: 'translateY(140px) rotate(540deg)', opacity: '0' },\n },\n 'pulse-soft': {\n '0%, 100%': { opacity: '1' },\n '50%': { opacity: '0.55' },\n },\n },\n animation: {\n 'fade-in': 'fade-in 200ms ease-out',\n 'fade-out': 'fade-out 150ms ease-in',\n 'zoom-in': 'zoom-in 200ms ease-out',\n 'zoom-out': 'zoom-out 150ms ease-in',\n 'slide-in-from-top': 'slide-in-from-top 200ms ease-out',\n 'slide-in-from-bottom': 'slide-in-from-bottom 200ms ease-out',\n 'slide-out-to-top': 'slide-out-to-top 150ms ease-in',\n 'slide-in-from-right': 'slide-in-from-right 250ms cubic-bezier(0.16, 1, 0.3, 1)',\n 'slide-out-to-right': 'slide-out-to-right 200ms ease-in',\n 'page-in': 'page-in 250ms ease-out',\n 'fade-up': 'fade-up 600ms cubic-bezier(0.16, 1, 0.3, 1) both',\n kenburns: 'kenburns 9s ease-out both',\n 'badge-pop': 'badge-pop 350ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n 'draw-check': 'draw-check 600ms ease-out 250ms both',\n 'pop-in': 'pop-in 450ms cubic-bezier(0.34, 1.56, 0.64, 1) both',\n 'confetti-fall': 'confetti-fall 1100ms ease-in both',\n 'pulse-soft': 'pulse-soft 1.6s ease-in-out infinite',\n },\n },\n },\n}\n\nexport default fayzUiPreset\nexport { fayzUiPreset }\n","import type { Config } from 'tailwindcss'\nimport { fayzUiPreset } from './theme/preset'\n\nexport interface FayzTailwindOptions {\n /** Extra app-specific content globs, appended after the SDK globs. */\n content?: string[]\n /** SDK source location relative to the app root (default ../../fayz-sdk). */\n sdkDir?: string\n}\n\n// SDK packages that ship Tailwind class names the app renders.\nconst SDK_PACKAGES = ['ui', 'admin', 'saas', 'storefront', 'portal', 'app-builder'] as const\nconst GLOB = '/src/**/*.{ts,tsx}'\n// Published packages ship dist only. Tailwind generates a utility solely when it\n// finds the literal class name in a scanned file, so scanning an installed\n// package means scanning its built JS. tsup does not minify, so the strings\n// survive verbatim (\"flex flex-col space-y-1 p-4\") and the extractor reads them\n// exactly as it reads TSX. Scanning src/ under node_modules matched nothing\n// once packages stopped publishing source, which emitted a stylesheet with no\n// utilities — the app rendered fully unstyled.\nconst DIST_GLOB = '/dist/**/*.js'\n\n/**\n * Shared Tailwind config for Fayz dogfood apps. Applies the Fayz UI preset and\n * scans the SDK shell/UI/plugin source for class names — from node_modules (the\n * Fayz editor sandbox / published) and a sibling `../../fayz-sdk` checkout (local\n * dev). Whichever exists is scanned; missing globs are ignored. Apps no longer\n * hand-maintain content globs or the relative-vs-npm preset import.\n *\n * import { fayzTailwind } from '@fayz-ai/ui/tailwind'\n * export default fayzTailwind()\n */\nexport function fayzTailwind(opts: FayzTailwindOptions = {}): Config {\n const sdk = opts.sdkDir ?? '../../fayz-sdk'\n return {\n presets: [fayzUiPreset as Config],\n darkMode: 'class',\n content: [\n './index.html',\n './src/**/*.{ts,tsx}',\n // Published / sandbox: SDK installed in node_modules, which ships dist only.\n ...SDK_PACKAGES.map((p) => `./node_modules/@fayz-ai/${p}${DIST_GLOB}`),\n './node_modules/@fayz-ai/plugin-*/dist/**/*.js',\n // Pre-0.10.1 installs still carry src/; a glob that matches nothing is\n // ignored, so keeping these costs nothing and keeps older pins styled.\n ...SDK_PACKAGES.map((p) => `./node_modules/@fayz-ai/${p}${GLOB}`),\n './node_modules/@fayz-ai/plugin-*/src/**/*.{ts,tsx}',\n // Local dev: SDK as a sibling checkout (matches nothing in production).\n ...SDK_PACKAGES.map((p) => `${sdk}/packages/${p}${GLOB}`),\n `${sdk}/plugins/*/src/**/*.{ts,tsx}`,\n ...(opts.content ?? []),\n ],\n plugins: [],\n }\n}\n"]}
package/dist/tailwind.js CHANGED
@@ -198,7 +198,7 @@ var fayzUiPreset = {
198
198
  };
199
199
 
200
200
  // src/tailwind.ts
201
- var SDK_PACKAGES = ["ui", "admin", "saas", "storefront", "portal"];
201
+ var SDK_PACKAGES = ["ui", "admin", "saas", "storefront", "portal", "app-builder"];
202
202
  var GLOB = "/src/**/*.{ts,tsx}";
203
203
  var DIST_GLOB = "/dist/**/*.js";
204
204
  function fayzTailwind(opts = {}) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/preset.ts","../src/tailwind.ts"],"names":[],"mappings":"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","file":"tailwind.js","sourcesContent":["import type { Config } from 'tailwindcss'\n\n/**\n * Tailwind CSS preset for @fayz-ai/ui.\n * Include this in your tailwind.config.ts:\n *\n * import { fayzUiPreset } from '@fayz-ai/ui/theme'\n * export default { presets: [fayzUiPreset], ... }\n */\nconst fayzUiPreset: Partial<Config> = {\n darkMode: 'class',\n theme: {\n extend: {\n colors: {\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n success: {\n DEFAULT: 'hsl(var(--success))',\n foreground: 'hsl(var(--success-foreground))',\n },\n warning: {\n DEFAULT: 'hsl(var(--warning))',\n foreground: 'hsl(var(--warning-foreground))',\n },\n info: {\n DEFAULT: 'hsl(var(--info))',\n foreground: 'hsl(var(--info-foreground))',\n },\n magic: {\n DEFAULT: 'hsl(var(--magic))',\n foreground: 'hsl(var(--magic-foreground))',\n },\n 'info-soft': {\n DEFAULT: 'hsl(var(--info-soft))',\n foreground: 'hsl(var(--info-soft-foreground))',\n },\n 'success-soft': {\n DEFAULT: 'hsl(var(--success-soft))',\n foreground: 'hsl(var(--success-soft-foreground))',\n },\n 'warning-soft': {\n DEFAULT: 'hsl(var(--warning-soft))',\n foreground: 'hsl(var(--warning-soft-foreground))',\n },\n 'destructive-soft': {\n DEFAULT: 'hsl(var(--destructive-soft))',\n foreground: 'hsl(var(--destructive-soft-foreground))',\n },\n 'magic-soft': {\n DEFAULT: 'hsl(var(--magic-soft))',\n foreground: 'hsl(var(--magic-soft-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n // Layout surface tokens\n sidebar: {\n DEFAULT: 'hsl(var(--sidebar))',\n foreground: 'hsl(var(--sidebar-foreground))',\n border: 'hsl(var(--sidebar-border))',\n accent: 'hsl(var(--sidebar-accent))',\n 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',\n muted: 'hsl(var(--sidebar-muted))',\n },\n content: 'hsl(var(--content))',\n },\n borderRadius: {\n button: 'var(--button-radius)',\n card: 'var(--card-radius)',\n input: 'var(--input-radius)',\n modal: 'var(--modal-radius)',\n },\n fontFamily: {\n sans: ['var(--font-family)'],\n mono: ['var(--font-family-mono)'],\n },\n boxShadow: {\n sm: 'var(--shadow-sm)',\n md: 'var(--shadow-md)',\n lg: 'var(--shadow-lg)',\n button: 'var(--shadow-button)',\n 'button-primary': 'var(--shadow-button-primary)',\n 'button-inset': 'var(--shadow-button-inset)',\n },\n keyframes: {\n 'fade-in': {\n from: { opacity: '0' },\n to: { opacity: '1' },\n },\n 'fade-out': {\n from: { opacity: '1' },\n to: { opacity: '0' },\n },\n 'zoom-in': {\n from: { transform: 'scale(0.95)', opacity: '0' },\n to: { transform: 'scale(1)', opacity: '1' },\n },\n 'zoom-out': {\n from: { transform: 'scale(1)', opacity: '1' },\n to: { transform: 'scale(0.95)', opacity: '0' },\n },\n 'slide-in-from-top': {\n from: { transform: 'translateY(-4px)', opacity: '0' },\n to: { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-in-from-bottom': {\n from: { transform: 'translateY(4px)', opacity: '0' },\n to: { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-out-to-top': {\n from: { transform: 'translateY(0)', opacity: '1' },\n to: { transform: 'translateY(-4px)', opacity: '0' },\n },\n 'page-in': {\n from: { opacity: '0', transform: 'translateY(6px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n 'slide-in-from-right': {\n from: { transform: 'translateX(100%)' },\n to: { transform: 'translateX(0)' },\n },\n 'slide-out-to-right': {\n from: { transform: 'translateX(0)' },\n to: { transform: 'translateX(100%)' },\n },\n 'fade-up': {\n from: { opacity: '0', transform: 'translateY(18px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n kenburns: {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.07)' },\n },\n 'badge-pop': {\n '0%': { transform: 'scale(0.6)' },\n '60%': { transform: 'scale(1.25)' },\n '100%': { transform: 'scale(1)' },\n },\n 'draw-check': {\n from: { 'stroke-dashoffset': '48' },\n to: { 'stroke-dashoffset': '0' },\n },\n 'pop-in': {\n '0%': { transform: 'scale(0)', opacity: '0' },\n '70%': { transform: 'scale(1.15)', opacity: '1' },\n '100%': { transform: 'scale(1)', opacity: '1' },\n },\n 'confetti-fall': {\n '0%': { transform: 'translateY(-10px) rotate(0deg)', opacity: '1' },\n '100%': { transform: 'translateY(140px) rotate(540deg)', opacity: '0' },\n },\n 'pulse-soft': {\n '0%, 100%': { opacity: '1' },\n '50%': { opacity: '0.55' },\n },\n },\n animation: {\n 'fade-in': 'fade-in 200ms ease-out',\n 'fade-out': 'fade-out 150ms ease-in',\n 'zoom-in': 'zoom-in 200ms ease-out',\n 'zoom-out': 'zoom-out 150ms ease-in',\n 'slide-in-from-top': 'slide-in-from-top 200ms ease-out',\n 'slide-in-from-bottom': 'slide-in-from-bottom 200ms ease-out',\n 'slide-out-to-top': 'slide-out-to-top 150ms ease-in',\n 'slide-in-from-right': 'slide-in-from-right 250ms cubic-bezier(0.16, 1, 0.3, 1)',\n 'slide-out-to-right': 'slide-out-to-right 200ms ease-in',\n 'page-in': 'page-in 250ms ease-out',\n 'fade-up': 'fade-up 600ms cubic-bezier(0.16, 1, 0.3, 1) both',\n kenburns: 'kenburns 9s ease-out both',\n 'badge-pop': 'badge-pop 350ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n 'draw-check': 'draw-check 600ms ease-out 250ms both',\n 'pop-in': 'pop-in 450ms cubic-bezier(0.34, 1.56, 0.64, 1) both',\n 'confetti-fall': 'confetti-fall 1100ms ease-in both',\n 'pulse-soft': 'pulse-soft 1.6s ease-in-out infinite',\n },\n },\n },\n}\n\nexport default fayzUiPreset\nexport { fayzUiPreset }\n","import type { Config } from 'tailwindcss'\nimport { fayzUiPreset } from './theme/preset'\n\nexport interface FayzTailwindOptions {\n /** Extra app-specific content globs, appended after the SDK globs. */\n content?: string[]\n /** SDK source location relative to the app root (default ../../fayz-sdk). */\n sdkDir?: string\n}\n\n// SDK packages that ship Tailwind class names the app renders.\nconst SDK_PACKAGES = ['ui', 'admin', 'saas', 'storefront', 'portal'] as const\nconst GLOB = '/src/**/*.{ts,tsx}'\n// Published packages ship dist only. Tailwind generates a utility solely when it\n// finds the literal class name in a scanned file, so scanning an installed\n// package means scanning its built JS. tsup does not minify, so the strings\n// survive verbatim (\"flex flex-col space-y-1 p-4\") and the extractor reads them\n// exactly as it reads TSX. Scanning src/ under node_modules matched nothing\n// once packages stopped publishing source, which emitted a stylesheet with no\n// utilities — the app rendered fully unstyled.\nconst DIST_GLOB = '/dist/**/*.js'\n\n/**\n * Shared Tailwind config for Fayz dogfood apps. Applies the Fayz UI preset and\n * scans the SDK shell/UI/plugin source for class names — from node_modules (the\n * Fayz editor sandbox / published) and a sibling `../../fayz-sdk` checkout (local\n * dev). Whichever exists is scanned; missing globs are ignored. Apps no longer\n * hand-maintain content globs or the relative-vs-npm preset import.\n *\n * import { fayzTailwind } from '@fayz-ai/ui/tailwind'\n * export default fayzTailwind()\n */\nexport function fayzTailwind(opts: FayzTailwindOptions = {}): Config {\n const sdk = opts.sdkDir ?? '../../fayz-sdk'\n return {\n presets: [fayzUiPreset as Config],\n darkMode: 'class',\n content: [\n './index.html',\n './src/**/*.{ts,tsx}',\n // Published / sandbox: SDK installed in node_modules, which ships dist only.\n ...SDK_PACKAGES.map((p) => `./node_modules/@fayz-ai/${p}${DIST_GLOB}`),\n './node_modules/@fayz-ai/plugin-*/dist/**/*.js',\n // Pre-0.10.1 installs still carry src/; a glob that matches nothing is\n // ignored, so keeping these costs nothing and keeps older pins styled.\n ...SDK_PACKAGES.map((p) => `./node_modules/@fayz-ai/${p}${GLOB}`),\n './node_modules/@fayz-ai/plugin-*/src/**/*.{ts,tsx}',\n // Local dev: SDK as a sibling checkout (matches nothing in production).\n ...SDK_PACKAGES.map((p) => `${sdk}/packages/${p}${GLOB}`),\n `${sdk}/plugins/*/src/**/*.{ts,tsx}`,\n ...(opts.content ?? []),\n ],\n plugins: [],\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/theme/preset.ts","../src/tailwind.ts"],"names":[],"mappings":"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","file":"tailwind.js","sourcesContent":["import type { Config } from 'tailwindcss'\n\n/**\n * Tailwind CSS preset for @fayz-ai/ui.\n * Include this in your tailwind.config.ts:\n *\n * import { fayzUiPreset } from '@fayz-ai/ui/theme'\n * export default { presets: [fayzUiPreset], ... }\n */\nconst fayzUiPreset: Partial<Config> = {\n darkMode: 'class',\n theme: {\n extend: {\n colors: {\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n success: {\n DEFAULT: 'hsl(var(--success))',\n foreground: 'hsl(var(--success-foreground))',\n },\n warning: {\n DEFAULT: 'hsl(var(--warning))',\n foreground: 'hsl(var(--warning-foreground))',\n },\n info: {\n DEFAULT: 'hsl(var(--info))',\n foreground: 'hsl(var(--info-foreground))',\n },\n magic: {\n DEFAULT: 'hsl(var(--magic))',\n foreground: 'hsl(var(--magic-foreground))',\n },\n 'info-soft': {\n DEFAULT: 'hsl(var(--info-soft))',\n foreground: 'hsl(var(--info-soft-foreground))',\n },\n 'success-soft': {\n DEFAULT: 'hsl(var(--success-soft))',\n foreground: 'hsl(var(--success-soft-foreground))',\n },\n 'warning-soft': {\n DEFAULT: 'hsl(var(--warning-soft))',\n foreground: 'hsl(var(--warning-soft-foreground))',\n },\n 'destructive-soft': {\n DEFAULT: 'hsl(var(--destructive-soft))',\n foreground: 'hsl(var(--destructive-soft-foreground))',\n },\n 'magic-soft': {\n DEFAULT: 'hsl(var(--magic-soft))',\n foreground: 'hsl(var(--magic-soft-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n // Layout surface tokens\n sidebar: {\n DEFAULT: 'hsl(var(--sidebar))',\n foreground: 'hsl(var(--sidebar-foreground))',\n border: 'hsl(var(--sidebar-border))',\n accent: 'hsl(var(--sidebar-accent))',\n 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',\n muted: 'hsl(var(--sidebar-muted))',\n },\n content: 'hsl(var(--content))',\n },\n borderRadius: {\n button: 'var(--button-radius)',\n card: 'var(--card-radius)',\n input: 'var(--input-radius)',\n modal: 'var(--modal-radius)',\n },\n fontFamily: {\n sans: ['var(--font-family)'],\n mono: ['var(--font-family-mono)'],\n },\n boxShadow: {\n sm: 'var(--shadow-sm)',\n md: 'var(--shadow-md)',\n lg: 'var(--shadow-lg)',\n button: 'var(--shadow-button)',\n 'button-primary': 'var(--shadow-button-primary)',\n 'button-inset': 'var(--shadow-button-inset)',\n },\n keyframes: {\n 'fade-in': {\n from: { opacity: '0' },\n to: { opacity: '1' },\n },\n 'fade-out': {\n from: { opacity: '1' },\n to: { opacity: '0' },\n },\n 'zoom-in': {\n from: { transform: 'scale(0.95)', opacity: '0' },\n to: { transform: 'scale(1)', opacity: '1' },\n },\n 'zoom-out': {\n from: { transform: 'scale(1)', opacity: '1' },\n to: { transform: 'scale(0.95)', opacity: '0' },\n },\n 'slide-in-from-top': {\n from: { transform: 'translateY(-4px)', opacity: '0' },\n to: { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-in-from-bottom': {\n from: { transform: 'translateY(4px)', opacity: '0' },\n to: { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-out-to-top': {\n from: { transform: 'translateY(0)', opacity: '1' },\n to: { transform: 'translateY(-4px)', opacity: '0' },\n },\n 'page-in': {\n from: { opacity: '0', transform: 'translateY(6px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n 'slide-in-from-right': {\n from: { transform: 'translateX(100%)' },\n to: { transform: 'translateX(0)' },\n },\n 'slide-out-to-right': {\n from: { transform: 'translateX(0)' },\n to: { transform: 'translateX(100%)' },\n },\n 'fade-up': {\n from: { opacity: '0', transform: 'translateY(18px)' },\n to: { opacity: '1', transform: 'translateY(0)' },\n },\n kenburns: {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.07)' },\n },\n 'badge-pop': {\n '0%': { transform: 'scale(0.6)' },\n '60%': { transform: 'scale(1.25)' },\n '100%': { transform: 'scale(1)' },\n },\n 'draw-check': {\n from: { 'stroke-dashoffset': '48' },\n to: { 'stroke-dashoffset': '0' },\n },\n 'pop-in': {\n '0%': { transform: 'scale(0)', opacity: '0' },\n '70%': { transform: 'scale(1.15)', opacity: '1' },\n '100%': { transform: 'scale(1)', opacity: '1' },\n },\n 'confetti-fall': {\n '0%': { transform: 'translateY(-10px) rotate(0deg)', opacity: '1' },\n '100%': { transform: 'translateY(140px) rotate(540deg)', opacity: '0' },\n },\n 'pulse-soft': {\n '0%, 100%': { opacity: '1' },\n '50%': { opacity: '0.55' },\n },\n },\n animation: {\n 'fade-in': 'fade-in 200ms ease-out',\n 'fade-out': 'fade-out 150ms ease-in',\n 'zoom-in': 'zoom-in 200ms ease-out',\n 'zoom-out': 'zoom-out 150ms ease-in',\n 'slide-in-from-top': 'slide-in-from-top 200ms ease-out',\n 'slide-in-from-bottom': 'slide-in-from-bottom 200ms ease-out',\n 'slide-out-to-top': 'slide-out-to-top 150ms ease-in',\n 'slide-in-from-right': 'slide-in-from-right 250ms cubic-bezier(0.16, 1, 0.3, 1)',\n 'slide-out-to-right': 'slide-out-to-right 200ms ease-in',\n 'page-in': 'page-in 250ms ease-out',\n 'fade-up': 'fade-up 600ms cubic-bezier(0.16, 1, 0.3, 1) both',\n kenburns: 'kenburns 9s ease-out both',\n 'badge-pop': 'badge-pop 350ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n 'draw-check': 'draw-check 600ms ease-out 250ms both',\n 'pop-in': 'pop-in 450ms cubic-bezier(0.34, 1.56, 0.64, 1) both',\n 'confetti-fall': 'confetti-fall 1100ms ease-in both',\n 'pulse-soft': 'pulse-soft 1.6s ease-in-out infinite',\n },\n },\n },\n}\n\nexport default fayzUiPreset\nexport { fayzUiPreset }\n","import type { Config } from 'tailwindcss'\nimport { fayzUiPreset } from './theme/preset'\n\nexport interface FayzTailwindOptions {\n /** Extra app-specific content globs, appended after the SDK globs. */\n content?: string[]\n /** SDK source location relative to the app root (default ../../fayz-sdk). */\n sdkDir?: string\n}\n\n// SDK packages that ship Tailwind class names the app renders.\nconst SDK_PACKAGES = ['ui', 'admin', 'saas', 'storefront', 'portal', 'app-builder'] as const\nconst GLOB = '/src/**/*.{ts,tsx}'\n// Published packages ship dist only. Tailwind generates a utility solely when it\n// finds the literal class name in a scanned file, so scanning an installed\n// package means scanning its built JS. tsup does not minify, so the strings\n// survive verbatim (\"flex flex-col space-y-1 p-4\") and the extractor reads them\n// exactly as it reads TSX. Scanning src/ under node_modules matched nothing\n// once packages stopped publishing source, which emitted a stylesheet with no\n// utilities — the app rendered fully unstyled.\nconst DIST_GLOB = '/dist/**/*.js'\n\n/**\n * Shared Tailwind config for Fayz dogfood apps. Applies the Fayz UI preset and\n * scans the SDK shell/UI/plugin source for class names — from node_modules (the\n * Fayz editor sandbox / published) and a sibling `../../fayz-sdk` checkout (local\n * dev). Whichever exists is scanned; missing globs are ignored. Apps no longer\n * hand-maintain content globs or the relative-vs-npm preset import.\n *\n * import { fayzTailwind } from '@fayz-ai/ui/tailwind'\n * export default fayzTailwind()\n */\nexport function fayzTailwind(opts: FayzTailwindOptions = {}): Config {\n const sdk = opts.sdkDir ?? '../../fayz-sdk'\n return {\n presets: [fayzUiPreset as Config],\n darkMode: 'class',\n content: [\n './index.html',\n './src/**/*.{ts,tsx}',\n // Published / sandbox: SDK installed in node_modules, which ships dist only.\n ...SDK_PACKAGES.map((p) => `./node_modules/@fayz-ai/${p}${DIST_GLOB}`),\n './node_modules/@fayz-ai/plugin-*/dist/**/*.js',\n // Pre-0.10.1 installs still carry src/; a glob that matches nothing is\n // ignored, so keeping these costs nothing and keeps older pins styled.\n ...SDK_PACKAGES.map((p) => `./node_modules/@fayz-ai/${p}${GLOB}`),\n './node_modules/@fayz-ai/plugin-*/src/**/*.{ts,tsx}',\n // Local dev: SDK as a sibling checkout (matches nothing in production).\n ...SDK_PACKAGES.map((p) => `${sdk}/packages/${p}${GLOB}`),\n `${sdk}/plugins/*/src/**/*.{ts,tsx}`,\n ...(opts.content ?? []),\n ],\n plugins: [],\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- export { Wizard, WizardField, canAdvance, fieldErrors, isEmpty, parseDraft, useWizard, visibleFields, visibleSteps } from '../chunk-AASANYXN.js';
2
- import '../chunk-3OVZ5JJQ.js';
1
+ export { Wizard, WizardField, canAdvance, fieldErrors, isEmpty, parseDraft, useWizard, visibleFields, visibleSteps } from '../chunk-OB2ULDBD.js';
2
+ import '../chunk-GLRLWBBF.js';
3
3
  import '../chunk-OKZ6WQB3.js';
4
4
  //# sourceMappingURL=index.js.map
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWizard.d.ts","sourceRoot":"","sources":["../../src/wizard/useWizard.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACnC,aAAa,CAAC,EAAE,YAAY,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAC1D;AAED,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACnC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9C,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;IAC1C,wFAAwF;IACxF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,6EAA6E;IAC7E,OAAO,EAAE,OAAO,CAAA;IAChB,mEAAmE;IACnE,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,oEAAoE;IACpE,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IAC5C,6DAA6D;IAC7D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,iFAAiF;IACjF,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B,6EAA6E;IAC7E,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CACtC;AAWD,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,eAAe,CAgQzG"}
1
+ {"version":3,"file":"useWizard.d.ts","sourceRoot":"","sources":["../../src/wizard/useWizard.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACnC,aAAa,CAAC,EAAE,YAAY,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CAC1D;AAED,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACnC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9C,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;IAC1C,wFAAwF;IACxF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,6EAA6E;IAC7E,OAAO,EAAE,OAAO,CAAA;IAChB,mEAAmE;IACnE,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,oEAAoE;IACpE,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IAC5C,6DAA6D;IAC7D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,iFAAiF;IACjF,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B,6EAA6E;IAC7E,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CACtC;AAWD,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gBAAgB,GAAG,eAAe,CAmQzG"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "fayz": {
4
4
  "status": "beta"
5
5
  },
6
- "version": "0.18.0",
6
+ "version": "0.19.0",
7
7
  "description": "Fayz SDK UI — Radix + Tailwind component library with CRUD engine and layout shells",
8
8
  "type": "module",
9
9
  "sideEffects": [
@@ -79,7 +79,7 @@
79
79
  "clsx": "^2.1.0",
80
80
  "recharts": "^2.15.0",
81
81
  "tailwind-merge": "^2.4.0",
82
- "@fayz-ai/core": "^0.18.0"
82
+ "@fayz-ai/core": "^0.19.0"
83
83
  },
84
84
  "devDependencies": {
85
85
  "@types/react": "^18.3.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/primitives/switch.tsx","../src/primitives/confirm-dialog.tsx","../src/primitives/step-progress.tsx","../src/primitives/option-select.tsx","../src/primitives/image-drop.tsx","../src/primitives/color-palette.tsx"],"names":["React","Switch","React2","jsxs","jsx","React3","React5","X"],"mappings":"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","file":"chunk-3OVZ5JJQ.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../lib/cn'\n\n// ---------------------------------------------------------------------------\n// Switch — ligar/desligar algo que vale IMEDIATAMENTE.\n//\n// É a diferença para o checkbox, e é o que decide qual usar: checkbox é uma\n// escolha que só existe quando o formulário for salvo (\"aceito os termos\");\n// switch é um interruptor — mexeu, mudou. Uma lista onde cada linha liga um\n// disparo é o segundo caso, e desenhá-lo como checkbox faz procurar o botão\n// Salvar que nunca vem.\n//\n// Sem Radix: é um <button role=\"switch\"> com aria-checked, que é exatamente o\n// contrato que o leitor de tela espera. Uma dependência a mais para animar um\n// círculo de 16px não se paga.\n// ---------------------------------------------------------------------------\n\nexport interface SwitchProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n /** 'sm' para linhas de lista, 'md' para formulários. */\n size?: 'sm' | 'md'\n /** Texto ao lado. Clicar nele também alterna — é área de toque de graça. */\n label?: React.ReactNode\n}\n\nconst TRACK = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n}\n\nconst THUMB = {\n sm: 'h-3 w-3 data-[on=true]:translate-x-3',\n md: 'h-4 w-4 data-[on=true]:translate-x-4',\n}\n\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { checked, onCheckedChange, size = 'sm', label, className, disabled, ...rest },\n ref,\n) {\n const control = (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n disabled={disabled}\n onClick={(e) => {\n // stopPropagation: o switch vive dentro de linhas clicáveis, e ligar\n // algo não deve navegar para outro lugar ao mesmo tempo.\n e.stopPropagation()\n rest.onClick?.(e)\n if (!disabled) onCheckedChange(!checked)\n }}\n className={cn(\n 'relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n TRACK[size],\n checked ? 'bg-primary' : 'bg-muted-foreground/30',\n className,\n )}\n {...rest}\n >\n <span\n data-on={checked}\n className={cn(\n 'pointer-events-none ml-0.5 inline-block rounded-full bg-background shadow-sm transition-transform',\n THUMB[size],\n )}\n />\n </button>\n )\n\n if (label == null) return control\n\n return (\n <label\n className={cn(\n 'inline-flex items-center gap-2 text-xs text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {control}\n <span>{label}</span>\n </label>\n )\n})\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { AlertTriangle, Info, CheckCircle2, XCircle } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\n\ntype ConfirmVariant = 'default' | 'destructive' | 'warning' | 'success'\n\ninterface ConfirmDialogProps {\n open: boolean\n onConfirm: () => void\n onCancel: () => void\n title: string\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n variant?: ConfirmVariant\n loading?: boolean\n}\n\nconst VARIANT_CONFIG: Record<\n ConfirmVariant,\n {\n icon: React.ElementType\n iconBg: string\n iconColor: string\n buttonVariant: 'default' | 'destructive'\n }\n> = {\n default: {\n icon: Info,\n iconBg: 'bg-info/10',\n iconColor: 'text-info',\n buttonVariant: 'default',\n },\n destructive: {\n icon: XCircle,\n iconBg: 'bg-destructive/10',\n iconColor: 'text-destructive',\n buttonVariant: 'destructive',\n },\n warning: {\n icon: AlertTriangle,\n iconBg: 'bg-warning/10',\n iconColor: 'text-warning',\n buttonVariant: 'destructive',\n },\n success: {\n icon: CheckCircle2,\n iconBg: 'bg-success/10',\n iconColor: 'text-success',\n buttonVariant: 'default',\n },\n}\n\nexport function ConfirmDialog({\n open,\n onConfirm,\n onCancel,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n variant = 'default',\n loading = false,\n}: ConfirmDialogProps) {\n const config = VARIANT_CONFIG[variant]\n const Icon = config.icon\n\n React.useEffect(() => {\n if (!open) return\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCancel()\n }\n document.addEventListener('keydown', handleKey)\n return () => document.removeEventListener('keydown', handleKey)\n }, [open, onCancel])\n\n if (!open) return null\n\n return createPortal(\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-[2px] animate-fade-in\"\n onClick={onCancel}\n />\n\n <div\n className=\"relative z-10 w-full max-w-sm mx-4 rounded-modal border border-border bg-card shadow-lg animate-zoom-in\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"confirm-title\"\n aria-describedby={description ? 'confirm-desc' : undefined}\n >\n <div className=\"p-6\">\n <div className=\"flex gap-4\">\n <div className={cn('flex h-10 w-10 items-center justify-center rounded-full shrink-0', config.iconBg)}>\n <Icon className={cn('h-5 w-5', config.iconColor)} />\n </div>\n <div className=\"min-w-0 pt-0.5\">\n <h3 id=\"confirm-title\" className=\"text-sm font-semibold text-foreground\">\n {title}\n </h3>\n {description && (\n <p id=\"confirm-desc\" className=\"text-xs text-muted-foreground mt-1 leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-5\">\n <Button variant=\"outline\" size=\"sm\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={config.buttonVariant} size=\"sm\" onClick={onConfirm} disabled={loading}>\n {loading ? 'Processing...' : confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/cn'\n\nexport interface StepProgressProps {\n /** How many steps the flow has. */\n total: number\n /** Zero-based index of the step on screen. */\n current: number\n /** Jump to a step. Only offered for steps already visited. */\n onSelect?: (index: number) => void\n className?: string\n 'aria-label'?: string\n}\n\n/**\n * Segmented progress rail — one bar per step, filled up to the current one.\n *\n * A single continuous bar tells you how far along you are; segments also tell you\n * how much is LEFT, which is what stops someone abandoning a form they think is\n * endless. Sits at the bottom of the wizard column, above the footer.\n */\nexport function StepProgress({ total, current, onSelect, className, ...rest }: StepProgressProps) {\n return (\n <div\n role=\"progressbar\"\n aria-label={rest['aria-label']}\n aria-valuemin={1}\n aria-valuemax={total}\n aria-valuenow={Math.min(current + 1, total)}\n className={cn('flex w-full items-center gap-2', className)}\n >\n {Array.from({ length: total }, (_, i) => {\n const done = i <= current\n // Only steps already behind you are clickable — jumping forward would skip\n // the validation the wizard runs on the way out of each step.\n const clickable = Boolean(onSelect) && i < current\n return (\n <button\n key={i}\n type=\"button\"\n tabIndex={clickable ? 0 : -1}\n aria-hidden={!clickable}\n disabled={!clickable}\n onClick={clickable ? () => onSelect?.(i) : undefined}\n className={cn(\n 'h-[2px] flex-1 rounded-full transition-colors duration-300',\n done ? 'bg-foreground' : 'bg-border',\n clickable && 'cursor-pointer hover:bg-foreground/70',\n )}\n />\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface SelectableOption {\n value: string\n label: React.ReactNode\n /** Second line under the label — the sentence that makes the choice obvious. */\n hint?: React.ReactNode\n icon?: React.ReactNode\n}\n\ninterface SharedProps {\n options: ReadonlyArray<SelectableOption>\n /** A string in single mode, a list in `multi` mode. */\n value?: string | string[]\n onChange: (value: string | string[]) => void\n multi?: boolean\n disabled?: boolean\n /**\n * Bind 1–9 to the first nine options and print the digit on each one.\n *\n * Off by default: two shortcut-bound groups on one screen would both answer to\n * \"1\". The caller decides which group owns the keys.\n */\n shortcuts?: boolean\n className?: string\n 'aria-label'?: string\n}\n\n/** Toggle in multi mode, replace in single mode. */\nfunction nextValue(current: string | string[] | undefined, picked: string, multi: boolean): string | string[] {\n if (!multi) return picked\n const list = Array.isArray(current) ? current : current ? [current] : []\n return list.includes(picked) ? list.filter((v) => v !== picked) : [...list, picked]\n}\n\nfunction isSelected(current: string | string[] | undefined, option: string): boolean {\n return Array.isArray(current) ? current.includes(option) : current === option\n}\n\n/** Only the first nine get a digit — a two-key shortcut is slower than the mouse. */\nconst MAX_SHORTCUTS = 9\n\n/**\n * 1–9 pick the matching option. Ignored while a field has focus, so typing \"2\"\n * into \"how many chairs\" answers the question instead of jumping the form.\n */\nfunction useOptionShortcuts(\n options: ReadonlyArray<SelectableOption>,\n enabled: boolean,\n pick: (value: string) => void,\n) {\n const pickRef = React.useRef(pick)\n pickRef.current = pick\n const values = options.slice(0, MAX_SHORTCUTS).map((o) => o.value).join('\u0000')\n\n React.useEffect(() => {\n if (!enabled) return\n const list = values.split('\u0000').filter(Boolean)\n if (list.length === 0) return\n function onKey(e: KeyboardEvent) {\n if (e.metaKey || e.ctrlKey || e.altKey) return\n const el = e.target as HTMLElement | null\n const tag = el?.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || el?.isContentEditable) return\n const index = Number(e.key) - 1\n if (!Number.isInteger(index) || index < 0 || index >= list.length) return\n e.preventDefault()\n pickRef.current(list[index]!)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [enabled, values])\n}\n\n/** The digit badge printed on a shortcut-bound option. */\nfunction KeyHint({ index, selected, corner }: { index: number; selected: boolean; corner?: boolean }) {\n return (\n <kbd\n aria-hidden\n className={cn(\n 'hidden h-5 min-w-[1.25rem] shrink-0 items-center justify-center rounded border px-1 font-mono text-[10px] font-semibold sm:inline-flex',\n // Parked in the corner rather than in the reading line: the shortcut is\n // an accelerator, not part of the answer, and inline it pushed every\n // label right and split the logo from the name it belongs to.\n corner && 'absolute right-2 top-2',\n selected\n ? 'border-primary/40 bg-primary/10 text-primary'\n : 'border-border bg-muted text-muted-foreground',\n )}\n >\n {index + 1}\n </kbd>\n )\n}\n\nexport interface OptionCardsProps extends SharedProps {\n /** Cards per row on wide screens. One column reads as a list — use it for long hints. */\n columns?: 1 | 2 | 3\n}\n\nconst COLUMNS: Record<1 | 2 | 3, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n}\n\n/**\n * Card picker — the answer surface for a question with a handful of options that\n * each need a sentence of explanation.\n *\n * Radix has no radio-group in this package and a native radio list cannot carry a\n * hint line, so this is a button grid with `role=\"radio\"`/`\"checkbox\"` semantics\n * layered back on.\n */\nexport function OptionCards({\n options, value, onChange, multi = false, disabled, shortcuts = false, columns = 2, className, ...rest\n}: OptionCardsProps) {\n useOptionShortcuts(options, shortcuts && !disabled, (picked) => onChange(nextValue(value, picked, multi)))\n return (\n <div\n role={multi ? 'group' : 'radiogroup'}\n aria-label={rest['aria-label']}\n className={cn('grid gap-2.5', COLUMNS[columns], className)}\n >\n {options.map((option, index) => {\n const selected = isSelected(value, option.value)\n const corner = shortcuts && index < MAX_SHORTCUTS\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multi ? 'checkbox' : 'radio'}\n aria-checked={selected}\n disabled={disabled}\n onClick={() => onChange(nextValue(value, option.value, multi))}\n className={cn(\n 'group relative flex items-start gap-3 rounded-lg border bg-card p-4 text-left transition-all',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:pointer-events-none disabled:opacity-50',\n selected\n ? 'border-primary ring-2 ring-primary/15'\n : 'border-border hover:-translate-y-px hover:border-foreground/25 hover:shadow-button',\n )}\n >\n {/* One thing in the corner. Once an option is picked its digit has\n done its job, and a check beside a number is two marks arguing\n about the same fact. */}\n {corner && selected && <Check className=\"absolute right-2 top-2 h-4 w-4 text-primary\" />}\n {corner && !selected && <KeyHint index={index} selected={false} corner />}\n {option.icon && <span className=\"mt-0.5 shrink-0 text-muted-foreground\">{option.icon}</span>}\n <span className={cn('min-w-0 flex-1', corner && 'pr-5')}>\n <span className=\"block text-sm font-semibold text-foreground\">{option.label}</span>\n {option.hint && (\n <span className=\"mt-0.5 block text-xs leading-relaxed text-muted-foreground\">{option.hint}</span>\n )}\n </span>\n {!corner && selected && <Check className=\"mt-0.5 h-4 w-4 shrink-0 text-primary\" />}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport type OptionChipsProps = SharedProps\n\n/**\n * Pill picker — same selection model as OptionCards, for lists long enough that\n * cards would push the question off screen (industries, channels, price bands).\n */\nexport function OptionChips({\n options, value, onChange, multi = false, disabled, shortcuts = false, className, ...rest\n}: OptionChipsProps) {\n useOptionShortcuts(options, shortcuts && !disabled, (picked) => onChange(nextValue(value, picked, multi)))\n return (\n <div\n role={multi ? 'group' : 'radiogroup'}\n aria-label={rest['aria-label']}\n className={cn('flex flex-wrap gap-2', className)}\n >\n {options.map((option, index) => {\n const selected = isSelected(value, option.value)\n return (\n <button\n key={option.value}\n type=\"button\"\n role={multi ? 'checkbox' : 'radio'}\n aria-checked={selected}\n disabled={disabled}\n onClick={() => onChange(nextValue(value, option.value, multi))}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-4 py-2 text-sm font-medium transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:pointer-events-none disabled:opacity-50',\n selected\n ? 'border-primary bg-primary/5 text-foreground'\n : 'border-border bg-card text-muted-foreground hover:border-foreground/25 hover:text-foreground',\n )}\n >\n {option.icon}\n {shortcuts && index < MAX_SHORTCUTS && <KeyHint index={index} selected={selected} />}\n {option.label}\n {selected && <Check className=\"h-3.5 w-3.5 text-primary\" />}\n </button>\n )\n })}\n </div>\n )\n}\n","import * as React from 'react'\nimport { ImagePlus, Loader2, X } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface ImageDropProps {\n /** Current image. Uncontrolled after the first upload — the component keeps what it uploaded. */\n value?: string\n /** Receives the file, returns the stored URL. Omit to render a read-only preview. */\n onUpload?: (file: File) => Promise<string>\n onChange?: (url: string | undefined) => void\n label?: string\n hint?: string\n accept?: string\n /** Cap in bytes, checked before `onUpload` runs. Default 5 MB. */\n maxBytes?: number\n shape?: 'square' | 'circle'\n disabled?: boolean\n /** Shown when the picked file is over `maxBytes`. `{max}` is replaced with the cap in MB. */\n tooLargeLabel?: string\n removeLabel?: string\n className?: string\n}\n\nconst DEFAULT_MAX_BYTES = 5 * 1024 * 1024\n\n/**\n * Image picker with preview — click or drop a file, see it, replace or clear it.\n *\n * Generalised from the CRUD form's image slot so surfaces that have no entity\n * behind them (workspace logo during setup, before the tenant row exists) get the\n * same affordance without importing the CRUD stack.\n */\nexport function ImageDrop({\n value,\n onUpload,\n onChange,\n label,\n hint,\n accept = 'image/*',\n maxBytes = DEFAULT_MAX_BYTES,\n shape = 'square',\n disabled,\n tooLargeLabel = 'File is larger than {max} MB.',\n removeLabel = 'Remove image',\n className,\n}: ImageDropProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [url, setUrl] = React.useState<string | undefined>(value)\n const [busy, setBusy] = React.useState(false)\n const [dragging, setDragging] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n\n React.useEffect(() => { setUrl(value) }, [value])\n\n const editable = Boolean(onUpload) && !disabled\n\n const handleFile = React.useCallback(\n async (file: File | undefined) => {\n if (!file || !onUpload) return\n if (file.size > maxBytes) {\n setError(tooLargeLabel.replace('{max}', String(Math.round(maxBytes / 1024 / 1024))))\n return\n }\n setBusy(true)\n setError(null)\n try {\n const next = await onUpload(file)\n setUrl(next)\n onChange?.(next)\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setBusy(false)\n }\n },\n [onUpload, onChange, maxBytes, tooLargeLabel],\n )\n\n const pick = () => { if (editable && !busy) inputRef.current?.click() }\n\n const clear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setUrl(undefined)\n setError(null)\n onChange?.(undefined)\n }\n\n return (\n <div className={cn('flex items-center gap-4', className)}>\n <div\n onClick={pick}\n onKeyDown={(e) => { if (editable && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); pick() } }}\n onDragOver={(e) => { if (editable) { e.preventDefault(); setDragging(true) } }}\n onDragLeave={() => setDragging(false)}\n onDrop={(e) => {\n if (!editable) return\n e.preventDefault()\n setDragging(false)\n void handleFile(e.dataTransfer.files?.[0])\n }}\n role={editable ? 'button' : undefined}\n tabIndex={editable ? 0 : undefined}\n className={cn(\n 'relative flex h-20 w-20 shrink-0 items-center justify-center overflow-hidden border-2 text-muted-foreground transition-colors',\n shape === 'circle' ? 'rounded-full' : 'rounded-xl',\n url ? 'border-solid border-border' : 'border-dashed border-border',\n dragging && 'border-primary text-primary',\n editable && 'cursor-pointer hover:border-primary/40 hover:text-primary/60',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n )}\n >\n {url ? <img src={url} alt=\"\" className=\"h-full w-full object-cover\" /> : <ImagePlus className=\"h-5 w-5\" />}\n {busy && (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/70\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </span>\n )}\n {url && editable && !busy && (\n <button\n type=\"button\"\n onClick={clear}\n aria-label={removeLabel}\n className=\"absolute right-0 top-0 flex h-5 w-5 items-center justify-center rounded-bl-lg bg-background/90 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n )}\n {editable && (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n e.target.value = ''\n void handleFile(file)\n }}\n />\n )}\n </div>\n <div className=\"min-w-0\">\n {label && <p className=\"text-sm font-medium text-foreground\">{label}</p>}\n {hint && !error && <p className=\"mt-0.5 text-xs leading-relaxed text-muted-foreground\">{hint}</p>}\n {error && <p className=\"mt-0.5 text-xs text-destructive\">{error}</p>}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\nexport interface ColorPaletteProps {\n /** Hex values, most prominent first. Shorter than `slots` is normal. */\n value?: ReadonlyArray<string>\n onChange: (colors: string[]) => void\n slots?: number\n /** One per slot, in order. Falls back to the slot number. */\n labels?: ReadonlyArray<string>\n removeLabel?: string\n className?: string\n}\n\nconst DEFAULT_SLOTS = 4\nconst FALLBACK_SWATCH = '#000000'\n\n/**\n * A fixed row of colour slots, each a swatch that opens the native picker plus a\n * hex field that accepts a paste.\n *\n * Slots rather than an add/remove list on purpose: brand colours arrive from a\n * crawl in a known order (primary, secondary, accent), and a positional row is\n * what makes \"the second one is wrong\" a one-click fix instead of a rebuild of\n * the whole palette.\n */\nexport function ColorPalette({\n value,\n onChange,\n slots = DEFAULT_SLOTS,\n labels,\n removeLabel = 'Remover cor',\n className,\n}: ColorPaletteProps) {\n const colors = React.useMemo(() => {\n const next = Array.from({ length: slots }, (_, i) => value?.[i] ?? '')\n return next\n }, [value, slots])\n\n // Trailing blanks are absence, not answers — a palette of two colours must\n // come back as two, or every consumer has to filter it again.\n const commit = (next: string[]) => {\n const trimmed = [...next]\n while (trimmed.length > 0 && !trimmed[trimmed.length - 1]) trimmed.pop()\n onChange(trimmed)\n }\n\n const setSlot = (index: number, hex: string) => {\n const next = [...colors]\n next[index] = hex\n commit(next)\n }\n\n return (\n <div className={cn('flex gap-2', className)}>\n {colors.map((color, index) => (\n <div key={index} className=\"flex-1 space-y-1\">\n <label className=\"group relative block cursor-pointer\">\n <div\n className={cn(\n 'h-10 rounded-lg border transition-colors',\n color ? 'border-border' : 'border-dashed border-border bg-muted/40',\n )}\n style={color ? { backgroundColor: color } : undefined}\n />\n <input\n type=\"color\"\n value={color || FALLBACK_SWATCH}\n aria-label={labels?.[index] ?? `Cor ${index + 1}`}\n onChange={(e) => setSlot(index, e.target.value)}\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n />\n {color && (\n <button\n type=\"button\"\n aria-label={removeLabel}\n onClick={(e) => {\n // The swatch is inside the label, so a click would reopen the picker.\n e.preventDefault()\n e.stopPropagation()\n setSlot(index, '')\n }}\n className=\"absolute -right-1.5 -top-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-foreground/80 text-background opacity-0 transition-opacity group-hover:opacity-100 focus-visible:opacity-100\"\n >\n <X className=\"h-2.5 w-2.5\" />\n </button>\n )}\n </label>\n <input\n type=\"text\"\n value={color.toUpperCase()}\n placeholder={labels?.[index] ?? `${index + 1}`}\n onChange={(e) => setSlot(index, normalizeHex(e.target.value))}\n className=\"w-full truncate bg-transparent text-center text-[10px] text-muted-foreground outline-none placeholder:text-muted-foreground/50\"\n />\n </div>\n ))}\n </div>\n )\n}\n\n/** Tolerates a pasted `1F7A3D`, `#1f7a3d` or `rgb(...)`-free junk mid-typing. */\nexport function normalizeHex(raw: string): string {\n const cleaned = raw.replace(/[^0-9a-fA-F#]/g, '')\n const withHash = cleaned.startsWith('#') ? cleaned : `#${cleaned}`\n return withHash.slice(0, 7)\n}\n"]}
@@ -1,177 +0,0 @@
1
- import { Zap, XCircle, X, Wrench, Workflow, Wheat, Warehouse, Wallet, UtensilsCrossed, Upload, WandSparkles, Utensils, UsersRound, Users, UserX, UserPlus, UserCog, UserCheck, User, Truck, Trophy, TrendingUp, TrendingDown, TreePalm, ToggleLeft, Timer, Target, Tags, TableProperties, Tag, Star, Sparkles, Soup, SlidersHorizontal, Sigma, ShoppingCart, ShoppingBag, ShieldCheck, Shield, Settings, Send, Search, Scale, Ruler, RotateCw, RotateCcw, Repeat, Receipt, Radio, Puzzle, PlusCircle, Plus, Plug, PieChart, Phone, Percent, Pencil, PawPrint, PartyPopper, Palette, PackageCheck, Package, Newspaper, Music, MousePointerClick, MoreHorizontal, Mic, MessageSquare, MessageCircle, Megaphone, MapPin, Map, Mail, Lock, ListPlus, ListMusic, ListChecks, List, Link, LineChart, LeafyGreen, Leaf, LayoutTemplate, LayoutDashboard, Layers, Landmark, Instagram, Inbox, Images, Image, Home, FolderTree, Hourglass, Heart, Handshake, GraduationCap, Globe, Gauge, FolderOpen, Flame, Filter, FileText, FileDown, FileCheck2, Eye, ExternalLink, Egg, DoorOpen, DollarSign, Dog, Disc3, CreditCard, CookingPot, Contact, Compass, Command, Clock3, Clock, ClipboardList, ClipboardCheck, Clapperboard, CircleDollarSign, CircleCheck, Circle, ChevronsUpDown, ChevronDown, ChefHat, CheckSquare, CheckCircle, Check, Cat, Camera, CalendarX, CalendarRange, CalendarPlus, CalendarDays, CalendarClock, CalendarCheck2, CalendarCheck, Calendar, Building2, Briefcase, Boxes, Box, BookOpenCheck, BookOpen, Bike, Bell, BarChart3, Banknote, Ban, BadgeDollarSign, Award, ArrowUpRight, ArrowUpCircle, ArrowLeftRight, ArrowDownRight, ArrowDownCircle, Apple, AlertTriangle, Activity } from 'lucide-react';
2
-
3
- // src/icons.ts
4
- var registry = {
5
- Activity,
6
- AlertTriangle,
7
- Apple,
8
- ArrowDownCircle,
9
- ArrowDownRight,
10
- ArrowLeftRight,
11
- ArrowUpCircle,
12
- ArrowUpRight,
13
- Award,
14
- BadgeDollarSign,
15
- Ban,
16
- Banknote,
17
- BarChart3,
18
- Bell,
19
- Bike,
20
- BookOpen,
21
- BookOpenCheck,
22
- Box,
23
- Boxes,
24
- Briefcase,
25
- Building2,
26
- Calendar,
27
- CalendarCheck,
28
- CalendarCheck2,
29
- CalendarClock,
30
- CalendarDays,
31
- CalendarPlus,
32
- CalendarRange,
33
- CalendarX,
34
- Camera,
35
- Cat,
36
- Check,
37
- CheckCircle,
38
- CheckSquare,
39
- ChefHat,
40
- ChevronDown,
41
- ChevronsUpDown,
42
- Circle,
43
- CircleCheck,
44
- CircleDollarSign,
45
- Clapperboard,
46
- ClipboardCheck,
47
- ClipboardList,
48
- Clock,
49
- Clock3,
50
- Command,
51
- Compass,
52
- Contact,
53
- CookingPot,
54
- CreditCard,
55
- Disc3,
56
- Dog,
57
- DollarSign,
58
- DoorOpen,
59
- Egg,
60
- ExternalLink,
61
- Eye,
62
- FileCheck2,
63
- FileDown,
64
- FileText,
65
- Filter,
66
- Flame,
67
- FolderOpen,
68
- Gauge,
69
- Globe,
70
- GraduationCap,
71
- Handshake,
72
- Heart,
73
- Hourglass,
74
- FolderTree,
75
- Home,
76
- Image,
77
- Images,
78
- Inbox,
79
- Instagram,
80
- Landmark,
81
- Layers,
82
- LayoutDashboard,
83
- LayoutTemplate,
84
- Leaf,
85
- LeafyGreen,
86
- LineChart,
87
- Link,
88
- List,
89
- ListChecks,
90
- ListMusic,
91
- ListPlus,
92
- Lock,
93
- Mail,
94
- Map,
95
- MapPin,
96
- Megaphone,
97
- MessageCircle,
98
- MessageSquare,
99
- Mic,
100
- MoreHorizontal,
101
- MousePointerClick,
102
- Music,
103
- Newspaper,
104
- Package,
105
- PackageCheck,
106
- Palette,
107
- PartyPopper,
108
- PawPrint,
109
- Pencil,
110
- Percent,
111
- Phone,
112
- PieChart,
113
- Plug,
114
- Plus,
115
- PlusCircle,
116
- Puzzle,
117
- Radio,
118
- Receipt,
119
- Repeat,
120
- RotateCcw,
121
- RotateCw,
122
- Ruler,
123
- Scale,
124
- Search,
125
- Send,
126
- Settings,
127
- Shield,
128
- ShieldCheck,
129
- ShoppingBag,
130
- ShoppingCart,
131
- Sigma,
132
- SlidersHorizontal,
133
- Soup,
134
- Sparkles,
135
- Star,
136
- Tag,
137
- TableProperties,
138
- Tags,
139
- Target,
140
- Timer,
141
- ToggleLeft,
142
- TreePalm,
143
- TrendingDown,
144
- TrendingUp,
145
- Trophy,
146
- Truck,
147
- User,
148
- UserCheck,
149
- UserCog,
150
- UserPlus,
151
- UserX,
152
- Users,
153
- UsersRound,
154
- Utensils,
155
- WandSparkles,
156
- Upload,
157
- UtensilsCrossed,
158
- Wallet,
159
- Warehouse,
160
- Wheat,
161
- Workflow,
162
- Wrench,
163
- X,
164
- XCircle,
165
- Zap
166
- };
167
- function registerIcons(icons) {
168
- Object.assign(registry, icons);
169
- }
170
- function getLucideIcon(name) {
171
- return registry[name];
172
- }
173
- var ICON_MAP = registry;
174
-
175
- export { ICON_MAP, getLucideIcon, registerIcons };
176
- //# sourceMappingURL=chunk-4GK6IHOI.js.map
177
- //# sourceMappingURL=chunk-4GK6IHOI.js.map