S2 Layers
=========

A style in the S2 system is comprised of a number of layers stacked on
top of each other.  Layers serve different purposes and can add or
change different things at each step.  End-users pick and choose which
layers they want and that ultimate determines how their journal looks.

The layers from the bottom to top are:

          Built-in
	  Core
          I18n-C
	  Layout
	  I18n
	  Theme
	  User


0: BUILT-IN
===========

This is a very thin layer that can almost be considered part of the
core layer (layer 1), but it has on large difference: the
implementation of the built-in layer is done in the S2 system's
backend language.  In this initial implementation, this is Perl.  This
layer serves as the bridge between reality and the happy opaque world
that is S2.  It lets S2 code have access to get data from the outside
and do things that are either available in native S2, or explicitly
disallowed because they could be unsafe.

1: CORE
=======

The core defines all the classes that are available in the system.
This definition includes both the data structures available to higher
layers and default implementations.  That is, it defines everything
there is available in, say, a journal entry object, and also defines
how to dump it to HTML.

Overtime as more functionality is added to LJ, the number of these
classes will grow, but it must never shrink or change, as to preserve
compatability with old layers above it.  Classes exist to represent
common LJ objects (journal entries, users, page views, etc.).

The cool thing about having default implementations in this layer is
that they're inherited by higher layers, including old ones written
when the core layer was smaller.  This lets us add new view types
(Memories view, Userinfo view, etc...) and have them match the user's
layout, without any of the layer authors updating their code.

There is only one core layer so users can't select it.  (well, see
versioning.txt) The core layer defines what's available in the
built-in layer, so obviously users can't select their built-in layer
either.  In fact, the existence of a built-in layer is transparent to
most parts of the system.

2: LAYOUT
=========

The layout is what in S1 we called a style.  In S2 terminology, the
style is the end result of combining all your layers together.  The
layout layer defines the most basic customizable element of the S2
system... it determines the base look for the style.  If a user wanted
to change their journal to match a very explcit look (say, to match an
existing website of theirs), then they'd make a new layout layer.  LJ
will provide a half-dozen of these, but the real customizabilty in the
new system is in the upper layers.

All layers can overide functions and properties in lower layers, but a
layout layer is unique in that it can define new functions and
properties.

3: THEME
========

In S1, a color theme was a top-level entity, just like a style.  The
idea was that style authors should be careful in designing their
styles using the right color codes such that any color theme could be
applied to it and the result would be pleasing.  This required a lot
of effort on the part of both style authors and color theme authors,
so it ultimately failed.  Lots of fingers were pointed between the two
groups and finally I admitted I was wrong in designing a system that
relied on everybody understanding such concepts.  Once one person made
a misbehaving style or theme, it pretty much ruined the entire system,
as nobody cared from that point on.

The result is that we were left with the obscure notion of "color
codes" which were impossible for users to imagine how to map onto the
style (now: layout) they were looking at.  They'd eventually discover
that "light emphasis text 2" meant, "the color at the top in the box".

In S2, themes are tied to layouts, and the layout layer defines that
properties can be overridden (these include color codes).  That way a
theme will fit a layout very closely.  Also, themes can define any
properties that a layout layer reflects, which might include images
and sound (I hate cheesy MIDIs... before sound will be allowed, there
will be a visitor option to disable ever hearing any sound).

Themes will rule.

4: I18N
=======

The next layer up is i18n (Internationalization).  Functionally, an
i18n layer as all the same power as a theme layer, but they serve
different purposes.  Whereas a theme layer will be overriding
properties and methods that affect colors and graphics, an i18n layer
will override a different subset that affects the text.

An i18n layer is specific to a layout, not a layout+theme.  We can
hopefully expect translators to produce 5 or 6 i18n layers (one per
layout), but we can't expect them to produce 120 (6 times, say, 20
themes per layout).

This then raises the question -- what if the i18n layer and theme
layer override an overlapping set of functions or properties?  If the
layout layer is designed to abstract copy and style in all the right
places, then this won't be a problem.  This isn't actually very hard
to do, and once we show users how it's done, they'll be able to write
compliant layout layers.  Only compliant layouts will be publicly
available to users, so even if a user does make their own terribly
non-compliant layout, chances are they're not interested in having it
translated anyway.

5: USER
=======

The final layer is the user layer.  Few users will likely use this,
but it provides a way to tweak anything that the lower layers didn't do
to the journal owner's pleasing.  This is equivalent to the S1
"overrides" box, but will be a lot simpler.  The user will be able to
make this layer with a wizard as well, or type in S2 code manually if
they so please.


SUMMARY
=======

In summary, the layers are:

          Built-in  -- bridge to real world

	  Core      -- defines what layers can access & do
          I18n-C    -- internationalization that applies to the core

	  Layout    -- an S1 "style", but see note below.

          i18n     \
	  Theme      - Tweaking a layout.
	  User      /

Although we called a layout a "style" in S1, in S2 we're going to be
calling a layout a layout and we'll only use "style" to describe the
end result of all a user's layers together.

CAPABILITIES:
=============

Declaring classes: core

Declaring new functions: core, layout

Declaring properties: core, layout

Changing "des" property on properties: i18n


