@amaster.ai/pi-lark 0.1.2-beta.44 → 0.1.2-beta.45

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 (122) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-apps/SKILL.md +23 -12
  3. package/skills/lark-apps/creative-design/agents/assets/vision-probe.png +0 -0
  4. package/skills/lark-apps/creative-design/agents/fork-verifier-agent.md +71 -0
  5. package/skills/lark-apps/creative-design/agents/vision-probe-agent.md +41 -0
  6. package/skills/lark-apps/creative-design/assets/index.html +27 -0
  7. package/skills/lark-apps/creative-design/creative-design.md +239 -0
  8. package/skills/lark-apps/creative-design/references/aily.md +39 -0
  9. package/skills/lark-apps/creative-design/references/animated-video.md +34 -0
  10. package/skills/lark-apps/creative-design/references/charts.md +165 -0
  11. package/skills/lark-apps/creative-design/references/claude.md +36 -0
  12. package/skills/lark-apps/creative-design/references/codex.md +32 -0
  13. package/skills/lark-apps/creative-design/references/data-report.md +108 -0
  14. package/skills/lark-apps/creative-design/references/frontend-design.md +71 -0
  15. package/skills/lark-apps/creative-design/references/hi-fi-design.md +32 -0
  16. package/skills/lark-apps/creative-design/references/interactive-prototype.md +24 -0
  17. package/skills/lark-apps/creative-design/references/make-a-deck.md +133 -0
  18. package/skills/lark-apps/creative-design/references/visual-exposure.md +82 -0
  19. package/skills/lark-apps/creative-design/references/wireframe.md +14 -0
  20. package/skills/lark-apps/creative-design/starter-components/android-frame.jsx +188 -0
  21. package/skills/lark-apps/creative-design/starter-components/animations.jsx +773 -0
  22. package/skills/lark-apps/creative-design/starter-components/browser-window.jsx +122 -0
  23. package/skills/lark-apps/creative-design/starter-components/deck-stage.js +2483 -0
  24. package/skills/lark-apps/creative-design/starter-components/design-canvas.jsx +1432 -0
  25. package/skills/lark-apps/creative-design/starter-components/ios-frame.jsx +270 -0
  26. package/skills/lark-apps/creative-design/starter-components/macos-window.jsx +197 -0
  27. package/skills/lark-apps/creative-design/starter-components/tweaks-panel.jsx +752 -0
  28. package/skills/lark-apps/references/lark-apps-automation.md +80 -2
  29. package/skills/lark-apps/references/lark-apps-cloud-dev.md +0 -1
  30. package/skills/lark-apps/references/lark-apps-create.md +1 -2
  31. package/skills/lark-apps/references/lark-apps-db.md +1 -1
  32. package/skills/lark-apps/references/lark-apps-env-pull.md +1 -1
  33. package/skills/lark-apps/references/lark-apps-file.md +1 -1
  34. package/skills/lark-apps/references/lark-apps-git-credential.md +1 -1
  35. package/skills/lark-apps/references/lark-apps-html-publish.md +4 -8
  36. package/skills/lark-apps/references/lark-apps-init.md +1 -1
  37. package/skills/lark-apps/references/lark-apps-list.md +1 -1
  38. package/skills/lark-apps/references/lark-apps-local-dev.md +54 -11
  39. package/skills/lark-apps/references/lark-apps-openapi-key.md +1 -1
  40. package/skills/lark-apps/references/lark-apps-release-create.md +2 -2
  41. package/skills/lark-apps/references/lark-apps-release-get.md +3 -3
  42. package/skills/lark-base/SKILL.md +1 -2
  43. package/skills/lark-base/references/lark-base-cell-value.md +3 -3
  44. package/skills/lark-base/references/lark-base-field-create.md +4 -0
  45. package/skills/lark-base/references/lark-base-field-json.md +4 -4
  46. package/skills/lark-base/references/lark-base-field-update.md +17 -1
  47. package/skills/lark-base/references/lark-base-record-batch-create.md +12 -10
  48. package/skills/lark-base/references/lark-base-record-batch-update.md +11 -9
  49. package/skills/lark-base/references/lark-base-record-upsert.md +1 -1
  50. package/skills/lark-calendar/references/lark-calendar-create.md +1 -0
  51. package/skills/lark-calendar/references/lark-calendar-update.md +3 -0
  52. package/skills/lark-doc/references/lark-doc-fetch.md +10 -2
  53. package/skills/lark-doc/references/lark-doc-whiteboard.md +9 -8
  54. package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +41 -0
  55. package/skills/lark-doc/references/lark-doc-xml.md +3 -2
  56. package/skills/lark-drive/SKILL.md +4 -1
  57. package/skills/lark-drive/references/lark-drive-comment-location.md +2 -2
  58. package/skills/lark-drive/references/lark-drive-upload.md +1 -0
  59. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md +273 -0
  60. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md +202 -0
  61. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md +231 -0
  62. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md +248 -0
  63. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md +174 -0
  64. package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md +202 -0
  65. package/skills/lark-drive/references/lark-drive-workflow.md +5 -4
  66. package/skills/lark-event/SKILL.md +1 -0
  67. package/skills/lark-event/references/lark-event-application.md +38 -0
  68. package/skills/lark-im/SKILL.md +1 -1
  69. package/skills/lark-im/references/lark-im-flag-list.md +8 -7
  70. package/skills/lark-okr/SKILL.md +71 -26
  71. package/skills/lark-okr/references/lark-okr-batch-create.md +19 -18
  72. package/skills/lark-okr/references/lark-okr-create.md +173 -0
  73. package/skills/lark-okr/references/lark-okr-cycle-list.md +17 -7
  74. package/skills/lark-okr/references/lark-okr-entities.md +1 -0
  75. package/skills/lark-okr/references/lark-okr-indicator-update.md +3 -1
  76. package/skills/lark-okr/references/lark-okr-indicators.md +61 -12
  77. package/skills/lark-okr/references/lark-okr-progress-list.md +21 -9
  78. package/skills/lark-slides/SKILL.md +103 -46
  79. package/skills/lark-slides/references/asset-planning.md +6 -4
  80. package/skills/lark-slides/references/iconpark.md +2 -2
  81. package/skills/lark-slides/references/lark-slides-create.md +2 -3
  82. package/skills/lark-slides/references/lark-slides-history.md +132 -0
  83. package/skills/lark-slides/references/lark-slides-media-upload.md +1 -2
  84. package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +7 -11
  85. package/skills/lark-slides/references/lark-slides-replace-slide.md +0 -3
  86. package/skills/lark-slides/references/lark-slides-screenshot.md +1 -1
  87. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +219 -0
  88. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +6 -5
  89. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +2 -2
  90. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +2 -3
  91. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +65 -30
  92. package/skills/lark-slides/references/planning-layer.md +11 -10
  93. package/skills/lark-slides/references/slides_chart_demo.xml +1416 -1
  94. package/skills/lark-slides/references/slides_xml_schema_definition.xml +1 -45
  95. package/skills/lark-slides/references/troubleshooting.md +25 -7
  96. package/skills/lark-slides/references/validation-checklist.md +33 -13
  97. package/skills/lark-slides/references/visual-planning.md +25 -22
  98. package/skills/lark-slides/references/xml-schema-quick-ref.md +225 -46
  99. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +223 -22
  100. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +183 -124
  101. package/skills/lark-whiteboard/SKILL.md +13 -12
  102. package/skills/lark-whiteboard/elements/layout.md +1 -1
  103. package/skills/lark-whiteboard/elements/schema.md +2 -2
  104. package/skills/lark-whiteboard/references/{lark-whiteboard-query.md → lark-whiteboard-export.md} +15 -15
  105. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +3 -3
  106. package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +7 -17
  107. package/skills/lark-whiteboard/routes/dsl.md +3 -3
  108. package/skills/lark-whiteboard/routes/mermaid.md +2 -2
  109. package/skills/lark-whiteboard/routes/svg-edit.md +4 -4
  110. package/skills/lark-whiteboard/routes/svg.md +11 -6
  111. package/skills/lark-whiteboard/scenes/bar-chart.md +1 -1
  112. package/skills/lark-whiteboard/scenes/fishbone.md +1 -1
  113. package/skills/lark-whiteboard/scenes/flywheel.md +1 -1
  114. package/skills/lark-whiteboard/scenes/line-chart.md +1 -1
  115. package/skills/lark-whiteboard/scenes/treemap.md +1 -1
  116. package/skills/lark-wiki/SKILL.md +1 -0
  117. package/skills/lark-slides/references/examples.md +0 -91
  118. package/skills/lark-slides/references/lark-slides-whiteboard.md +0 -331
  119. package/skills/lark-slides/references/lark-slides-xml-get.md +0 -100
  120. package/skills/lark-slides/references/slide-templates.md +0 -201
  121. package/skills/lark-slides/references/slides_demo.xml +0 -226
  122. package/skills/lark-slides/references/xml-format-guide.md +0 -433
@@ -0,0 +1,270 @@
1
+ /* BEGIN USAGE */
2
+ // iOS.jsx — Simplified iOS 26 (Liquid Glass) device frame
3
+ // Based on the iOS 26 UI Kit + Figma status bar spec. No assets, no deps.
4
+ // Exports (to window): IOSDevice, IOSStatusBar, IOSList, IOSListRow, IOSKeyboard
5
+ //
6
+ // Usage — wrap your screen content in <IOSDevice> to get the bezel, status bar
7
+ // and home indicator (props: width=402, height=874, dark, keyboard):
8
+ //
9
+ // <IOSDevice>
10
+ // ...your screen content...
11
+ // </IOSDevice>
12
+ // <IOSDevice dark keyboard>…</IOSDevice>
13
+ // <IOSDevice width={390} height={844}>…</IOSDevice> // smaller device size
14
+ //
15
+ // Safe areas — REQUIRED on every screen. The status bar (top) and home
16
+ // indicator (bottom) float OVER your content; inset it or it overlaps them.
17
+ // --ios-safe-top top inset (Dynamic Island + status bar)
18
+ // --ios-safe-bottom bottom inset (home indicator)
19
+ /* END USAGE */
20
+
21
+ // ─────────────────────────────────────────────────────────────
22
+ // Status bar
23
+ // ─────────────────────────────────────────────────────────────
24
+ function IOSStatusBar({ dark = false, time = '9:41' }) {
25
+ const c = dark ? '#fff' : '#000';
26
+ return (
27
+ <div style={{
28
+ display: 'flex', gap: 154, alignItems: 'center', justifyContent: 'center',
29
+ padding: '21px 24px 19px', boxSizing: 'border-box',
30
+ position: 'relative', zIndex: 20, width: '100%',
31
+ }}>
32
+ <div style={{ flex: 1, height: 22, display: 'flex', alignItems: 'center', justifyContent: 'center', paddingTop: 1.5 }}>
33
+ <span style={{
34
+ fontFamily: '-apple-system, "SF Pro", system-ui', fontWeight: 590,
35
+ fontSize: 17, lineHeight: '22px', color: c,
36
+ }}>{time}</span>
37
+ </div>
38
+ <div style={{ flex: 1, height: 22, display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 7, paddingTop: 1, paddingRight: 1 }}>
39
+ <svg width="19" height="12" viewBox="0 0 19 12">
40
+ <rect x="0" y="7.5" width="3.2" height="4.5" rx="0.7" fill={c}/>
41
+ <rect x="4.8" y="5" width="3.2" height="7" rx="0.7" fill={c}/>
42
+ <rect x="9.6" y="2.5" width="3.2" height="9.5" rx="0.7" fill={c}/>
43
+ <rect x="14.4" y="0" width="3.2" height="12" rx="0.7" fill={c}/>
44
+ </svg>
45
+ <svg width="17" height="12" viewBox="0 0 17 12">
46
+ <path d="M8.5 3.2C10.8 3.2 12.9 4.1 14.4 5.6L15.5 4.5C13.7 2.7 11.2 1.5 8.5 1.5C5.8 1.5 3.3 2.7 1.5 4.5L2.6 5.6C4.1 4.1 6.2 3.2 8.5 3.2Z" fill={c}/>
47
+ <path d="M8.5 6.8C9.9 6.8 11.1 7.3 12 8.2L13.1 7.1C11.8 5.9 10.2 5.1 8.5 5.1C6.8 5.1 5.2 5.9 3.9 7.1L5 8.2C5.9 7.3 7.1 6.8 8.5 6.8Z" fill={c}/>
48
+ <circle cx="8.5" cy="10.5" r="1.5" fill={c}/>
49
+ </svg>
50
+ <svg width="27" height="13" viewBox="0 0 27 13">
51
+ <rect x="0.5" y="0.5" width="23" height="12" rx="3.5" stroke={c} strokeOpacity="0.35" fill="none"/>
52
+ <rect x="2" y="2" width="20" height="9" rx="2" fill={c}/>
53
+ <path d="M25 4.5V8.5C25.8 8.2 26.5 7.2 26.5 6.5C26.5 5.8 25.8 4.8 25 4.5Z" fill={c} fillOpacity="0.4"/>
54
+ </svg>
55
+ </div>
56
+ </div>
57
+ );
58
+ }
59
+
60
+ // ─────────────────────────────────────────────────────────────
61
+ // Grouped list (inset card, r:26) + row (52px)
62
+ // ─────────────────────────────────────────────────────────────
63
+ function IOSListRow({ title, detail, icon, chevron = true, isLast = false, dark = false }) {
64
+ const text = dark ? '#fff' : '#000';
65
+ const sec = dark ? 'rgba(235,235,245,0.6)' : 'rgba(60,60,67,0.6)';
66
+ const ter = dark ? 'rgba(235,235,245,0.3)' : 'rgba(60,60,67,0.3)';
67
+ const sep = dark ? 'rgba(84,84,88,0.65)' : 'rgba(60,60,67,0.12)';
68
+ return (
69
+ <div style={{
70
+ display: 'flex', alignItems: 'center', minHeight: 52,
71
+ padding: '0 16px', position: 'relative',
72
+ fontFamily: '-apple-system, system-ui', fontSize: 17,
73
+ letterSpacing: -0.43,
74
+ }}>
75
+ {icon && (
76
+ <div style={{
77
+ width: 30, height: 30, borderRadius: 7, background: icon,
78
+ marginRight: 12, flexShrink: 0,
79
+ }} />
80
+ )}
81
+ <div style={{ flex: 1, color: text }}>{title}</div>
82
+ {detail && <span style={{ color: sec, marginRight: 6 }}>{detail}</span>}
83
+ {chevron && (
84
+ <svg width="8" height="14" viewBox="0 0 8 14" style={{ flexShrink: 0 }}>
85
+ <path d="M1 1l6 6-6 6" stroke={ter} strokeWidth="2" fill="none" strokeLinecap="round" strokeLinejoin="round"/>
86
+ </svg>
87
+ )}
88
+ {!isLast && (
89
+ <div style={{
90
+ position: 'absolute', bottom: 0, right: 0,
91
+ left: icon ? 58 : 16, height: 0.5, background: sep,
92
+ }} />
93
+ )}
94
+ </div>
95
+ );
96
+ }
97
+
98
+ function IOSList({ header, children, dark = false }) {
99
+ const hc = dark ? 'rgba(235,235,245,0.6)' : 'rgba(60,60,67,0.6)';
100
+ const bg = dark ? '#1C1C1E' : '#fff';
101
+ return (
102
+ <div>
103
+ {header && (
104
+ <div style={{
105
+ fontFamily: '-apple-system, system-ui', fontSize: 13,
106
+ color: hc, textTransform: 'uppercase',
107
+ padding: '8px 36px 6px', letterSpacing: -0.08,
108
+ }}>{header}</div>
109
+ )}
110
+ <div style={{
111
+ background: bg, borderRadius: 26,
112
+ margin: '0 16px', overflow: 'hidden',
113
+ }}>{children}</div>
114
+ </div>
115
+ );
116
+ }
117
+
118
+ // ─────────────────────────────────────────────────────────────
119
+ // Device frame
120
+ // ─────────────────────────────────────────────────────────────
121
+ function IOSDevice({
122
+ children, width = 402, height = 874, dark = false,
123
+ keyboard = false,
124
+ }) {
125
+ return (
126
+ <div style={{
127
+ width, height, borderRadius: 48, overflow: 'hidden',
128
+ position: 'relative', background: dark ? '#000' : '#F2F2F7',
129
+ border: '1px solid #DEE0E3',
130
+ fontFamily: '-apple-system, system-ui, sans-serif',
131
+ WebkitFontSmoothing: 'antialiased',
132
+ '--ios-safe-top': '62px',
133
+ '--ios-safe-bottom': '34px',
134
+ }}>
135
+ {/* dynamic island */}
136
+ <div style={{
137
+ position: 'absolute', top: 11, left: '50%', transform: 'translateX(-50%)',
138
+ width: 126, height: 37, borderRadius: 24, background: '#000', zIndex: 50,
139
+ }} />
140
+ {/* status bar (absolute) */}
141
+ <div style={{ position: 'absolute', top: 0, left: 0, right: 0, zIndex: 10 }}>
142
+ <IOSStatusBar dark={dark} />
143
+ </div>
144
+ {/* content */}
145
+ <div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
146
+ <div style={{ flex: 1, overflow: 'auto' }}>{children}</div>
147
+ {keyboard && <IOSKeyboard dark={dark} />}
148
+ </div>
149
+ {/* home indicator — always on top */}
150
+ <div style={{
151
+ position: 'absolute', bottom: 0, left: 0, right: 0, zIndex: 60,
152
+ height: 34, display: 'flex', justifyContent: 'center', alignItems: 'flex-end',
153
+ paddingBottom: 8, pointerEvents: 'none',
154
+ }}>
155
+ <div style={{
156
+ width: 139, height: 5, borderRadius: 100,
157
+ background: dark ? 'rgba(255,255,255,0.7)' : 'rgba(0,0,0,0.25)',
158
+ }} />
159
+ </div>
160
+ </div>
161
+ );
162
+ }
163
+
164
+ // ─────────────────────────────────────────────────────────────
165
+ // Keyboard — iOS 26 liquid glass
166
+ // ─────────────────────────────────────────────────────────────
167
+ function IOSKeyboard({ dark = false }) {
168
+ const glyph = dark ? 'rgba(255,255,255,0.7)' : '#595959';
169
+ const sugg = dark ? 'rgba(255,255,255,0.6)' : '#333';
170
+ const keyBg = dark ? 'rgba(255,255,255,0.22)' : 'rgba(255,255,255,0.85)';
171
+
172
+ // special-key icons
173
+ const icons = {
174
+ shift: <svg width="19" height="17" viewBox="0 0 19 17"><path d="M9.5 1L1 9.5h4.5V16h8V9.5H18L9.5 1z" fill={glyph}/></svg>,
175
+ del: <svg width="23" height="17" viewBox="0 0 23 17"><path d="M7 1h13a2 2 0 012 2v11a2 2 0 01-2 2H7l-6-7.5L7 1z" fill="none" stroke={glyph} strokeWidth="1.6" strokeLinejoin="round"/><path d="M10 5l7 7M17 5l-7 7" stroke={glyph} strokeWidth="1.6" strokeLinecap="round"/></svg>,
176
+ ret: <svg width="20" height="14" viewBox="0 0 20 14"><path d="M18 1v6H4m0 0l4-4M4 7l4 4" fill="none" stroke="#fff" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"/></svg>,
177
+ };
178
+
179
+ const key = (content, { w, flex, ret, fs = 25, k } = {}) => (
180
+ <div key={k} style={{
181
+ height: 42, borderRadius: 8.5,
182
+ flex: flex ? 1 : undefined, width: w, minWidth: 0,
183
+ background: ret ? '#08f' : keyBg,
184
+ boxShadow: '0 1px 0 rgba(0,0,0,0.075)',
185
+ display: 'flex', alignItems: 'center', justifyContent: 'center',
186
+ fontFamily: '-apple-system, "SF Compact", system-ui',
187
+ fontSize: fs, fontWeight: 458, color: ret ? '#fff' : glyph,
188
+ }}>{content}</div>
189
+ );
190
+
191
+ const row = (keys, pad = 0) => (
192
+ <div style={{ display: 'flex', gap: 6.5, justifyContent: 'center', padding: `0 ${pad}px` }}>
193
+ {keys.map(l => key(l, { flex: true, k: l }))}
194
+ </div>
195
+ );
196
+
197
+ return (
198
+ <div style={{
199
+ position: 'relative', zIndex: 15, borderRadius: 27, overflow: 'hidden',
200
+ padding: '11px 0 2px',
201
+ display: 'flex', flexDirection: 'column', alignItems: 'center',
202
+ boxShadow: dark
203
+ ? '0 -2px 20px rgba(0,0,0,0.09)'
204
+ : '0 -1px 6px rgba(0,0,0,0.018), 0 -3px 20px rgba(0,0,0,0.012)',
205
+ }}>
206
+ {/* liquid glass bg — same recipe as nav pills */}
207
+ <div style={{
208
+ position: 'absolute', inset: 0, borderRadius: 27,
209
+ backdropFilter: 'blur(12px) saturate(180%)',
210
+ WebkitBackdropFilter: 'blur(12px) saturate(180%)',
211
+ background: dark ? 'rgba(120,120,128,0.14)' : 'rgba(255,255,255,0.25)',
212
+ }} />
213
+ <div style={{
214
+ position: 'absolute', inset: 0, borderRadius: 27,
215
+ boxShadow: dark
216
+ ? 'inset 1.5px 1.5px 1px rgba(255,255,255,0.15)'
217
+ : 'inset 1.5px 1.5px 1px rgba(255,255,255,0.7), inset -1px -1px 1px rgba(255,255,255,0.4)',
218
+ border: dark ? '0.5px solid rgba(255,255,255,0.15)' : '0.5px solid rgba(0,0,0,0.06)',
219
+ pointerEvents: 'none',
220
+ }} />
221
+
222
+ {/* autocorrect bar */}
223
+ <div style={{
224
+ display: 'flex', gap: 20, alignItems: 'center',
225
+ padding: '8px 22px 13px', width: '100%', boxSizing: 'border-box',
226
+ position: 'relative',
227
+ }}>
228
+ {['"The"', 'the', 'to'].map((w, i) => (
229
+ <React.Fragment key={i}>
230
+ {i > 0 && <div style={{ width: 1, height: 25, background: '#ccc', opacity: 0.3 }} />}
231
+ <div style={{
232
+ flex: 1, textAlign: 'center',
233
+ fontFamily: '-apple-system, system-ui', fontSize: 17,
234
+ color: sugg, letterSpacing: -0.43, lineHeight: '22px',
235
+ }}>{w}</div>
236
+ </React.Fragment>
237
+ ))}
238
+ </div>
239
+
240
+ {/* key layout */}
241
+ <div style={{
242
+ display: 'flex', flexDirection: 'column', gap: 13,
243
+ padding: '0 6.5px', width: '100%', boxSizing: 'border-box',
244
+ position: 'relative',
245
+ }}>
246
+ {row(['q','w','e','r','t','y','u','i','o','p'])}
247
+ {row(['a','s','d','f','g','h','j','k','l'], 20)}
248
+ <div style={{ display: 'flex', gap: 14.25, alignItems: 'center' }}>
249
+ {key(icons.shift, { w: 45, k: 'shift' })}
250
+ <div style={{ display: 'flex', gap: 6.5, flex: 1 }}>
251
+ {['z','x','c','v','b','n','m'].map(l => key(l, { flex: true, k: l }))}
252
+ </div>
253
+ {key(icons.del, { w: 45, k: 'del' })}
254
+ </div>
255
+ <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
256
+ {key('ABC', { w: 92.25, fs: 18, k: 'abc' })}
257
+ {key('', { flex: true, k: 'space' })}
258
+ {key(icons.ret, { w: 92.25, ret: true, k: 'ret' })}
259
+ </div>
260
+ </div>
261
+
262
+ {/* bottom spacer (emoji+mic area, icons omitted) */}
263
+ <div style={{ height: 56, width: '100%', position: 'relative' }} />
264
+ </div>
265
+ );
266
+ }
267
+
268
+ Object.assign(window, {
269
+ IOSDevice, IOSStatusBar, IOSList, IOSListRow, IOSKeyboard,
270
+ });
@@ -0,0 +1,197 @@
1
+ /* BEGIN USAGE */
2
+ // MacOS.jsx — Simplified macOS Tahoe (Liquid Glass) window
3
+ // Based on the macOS Tahoe UI Kit. No image assets, no dependencies.
4
+ // Exports (to window): MacWindow, MacSidebar, MacSidebarItem, MacSidebarHeader, MacToolbar, MacGlass, MacTrafficLights
5
+ //
6
+ // Usage — wrap your app content in <MacWindow> to get the window chrome
7
+ // (traffic lights + titlebar). Props: width, height, title, sidebar (pass a
8
+ // <MacSidebar> element); compose MacToolbar/MacGlass inside as needed:
9
+ //
10
+ // <MacWindow width={980} height={620} title="Documents"
11
+ // sidebar={<MacSidebar>…</MacSidebar>}>
12
+ // ...your app content...
13
+ // </MacWindow>
14
+ /* END USAGE */
15
+
16
+ const MAC_FONT = '-apple-system, BlinkMacSystemFont, "SF Pro", "Helvetica Neue", sans-serif';
17
+
18
+ // ─────────────────────────────────────────────────────────────
19
+ // Liquid glass primitive — blur + white tint + inset highlight
20
+ // ─────────────────────────────────────────────────────────────
21
+ function MacGlass({ children, radius = 296, dark = false, style = {} }) {
22
+ return (
23
+ <div style={{ position: 'relative', borderRadius: radius, ...style }}>
24
+ <div style={{
25
+ position: 'absolute', inset: 0, borderRadius: radius,
26
+ background: dark ? 'rgba(255,255,255,0.08)' : 'rgba(255,255,255,0.35)',
27
+ backdropFilter: 'blur(40px) saturate(180%)',
28
+ WebkitBackdropFilter: 'blur(40px) saturate(180%)',
29
+ border: dark ? '0.5px solid rgba(255,255,255,0.12)' : '0.5px solid rgba(255,255,255,0.6)',
30
+ boxShadow: dark
31
+ ? '0 8px 40px rgba(0,0,0,0.2)'
32
+ : '0 8px 40px rgba(0,0,0,0.08), inset 0 1px 0 rgba(255,255,255,0.4)',
33
+ }} />
34
+ <div style={{ position: 'relative', zIndex: 1 }}>{children}</div>
35
+ </div>
36
+ );
37
+ }
38
+
39
+ // ─────────────────────────────────────────────────────────────
40
+ // Traffic lights (14px, Tahoe colors)
41
+ // ─────────────────────────────────────────────────────────────
42
+ function MacTrafficLights({ style = {} }) {
43
+ const dot = (bg) => (
44
+ <div style={{
45
+ width: 14, height: 14, borderRadius: '50%', background: bg,
46
+ border: '0.5px solid rgba(0,0,0,0.1)',
47
+ }} />
48
+ );
49
+ return (
50
+ <div style={{ display: 'flex', gap: 9, alignItems: 'center', padding: 1, ...style }}>
51
+ {dot('#ff736a')}{dot('#febc2e')}{dot('#19c332')}
52
+ </div>
53
+ );
54
+ }
55
+
56
+ // ─────────────────────────────────────────────────────────────
57
+ // Toolbar — title + single glass pill icon
58
+ // ─────────────────────────────────────────────────────────────
59
+ function MacToolbar({ title = 'Folder' }) {
60
+ return (
61
+ <div style={{
62
+ display: 'flex', gap: 8, alignItems: 'center', padding: 8, flexShrink: 0,
63
+ }}>
64
+ {/* title */}
65
+ <div style={{
66
+ fontFamily: MAC_FONT, fontSize: 15, fontWeight: 700,
67
+ color: 'rgba(0,0,0,0.85)', whiteSpace: 'nowrap', paddingLeft: 8,
68
+ }}>{title}</div>
69
+ <div style={{ flex: 1 }} />
70
+ {/* single action */}
71
+ <MacGlass>
72
+ <div style={{
73
+ width: 36, height: 36, display: 'flex',
74
+ alignItems: 'center', justifyContent: 'center',
75
+ }}>
76
+ <div style={{ width: 14, height: 14, borderRadius: '50%', background: '#4c4c4c', opacity: 0.4 }} />
77
+ </div>
78
+ </MacGlass>
79
+ {/* search */}
80
+ <MacGlass>
81
+ <div style={{
82
+ width: 140, height: 36, display: 'flex', alignItems: 'center',
83
+ gap: 6, padding: '0 12px',
84
+ }}>
85
+ <svg width="13" height="13" viewBox="0 0 13 13" fill="none">
86
+ <circle cx="5.5" cy="5.5" r="4" stroke="#727272" strokeWidth="1.5"/>
87
+ <path d="M8.5 8.5l3 3" stroke="#727272" strokeWidth="1.5" strokeLinecap="round"/>
88
+ </svg>
89
+ <span style={{
90
+ fontFamily: MAC_FONT, fontSize: 13, fontWeight: 500, color: '#727272',
91
+ }}>Search</span>
92
+ </div>
93
+ </MacGlass>
94
+ </div>
95
+ );
96
+ }
97
+
98
+ // ─────────────────────────────────────────────────────────────
99
+ // Sidebar — frosted glass panel floating inside the window
100
+ // ─────────────────────────────────────────────────────────────
101
+ function MacSidebarItem({ label, selected = false }) {
102
+ return (
103
+ <div style={{
104
+ display: 'flex', alignItems: 'center', gap: 6,
105
+ height: 24, padding: '4px 10px 4px 6px', margin: '0 10px',
106
+ borderRadius: 8, position: 'relative',
107
+ fontFamily: MAC_FONT, fontSize: 11, fontWeight: 500,
108
+ }}>
109
+ {selected && (
110
+ <div style={{
111
+ position: 'absolute', inset: 0, borderRadius: 8,
112
+ background: 'rgba(0,0,0,0.11)', mixBlendMode: 'multiply',
113
+ }} />
114
+ )}
115
+ <div style={{
116
+ width: 14, height: 14, borderRadius: '50%',
117
+ background: selected ? '#007aff' : 'rgba(0,0,0,0.4)',
118
+ opacity: selected ? 1 : 0.5, flexShrink: 0, position: 'relative',
119
+ }} />
120
+ <span style={{ color: 'rgba(0,0,0,0.85)', position: 'relative' }}>{label}</span>
121
+ </div>
122
+ );
123
+ }
124
+
125
+ function MacSidebar({ children }) {
126
+ return (
127
+ <div style={{
128
+ width: 220, height: '100%', padding: 8, flexShrink: 0,
129
+ position: 'relative', display: 'flex', flexDirection: 'column',
130
+ }}>
131
+ {/* glass panel */}
132
+ <div style={{
133
+ position: 'absolute', inset: 8, borderRadius: 18,
134
+ background: 'rgba(210,225,245,0.45)',
135
+ backdropFilter: 'blur(50px) saturate(200%)',
136
+ WebkitBackdropFilter: 'blur(50px) saturate(200%)',
137
+ border: '0.5px solid rgba(255,255,255,0.5)',
138
+ boxShadow: '0 8px 40px rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.35)',
139
+ }} />
140
+ {/* content */}
141
+ <div style={{
142
+ position: 'relative', zIndex: 1, padding: '10px 0',
143
+ display: 'flex', flexDirection: 'column', gap: 2,
144
+ }}>
145
+ {/* window controls + sidebar toggle */}
146
+ <div style={{
147
+ height: 32, display: 'flex', alignItems: 'center',
148
+ justifyContent: 'space-between', padding: '0 10px', marginBottom: 4,
149
+ }}>
150
+ <MacTrafficLights />
151
+ </div>
152
+ {children}
153
+ </div>
154
+ </div>
155
+ );
156
+ }
157
+
158
+ function MacSidebarHeader({ title }) {
159
+ return (
160
+ <div style={{
161
+ padding: '14px 18px 5px',
162
+ fontFamily: MAC_FONT, fontSize: 11, fontWeight: 700,
163
+ color: 'rgba(0,0,0,0.5)',
164
+ }}>{title}</div>
165
+ );
166
+ }
167
+
168
+ // ─────────────────────────────────────────────────────────────
169
+ // Window — r:26, big shadow, sidebar + toolbar + content
170
+ // ─────────────────────────────────────────────────────────────
171
+ function MacWindow({
172
+ width = 900, height = 600, title = 'Folder',
173
+ sidebar, children,
174
+ }) {
175
+ return (
176
+ <div style={{
177
+ width, height, borderRadius: 26, overflow: 'hidden',
178
+ background: '#fff',
179
+ border: '1px solid #DEE0E3',
180
+ display: 'flex', position: 'relative',
181
+ fontFamily: MAC_FONT,
182
+ }}>
183
+ <MacSidebar>{sidebar}</MacSidebar>
184
+ <div style={{ flex: 1, display: 'flex', flexDirection: 'column' }}>
185
+ <MacToolbar title={title} />
186
+ <div style={{ flex: 1, overflow: 'auto', padding: '4px 8px' }}>
187
+ {children}
188
+ </div>
189
+ </div>
190
+ </div>
191
+ );
192
+ }
193
+
194
+ Object.assign(window, {
195
+ MacWindow, MacSidebar, MacSidebarItem, MacSidebarHeader,
196
+ MacToolbar, MacGlass, MacTrafficLights,
197
+ });