@activecollab/components 2.0.363 → 2.0.365

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 (91) hide show
  1. package/dist/cjs/presentation/shared/index.js +37 -1
  2. package/dist/cjs/presentation/shared/index.js.map +1 -1
  3. package/dist/cjs/presentation/shared/settings.js +91 -0
  4. package/dist/cjs/presentation/shared/settings.js.map +1 -0
  5. package/dist/cjs/presentation/stackedCard/content/ImageCard.js +60 -0
  6. package/dist/cjs/presentation/stackedCard/content/ImageCard.js.map +1 -0
  7. package/dist/cjs/presentation/stackedCard/content/LinkCard.js +348 -0
  8. package/dist/cjs/presentation/stackedCard/content/LinkCard.js.map +1 -0
  9. package/dist/cjs/presentation/stackedCard/content/NoteCard.js +92 -0
  10. package/dist/cjs/presentation/stackedCard/content/NoteCard.js.map +1 -0
  11. package/dist/cjs/presentation/stackedCard/content/SwatchCard.js +74 -0
  12. package/dist/cjs/presentation/stackedCard/content/SwatchCard.js.map +1 -0
  13. package/dist/cjs/presentation/stackedCard/content/TaskCard.js +231 -0
  14. package/dist/cjs/presentation/stackedCard/content/TaskCard.js.map +1 -0
  15. package/dist/cjs/presentation/stackedCard/content/index.js +83 -0
  16. package/dist/cjs/presentation/stackedCard/content/index.js.map +1 -0
  17. package/dist/cjs/presentation/stackedCard/content/shared.js +144 -0
  18. package/dist/cjs/presentation/stackedCard/content/shared.js.map +1 -0
  19. package/dist/cjs/presentation/stackedCard/content/unfurl.js +172 -0
  20. package/dist/cjs/presentation/stackedCard/content/unfurl.js.map +1 -0
  21. package/dist/cjs/presentation/stackedCard/primitives.js +254 -0
  22. package/dist/cjs/presentation/stackedCard/primitives.js.map +1 -0
  23. package/dist/cjs/presentation/stackedCard/resizePolicy.js +183 -0
  24. package/dist/cjs/presentation/stackedCard/resizePolicy.js.map +1 -0
  25. package/dist/cjs/presentation/stackedCard/shell.js +165 -0
  26. package/dist/cjs/presentation/stackedCard/shell.js.map +1 -0
  27. package/dist/cjs/presentation/stackedCard/storyScaffold.js +72 -0
  28. package/dist/cjs/presentation/stackedCard/storyScaffold.js.map +1 -0
  29. package/dist/cjs/presentation/stackedCard/useInlineEdit.js +208 -0
  30. package/dist/cjs/presentation/stackedCard/useInlineEdit.js.map +1 -0
  31. package/dist/esm/presentation/shared/index.d.ts +2 -0
  32. package/dist/esm/presentation/shared/index.d.ts.map +1 -1
  33. package/dist/esm/presentation/shared/index.js +1 -0
  34. package/dist/esm/presentation/shared/index.js.map +1 -1
  35. package/dist/esm/presentation/shared/settings.d.ts +33 -0
  36. package/dist/esm/presentation/shared/settings.d.ts.map +1 -0
  37. package/dist/esm/presentation/shared/settings.js +84 -0
  38. package/dist/esm/presentation/shared/settings.js.map +1 -0
  39. package/dist/esm/presentation/stackedCard/content/ImageCard.d.ts +15 -0
  40. package/dist/esm/presentation/stackedCard/content/ImageCard.d.ts.map +1 -0
  41. package/dist/esm/presentation/stackedCard/content/ImageCard.js +50 -0
  42. package/dist/esm/presentation/stackedCard/content/ImageCard.js.map +1 -0
  43. package/dist/esm/presentation/stackedCard/content/LinkCard.d.ts +28 -0
  44. package/dist/esm/presentation/stackedCard/content/LinkCard.d.ts.map +1 -0
  45. package/dist/esm/presentation/stackedCard/content/LinkCard.js +336 -0
  46. package/dist/esm/presentation/stackedCard/content/LinkCard.js.map +1 -0
  47. package/dist/esm/presentation/stackedCard/content/NoteCard.d.ts +10 -0
  48. package/dist/esm/presentation/stackedCard/content/NoteCard.d.ts.map +1 -0
  49. package/dist/esm/presentation/stackedCard/content/NoteCard.js +82 -0
  50. package/dist/esm/presentation/stackedCard/content/NoteCard.js.map +1 -0
  51. package/dist/esm/presentation/stackedCard/content/SwatchCard.d.ts +14 -0
  52. package/dist/esm/presentation/stackedCard/content/SwatchCard.d.ts.map +1 -0
  53. package/dist/esm/presentation/stackedCard/content/SwatchCard.js +64 -0
  54. package/dist/esm/presentation/stackedCard/content/SwatchCard.js.map +1 -0
  55. package/dist/esm/presentation/stackedCard/content/TaskCard.d.ts +29 -0
  56. package/dist/esm/presentation/stackedCard/content/TaskCard.d.ts.map +1 -0
  57. package/dist/esm/presentation/stackedCard/content/TaskCard.js +218 -0
  58. package/dist/esm/presentation/stackedCard/content/TaskCard.js.map +1 -0
  59. package/dist/esm/presentation/stackedCard/content/index.d.ts +8 -0
  60. package/dist/esm/presentation/stackedCard/content/index.d.ts.map +1 -0
  61. package/dist/esm/presentation/stackedCard/content/index.js +8 -0
  62. package/dist/esm/presentation/stackedCard/content/index.js.map +1 -0
  63. package/dist/esm/presentation/stackedCard/content/shared.d.ts +46 -0
  64. package/dist/esm/presentation/stackedCard/content/shared.d.ts.map +1 -0
  65. package/dist/esm/presentation/stackedCard/content/shared.js +134 -0
  66. package/dist/esm/presentation/stackedCard/content/shared.js.map +1 -0
  67. package/dist/esm/presentation/stackedCard/content/unfurl.d.ts +89 -0
  68. package/dist/esm/presentation/stackedCard/content/unfurl.d.ts.map +1 -0
  69. package/dist/esm/presentation/stackedCard/content/unfurl.js +147 -0
  70. package/dist/esm/presentation/stackedCard/content/unfurl.js.map +1 -0
  71. package/dist/esm/presentation/stackedCard/primitives.d.ts +84 -0
  72. package/dist/esm/presentation/stackedCard/primitives.d.ts.map +1 -0
  73. package/dist/esm/presentation/stackedCard/primitives.js +241 -0
  74. package/dist/esm/presentation/stackedCard/primitives.js.map +1 -0
  75. package/dist/esm/presentation/stackedCard/resizePolicy.d.ts +97 -0
  76. package/dist/esm/presentation/stackedCard/resizePolicy.d.ts.map +1 -0
  77. package/dist/esm/presentation/stackedCard/resizePolicy.js +173 -0
  78. package/dist/esm/presentation/stackedCard/resizePolicy.js.map +1 -0
  79. package/dist/esm/presentation/stackedCard/shell.d.ts +46 -0
  80. package/dist/esm/presentation/stackedCard/shell.d.ts.map +1 -0
  81. package/dist/esm/presentation/stackedCard/shell.js +156 -0
  82. package/dist/esm/presentation/stackedCard/shell.js.map +1 -0
  83. package/dist/esm/presentation/stackedCard/storyScaffold.d.ts +28 -0
  84. package/dist/esm/presentation/stackedCard/storyScaffold.d.ts.map +1 -0
  85. package/dist/esm/presentation/stackedCard/storyScaffold.js +66 -0
  86. package/dist/esm/presentation/stackedCard/storyScaffold.js.map +1 -0
  87. package/dist/esm/presentation/stackedCard/useInlineEdit.d.ts +68 -0
  88. package/dist/esm/presentation/stackedCard/useInlineEdit.d.ts.map +1 -0
  89. package/dist/esm/presentation/stackedCard/useInlineEdit.js +192 -0
  90. package/dist/esm/presentation/stackedCard/useInlineEdit.js.map +1 -0
  91. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_shared","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_unfurl","_TaskCard","_LinkCard","_ImageCard","_SwatchCard","_NoteCard"],"sources":["../../../../../src/presentation/stackedCard/content/index.ts"],"sourcesContent":["export * from \"./shared\";\nexport * from \"./unfurl\";\nexport * from \"./TaskCard\";\nexport * from \"./LinkCard\";\nexport * from \"./ImageCard\";\nexport * from \"./SwatchCard\";\nexport * from \"./NoteCard\";\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.playControl = exports.coverManagement = exports.StyledFavicon = exports.StyledColorCover = exports.StyledClamp = exports.StyledChip = exports.Placeholder = exports.EntityDots = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
9
+ var _Icons = require("../../../components/Icons");
10
+ var _Typography = require("../../../components/Typography");
11
+ var _Typography2 = require("../../../components/Typography/Typography");
12
+ var _primitives = require("../primitives");
13
+ var _excluded = ["icon", "label", "height", "dashed"];
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
17
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
18
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
19
+ /**
20
+ * Content-level chrome shared by the typed StackedCard components.
21
+ *
22
+ * These live OUTSIDE the shell on purpose. The shell is hollow; the "…" entity
23
+ * menu, the cover-management controls, the clamp, the favicon, the chips and
24
+ * the placeholder frame are content concerns, so they belong here where the
25
+ * typed cards (TaskCard, LinkCard, …) compose them.
26
+ */
27
+
28
+ /* ------------------------------------------------------------------ */
29
+ /* Cover chrome — media control + cover management */
30
+ /* ------------------------------------------------------------------ */
31
+
32
+ /** Centered media control (play), for a cover that wraps audio/video. */
33
+ var playControl = exports.playControl = /*#__PURE__*/_react.default.createElement(_primitives.PlayBadge, null, /*#__PURE__*/_react.default.createElement(_Icons.PlayIcon, null));
34
+
35
+ /**
36
+ * Top-right cover management. Acts on the COVER (collapse it, remove it) — not
37
+ * on the entity. Callers wire the click handlers; the default is inert chrome
38
+ * for the static demos.
39
+ */
40
+ var coverManagement = exports.coverManagement = function coverManagement() {
41
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
42
+ _ref$removeLabel = _ref.removeLabel,
43
+ removeLabel = _ref$removeLabel === void 0 ? "Remove cover" : _ref$removeLabel,
44
+ onCollapse = _ref.onCollapse,
45
+ onRemove = _ref.onRemove;
46
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_primitives.CoverButton, {
47
+ type: "button",
48
+ "aria-label": "Collapse cover",
49
+ onClick: onCollapse
50
+ }, /*#__PURE__*/_react.default.createElement(_primitives.CollapseGlyph, null)), /*#__PURE__*/_react.default.createElement(_primitives.CoverButton, {
51
+ type: "button",
52
+ "aria-label": removeLabel,
53
+ onClick: onRemove
54
+ }, /*#__PURE__*/_react.default.createElement(_primitives.RemoveCoverGlyph, null)));
55
+ };
56
+
57
+ /* ------------------------------------------------------------------ */
58
+ /* Entity "…" menu — acts on the ENTITY, lives in a content row */
59
+ /* ------------------------------------------------------------------ */
60
+
61
+ var StyledEntityDots = _styledComponents.default.button.withConfig({
62
+ displayName: "shared__StyledEntityDots",
63
+ componentId: "sc-1x5md9a-0"
64
+ })(["display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;padding:0;border:0;border-radius:6px;cursor:pointer;color:var(--color-theme-700);background:var(--color-theme-200);svg{width:16px;height:16px;display:block;}&:hover{background:var(--color-theme-300);}"]);
65
+ var EntityDots = exports.EntityDots = function EntityDots(props) {
66
+ return /*#__PURE__*/_react.default.createElement(StyledEntityDots, _extends({
67
+ type: "button",
68
+ "aria-label": "Options",
69
+ "data-fixed": true,
70
+ className: "sc-control"
71
+ }, props), /*#__PURE__*/_react.default.createElement(_Icons.TreeDotsIcon, null));
72
+ };
73
+
74
+ /* ------------------------------------------------------------------ */
75
+ /* Text + inline bits */
76
+ /* ------------------------------------------------------------------ */
77
+
78
+ /** Two-line title clamp — the card's name row content. */
79
+ var StyledClamp = exports.StyledClamp = (0, _styledComponents.default)(_Typography.Body2).withConfig({
80
+ displayName: "shared__StyledClamp",
81
+ componentId: "sc-1x5md9a-1"
82
+ })(["display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;"]);
83
+
84
+ /** A favicon square — a solid data colour stands in for the real favicon. */
85
+ var StyledFavicon = exports.StyledFavicon = _styledComponents.default.span.withConfig({
86
+ displayName: "shared__StyledFavicon",
87
+ componentId: "sc-1x5md9a-2"
88
+ })(["display:inline-flex;width:16px;height:16px;border-radius:4px;background:", ";flex-shrink:0;"], function (_ref2) {
89
+ var $bg = _ref2.$bg;
90
+ return $bg;
91
+ });
92
+
93
+ /** A small pill for link metadata (media kind, duration, …). */
94
+ var StyledChip = exports.StyledChip = _styledComponents.default.span.withConfig({
95
+ displayName: "shared__StyledChip",
96
+ componentId: "sc-1x5md9a-3"
97
+ })(["display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;background:var(--color-theme-300);color:var(--color-theme-800);font-size:11px;white-space:nowrap;"]);
98
+
99
+ /** A solid-colour cover fill (swatch value, generic link cover, image stand-in). */
100
+ var StyledColorCover = exports.StyledColorCover = _styledComponents.default.div.withConfig({
101
+ displayName: "shared__StyledColorCover",
102
+ componentId: "sc-1x5md9a-4"
103
+ })(["width:100%;height:100%;background:", ";"], function (_ref3) {
104
+ var $color = _ref3.$color;
105
+ return $color;
106
+ });
107
+
108
+ /* ------------------------------------------------------------------ */
109
+ /* Placeholder frame — the interactive empty state, per type */
110
+ /* ------------------------------------------------------------------ */
111
+
112
+ var StyledPlaceholder = _styledComponents.default.button.withConfig({
113
+ displayName: "shared__StyledPlaceholder",
114
+ componentId: "sc-1x5md9a-5"
115
+ })(["display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;width:100%;height:", "px;padding:0;border:0;background:transparent;color:var(--color-theme-600);text-align:center;cursor:pointer;", " > svg{width:40px;height:40px;color:var(--color-theme-500);}"], function (_ref4) {
116
+ var $height = _ref4.$height;
117
+ return $height !== null && $height !== void 0 ? $height : 150;
118
+ }, function (_ref5) {
119
+ var $dashed = _ref5.$dashed;
120
+ return $dashed && (0, _styledComponents.css)(["margin:8px;width:calc(100% - 16px);border:1.5px dashed var(--color-theme-400);border-radius:6px;&:hover{border-color:var(--sc-selection-ring);color:var(--color-theme-700);}"]);
121
+ });
122
+
123
+ /**
124
+ * The shared placeholder frame. Each type supplies its own icon and verb-first,
125
+ * sentence-case invitation (ActiveCollab voice). Interactive by design — the
126
+ * whole frame is a button — and distinct from the loading skeleton.
127
+ */
128
+ var Placeholder = exports.Placeholder = function Placeholder(_ref6) {
129
+ var icon = _ref6.icon,
130
+ label = _ref6.label,
131
+ height = _ref6.height,
132
+ dashed = _ref6.dashed,
133
+ rest = _objectWithoutProperties(_ref6, _excluded);
134
+ return /*#__PURE__*/_react.default.createElement(StyledPlaceholder, _extends({
135
+ type: "button",
136
+ $height: height,
137
+ $dashed: dashed
138
+ }, rest), icon, /*#__PURE__*/_react.default.createElement(_Typography2.Typography, {
139
+ as: "span",
140
+ variant: "Body 2",
141
+ color: "secondary"
142
+ }, label));
143
+ };
144
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","names":["_react","_interopRequireDefault","require","_styledComponents","_interopRequireWildcard","_Icons","_Typography","_Typography2","_primitives","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_objectWithoutProperties","_objectWithoutPropertiesLoose","getOwnPropertySymbols","length","indexOf","propertyIsEnumerable","_extends","assign","bind","arguments","apply","playControl","exports","createElement","PlayBadge","PlayIcon","coverManagement","_ref","undefined","_ref$removeLabel","removeLabel","onCollapse","onRemove","Fragment","CoverButton","type","onClick","CollapseGlyph","RemoveCoverGlyph","StyledEntityDots","styled","button","withConfig","displayName","componentId","EntityDots","props","className","TreeDotsIcon","StyledClamp","Body2","StyledFavicon","span","_ref2","$bg","StyledChip","StyledColorCover","div","_ref3","$color","StyledPlaceholder","_ref4","$height","_ref5","$dashed","css","Placeholder","_ref6","icon","label","height","dashed","rest","Typography","as","variant","color"],"sources":["../../../../../src/presentation/stackedCard/content/shared.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode } from \"react\";\n\nimport styled, { css } from \"styled-components\";\n\nimport { PlayIcon, TreeDotsIcon } from \"../../../components/Icons\";\nimport { Body2 } from \"../../../components/Typography\";\nimport { Typography } from \"../../../components/Typography/Typography\";\nimport {\n CollapseGlyph,\n CoverButton,\n PlayBadge,\n RemoveCoverGlyph,\n} from \"../primitives\";\n\n/**\n * Content-level chrome shared by the typed StackedCard components.\n *\n * These live OUTSIDE the shell on purpose. The shell is hollow; the \"…\" entity\n * menu, the cover-management controls, the clamp, the favicon, the chips and\n * the placeholder frame are content concerns, so they belong here where the\n * typed cards (TaskCard, LinkCard, …) compose them.\n */\n\n/* ------------------------------------------------------------------ */\n/* Cover chrome — media control + cover management */\n/* ------------------------------------------------------------------ */\n\n/** Centered media control (play), for a cover that wraps audio/video. */\nexport const playControl = (\n <PlayBadge>\n <PlayIcon />\n </PlayBadge>\n);\n\n/**\n * Top-right cover management. Acts on the COVER (collapse it, remove it) — not\n * on the entity. Callers wire the click handlers; the default is inert chrome\n * for the static demos.\n */\nexport const coverManagement = ({\n removeLabel = \"Remove cover\",\n onCollapse,\n onRemove,\n}: {\n removeLabel?: string;\n onCollapse?: () => void;\n onRemove?: () => void;\n} = {}): ReactElement => (\n <>\n <CoverButton type=\"button\" aria-label=\"Collapse cover\" onClick={onCollapse}>\n <CollapseGlyph />\n </CoverButton>\n <CoverButton type=\"button\" aria-label={removeLabel} onClick={onRemove}>\n <RemoveCoverGlyph />\n </CoverButton>\n </>\n);\n\n/* ------------------------------------------------------------------ */\n/* Entity \"…\" menu — acts on the ENTITY, lives in a content row */\n/* ------------------------------------------------------------------ */\n\nconst StyledEntityDots = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n color: var(--color-theme-700);\n background: var(--color-theme-200);\n\n svg {\n width: 16px;\n height: 16px;\n display: block;\n }\n\n &:hover {\n background: var(--color-theme-300);\n }\n`;\n\nexport const EntityDots = (\n props: React.ButtonHTMLAttributes<HTMLButtonElement>\n): ReactElement => (\n <StyledEntityDots\n type=\"button\"\n aria-label=\"Options\"\n data-fixed\n className=\"sc-control\"\n {...props}\n >\n <TreeDotsIcon />\n </StyledEntityDots>\n);\n\n/* ------------------------------------------------------------------ */\n/* Text + inline bits */\n/* ------------------------------------------------------------------ */\n\n/** Two-line title clamp — the card's name row content. */\nexport const StyledClamp = styled(Body2)`\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n`;\n\n/** A favicon square — a solid data colour stands in for the real favicon. */\nexport const StyledFavicon = styled.span<{ $bg: string }>`\n display: inline-flex;\n width: 16px;\n height: 16px;\n border-radius: 4px;\n background: ${({ $bg }) => $bg};\n flex-shrink: 0;\n`;\n\n/** A small pill for link metadata (media kind, duration, …). */\nexport const StyledChip = styled.span`\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--color-theme-300);\n color: var(--color-theme-800);\n font-size: 11px;\n white-space: nowrap;\n`;\n\n/** A solid-colour cover fill (swatch value, generic link cover, image stand-in). */\nexport const StyledColorCover = styled.div<{ $color: string }>`\n width: 100%;\n height: 100%;\n background: ${({ $color }) => $color};\n`;\n\n/* ------------------------------------------------------------------ */\n/* Placeholder frame — the interactive empty state, per type */\n/* ------------------------------------------------------------------ */\n\nconst StyledPlaceholder = styled.button<{\n $height?: number;\n $dashed?: boolean;\n}>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n width: 100%;\n height: ${({ $height }) => $height ?? 150}px;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--color-theme-600);\n text-align: center;\n cursor: pointer;\n\n ${({ $dashed }) =>\n $dashed &&\n css`\n margin: 8px;\n width: calc(100% - 16px);\n border: 1.5px dashed var(--color-theme-400);\n border-radius: 6px;\n\n &:hover {\n border-color: var(--sc-selection-ring);\n color: var(--color-theme-700);\n }\n `}\n\n > svg {\n width: 40px;\n height: 40px;\n color: var(--color-theme-500);\n }\n`;\n\n/**\n * The shared placeholder frame. Each type supplies its own icon and verb-first,\n * sentence-case invitation (ActiveCollab voice). Interactive by design — the\n * whole frame is a button — and distinct from the loading skeleton.\n */\nexport const Placeholder = ({\n icon,\n label,\n height,\n dashed,\n ...rest\n}: {\n icon: ReactNode;\n label: ReactNode;\n height?: number;\n dashed?: boolean;\n} & React.ButtonHTMLAttributes<HTMLButtonElement>): ReactElement => (\n <StyledPlaceholder type=\"button\" $height={height} $dashed={dashed} {...rest}>\n {icon}\n <Typography as=\"span\" variant=\"Body 2\" color=\"secondary\">\n {label}\n </Typography>\n </StyledPlaceholder>\n);\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,iBAAA,GAAAC,uBAAA,CAAAF,OAAA;AAEA,IAAAG,MAAA,GAAAH,OAAA;AACA,IAAAI,WAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AACA,IAAAM,WAAA,GAAAN,OAAA;AAKuB,IAAAO,SAAA;AAAA,SAAAL,wBAAAM,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAR,uBAAA,YAAAA,wBAAAM,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,cAAAM,EAAA,IAAAd,CAAA,gBAAAc,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,EAAA,OAAAP,CAAA,IAAAD,CAAA,GAAAW,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAc,EAAA,OAAAP,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAM,EAAA,EAAAP,CAAA,IAAAC,CAAA,CAAAM,EAAA,IAAAd,CAAA,CAAAc,EAAA,WAAAN,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAAA,SAAAV,uBAAAS,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAK,UAAA,GAAAL,CAAA,KAAAU,OAAA,EAAAV,CAAA;AAAA,SAAAoB,yBAAApB,CAAA,EAAAC,CAAA,gBAAAD,CAAA,iBAAAM,CAAA,EAAAH,CAAA,EAAAI,CAAA,GAAAc,6BAAA,CAAArB,CAAA,EAAAC,CAAA,OAAAgB,MAAA,CAAAK,qBAAA,QAAAlB,CAAA,GAAAa,MAAA,CAAAK,qBAAA,CAAAtB,CAAA,QAAAG,CAAA,MAAAA,CAAA,GAAAC,CAAA,CAAAmB,MAAA,EAAApB,CAAA,IAAAG,CAAA,GAAAF,CAAA,CAAAD,CAAA,UAAAF,CAAA,CAAAuB,OAAA,CAAAlB,CAAA,QAAAmB,oBAAA,CAAAT,IAAA,CAAAhB,CAAA,EAAAM,CAAA,MAAAC,CAAA,CAAAD,CAAA,IAAAN,CAAA,CAAAM,CAAA,aAAAC,CAAA;AAAA,SAAAc,8BAAAlB,CAAA,EAAAH,CAAA,gBAAAG,CAAA,iBAAAF,CAAA,gBAAAG,CAAA,IAAAD,CAAA,SAAAY,cAAA,CAAAC,IAAA,CAAAb,CAAA,EAAAC,CAAA,gBAAAJ,CAAA,CAAAwB,OAAA,CAAApB,CAAA,aAAAH,CAAA,CAAAG,CAAA,IAAAD,CAAA,CAAAC,CAAA,YAAAH,CAAA;AAAA,SAAAyB,SAAA,WAAAA,QAAA,GAAAT,MAAA,CAAAU,MAAA,GAAAV,MAAA,CAAAU,MAAA,CAAAC,IAAA,eAAAxB,CAAA,aAAAJ,CAAA,MAAAA,CAAA,GAAA6B,SAAA,CAAAN,MAAA,EAAAvB,CAAA,UAAAC,CAAA,GAAA4B,SAAA,CAAA7B,CAAA,YAAAG,CAAA,IAAAF,CAAA,OAAAc,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAE,CAAA,MAAAC,CAAA,CAAAD,CAAA,IAAAF,CAAA,CAAAE,CAAA,aAAAC,CAAA,KAAAsB,QAAA,CAAAI,KAAA,OAAAD,SAAA;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACO,IAAME,WAAW,GAAAC,OAAA,CAAAD,WAAA,gBACtBzC,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACnC,WAAA,CAAAoC,SAAS,qBACR5C,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACtC,MAAA,CAAAwC,QAAQ,MAAE,CACF,CACZ;;AAED;AACA;AACA;AACA;AACA;AACO,IAAMC,eAAe,GAAAJ,OAAA,CAAAI,eAAA,GAAG,SAAlBA,eAAeA,CAAA;EAAA,IAAAC,IAAA,GAAAR,SAAA,CAAAN,MAAA,QAAAM,SAAA,QAAAS,SAAA,GAAAT,SAAA,MAQxB,CAAC,CAAC;IAAAU,gBAAA,GAAAF,IAAA,CAPJG,WAAW;IAAXA,WAAW,GAAAD,gBAAA,cAAG,cAAc,GAAAA,gBAAA;IAC5BE,UAAU,GAAAJ,IAAA,CAAVI,UAAU;IACVC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;EAAA,oBAMRpD,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAAA3C,MAAA,CAAAoB,OAAA,CAAAiC,QAAA,qBACErD,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACnC,WAAA,CAAA8C,WAAW;IAACC,IAAI,EAAC,QAAQ;IAAC,cAAW,gBAAgB;IAACC,OAAO,EAAEL;EAAW,gBACzEnD,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACnC,WAAA,CAAAiD,aAAa,MAAE,CACL,CAAC,eACdzD,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACnC,WAAA,CAAA8C,WAAW;IAACC,IAAI,EAAC,QAAQ;IAAC,cAAYL,WAAY;IAACM,OAAO,EAAEJ;EAAS,gBACpEpD,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACnC,WAAA,CAAAkD,gBAAgB,MAAE,CACR,CACb,CAAC;AAAA,CACJ;;AAED;AACA;AACA;;AAEA,IAAMC,gBAAgB,GAAGC,yBAAM,CAACC,MAAM,CAAAC,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,qSAsBrC;AAEM,IAAMC,UAAU,GAAAvB,OAAA,CAAAuB,UAAA,GAAG,SAAbA,UAAUA,CACrBC,KAAoD;EAAA,oBAEpDlE,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACgB,gBAAgB,EAAAvB,QAAA;IACfmB,IAAI,EAAC,QAAQ;IACb,cAAW,SAAS;IACpB,kBAAU;IACVY,SAAS,EAAC;EAAY,GAClBD,KAAK,gBAETlE,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACtC,MAAA,CAAA+D,YAAY,MAAE,CACC,CAAC;AAAA,CACpB;;AAED;AACA;AACA;;AAEA;AACO,IAAMC,WAAW,GAAA3B,OAAA,CAAA2B,WAAA,GAAG,IAAAT,yBAAM,EAACU,iBAAK,CAAC,CAAAR,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,6FAKvC;;AAED;AACO,IAAMO,aAAa,GAAA7B,OAAA,CAAA6B,aAAA,GAAGX,yBAAM,CAACY,IAAI,CAAAV,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,oGAKxB,UAAAS,KAAA;EAAA,IAAGC,GAAG,GAAAD,KAAA,CAAHC,GAAG;EAAA,OAAOA,GAAG;AAAA,EAE/B;;AAED;AACO,IAAMC,UAAU,GAAAjC,OAAA,CAAAiC,UAAA,GAAGf,yBAAM,CAACY,IAAI,CAAAV,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,mLASpC;;AAED;AACO,IAAMY,gBAAgB,GAAAlC,OAAA,CAAAkC,gBAAA,GAAGhB,yBAAM,CAACiB,GAAG,CAAAf,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,gDAG1B,UAAAc,KAAA;EAAA,IAAGC,MAAM,GAAAD,KAAA,CAANC,MAAM;EAAA,OAAOA,MAAM;AAAA,EACrC;;AAED;AACA;AACA;;AAEA,IAAMC,iBAAiB,GAAGpB,yBAAM,CAACC,MAAM,CAAAC,UAAA;EAAAC,WAAA;EAAAC,WAAA;AAAA,gSAU3B,UAAAiB,KAAA;EAAA,IAAGC,OAAO,GAAAD,KAAA,CAAPC,OAAO;EAAA,OAAOA,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,GAAG;AAAA,GAQvC,UAAAC,KAAA;EAAA,IAAGC,OAAO,GAAAD,KAAA,CAAPC,OAAO;EAAA,OACVA,OAAO,QACPC,qBAAG,mLAUF;AAAA,EAOJ;;AAED;AACA;AACA;AACA;AACA;AACO,IAAMC,WAAW,GAAA5C,OAAA,CAAA4C,WAAA,GAAG,SAAdA,WAAWA,CAAAC,KAAA;EAAA,IACtBC,IAAI,GAAAD,KAAA,CAAJC,IAAI;IACJC,KAAK,GAAAF,KAAA,CAALE,KAAK;IACLC,MAAM,GAAAH,KAAA,CAANG,MAAM;IACNC,MAAM,GAAAJ,KAAA,CAANI,MAAM;IACHC,IAAI,GAAA9D,wBAAA,CAAAyD,KAAA,EAAA9E,SAAA;EAAA,oBAOPT,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACqC,iBAAiB,EAAA5C,QAAA;IAACmB,IAAI,EAAC,QAAQ;IAAC2B,OAAO,EAAEQ,MAAO;IAACN,OAAO,EAAEO;EAAO,GAAKC,IAAI,GACxEJ,IAAI,eACLxF,MAAA,CAAAoB,OAAA,CAAAuB,aAAA,CAACpC,YAAA,CAAAsF,UAAU;IAACC,EAAE,EAAC,MAAM;IAACC,OAAO,EAAC,QAAQ;IAACC,KAAK,EAAC;EAAW,GACrDP,KACS,CACK,CAAC;AAAA,CACrB","ignoreList":[]}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useUnfurl = exports.formatFetchedAt = exports.MOCK_LINKS = void 0;
7
+ var _react = require("react");
8
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
9
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
11
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
12
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
13
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
14
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
15
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
18
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
19
+ /**
20
+ * Mock unfurl service for the LinkCard concept.
21
+ *
22
+ * A link preview is a LIFECYCLE, not two static layouts. The real service is
23
+ * server-side (SSRF-guarded, oEmbed → OpenGraph → Twitter Cards → <title>,
24
+ * cached ~24h with a stored `fetchedAt` and a manual re-unfurl affordance — see
25
+ * note 52104 §B3). This is a promise-based fake with a configurable delay and a
26
+ * failure toggle so the story can drive the whole lifecycle without a network.
27
+ *
28
+ * The data arrives on a PROGRESSIVE LADDER of three tiers, each carrying more
29
+ * than the last:
30
+ * url → just the raw URL (nothing fetched yet)
31
+ * basic → favicon + title + domain
32
+ * full → + description, hero image, media kind / duration
33
+ * The card reserves the next tier's space at every tier, so climbing the ladder
34
+ * never reflows the card.
35
+ */
36
+
37
+ /** The cumulative data shape. Fields fill in as the ladder climbs. */
38
+
39
+ /** A seed link — what the fake "server" would resolve the URL to at tier full. */
40
+
41
+ var MOCK_LINKS = exports.MOCK_LINKS = {
42
+ vimeo: {
43
+ url: "https://vimeo.com/876631121",
44
+ faviconColor: "#0F6E56",
45
+ title: "Brand refresh — motion explorations for the spring launch",
46
+ domain: "vimeo.com",
47
+ description: "A reel of motion studies exploring the refreshed brand system: type in motion, the new mark, and transitions for the marketing site.",
48
+ heroColor: "#1D9E75",
49
+ kind: "Video",
50
+ duration: "4:32",
51
+ playable: true
52
+ },
53
+ history: {
54
+ url: "https://ww2history.org/timeline",
55
+ faviconColor: "#8C5A2B",
56
+ title: "The Second World War • Timeline, key battles, and firsthand accounts",
57
+ domain: "ww2history.org",
58
+ description: "An illustrated timeline of the Second World War with primary sources, maps, and firsthand accounts from each theatre of the war.",
59
+ heroColor: "#B5793B",
60
+ kind: "Article",
61
+ playable: false
62
+ }
63
+ };
64
+
65
+ /** Progressive tier data derived from a seed link. */
66
+ var tierData = function tierData(link, tier) {
67
+ if (tier === "url") return {
68
+ url: link.url
69
+ };
70
+ if (tier === "basic") {
71
+ return {
72
+ url: link.url,
73
+ faviconColor: link.faviconColor,
74
+ title: link.title,
75
+ domain: link.domain
76
+ };
77
+ }
78
+ return _objectSpread({}, link);
79
+ };
80
+ /**
81
+ * Drives one link through the unfurl lifecycle. Climbs url → basic → full on a
82
+ * timer, or lands in `error` if `shouldFail`. `retry` / `reunfurl` re-run it;
83
+ * `markStale` moves a resolved card to the stale state so the re-unfurl
84
+ * affordance can be shown.
85
+ */
86
+ var useUnfurl = exports.useUnfurl = function useUnfurl(_ref) {
87
+ var link = _ref.link,
88
+ _ref$delayMs = _ref.delayMs,
89
+ delayMs = _ref$delayMs === void 0 ? 900 : _ref$delayMs,
90
+ _ref$shouldFail = _ref.shouldFail,
91
+ shouldFail = _ref$shouldFail === void 0 ? false : _ref$shouldFail;
92
+ var _useState = (0, _react.useState)("resolving"),
93
+ _useState2 = _slicedToArray(_useState, 2),
94
+ status = _useState2[0],
95
+ setStatus = _useState2[1];
96
+ var _useState3 = (0, _react.useState)("url"),
97
+ _useState4 = _slicedToArray(_useState3, 2),
98
+ tier = _useState4[0],
99
+ setTier = _useState4[1];
100
+ var _useState5 = (0, _react.useState)(function () {
101
+ return tierData(link, "url");
102
+ }),
103
+ _useState6 = _slicedToArray(_useState5, 2),
104
+ data = _useState6[0],
105
+ setData = _useState6[1];
106
+ var _useState7 = (0, _react.useState)(null),
107
+ _useState8 = _slicedToArray(_useState7, 2),
108
+ fetchedAt = _useState8[0],
109
+ setFetchedAt = _useState8[1];
110
+ var timers = (0, _react.useRef)([]);
111
+ var clearTimers = (0, _react.useCallback)(function () {
112
+ timers.current.forEach(clearTimeout);
113
+ timers.current = [];
114
+ }, []);
115
+ var start = (0, _react.useCallback)(function () {
116
+ clearTimers();
117
+ setStatus("resolving");
118
+ setTier("url");
119
+ setData(tierData(link, "url"));
120
+ if (shouldFail) {
121
+ // Fail partway: the favicon + title never arrive; we keep the raw URL.
122
+ timers.current.push(setTimeout(function () {
123
+ return setStatus("error");
124
+ }, delayMs));
125
+ return;
126
+ }
127
+ timers.current.push(setTimeout(function () {
128
+ setTier("basic");
129
+ setData(tierData(link, "basic"));
130
+ }, delayMs));
131
+ timers.current.push(setTimeout(function () {
132
+ setTier("full");
133
+ setData(tierData(link, "full"));
134
+ setStatus("resolved");
135
+ setFetchedAt(Date.now());
136
+ }, delayMs * 2));
137
+ }, [clearTimers, link, delayMs, shouldFail]);
138
+ var markStale = (0, _react.useCallback)(function () {
139
+ setStatus(function (prev) {
140
+ return prev === "resolved" ? "stale" : prev;
141
+ });
142
+ }, []);
143
+
144
+ // Kick off on mount and whenever the config that defines the run changes.
145
+ (0, _react.useEffect)(function () {
146
+ start();
147
+ return clearTimers;
148
+ }, [start, clearTimers]);
149
+ return {
150
+ status,
151
+ tier,
152
+ data,
153
+ fetchedAt,
154
+ start,
155
+ retry: start,
156
+ reunfurl: start,
157
+ markStale
158
+ };
159
+ };
160
+
161
+ /** Human-readable "fetched N ago" for the stale affordance. */
162
+ var formatFetchedAt = exports.formatFetchedAt = function formatFetchedAt(fetchedAt) {
163
+ if (!fetchedAt) return "";
164
+ var seconds = Math.max(1, Math.round((Date.now() - fetchedAt) / 1000));
165
+ if (seconds < 60) return "".concat(seconds, "s ago");
166
+ var minutes = Math.round(seconds / 60);
167
+ if (minutes < 60) return "".concat(minutes, "m ago");
168
+ var hours = Math.round(minutes / 60);
169
+ if (hours < 24) return "".concat(hours, "h ago");
170
+ return "".concat(Math.round(hours / 24), "d ago");
171
+ };
172
+ //# sourceMappingURL=unfurl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unfurl.js","names":["_react","require","_slicedToArray","r","e","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","t","toString","call","slice","constructor","name","Array","from","test","length","n","l","Symbol","iterator","i","u","f","o","next","Object","done","push","value","return","isArray","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","apply","_objectSpread","arguments","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","configurable","writable","_toPrimitive","toPrimitive","String","Number","MOCK_LINKS","exports","vimeo","url","faviconColor","title","domain","description","heroColor","kind","duration","playable","history","tierData","link","tier","useUnfurl","_ref","_ref$delayMs","delayMs","_ref$shouldFail","shouldFail","_useState","useState","_useState2","status","setStatus","_useState3","_useState4","setTier","_useState5","_useState6","data","setData","_useState7","_useState8","fetchedAt","setFetchedAt","timers","useRef","clearTimers","useCallback","current","clearTimeout","start","setTimeout","Date","now","markStale","prev","useEffect","retry","reunfurl","formatFetchedAt","seconds","Math","max","round","concat","minutes","hours"],"sources":["../../../../../src/presentation/stackedCard/content/unfurl.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/**\n * Mock unfurl service for the LinkCard concept.\n *\n * A link preview is a LIFECYCLE, not two static layouts. The real service is\n * server-side (SSRF-guarded, oEmbed → OpenGraph → Twitter Cards → <title>,\n * cached ~24h with a stored `fetchedAt` and a manual re-unfurl affordance — see\n * note 52104 §B3). This is a promise-based fake with a configurable delay and a\n * failure toggle so the story can drive the whole lifecycle without a network.\n *\n * The data arrives on a PROGRESSIVE LADDER of three tiers, each carrying more\n * than the last:\n * url → just the raw URL (nothing fetched yet)\n * basic → favicon + title + domain\n * full → + description, hero image, media kind / duration\n * The card reserves the next tier's space at every tier, so climbing the ladder\n * never reflows the card.\n */\n\nexport type UnfurlTier = \"url\" | \"basic\" | \"full\";\n\nexport type UnfurlStatus = \"resolving\" | \"resolved\" | \"stale\" | \"error\";\n\n/** The cumulative data shape. Fields fill in as the ladder climbs. */\nexport interface UnfurlData {\n /** Always present — the raw pasted URL. */\n url: string;\n /** Tier `basic` and up: a stand-in favicon colour. */\n faviconColor?: string;\n /** Tier `basic` and up: page title. */\n title?: string;\n /** Tier `basic` and up: the display domain. */\n domain?: string;\n /** Tier `full`: short description / summary. */\n description?: string;\n /** Tier `full`: hero image src (a real <img> in production). */\n heroSrc?: string;\n /** Tier `full`: hero fill colour, used when there is no hero image. */\n heroColor?: string;\n /** Tier `full`: media kind chip (Video, Article, …). */\n kind?: string;\n /** Tier `full`: duration chip for playable media. */\n duration?: string;\n /** Tier `full`: whether the media is playable (shows the cover play badge). */\n playable?: boolean;\n}\n\n/** A seed link — what the fake \"server\" would resolve the URL to at tier full. */\nexport interface MockLink {\n url: string;\n faviconColor: string;\n title: string;\n domain: string;\n description: string;\n heroColor: string;\n heroSrc?: string;\n kind: string;\n duration?: string;\n playable?: boolean;\n}\n\nexport const MOCK_LINKS: Record<string, MockLink> = {\n vimeo: {\n url: \"https://vimeo.com/876631121\",\n faviconColor: \"#0F6E56\",\n title: \"Brand refresh — motion explorations for the spring launch\",\n domain: \"vimeo.com\",\n description:\n \"A reel of motion studies exploring the refreshed brand system: type in motion, the new mark, and transitions for the marketing site.\",\n heroColor: \"#1D9E75\",\n kind: \"Video\",\n duration: \"4:32\",\n playable: true,\n },\n history: {\n url: \"https://ww2history.org/timeline\",\n faviconColor: \"#8C5A2B\",\n title:\n \"The Second World War • Timeline, key battles, and firsthand accounts\",\n domain: \"ww2history.org\",\n description:\n \"An illustrated timeline of the Second World War with primary sources, maps, and firsthand accounts from each theatre of the war.\",\n heroColor: \"#B5793B\",\n kind: \"Article\",\n playable: false,\n },\n};\n\n/** Progressive tier data derived from a seed link. */\nconst tierData = (link: MockLink, tier: UnfurlTier): UnfurlData => {\n if (tier === \"url\") return { url: link.url };\n if (tier === \"basic\") {\n return {\n url: link.url,\n faviconColor: link.faviconColor,\n title: link.title,\n domain: link.domain,\n };\n }\n return { ...link };\n};\n\nexport interface UnfurlConfig {\n /** Which seed link to resolve. */\n link: MockLink;\n /** Per-tier delay in ms (url→basic and basic→full each wait this long). */\n delayMs?: number;\n /** When true, the unfurl fails partway and lands in the error state. */\n shouldFail?: boolean;\n}\n\nexport interface UnfurlController {\n status: UnfurlStatus;\n tier: UnfurlTier;\n data: UnfurlData;\n /** Epoch ms of the last successful resolve (drives the stale affordance). */\n fetchedAt: number | null;\n /** Start (or restart) the unfurl ladder from scratch. */\n start: () => void;\n /** Retry after an error — re-runs the simulation. */\n retry: () => void;\n /** Re-unfurl a resolved/stale card — re-runs the simulation. */\n reunfurl: () => void;\n /** Force the resolved card into the stale state (demo affordance). */\n markStale: () => void;\n}\n\n/**\n * Drives one link through the unfurl lifecycle. Climbs url → basic → full on a\n * timer, or lands in `error` if `shouldFail`. `retry` / `reunfurl` re-run it;\n * `markStale` moves a resolved card to the stale state so the re-unfurl\n * affordance can be shown.\n */\nexport const useUnfurl = ({\n link,\n delayMs = 900,\n shouldFail = false,\n}: UnfurlConfig): UnfurlController => {\n const [status, setStatus] = useState<UnfurlStatus>(\"resolving\");\n const [tier, setTier] = useState<UnfurlTier>(\"url\");\n const [data, setData] = useState<UnfurlData>(() => tierData(link, \"url\"));\n const [fetchedAt, setFetchedAt] = useState<number | null>(null);\n\n const timers = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n const clearTimers = useCallback(() => {\n timers.current.forEach(clearTimeout);\n timers.current = [];\n }, []);\n\n const start = useCallback(() => {\n clearTimers();\n setStatus(\"resolving\");\n setTier(\"url\");\n setData(tierData(link, \"url\"));\n\n if (shouldFail) {\n // Fail partway: the favicon + title never arrive; we keep the raw URL.\n timers.current.push(setTimeout(() => setStatus(\"error\"), delayMs));\n return;\n }\n\n timers.current.push(\n setTimeout(() => {\n setTier(\"basic\");\n setData(tierData(link, \"basic\"));\n }, delayMs)\n );\n timers.current.push(\n setTimeout(() => {\n setTier(\"full\");\n setData(tierData(link, \"full\"));\n setStatus(\"resolved\");\n setFetchedAt(Date.now());\n }, delayMs * 2)\n );\n }, [clearTimers, link, delayMs, shouldFail]);\n\n const markStale = useCallback(() => {\n setStatus((prev) => (prev === \"resolved\" ? \"stale\" : prev));\n }, []);\n\n // Kick off on mount and whenever the config that defines the run changes.\n useEffect(() => {\n start();\n return clearTimers;\n }, [start, clearTimers]);\n\n return {\n status,\n tier,\n data,\n fetchedAt,\n start,\n retry: start,\n reunfurl: start,\n markStale,\n };\n};\n\n/** Human-readable \"fetched N ago\" for the stale affordance. */\nexport const formatFetchedAt = (fetchedAt: number | null): string => {\n if (!fetchedAt) return \"\";\n const seconds = Math.max(1, Math.round((Date.now() - fetchedAt) / 1000));\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.round(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n return `${Math.round(hours / 24)}d ago`;\n};\n"],"mappings":"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","ignoreList":[]}